blob: 438a3815f9a369cf9d8aa9b3823d6f42d9b72b50 [file] [log] [blame]
hughchen04049682018-04-23 15:55:51 +08001/*
2 * Copyright 2018 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 */
16package com.android.settings.connecteddevice;
17
Hugh Chen30a97a92020-08-05 16:58:41 +080018import android.bluetooth.BluetoothAdapter;
Hugh Chencb057d62020-08-14 17:56:20 +080019import android.bluetooth.BluetoothDevice;
Hugh Chen30a97a92020-08-05 16:58:41 +080020import android.content.BroadcastReceiver;
hughchen04049682018-04-23 15:55:51 +080021import android.content.Context;
Hugh Chen30a97a92020-08-05 16:58:41 +080022import android.content.Intent;
23import android.content.IntentFilter;
hughchen04049682018-04-23 15:55:51 +080024import android.content.pm.PackageManager;
Hugh Chencb057d62020-08-14 17:56:20 +080025import android.util.Log;
hughchen04049682018-04-23 15:55:51 +080026
Fan Zhang23f8d592018-08-28 15:11:40 -070027import androidx.annotation.VisibleForTesting;
28import androidx.preference.Preference;
jackqdyuleib152e6d2018-09-24 12:14:27 -070029import androidx.preference.PreferenceGroup;
Fan Zhang23f8d592018-08-28 15:11:40 -070030import androidx.preference.PreferenceScreen;
31
Hugh Chen30a97a92020-08-05 16:58:41 +080032import com.android.settings.R;
Hugh Chencb057d62020-08-14 17:56:20 +080033import com.android.settings.bluetooth.BluetoothDevicePreference;
hughchen04049682018-04-23 15:55:51 +080034import com.android.settings.bluetooth.BluetoothDeviceUpdater;
35import com.android.settings.bluetooth.SavedBluetoothDeviceUpdater;
Ivan Chiangc6d71912018-05-24 17:52:49 +080036import com.android.settings.connecteddevice.dock.DockUpdater;
hughchen04049682018-04-23 15:55:51 +080037import com.android.settings.core.BasePreferenceController;
38import com.android.settings.dashboard.DashboardFragment;
Ivan Chiangc6d71912018-05-24 17:52:49 +080039import com.android.settings.overlay.FeatureFactory;
hughchen04049682018-04-23 15:55:51 +080040import com.android.settingslib.core.lifecycle.LifecycleObserver;
41import com.android.settingslib.core.lifecycle.events.OnStart;
42import com.android.settingslib.core.lifecycle.events.OnStop;
43
Hugh Chencb057d62020-08-14 17:56:20 +080044import java.util.ArrayList;
45import java.util.List;
46
hughchen04049682018-04-23 15:55:51 +080047public class PreviouslyConnectedDevicePreferenceController extends BasePreferenceController
48 implements LifecycleObserver, OnStart, OnStop, DevicePreferenceCallback {
49
Hugh Chencb057d62020-08-14 17:56:20 +080050 private static final String TAG = "PreviouslyDevicePreController";
51 private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
52
jackqdyuleib152e6d2018-09-24 12:14:27 -070053 private static final int MAX_DEVICE_NUM = 3;
Hugh Chen194dd882020-09-02 17:00:13 +080054 private static final int DOCK_DEVICE_INDEX = 9;
Hugh Chen30a97a92020-08-05 16:58:41 +080055 private static final String KEY_SEE_ALL = "previously_connected_devices_see_all";
jackqdyuleib152e6d2018-09-24 12:14:27 -070056
Hugh Chencb057d62020-08-14 17:56:20 +080057 private final List<Preference> mDevicesList = new ArrayList<>();
Hugh Chen194dd882020-09-02 17:00:13 +080058 private final List<Preference> mDockDevicesList = new ArrayList<>();
Hugh Chencb057d62020-08-14 17:56:20 +080059
jackqdyuleib152e6d2018-09-24 12:14:27 -070060 private PreferenceGroup mPreferenceGroup;
hughchen04049682018-04-23 15:55:51 +080061 private BluetoothDeviceUpdater mBluetoothDeviceUpdater;
Ivan Chiangc6d71912018-05-24 17:52:49 +080062 private DockUpdater mSavedDockUpdater;
Hugh Chen30a97a92020-08-05 16:58:41 +080063 private BluetoothAdapter mBluetoothAdapter;
64
65 @VisibleForTesting
66 Preference mSeeAllPreference;
67 @VisibleForTesting
68 IntentFilter mIntentFilter;
69
70 @VisibleForTesting
71 BroadcastReceiver mReceiver = new BroadcastReceiver() {
72 @Override
73 public void onReceive(Context context, Intent intent) {
74 updatePreferenceVisibility();
75 }
76 };
hughchen04049682018-04-23 15:55:51 +080077
78 public PreviouslyConnectedDevicePreferenceController(Context context, String preferenceKey) {
79 super(context, preferenceKey);
Ivan Chiangc6d71912018-05-24 17:52:49 +080080
81 mSavedDockUpdater = FeatureFactory.getFactory(
Fan Zhang7db118e2019-02-14 12:25:29 -080082 context).getDockUpdaterFeatureProvider().getSavedDockUpdater(context, this);
Hugh Chen30a97a92020-08-05 16:58:41 +080083 mIntentFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
84 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
hughchen04049682018-04-23 15:55:51 +080085 }
86
87 @Override
88 public int getAvailabilityStatus() {
hughchenef2c1a12019-04-17 15:43:22 +080089 return (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)
90 || mSavedDockUpdater != null)
hughchen04049682018-04-23 15:55:51 +080091 ? AVAILABLE
92 : CONDITIONALLY_UNAVAILABLE;
93 }
94
95 @Override
96 public void displayPreference(PreferenceScreen screen) {
97 super.displayPreference(screen);
Fan Zhang7db118e2019-02-14 12:25:29 -080098 mPreferenceGroup = screen.findPreference(getPreferenceKey());
Hugh Chen30a97a92020-08-05 16:58:41 +080099 mSeeAllPreference = mPreferenceGroup.findPreference(KEY_SEE_ALL);
100 updatePreferenceVisibility();
jackqdyuleib152e6d2018-09-24 12:14:27 -0700101
hughchen04049682018-04-23 15:55:51 +0800102 if (isAvailable()) {
Ivan Chiang06036362018-06-22 12:39:44 +0800103 final Context context = screen.getContext();
104 mBluetoothDeviceUpdater.setPrefContext(context);
105 mSavedDockUpdater.setPreferenceContext(context);
hughchen04049682018-04-23 15:55:51 +0800106 }
107 }
108
109 @Override
110 public void onStart() {
111 mBluetoothDeviceUpdater.registerCallback();
Ivan Chiangc6d71912018-05-24 17:52:49 +0800112 mSavedDockUpdater.registerCallback();
Hugh Chen30a97a92020-08-05 16:58:41 +0800113 mContext.registerReceiver(mReceiver, mIntentFilter);
hughchen04049682018-04-23 15:55:51 +0800114 }
115
116 @Override
117 public void onStop() {
118 mBluetoothDeviceUpdater.unregisterCallback();
Ivan Chiangc6d71912018-05-24 17:52:49 +0800119 mSavedDockUpdater.unregisterCallback();
Hugh Chen30a97a92020-08-05 16:58:41 +0800120 mContext.unregisterReceiver(mReceiver);
hughchen04049682018-04-23 15:55:51 +0800121 }
122
123 public void init(DashboardFragment fragment) {
124 mBluetoothDeviceUpdater = new SavedBluetoothDeviceUpdater(fragment.getContext(),
125 fragment, PreviouslyConnectedDevicePreferenceController.this);
126 }
127
128 @Override
129 public void onDeviceAdded(Preference preference) {
Hugh Chencb057d62020-08-14 17:56:20 +0800130 final List<BluetoothDevice> bluetoothDevices =
131 mBluetoothAdapter.getMostRecentlyConnectedDevices();
Hugh Chen194dd882020-09-02 17:00:13 +0800132 final int index = preference instanceof BluetoothDevicePreference
133 ? bluetoothDevices.indexOf(((BluetoothDevicePreference) preference)
134 .getBluetoothDevice().getDevice()) : DOCK_DEVICE_INDEX;
Hugh Chencb057d62020-08-14 17:56:20 +0800135 if (DEBUG) {
136 Log.d(TAG, "onDeviceAdded() " + preference.getTitle() + ", index of : " + index);
137 for (BluetoothDevice device : bluetoothDevices) {
138 Log.d(TAG, "onDeviceAdded() most recently device : " + device.getName());
139 }
140 }
Hugh Chen194dd882020-09-02 17:00:13 +0800141 addPreference(index, preference);
Hugh Chen30a97a92020-08-05 16:58:41 +0800142 updatePreferenceVisibility();
hughchen04049682018-04-23 15:55:51 +0800143 }
144
Hugh Chen194dd882020-09-02 17:00:13 +0800145 private void addPreference(int index, Preference preference) {
146 if (preference instanceof BluetoothDevicePreference) {
147 if (mDevicesList.size() >= index) {
148 mDevicesList.add(index, preference);
149 } else {
150 mDevicesList.add(preference);
151 }
Hugh Chencb057d62020-08-14 17:56:20 +0800152 } else {
Hugh Chen194dd882020-09-02 17:00:13 +0800153 mDockDevicesList.add(preference);
Hugh Chencb057d62020-08-14 17:56:20 +0800154 }
Hugh Chen194dd882020-09-02 17:00:13 +0800155 addPreference();
156 }
157
158 private void addPreference() {
Hugh Chencb057d62020-08-14 17:56:20 +0800159 mPreferenceGroup.removeAll();
160 mPreferenceGroup.addPreference(mSeeAllPreference);
Hugh Chen194dd882020-09-02 17:00:13 +0800161 final int size = getDeviceListSize();
Hugh Chencb057d62020-08-14 17:56:20 +0800162 for (int i = 0; i < size; i++) {
163 if (DEBUG) {
164 Log.d(TAG, "addPreference() add device : " + mDevicesList.get(i).getTitle());
165 }
166 mDevicesList.get(i).setOrder(i);
167 mPreferenceGroup.addPreference(mDevicesList.get(i));
168 }
Hugh Chen194dd882020-09-02 17:00:13 +0800169 if (mDockDevicesList.size() > 0) {
170 for (int i = 0; i < getDockDeviceListSize(MAX_DEVICE_NUM - size); i++) {
171 if (DEBUG) {
172 Log.d(TAG, "addPreference() add dock device : "
173 + mDockDevicesList.get(i).getTitle());
174 }
175 mDockDevicesList.get(i).setOrder(DOCK_DEVICE_INDEX);
176 mPreferenceGroup.addPreference(mDockDevicesList.get(i));
177 }
178 }
179 }
180
181 private int getDeviceListSize() {
182 return mDevicesList.size() >= MAX_DEVICE_NUM
183 ? MAX_DEVICE_NUM : mDevicesList.size();
184 }
185
186 private int getDockDeviceListSize(int availableSize) {
187 return mDockDevicesList.size() >= availableSize
188 ? availableSize : mDockDevicesList.size();
Hugh Chencb057d62020-08-14 17:56:20 +0800189 }
190
hughchen04049682018-04-23 15:55:51 +0800191 @Override
192 public void onDeviceRemoved(Preference preference) {
Hugh Chen194dd882020-09-02 17:00:13 +0800193 if (preference instanceof BluetoothDevicePreference) {
194 mDevicesList.remove(preference);
195 } else {
196 mDockDevicesList.remove(preference);
Hugh Chencb057d62020-08-14 17:56:20 +0800197 }
Hugh Chen194dd882020-09-02 17:00:13 +0800198
199 addPreference();
Hugh Chen30a97a92020-08-05 16:58:41 +0800200 updatePreferenceVisibility();
hughchen04049682018-04-23 15:55:51 +0800201 }
202
203 @VisibleForTesting
204 void setBluetoothDeviceUpdater(BluetoothDeviceUpdater bluetoothDeviceUpdater) {
205 mBluetoothDeviceUpdater = bluetoothDeviceUpdater;
206 }
207
208 @VisibleForTesting
Ivan Chiangc6d71912018-05-24 17:52:49 +0800209 void setSavedDockUpdater(DockUpdater savedDockUpdater) {
210 mSavedDockUpdater = savedDockUpdater;
211 }
212
213 @VisibleForTesting
jackqdyuleib152e6d2018-09-24 12:14:27 -0700214 void setPreferenceGroup(PreferenceGroup preferenceGroup) {
215 mPreferenceGroup = preferenceGroup;
hughchen04049682018-04-23 15:55:51 +0800216 }
217
218 @VisibleForTesting
Hugh Chen30a97a92020-08-05 16:58:41 +0800219 void updatePreferenceVisibility() {
220 if (mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()) {
221 mSeeAllPreference.setSummary("");
222 } else {
223 mSeeAllPreference.setSummary(
224 mContext.getString(R.string.connected_device_see_all_summary));
225 }
hughchen04049682018-04-23 15:55:51 +0800226 }
Ivan Chiangc6d71912018-05-24 17:52:49 +0800227}