From d1406341641662be3d35b014c0f48c935ceba83a Mon Sep 17 00:00:00 2001 From: SongFerngWang Date: Wed, 30 Aug 2023 19:49:29 +0800 Subject: [PATCH] To Add try-catch for MetadataChangedListener to handle the Exception Since the BT is not enabled, the BluetoothAdapter can't register the device into Metadata List. Then, the BluetoothAdapter throws the execption while the UI did the unregister. Bug: 291207069 Test: build pass Change-Id: I86e0a3369d7371747a249b34f949d59929afb1c7 --- ...ancedBluetoothDetailsHeaderController.java | 47 ++++++++++++++++--- .../bluetooth/BluetoothDevicePreference.java | 43 +++++++++++++++-- 2 files changed, 78 insertions(+), 12 deletions(-) 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(); }