Fix incorrect UI issue of "previously connected devices"

This CL before, the bt device still showing on
"previously connected devices" after forgot that bt device.
It because the list of getMostRecentlyConnectedDevices()
will not include BOND_NONE device. We need to remove the
device that not include in list of getMostRecentlyConnectedDevices() .

This CL add removePreferenceIfNecessary() to check the device whether
is contained in getMostRecentlyConnectedDevices(). If not, remove the
preference.

Bug: 149193092
Test: make -j42 RunSettingsRoboTests
Change-Id: I94bedf222b64d9f05dc6f979b79dbc8794c0f97d
This commit is contained in:
hughchen
2020-02-10 19:01:50 +08:00
parent 7233ed3406
commit 76dcfdedf2
2 changed files with 46 additions and 1 deletions

View File

@@ -28,6 +28,9 @@ import com.android.settings.dashboard.DashboardFragment;
import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
import java.util.ArrayList;
import java.util.List;
/** /**
* Maintain and update saved bluetooth devices(bonded but not connected) * Maintain and update saved bluetooth devices(bonded but not connected)
*/ */
@@ -54,7 +57,10 @@ public class SavedBluetoothDeviceUpdater extends BluetoothDeviceUpdater
if (mBluetoothAdapter.isEnabled()) { if (mBluetoothAdapter.isEnabled()) {
final CachedBluetoothDeviceManager cachedManager = final CachedBluetoothDeviceManager cachedManager =
mLocalManager.getCachedDeviceManager(); 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); final CachedBluetoothDevice cachedDevice = cachedManager.findDevice(device);
if (cachedDevice != null) { if (cachedDevice != null) {
update(cachedDevice); update(cachedDevice);
@@ -65,6 +71,18 @@ public class SavedBluetoothDeviceUpdater extends BluetoothDeviceUpdater
} }
} }
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 @Override
public void update(CachedBluetoothDevice cachedDevice) { public void update(CachedBluetoothDevice cachedDevice) {
if (isFilterMatched(cachedDevice)) { if (isFilterMatched(cachedDevice)) {

View File

@@ -18,6 +18,7 @@ package com.android.settings.bluetooth;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
@@ -208,4 +209,30 @@ public class SavedBluetoothDeviceUpdaterTest {
verify(mBluetoothDeviceUpdater).removeAllDevicesFromPreference(); 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);
}
} }