[Settings] Avoid NPE if BT device is changed by framework.

- Do not register only one BT device for primary to avoid primary
   BT devcie change to another.
 - Register and unregister all BT devices

Bug: 280236099
Test: atest passed
Change-Id: I610144c7f8f649e40d99cf1dc7f50d1f3b80f109
This commit is contained in:
tom hsu
2023-05-11 02:23:06 +08:00
parent d3897afda6
commit 0617631408
2 changed files with 83 additions and 25 deletions

View File

@@ -57,7 +57,9 @@ import com.android.settingslib.widget.LayoutPreference;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
@@ -92,6 +94,7 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont
@VisibleForTesting
final Map<String, Bitmap> mIconCache;
private CachedBluetoothDevice mCachedDevice;
private Set<BluetoothDevice> mBluetoothDevices;
@VisibleForTesting
BluetoothAdapter mBluetoothAdapter;
@VisibleForTesting
@@ -142,23 +145,13 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont
if (!isAvailable()) {
return;
}
mIsRegisterCallback = true;
mCachedDevice.registerCallback(this);
mBluetoothAdapter.addOnMetadataChangedListener(mCachedDevice.getDevice(),
mContext.getMainExecutor(), mMetadataListener);
registerBluetoothDevice();
refresh();
}
@Override
public void onStop() {
if (!mIsRegisterCallback) {
return;
}
mCachedDevice.unregisterCallback(this);
mBluetoothAdapter.removeOnMetadataChangedListener(mCachedDevice.getDevice(),
mMetadataListener);
mIsRegisterCallback = false;
unRegisterBluetoothDevice();
}
@Override
@@ -176,6 +169,40 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont
mCachedDevice = cachedBluetoothDevice;
}
private void registerBluetoothDevice() {
if (mBluetoothDevices == null) {
mBluetoothDevices = new HashSet<>();
}
mBluetoothDevices.clear();
if (mCachedDevice.getDevice() != null) {
mBluetoothDevices.add(mCachedDevice.getDevice());
}
mCachedDevice.getMemberDevice().forEach(cbd -> {
if (cbd != null) {
mBluetoothDevices.add(cbd.getDevice());
}
});
if (mBluetoothDevices.isEmpty()) {
Log.d(TAG, "No BT devcie to register.");
return;
}
mCachedDevice.registerCallback(this);
mBluetoothDevices.forEach(bd ->
mBluetoothAdapter.addOnMetadataChangedListener(bd,
mContext.getMainExecutor(), mMetadataListener));
}
private void unRegisterBluetoothDevice() {
if (mBluetoothDevices == null || mBluetoothDevices.isEmpty()) {
Log.d(TAG, "No BT devcie to unregister.");
return;
}
mCachedDevice.unregisterCallback(this);
mBluetoothDevices.forEach(bd -> mBluetoothAdapter.removeOnMetadataChangedListener(bd,
mMetadataListener));
mBluetoothDevices.clear();
}
@VisibleForTesting
void refresh() {
if (mLayoutPreference != null && mCachedDevice != null) {