Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1045823b authored by hughchen's avatar hughchen
Browse files

Fix ConcurrentModificationException

Use CopyOnWriteArrayList instead of Arraylist to
avoid ConcurrentModificationException.

Bug: 147334979
Test: make -j42 RunSettingsRoboTests

Change-Id: I669f379d3eba6a086c6bd97cde2b78d92fb5c481
parent c770c913
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -37,7 +37,9 @@ import com.android.settingslib.media.MediaDevice;
import com.android.settingslib.utils.ThreadUtils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * SliceBackgroundWorker for get MediaDevice list and handle MediaDevice state change event.
@@ -46,7 +48,7 @@ public class MediaDeviceUpdateWorker extends SliceBackgroundWorker
        implements LocalMediaManager.DeviceCallback {

    private final Context mContext;
    private final List<MediaDevice> mMediaDevices = new ArrayList<>();
    private final Collection<MediaDevice> mMediaDevices = new CopyOnWriteArrayList<>();
    private final DevicesChangedBroadcastReceiver mReceiver;
    private final String mPackageName;

@@ -110,8 +112,8 @@ public class MediaDeviceUpdateWorker extends SliceBackgroundWorker
        notifySliceChange();
    }

    public List<MediaDevice> getMediaDevices() {
        return new ArrayList<>(mMediaDevices);
    public Collection<MediaDevice> getMediaDevices() {
        return mMediaDevices;
    }

    public void connectDevice(MediaDevice device) {
@@ -121,7 +123,7 @@ public class MediaDeviceUpdateWorker extends SliceBackgroundWorker
    }

    public MediaDevice getMediaDeviceById(String id) {
        return mLocalMediaManager.getMediaDeviceById(mMediaDevices, id);
        return mLocalMediaManager.getMediaDeviceById(new ArrayList<>(mMediaDevices), id);
    }

    public MediaDevice getCurrentConnectedMediaDevice() {
+4 −4
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@ import com.android.settings.slices.SliceBackgroundWorker;
import com.android.settings.slices.SliceBroadcastReceiver;
import com.android.settingslib.media.MediaDevice;

import java.util.List;
import java.util.Collection;

/**
 * Show the Media device that can be transfer the media.
@@ -78,7 +78,7 @@ public class MediaOutputSlice implements CustomSliceable {
            return listBuilder.build();
        }

        final List<MediaDevice> devices = getMediaDevices();
        final Collection<MediaDevice> devices = getMediaDevices();
        final MediaDeviceUpdateWorker worker = getWorker();
        final MediaDevice connectedDevice = worker.getCurrentConnectedMediaDevice();
        final boolean isTouched = worker.getIsTouched();
@@ -136,8 +136,8 @@ public class MediaOutputSlice implements CustomSliceable {
        return mWorker;
    }

    private List<MediaDevice> getMediaDevices() {
        final List<MediaDevice> devices = getWorker().getMediaDevices();
    private Collection<MediaDevice> getMediaDevices() {
        final Collection<MediaDevice> devices = getWorker().getMediaDevices();
        return devices;
    }

+6 −3
Original line number Diff line number Diff line
@@ -116,7 +116,8 @@ public class MediaDeviceUpdateWorkerTest {
        newDevices.add(mMediaDevice2);

        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(1).getId()).isEqualTo(newDevices.get(1).getId());
@@ -134,7 +135,8 @@ public class MediaDeviceUpdateWorkerTest {
        newDevices.add(device3);

        mMediaDeviceUpdateWorker.onDeviceListUpdate(newDevices);
        final List<MediaDevice> devices = mMediaDeviceUpdateWorker.getMediaDevices();
        final List<MediaDevice> devices =
                new ArrayList<>(mMediaDeviceUpdateWorker.getMediaDevices());

        assertThat(devices.size()).isEqualTo(newDevices.size());
    }
@@ -147,7 +149,8 @@ public class MediaDeviceUpdateWorkerTest {
        newDevices.add(mMediaDevice1);

        mMediaDeviceUpdateWorker.onDeviceListUpdate(newDevices);
        final List<MediaDevice> devices = mMediaDeviceUpdateWorker.getMediaDevices();
        final List<MediaDevice> devices =
                new ArrayList<>(mMediaDeviceUpdateWorker.getMediaDevices());

        assertThat(devices.size()).isEqualTo(newDevices.size());
    }