1 /*
2  * Copyright (C) 2015 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.tv.settings.accessories;
18 
19 import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE;
20 import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
21 
22 import android.annotation.CallSuper;
23 import android.bluetooth.BluetoothDevice;
24 import android.content.Context;
25 import android.graphics.Bitmap;
26 import android.graphics.Canvas;
27 import android.graphics.drawable.BitmapDrawable;
28 import android.graphics.drawable.Drawable;
29 import android.os.Bundle;
30 import android.util.SparseArray;
31 
32 import androidx.annotation.NonNull;
33 import androidx.leanback.preference.BaseLeanbackPreferenceFragmentCompat;
34 import androidx.leanback.widget.VerticalGridView;
35 import androidx.lifecycle.LifecycleOwner;
36 import androidx.preference.Preference;
37 import androidx.preference.PreferenceScreen;
38 
39 import com.android.settingslib.core.lifecycle.Lifecycle;
40 import com.android.tv.settings.R;
41 
42 import java.util.List;
43 
44 /**
45  * The screen in TV settings that shows when bluetooth searching/pairing is active.
46  */
47 public class AddAccessoryPreferenceFragment extends BaseLeanbackPreferenceFragmentCompat implements
48         LifecycleOwner {
49 
50     private SparseArray<Drawable> mResizedDrawables = new SparseArray<>();
51     private final Lifecycle mLifecycle = new Lifecycle(this);
52 
AddAccessoryPreferenceFragment()53     public AddAccessoryPreferenceFragment() {
54         super();
55     }
56 
newInstance()57     public static AddAccessoryPreferenceFragment newInstance() {
58         return new AddAccessoryPreferenceFragment();
59     }
60 
61     @Override
onCreatePreferences(Bundle savedInstanceState, String rootKey)62     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
63         final AddAccessoryActivity activity = (AddAccessoryActivity) getActivity();
64         final Context themedContext = getPreferenceManager().getContext();
65 
66         PreferenceScreen screen =
67                 getPreferenceManager().createPreferenceScreen(themedContext);
68         updateList(screen, activity.getBluetoothDevices(), activity.getCurrentTargetAddress(),
69                 activity.getCurrentTargetStatus(), activity.getCancelledAddress());
70     }
71 
updateList(PreferenceScreen screen, List<BluetoothDevice> devices, String currentTargetAddress, String currentTargetStatus, String cancelledAddress)72     public void updateList(PreferenceScreen screen, List<BluetoothDevice> devices,
73                            String currentTargetAddress, String currentTargetStatus,
74                            String cancelledAddress) {
75         final Context themedContext = getPreferenceManager().getContext();
76         screen.removeAll();
77 
78         if (devices == null) {
79             return;
80         }
81         // Add entries for the discovered Bluetooth devices
82         for (BluetoothDevice bt : devices) {
83             final Preference preference = new Preference(themedContext);
84             if (currentTargetAddress.equalsIgnoreCase(bt.getAddress()) &&
85                     !currentTargetStatus.isEmpty()) {
86                 preference.setSummary(currentTargetStatus);
87             } else if (cancelledAddress.equalsIgnoreCase(bt.getAddress())) {
88                 preference.setSummary(R.string.accessory_state_canceled);
89             } else {
90                 preference.setSummary(bt.getAddress());
91             }
92             preference.setIcon(getDeviceDrawable(bt));
93             preference.setKey(bt.getAddress());
94             preference.setTitle(bt.getName());
95             screen.addPreference(preference);
96         }
97         setPreferenceScreen(screen);
98     }
99 
clearList()100     public void clearList() {
101         PreferenceScreen screen = getPreferenceScreen();
102         if (screen != null) {
103             screen.removeAll();
104         }
105     }
106 
getDeviceDrawable(BluetoothDevice device)107     private Drawable getDeviceDrawable(BluetoothDevice device) {
108         final int resId = AccessoriesFragment.getImageIdForDevice(device, false);
109         Drawable drawable = mResizedDrawables.get(resId);
110         if (drawable == null) {
111             final Drawable tempDrawable = getActivity().getDrawable(resId);
112             // icons for TwoPanel have a bigger icon offset
113             final int iconOffset =
114                     getResources().getDimensionPixelSize(R.dimen.preference_icon_offset);
115             final int iconWidth =
116                     getResources().getDimensionPixelSize(R.dimen.lb_dialog_list_item_icon_width)
117                             + iconOffset;
118             final int iconHeight =
119                     getResources().getDimensionPixelSize(R.dimen.lb_dialog_list_item_icon_height)
120                             + iconOffset;
121             tempDrawable.setBounds(0, 0, iconWidth, iconHeight);
122             final Bitmap bitmap =
123                     Bitmap.createBitmap(iconWidth, iconHeight, Bitmap.Config.ARGB_8888);
124             final Canvas canvas = new Canvas(bitmap);
125             tempDrawable.draw(canvas);
126             drawable = new BitmapDrawable(getResources(), bitmap);
127             mResizedDrawables.put(resId, drawable);
128         }
129         return drawable;
130     }
131 
132     @Override
onPreferenceTreeClick(Preference preference)133     public boolean onPreferenceTreeClick(Preference preference) {
134         final AddAccessoryActivity activity = (AddAccessoryActivity) getActivity();
135         activity.onActionClicked(preference.getKey());
136         return super.onPreferenceTreeClick(preference);
137     }
138 
advanceSelection()139     public void advanceSelection() {
140         final int preferenceCount = getPreferenceScreen().getPreferenceCount();
141         if (preferenceCount > 0) {
142             final VerticalGridView vgv = (VerticalGridView) getListView();
143             final int position = (vgv.getSelectedPosition() + 1) % preferenceCount;
144             vgv.setSelectedPositionSmooth(position);
145         }
146     }
147 
148     @NonNull
149     @Override
getLifecycle()150     public Lifecycle getLifecycle() {
151         return mLifecycle;
152     }
153 
154     @CallSuper
155     @Override
onResume()156     public void onResume() {
157         mLifecycle.handleLifecycleEvent(ON_RESUME);
158         super.onResume();
159     }
160 
161     @CallSuper
162     @Override
onPause()163     public void onPause() {
164         mLifecycle.handleLifecycleEvent(ON_PAUSE);
165         super.onPause();
166     }
167 }
168