diff --git a/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java b/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java index dca005ba65b..c38e340d35f 100644 --- a/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java +++ b/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java @@ -167,6 +167,10 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont } private void registerBluetoothDevice() { + if (mBluetoothAdapter == null) { + Log.d(TAG, "No mBluetoothAdapter"); + return; + } if (mBluetoothDevices == null) { mBluetoothDevices = new HashSet<>(); } @@ -180,23 +184,52 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont } }); if (mBluetoothDevices.isEmpty()) { - Log.d(TAG, "No BT devcie to register."); + Log.d(TAG, "No BT device to register."); return; } mCachedDevice.registerCallback(this); - mBluetoothDevices.forEach(bd -> - mBluetoothAdapter.addOnMetadataChangedListener(bd, - mContext.getMainExecutor(), mMetadataListener)); + Set errorDevices = new HashSet<>(); + mBluetoothDevices.forEach(bd -> { + try { + boolean isSuccess = mBluetoothAdapter.addOnMetadataChangedListener(bd, + mContext.getMainExecutor(), mMetadataListener); + if (!isSuccess) { + Log.e(TAG, bd.getAnonymizedAddress() + ": add into Listener failed"); + errorDevices.add(bd); + } + } catch (NullPointerException e) { + errorDevices.add(bd); + Log.e(TAG, bd.getAnonymizedAddress() + ":" + e.toString()); + } catch (IllegalArgumentException e) { + errorDevices.add(bd); + Log.e(TAG, bd.getAnonymizedAddress() + ":" + e.toString()); + } + }); + for (BluetoothDevice errorDevice : errorDevices) { + mBluetoothDevices.remove(errorDevice); + Log.d(TAG, "mBluetoothDevices remove " + errorDevice.getAnonymizedAddress()); + } } private void unRegisterBluetoothDevice() { + if (mBluetoothAdapter == null) { + Log.d(TAG, "No mBluetoothAdapter"); + return; + } if (mBluetoothDevices == null || mBluetoothDevices.isEmpty()) { - Log.d(TAG, "No BT devcie to unregister."); + Log.d(TAG, "No BT device to unregister."); return; } mCachedDevice.unregisterCallback(this); - mBluetoothDevices.forEach(bd -> mBluetoothAdapter.removeOnMetadataChangedListener(bd, - mMetadataListener)); + mBluetoothDevices.forEach(bd -> { + try { + mBluetoothAdapter.removeOnMetadataChangedListener(bd, mMetadataListener); + } catch (NullPointerException e) { + Log.e(TAG, bd.getAnonymizedAddress() + ":" + e.toString()); + } catch (IllegalArgumentException e) { + Log.e(TAG, bd.getAnonymizedAddress() + ":" + e.toString()); + } + }); mBluetoothDevices.clear(); } diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java index 014a02b119a..98d78f24341 100644 --- a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java +++ b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java @@ -196,6 +196,10 @@ public final class BluetoothDevicePreference extends GearPreference { } private void registerMetadataChangedListener() { + if (mBluetoothAdapter == null) { + Log.d(TAG, "No mBluetoothAdapter"); + return; + } if (mBluetoothDevices == null) { mBluetoothDevices = new HashSet<>(); } @@ -210,18 +214,47 @@ public final class BluetoothDevicePreference extends GearPreference { Log.d(TAG, "No BT device to register."); return; } - mBluetoothDevices.forEach(bd -> - mBluetoothAdapter.addOnMetadataChangedListener(bd, - getContext().getMainExecutor(), mMetadataListener)); + Set errorDevices = new HashSet<>(); + mBluetoothDevices.forEach(bd -> { + try { + boolean isSuccess = mBluetoothAdapter.addOnMetadataChangedListener(bd, + getContext().getMainExecutor(), mMetadataListener); + if (!isSuccess) { + Log.e(TAG, bd.getAnonymizedAddress() + ": add into Listener failed"); + errorDevices.add(bd); + } + } catch (NullPointerException e) { + errorDevices.add(bd); + Log.e(TAG, bd.getAnonymizedAddress() + ":" + e.toString()); + } catch (IllegalArgumentException e) { + errorDevices.add(bd); + Log.e(TAG, bd.getAnonymizedAddress() + ":" + e.toString()); + } + }); + for (BluetoothDevice errorDevice : errorDevices) { + mBluetoothDevices.remove(errorDevice); + Log.d(TAG, "mBluetoothDevices remove " + errorDevice.getAnonymizedAddress()); + } } private void unregisterMetadataChangedListener() { + if (mBluetoothAdapter == null) { + Log.d(TAG, "No mBluetoothAdapter"); + return; + } if (mBluetoothDevices == null || mBluetoothDevices.isEmpty()) { Log.d(TAG, "No BT device to unregister."); return; } - mBluetoothDevices.forEach( - bd -> mBluetoothAdapter.removeOnMetadataChangedListener(bd, mMetadataListener)); + mBluetoothDevices.forEach(bd -> { + try { + mBluetoothAdapter.removeOnMetadataChangedListener(bd, mMetadataListener); + } catch (NullPointerException e) { + Log.e(TAG, bd.getAnonymizedAddress() + ":" + e.toString()); + } catch (IllegalArgumentException e) { + Log.e(TAG, bd.getAnonymizedAddress() + ":" + e.toString()); + } + }); mBluetoothDevices.clear(); }