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         updateList(activity.getBluetoothDevices(), activity.getCurrentTargetAddress(),
65                 activity.getCurrentTargetStatus(), activity.getCancelledAddress());
66     }
67 
updateList(List<BluetoothDevice> devices, String currentTargetAddress, String currentTargetStatus, String cancelledAddress)68     public void updateList(List<BluetoothDevice> devices, String currentTargetAddress,
69             String currentTargetStatus, String cancelledAddress) {
70         final Context themedContext = getPreferenceManager().getContext();
71 
72         PreferenceScreen screen = getPreferenceScreen();
73         if (screen == null) {
74             screen = getPreferenceManager().createPreferenceScreen(themedContext);
75             setPreferenceScreen(screen);
76         } else {
77             screen.removeAll();
78         }
79 
80         if (devices == null) {
81             return;
82         }
83 
84         // Add entries for the discovered Bluetooth devices
85         for (BluetoothDevice bt : devices) {
86             final Preference preference = new Preference(themedContext);
87             if (currentTargetAddress.equalsIgnoreCase(bt.getAddress()) &&
88                     !currentTargetStatus.isEmpty()) {
89                 preference.setSummary(currentTargetStatus);
90             } else if (cancelledAddress.equalsIgnoreCase(bt.getAddress())) {
91                 preference.setSummary(R.string.accessory_state_canceled);
92             } else {
93                 preference.setSummary(bt.getAddress());
94             }
95             preference.setKey(bt.getAddress());
96             preference.setTitle(bt.getName());
97             preference.setIcon(getDeviceDrawable(bt));
98             screen.addPreference(preference);
99         }
100     }
101 
getDeviceDrawable(BluetoothDevice device)102     private Drawable getDeviceDrawable(BluetoothDevice device) {
103         final int resId = AccessoriesFragment.getImageIdForDevice(device, false);
104         Drawable drawable = mResizedDrawables.get(resId);
105         if (drawable == null) {
106             final Drawable tempDrawable = getActivity().getDrawable(resId);
107             final int iconWidth =
108                     getResources().getDimensionPixelSize(R.dimen.lb_dialog_list_item_icon_width);
109             final int iconHeight =
110                     getResources().getDimensionPixelSize(R.dimen.lb_dialog_list_item_icon_height);
111             tempDrawable.setBounds(0, 0, iconWidth, iconHeight);
112             final Bitmap bitmap =
113                     Bitmap.createBitmap(iconWidth, iconHeight, Bitmap.Config.ARGB_8888);
114             final Canvas canvas = new Canvas(bitmap);
115             tempDrawable.draw(canvas);
116             drawable = new BitmapDrawable(getResources(), bitmap);
117             mResizedDrawables.put(resId, drawable);
118         }
119         return drawable;
120     }
121 
122     @Override
onPreferenceTreeClick(Preference preference)123     public boolean onPreferenceTreeClick(Preference preference) {
124         final AddAccessoryActivity activity = (AddAccessoryActivity) getActivity();
125         activity.onActionClicked(preference.getKey());
126         return super.onPreferenceTreeClick(preference);
127     }
128 
advanceSelection()129     public void advanceSelection() {
130         final int preferenceCount = getPreferenceScreen().getPreferenceCount();
131         if (preferenceCount > 0) {
132             final VerticalGridView vgv = (VerticalGridView) getListView();
133             final int position = (vgv.getSelectedPosition() + 1) % preferenceCount;
134             vgv.setSelectedPositionSmooth(position);
135         }
136     }
137 
138     @NonNull
139     @Override
getLifecycle()140     public Lifecycle getLifecycle() {
141         return mLifecycle;
142     }
143 
144     @CallSuper
145     @Override
onResume()146     public void onResume() {
147         mLifecycle.handleLifecycleEvent(ON_RESUME);
148         super.onResume();
149     }
150 
151     @CallSuper
152     @Override
onPause()153     public void onPause() {
154         mLifecycle.handleLifecycleEvent(ON_PAUSE);
155         super.onPause();
156     }
157 }
158