Fix ConcurrentModificationException

Use CopyOnWriteArrayList instead of Arraylist to
avoid ConcurrentModificationException.

Bug: 147334979
Test: make -j42 RunSettingsRoboTests

Change-Id: I669f379d3eba6a086c6bd97cde2b78d92fb5c481
This commit is contained in:
hughchen
2020-01-09 17:58:00 +08:00
parent c770c9133a
commit 1045823b3c
3 changed files with 16 additions and 11 deletions

View File

@@ -37,7 +37,9 @@ import com.android.settingslib.media.MediaDevice;
import com.android.settingslib.utils.ThreadUtils; import com.android.settingslib.utils.ThreadUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
/** /**
* SliceBackgroundWorker for get MediaDevice list and handle MediaDevice state change event. * SliceBackgroundWorker for get MediaDevice list and handle MediaDevice state change event.
@@ -46,7 +48,7 @@ public class MediaDeviceUpdateWorker extends SliceBackgroundWorker
implements LocalMediaManager.DeviceCallback { implements LocalMediaManager.DeviceCallback {
private final Context mContext; private final Context mContext;
private final List<MediaDevice> mMediaDevices = new ArrayList<>(); private final Collection<MediaDevice> mMediaDevices = new CopyOnWriteArrayList<>();
private final DevicesChangedBroadcastReceiver mReceiver; private final DevicesChangedBroadcastReceiver mReceiver;
private final String mPackageName; private final String mPackageName;
@@ -110,8 +112,8 @@ public class MediaDeviceUpdateWorker extends SliceBackgroundWorker
notifySliceChange(); notifySliceChange();
} }
public List<MediaDevice> getMediaDevices() { public Collection<MediaDevice> getMediaDevices() {
return new ArrayList<>(mMediaDevices); return mMediaDevices;
} }
public void connectDevice(MediaDevice device) { public void connectDevice(MediaDevice device) {
@@ -121,7 +123,7 @@ public class MediaDeviceUpdateWorker extends SliceBackgroundWorker
} }
public MediaDevice getMediaDeviceById(String id) { public MediaDevice getMediaDeviceById(String id) {
return mLocalMediaManager.getMediaDeviceById(mMediaDevices, id); return mLocalMediaManager.getMediaDeviceById(new ArrayList<>(mMediaDevices), id);
} }
public MediaDevice getCurrentConnectedMediaDevice() { public MediaDevice getCurrentConnectedMediaDevice() {

View File

@@ -40,7 +40,7 @@ import com.android.settings.slices.SliceBackgroundWorker;
import com.android.settings.slices.SliceBroadcastReceiver; import com.android.settings.slices.SliceBroadcastReceiver;
import com.android.settingslib.media.MediaDevice; import com.android.settingslib.media.MediaDevice;
import java.util.List; import java.util.Collection;
/** /**
* Show the Media device that can be transfer the media. * Show the Media device that can be transfer the media.
@@ -78,7 +78,7 @@ public class MediaOutputSlice implements CustomSliceable {
return listBuilder.build(); return listBuilder.build();
} }
final List<MediaDevice> devices = getMediaDevices(); final Collection<MediaDevice> devices = getMediaDevices();
final MediaDeviceUpdateWorker worker = getWorker(); final MediaDeviceUpdateWorker worker = getWorker();
final MediaDevice connectedDevice = worker.getCurrentConnectedMediaDevice(); final MediaDevice connectedDevice = worker.getCurrentConnectedMediaDevice();
final boolean isTouched = worker.getIsTouched(); final boolean isTouched = worker.getIsTouched();
@@ -136,8 +136,8 @@ public class MediaOutputSlice implements CustomSliceable {
return mWorker; return mWorker;
} }
private List<MediaDevice> getMediaDevices() { private Collection<MediaDevice> getMediaDevices() {
final List<MediaDevice> devices = getWorker().getMediaDevices(); final Collection<MediaDevice> devices = getWorker().getMediaDevices();
return devices; return devices;
} }

View File

@@ -116,7 +116,8 @@ public class MediaDeviceUpdateWorkerTest {
newDevices.add(mMediaDevice2); newDevices.add(mMediaDevice2);
mMediaDeviceUpdateWorker.onDeviceListUpdate(newDevices); mMediaDeviceUpdateWorker.onDeviceListUpdate(newDevices);
final List<MediaDevice> devices = mMediaDeviceUpdateWorker.getMediaDevices(); final List<MediaDevice> devices =
new ArrayList<>(mMediaDeviceUpdateWorker.getMediaDevices());
assertThat(devices.get(0).getId()).isEqualTo(newDevices.get(0).getId()); assertThat(devices.get(0).getId()).isEqualTo(newDevices.get(0).getId());
assertThat(devices.get(1).getId()).isEqualTo(newDevices.get(1).getId()); assertThat(devices.get(1).getId()).isEqualTo(newDevices.get(1).getId());
@@ -134,7 +135,8 @@ public class MediaDeviceUpdateWorkerTest {
newDevices.add(device3); newDevices.add(device3);
mMediaDeviceUpdateWorker.onDeviceListUpdate(newDevices); mMediaDeviceUpdateWorker.onDeviceListUpdate(newDevices);
final List<MediaDevice> devices = mMediaDeviceUpdateWorker.getMediaDevices(); final List<MediaDevice> devices =
new ArrayList<>(mMediaDeviceUpdateWorker.getMediaDevices());
assertThat(devices.size()).isEqualTo(newDevices.size()); assertThat(devices.size()).isEqualTo(newDevices.size());
} }
@@ -147,7 +149,8 @@ public class MediaDeviceUpdateWorkerTest {
newDevices.add(mMediaDevice1); newDevices.add(mMediaDevice1);
mMediaDeviceUpdateWorker.onDeviceListUpdate(newDevices); mMediaDeviceUpdateWorker.onDeviceListUpdate(newDevices);
final List<MediaDevice> devices = mMediaDeviceUpdateWorker.getMediaDevices(); final List<MediaDevice> devices =
new ArrayList<>(mMediaDeviceUpdateWorker.getMediaDevices());
assertThat(devices.size()).isEqualTo(newDevices.size()); assertThat(devices.size()).isEqualTo(newDevices.size());
} }