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);
+    }
 }