From 37282f0f02a4134b3a8c7006cefe8d953aa007b0 Mon Sep 17 00:00:00 2001 From: hughchen Date: Wed, 25 Mar 2020 18:12:52 +0800 Subject: [PATCH] Fix ConcurrentModificationException This CL use CopyOnWriteArrayList to avoid ConcurrentModificationException. Bug: 152188749 Test: build pass Change-Id: Icfdcef703cb7f7ac21233c0f2b4bf5111121630a --- .../settingslib/media/LocalMediaManager.java | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java index b1300a97a3244..2e144ccb493c7 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java @@ -68,9 +68,9 @@ public class LocalMediaManager implements BluetoothCallback { private String mPackageName; @VisibleForTesting - List mMediaDevices = new ArrayList<>(); + List mMediaDevices = new CopyOnWriteArrayList<>(); @VisibleForTesting - List mDisconnectedMediaDevices = new ArrayList<>(); + List mDisconnectedMediaDevices = new CopyOnWriteArrayList<>(); @VisibleForTesting MediaDevice mPhoneDevice; @VisibleForTesting @@ -206,6 +206,7 @@ public class LocalMediaManager implements BluetoothCallback { public void stopScan() { mInfoMediaManager.unregisterCallback(mMediaDeviceCallback); mInfoMediaManager.stopScan(); + unRegisterDeviceAttributeChangeCallback(); } /** @@ -392,32 +393,34 @@ public class LocalMediaManager implements BluetoothCallback { } private List buildDisconnectedBluetoothDevice() { - for (MediaDevice device : mDisconnectedMediaDevices) { - ((BluetoothMediaDevice) device).getCachedDevice() - .unregisterCallback(mDeviceAttributeChangeCallback); - } - mDisconnectedMediaDevices.clear(); final List bluetoothDevices = mBluetoothAdapter.getMostRecentlyConnectedDevices(); final CachedBluetoothDeviceManager cachedDeviceManager = mLocalBluetoothManager.getCachedDeviceManager(); + final List cachedBluetoothDeviceList = new ArrayList<>(); for (BluetoothDevice device : bluetoothDevices) { final CachedBluetoothDevice cachedDevice = cachedDeviceManager.findDevice(device); if (cachedDevice != null) { if (cachedDevice.getBondState() == BluetoothDevice.BOND_BONDED && !cachedDevice.isConnected()) { - final MediaDevice mediaDevice = new BluetoothMediaDevice(mContext, - cachedDevice, - null, null, mPackageName); - if (!mMediaDevices.contains(mediaDevice)) { - cachedDevice.registerCallback(mDeviceAttributeChangeCallback); - mDisconnectedMediaDevices.add(mediaDevice); - } + cachedBluetoothDeviceList.add(cachedDevice); } } } + + unRegisterDeviceAttributeChangeCallback(); + mDisconnectedMediaDevices.clear(); + for (CachedBluetoothDevice cachedDevice : cachedBluetoothDeviceList) { + final MediaDevice mediaDevice = new BluetoothMediaDevice(mContext, + cachedDevice, + null, null, mPackageName); + if (!mMediaDevices.contains(mediaDevice)) { + cachedDevice.registerCallback(mDeviceAttributeChangeCallback); + mDisconnectedMediaDevices.add(mediaDevice); + } + } return new ArrayList<>(mDisconnectedMediaDevices); } @@ -468,6 +471,12 @@ public class LocalMediaManager implements BluetoothCallback { } } + private void unRegisterDeviceAttributeChangeCallback() { + for (MediaDevice device : mDisconnectedMediaDevices) { + ((BluetoothMediaDevice) device).getCachedDevice() + .unregisterCallback(mDeviceAttributeChangeCallback); + } + } /** * Callback for notifying device information updating