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

Commit f7077d90 authored by Angela Wang's avatar Angela Wang
Browse files

Fix crash when unpairing a device which supports CSIP

When unpairing a device from settings page, it'll cause
ConcurrentModificationException if the device has CSIP set size > 1.
Iterate the cloned member devices set instead of the original one to
prevent crashing.

Bug: 292190538
Test: unpair a device with 2 members and verify no crash happend
Change-Id: Iaed76612d03a05f31e24ce8ae5b25879d7721e6a
parent 8602b5f4
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import com.android.internal.annotations.VisibleForTesting;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@@ -353,16 +354,17 @@ public class CachedBluetoothDeviceManager {
    public synchronized void onDeviceUnpaired(CachedBluetoothDevice device) {
        device.setGroupId(BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
        CachedBluetoothDevice mainDevice = mCsipDeviceManager.findMainDevice(device);
        final Set<CachedBluetoothDevice> memberDevices = device.getMemberDevice();
        // Should iterate through the cloned set to avoid ConcurrentModificationException
        final Set<CachedBluetoothDevice> memberDevices = new HashSet<>(device.getMemberDevice());
        if (!memberDevices.isEmpty()) {
            // Main device is unpaired, to unpair the member device
            // Main device is unpaired, also unpair the member devices
            for (CachedBluetoothDevice memberDevice : memberDevices) {
                memberDevice.unpair();
                memberDevice.setGroupId(BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
                device.removeMemberDevice(memberDevice);
            }
        } else if (mainDevice != null) {
            // the member device unpaired, to unpair main device
            // Member device is unpaired, also unpair the main device
            mainDevice.unpair();
        }
        mainDevice = mHearingAidDeviceManager.findMainDevice(device);