Merge "Fix incorrect UI issue of "previously connected devices""
diff --git a/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java
index 9a327ed..bbcd13c 100644
--- a/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java
+++ b/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java
@@ -28,6 +28,9 @@
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* Maintain and update saved bluetooth devices(bonded but not connected)
*/
@@ -54,7 +57,10 @@
if (mBluetoothAdapter.isEnabled()) {
final CachedBluetoothDeviceManager cachedManager =
mLocalManager.getCachedDeviceManager();
- for (BluetoothDevice device : mBluetoothAdapter.getMostRecentlyConnectedDevices()) {
+ final List<BluetoothDevice> bluetoothDevices =
+ mBluetoothAdapter.getMostRecentlyConnectedDevices();
+ removePreferenceIfNecessary(bluetoothDevices, cachedManager);
+ for (BluetoothDevice device : bluetoothDevices) {
final CachedBluetoothDevice cachedDevice = cachedManager.findDevice(device);
if (cachedDevice != null) {
update(cachedDevice);
@@ -65,6 +71,18 @@
}
}
+ private void removePreferenceIfNecessary(List<BluetoothDevice> bluetoothDevices,
+ CachedBluetoothDeviceManager cachedManager) {
+ for (BluetoothDevice device : new ArrayList<>(mPreferenceMap.keySet())) {
+ if (!bluetoothDevices.contains(device)) {
+ final CachedBluetoothDevice cachedDevice = cachedManager.findDevice(device);
+ if (cachedDevice != null) {
+ removePreference(cachedDevice);
+ }
+ }
+ }
+ }
+
@Override
public void update(CachedBluetoothDevice cachedDevice) {
if (isFilterMatched(cachedDevice)) {
diff --git a/tests/robotests/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdaterTest.java
index 3993475..da11781 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdaterTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdaterTest.java
@@ -18,6 +18,7 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -208,4 +209,30 @@
verify(mBluetoothDeviceUpdater).removeAllDevicesFromPreference();
}
+
+ @Test
+ public void forceUpdate_deviceNotContain_removePreference() {
+ final List<BluetoothDevice> bluetoothDevices = new ArrayList<>();
+ bluetoothDevices.add(mBluetoothDevice);
+ final BluetoothDevice device2 = mock(BluetoothDevice.class);
+ final CachedBluetoothDevice cachedDevice2 = mock(CachedBluetoothDevice.class);
+
+ mBluetoothDeviceUpdater.mPreferenceMap.put(device2, mPreference);
+
+ when(cachedDevice2.getDevice()).thenReturn(device2);
+ when(cachedDevice2.getAddress()).thenReturn("04:52:C7:0B:D8:3S");
+ when(mDeviceManager.findDevice(device2)).thenReturn(cachedDevice2);
+ when(mBluetoothAdapter.isEnabled()).thenReturn(true);
+ when(mBluetoothAdapter.getMostRecentlyConnectedDevices()).thenReturn(bluetoothDevices);
+ when(mBluetoothManager.getCachedDeviceManager()).thenReturn(mDeviceManager);
+ when(mDeviceManager.findDevice(mBluetoothDevice)).thenReturn(mCachedBluetoothDevice);
+ when(mBluetoothDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+ when(mBluetoothDevice.isConnected()).thenReturn(false);
+
+ mBluetoothDeviceUpdater.forceUpdate();
+
+ verify(mBluetoothDeviceUpdater).removePreference(cachedDevice2);
+ verify(mBluetoothDeviceUpdater).addPreference(mCachedBluetoothDevice,
+ BluetoothDevicePreference.SortType.TYPE_NO_SORT);
+ }
}