Fix bluetooth settings force close

This CL include following change:

- Add null check of cacedBluetoothDevice, cachedBluetooth could be null
  if the input BluetoothDevice can't found in
  CachedBluetoothDeviceManager.
- Move addPreference() and removePreference() to update() method,
  because update() will be called to update UI when recevice Bluetooth
  device change event.
- Add test case to test CachedBluetoothDevice null check.

Bug: 149068434
Test: make -j42 RunSettingsRoboTests
Change-Id: I90016bf1175925821b0d9b634c62cf796289a734
This commit is contained in:
hughchen
2020-02-07 17:48:39 +08:00
parent 978b19ec63
commit 1b3f570a67
2 changed files with 106 additions and 10 deletions

View File

@@ -20,6 +20,7 @@ import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.util.Log;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import com.android.settings.connecteddevice.DevicePreferenceCallback;
@@ -38,24 +39,25 @@ public class SavedBluetoothDeviceUpdater extends BluetoothDeviceUpdater
private static final String PREF_KEY = "saved_bt";
@VisibleForTesting
BluetoothAdapter mBluetoothAdapter;
public SavedBluetoothDeviceUpdater(Context context, DashboardFragment fragment,
DevicePreferenceCallback devicePreferenceCallback) {
super(context, fragment, devicePreferenceCallback);
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
@Override
public void forceUpdate() {
if (BluetoothAdapter.getDefaultAdapter().isEnabled()) {
if (mBluetoothAdapter.isEnabled()) {
final CachedBluetoothDeviceManager cachedManager =
mLocalManager.getCachedDeviceManager();
for (BluetoothDevice device
: BluetoothAdapter.getDefaultAdapter().getMostRecentlyConnectedDevices()) {
for (BluetoothDevice device : mBluetoothAdapter.getMostRecentlyConnectedDevices()) {
final CachedBluetoothDevice cachedDevice = cachedManager.findDevice(device);
if (isFilterMatched(cachedDevice)) {
// Add the preference if it is new one
addPreference(cachedDevice, BluetoothDevicePreference.SortType.TYPE_NO_SORT);
} else {
removePreference(cachedDevice);
if (cachedDevice != null) {
update(cachedDevice);
}
}
} else {
@@ -63,6 +65,16 @@ public class SavedBluetoothDeviceUpdater extends BluetoothDeviceUpdater
}
}
@Override
public void update(CachedBluetoothDevice cachedDevice) {
if (isFilterMatched(cachedDevice)) {
// Add the preference if it is new one
addPreference(cachedDevice, BluetoothDevicePreference.SortType.TYPE_NO_SORT);
} else {
removePreference(cachedDevice);
}
}
@Override
public boolean isFilterMatched(CachedBluetoothDevice cachedDevice) {
final BluetoothDevice device = cachedDevice.getDevice();