Fix ConcurrentModificationException
This CL use CopyOnWriteArrayList to avoid
ConcurrentModificationException.
Bug: 152188749
Test: build pass
Change-Id: Icfdcef703cb7f7ac21233c0f2b4bf5111121630a
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java
index b1300a9..2e144cc 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 @@
private String mPackageName;
@VisibleForTesting
- List<MediaDevice> mMediaDevices = new ArrayList<>();
+ List<MediaDevice> mMediaDevices = new CopyOnWriteArrayList<>();
@VisibleForTesting
- List<MediaDevice> mDisconnectedMediaDevices = new ArrayList<>();
+ List<MediaDevice> mDisconnectedMediaDevices = new CopyOnWriteArrayList<>();
@VisibleForTesting
MediaDevice mPhoneDevice;
@VisibleForTesting
@@ -206,6 +206,7 @@
public void stopScan() {
mInfoMediaManager.unregisterCallback(mMediaDeviceCallback);
mInfoMediaManager.stopScan();
+ unRegisterDeviceAttributeChangeCallback();
}
/**
@@ -392,32 +393,34 @@
}
private List<MediaDevice> buildDisconnectedBluetoothDevice() {
- for (MediaDevice device : mDisconnectedMediaDevices) {
- ((BluetoothMediaDevice) device).getCachedDevice()
- .unregisterCallback(mDeviceAttributeChangeCallback);
- }
- mDisconnectedMediaDevices.clear();
final List<BluetoothDevice> bluetoothDevices =
mBluetoothAdapter.getMostRecentlyConnectedDevices();
final CachedBluetoothDeviceManager cachedDeviceManager =
mLocalBluetoothManager.getCachedDeviceManager();
+ final List<CachedBluetoothDevice> 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 @@
}
}
+ private void unRegisterDeviceAttributeChangeCallback() {
+ for (MediaDevice device : mDisconnectedMediaDevices) {
+ ((BluetoothMediaDevice) device).getCachedDevice()
+ .unregisterCallback(mDeviceAttributeChangeCallback);
+ }
+ }
/**
* Callback for notifying device information updating