Fix ConcurrentModificationException
Use CopyOnWriteArrayList instead of Arraylist to avoid ConcurrentModificationException. Bug: 147334979 Test: make -j42 RunSettingsRoboTests Change-Id: I669f379d3eba6a086c6bd97cde2b78d92fb5c481
This commit is contained in:
@@ -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() {
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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());
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user