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

Commit 37282f0f authored by hughchen's avatar hughchen Committed by Robert Luo
Browse files

Fix ConcurrentModificationException

This CL use CopyOnWriteArrayList to avoid
ConcurrentModificationException.

Bug: 152188749
Test: build pass
Change-Id: Icfdcef703cb7f7ac21233c0f2b4bf5111121630a
parent 0fdf17d0
Loading
Loading
Loading
Loading
+23 −14
Original line number Diff line number Diff line
@@ -68,9 +68,9 @@ public class LocalMediaManager implements BluetoothCallback {
    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 class LocalMediaManager implements BluetoothCallback {
    public void stopScan() {
        mInfoMediaManager.unregisterCallback(mMediaDeviceCallback);
        mInfoMediaManager.stopScan();
        unRegisterDeviceAttributeChangeCallback();
    }

    /**
@@ -392,22 +393,26 @@ public class LocalMediaManager implements BluetoothCallback {
        }

        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()) {
                        cachedBluetoothDeviceList.add(cachedDevice);
                    }
                }
            }

            unRegisterDeviceAttributeChangeCallback();
            mDisconnectedMediaDevices.clear();
            for (CachedBluetoothDevice cachedDevice : cachedBluetoothDeviceList) {
                final MediaDevice mediaDevice = new BluetoothMediaDevice(mContext,
                        cachedDevice,
                        null, null, mPackageName);
@@ -416,8 +421,6 @@ public class LocalMediaManager implements BluetoothCallback {
                    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