Merge "[Settings] Avoid NPE if BT device is changed by framework." into udc-dev
This commit is contained in:
@@ -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
|
||||
@@ -141,23 +144,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
|
||||
@@ -175,6 +168,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) {
|
||||
|
Reference in New Issue
Block a user