• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 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 package com.android.settings.bluetooth;
17 
18 import android.app.settings.SettingsEnums;
19 import android.bluetooth.BluetoothAdapter;
20 import android.bluetooth.BluetoothDevice;
21 import android.content.Context;
22 import android.util.Log;
23 
24 import androidx.annotation.VisibleForTesting;
25 import androidx.preference.Preference;
26 
27 import com.android.settings.connecteddevice.DevicePreferenceCallback;
28 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
29 import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
30 
31 import java.util.ArrayList;
32 import java.util.List;
33 
34 /**
35  * Maintain and update saved bluetooth devices(bonded but not connected)
36  */
37 public class SavedBluetoothDeviceUpdater extends BluetoothDeviceUpdater
38         implements Preference.OnPreferenceClickListener {
39 
40     private static final String TAG = "SavedBluetoothDeviceUpdater";
41     private static final boolean DBG = Log.isLoggable(BluetoothDeviceUpdater.TAG, Log.DEBUG);
42 
43     private static final String PREF_KEY = "saved_bt";
44 
45     private final boolean mShowConnectedDevice;
46 
47     @VisibleForTesting
48     BluetoothAdapter mBluetoothAdapter;
49 
SavedBluetoothDeviceUpdater(Context context, DevicePreferenceCallback devicePreferenceCallback, boolean showConnectedDevice, int metricsCategory)50     public SavedBluetoothDeviceUpdater(Context context,
51             DevicePreferenceCallback devicePreferenceCallback, boolean showConnectedDevice,
52             int metricsCategory) {
53         super(context, devicePreferenceCallback, metricsCategory);
54         mShowConnectedDevice = showConnectedDevice;
55         mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
56     }
57 
58     @Override
forceUpdate()59     public void forceUpdate() {
60         if (mBluetoothAdapter.isEnabled()) {
61             final CachedBluetoothDeviceManager cachedManager =
62                     mLocalManager.getCachedDeviceManager();
63             final List<BluetoothDevice> bluetoothDevices =
64                     mBluetoothAdapter.getMostRecentlyConnectedDevices();
65             removePreferenceIfNecessary(bluetoothDevices, cachedManager);
66             for (BluetoothDevice device : bluetoothDevices) {
67                 final CachedBluetoothDevice cachedDevice = cachedManager.findDevice(device);
68                 if (cachedDevice != null && !cachedManager.isSubDevice(device)) {
69                     update(cachedDevice);
70                 }
71             }
72         } else {
73             removeAllDevicesFromPreference();
74         }
75     }
76 
removePreferenceIfNecessary(List<BluetoothDevice> bluetoothDevices, CachedBluetoothDeviceManager cachedManager)77     private void removePreferenceIfNecessary(List<BluetoothDevice> bluetoothDevices,
78             CachedBluetoothDeviceManager cachedManager) {
79         for (BluetoothDevice device : new ArrayList<>(mPreferenceMap.keySet())) {
80             if (!bluetoothDevices.contains(device)) {
81                 final CachedBluetoothDevice cachedDevice = cachedManager.findDevice(device);
82                 if (cachedDevice != null) {
83                     removePreference(cachedDevice);
84                 }
85             }
86         }
87     }
88 
89     @Override
update(CachedBluetoothDevice cachedDevice)90     public void update(CachedBluetoothDevice cachedDevice) {
91         if (isFilterMatched(cachedDevice)) {
92             // Add the preference if it is new one
93             addPreference(cachedDevice, BluetoothDevicePreference.SortType.TYPE_NO_SORT);
94         } else {
95             removePreference(cachedDevice);
96         }
97         Log.d(TAG, "Map : " + mPreferenceMap);
98     }
99 
100     @Override
isFilterMatched(CachedBluetoothDevice cachedDevice)101     public boolean isFilterMatched(CachedBluetoothDevice cachedDevice) {
102         final BluetoothDevice device = cachedDevice.getDevice();
103         if (DBG) {
104             Log.d(TAG, "isFilterMatched() device name : " + cachedDevice.getName() +
105                     ", is connected : " + device.isConnected() + ", is profile connected : "
106                     + cachedDevice.isConnected());
107         }
108         return device.getBondState() == BluetoothDevice.BOND_BONDED
109                 && (mShowConnectedDevice || (!device.isConnected() && isDeviceInCachedDevicesList(
110                 cachedDevice)));
111     }
112 
113     @Override
onPreferenceClick(Preference preference)114     public boolean onPreferenceClick(Preference preference) {
115         mMetricsFeatureProvider.logClickedPreference(preference, mMetricsCategory);
116         final CachedBluetoothDevice device = ((BluetoothDevicePreference) preference)
117                 .getBluetoothDevice();
118         if (device.isConnected()) {
119             return device.setActive();
120         }
121         mMetricsFeatureProvider.action(mPrefContext,
122                 SettingsEnums.ACTION_SETTINGS_BLUETOOTH_CONNECT);
123         device.connect();
124         return true;
125     }
126 
127     @Override
getPreferenceKey()128     protected String getPreferenceKey() {
129         return PREF_KEY;
130     }
131 
132     @Override
getLogTag()133     protected String getLogTag() {
134         return TAG;
135     }
136 }
137