• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.systemui.accessibility.hearingaid;
18 
19 import android.content.Context;
20 import android.graphics.drawable.Drawable;
21 import android.view.LayoutInflater;
22 import android.view.View;
23 import android.view.ViewGroup;
24 import android.widget.ImageView;
25 import android.widget.TextView;
26 
27 import androidx.annotation.NonNull;
28 import androidx.recyclerview.widget.RecyclerView;
29 
30 import com.android.systemui.bluetooth.qsdialog.DeviceItem;
31 import com.android.systemui.res.R;
32 
33 import kotlin.Pair;
34 
35 import java.util.List;
36 
37 /**
38  * Adapter for showing hearing device item list {@link DeviceItem}.
39  */
40 public class HearingDevicesListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
41     private final List<DeviceItem> mItemList;
42     private final HearingDeviceItemCallback mCallback;
43 
HearingDevicesListAdapter(List<DeviceItem> itemList, HearingDeviceItemCallback callback)44     public HearingDevicesListAdapter(List<DeviceItem> itemList,
45             HearingDeviceItemCallback callback) {
46         mItemList = itemList;
47         mCallback = callback;
48     }
49 
50     @NonNull
51     @Override
onCreateViewHolder(@onNull ViewGroup viewGroup, int position)52     public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) {
53         View view = LayoutInflater.from(viewGroup.getContext()).inflate(
54                 R.layout.bluetooth_device_item, viewGroup, false);
55         return new DeviceItemViewHolder(view, viewGroup.getContext());
56     }
57 
58     @Override
onBindViewHolder(@onNull RecyclerView.ViewHolder viewHolder, int position)59     public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
60         DeviceItem item = mItemList.get(position);
61         ((DeviceItemViewHolder) viewHolder).bindView(item, mCallback);
62     }
63 
64     @Override
getItemCount()65     public int getItemCount() {
66         return mItemList.size();
67     }
68 
69     /**
70      * Updates items in the adapter.
71      *
72      * @param itemList bluetooth device item list
73      */
refreshDeviceItemList(List<DeviceItem> itemList)74     public void refreshDeviceItemList(List<DeviceItem> itemList) {
75         mItemList.clear();
76         mItemList.addAll(itemList);
77         notifyDataSetChanged();
78     }
79 
80     /**
81      * Interface to provide callbacks when click on the device item in hearing device quick
82      * settings tile.
83      */
84     public interface HearingDeviceItemCallback {
85         /**
86          * Called when gear view in device item is clicked.
87          *
88          * @param deviceItem bluetooth device item
89          * @param view       the view that was clicked
90          */
onDeviceItemGearClicked(@onNull DeviceItem deviceItem, @NonNull View view)91         void onDeviceItemGearClicked(@NonNull DeviceItem deviceItem, @NonNull View view);
92 
93         /**
94          * Called when device item is clicked.
95          *
96          * @param deviceItem bluetooth device item
97          * @param view       the view that was clicked
98          */
onDeviceItemClicked(@onNull DeviceItem deviceItem, @NonNull View view)99         void onDeviceItemClicked(@NonNull DeviceItem deviceItem, @NonNull View view);
100     }
101 
102     private static class DeviceItemViewHolder extends RecyclerView.ViewHolder {
103         private final Context mContext;
104         private final View mContainer;
105         private final TextView mNameView;
106         private final TextView mSummaryView;
107         private final ImageView mIconView;
108         private final ImageView mGearIcon;
109         private final View mGearView;
110         private final View mDividerView;
111 
DeviceItemViewHolder(@onNull View itemView, Context context)112         DeviceItemViewHolder(@NonNull View itemView, Context context) {
113             super(itemView);
114             mContext = context;
115             mContainer = itemView.requireViewById(R.id.bluetooth_device_row);
116             mNameView = itemView.requireViewById(R.id.bluetooth_device_name);
117             mSummaryView = itemView.requireViewById(R.id.bluetooth_device_summary);
118             mIconView = itemView.requireViewById(R.id.bluetooth_device_icon);
119             mGearIcon = itemView.requireViewById(R.id.gear_icon_image);
120             mGearView = itemView.requireViewById(R.id.gear_icon);
121             mDividerView = itemView.requireViewById(R.id.divider);
122         }
123 
bindView(DeviceItem item, HearingDeviceItemCallback callback)124         public void bindView(DeviceItem item, HearingDeviceItemCallback callback) {
125             mContainer.setEnabled(item.isEnabled());
126             mContainer.setOnClickListener(view -> callback.onDeviceItemClicked(item, view));
127             Integer backgroundResId = item.getBackground();
128             if (backgroundResId != null) {
129                 mContainer.setBackground(mContext.getDrawable(item.getBackground()));
130             }
131 
132             // tint different color in different state for bad color contrast problem
133             int tintColor = item.isActive() ? mContext.getColor(
134                     com.android.internal.R.color.materialColorOnPrimaryContainer)
135                     : mContext.getColor(com.android.internal.R.color.materialColorOnSurface);
136 
137             Pair<Drawable, String> iconPair = item.getIconWithDescription();
138             if (iconPair != null) {
139                 Drawable drawable = iconPair.getFirst();
140                 mIconView.setImageDrawable(drawable);
141                 mIconView.setContentDescription(iconPair.getSecond());
142             }
143 
144             mNameView.setTextAppearance(
145                     item.isActive() ? R.style.TextAppearance_BluetoothTileDialog_Active
146                             : R.style.TextAppearance_BluetoothTileDialog);
147             mNameView.setText(item.getDeviceName());
148             mSummaryView.setTextAppearance(
149                     item.isActive() ? R.style.TextAppearance_BluetoothTileDialog_Active
150                             : R.style.TextAppearance_BluetoothTileDialog);
151             mSummaryView.setText(item.getConnectionSummary());
152 
153             mGearIcon.getDrawable().mutate().setTint(tintColor);
154             mGearView.setOnClickListener(view -> callback.onDeviceItemGearClicked(item, view));
155             mDividerView.setBackgroundColor(tintColor);
156         }
157     }
158 }
159