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

Commit 16a56909 authored by Stanley Tng's avatar Stanley Tng
Browse files

Fixed ConcurrentModificationException with HearingAids profile

Prevent ConcurrentModificationException crash when traversing the
mCachedDevices list by removing entries outside of the loop.

Bug: 78357837
Test: Runs ROBOTEST_FILTER=CachedBluetoothDeviceManagerTest make -j40 RunSettingsLibRoboTests
Change-Id: I27db2dc94a7d0108e9b848d187d4e5bc9f5b567c
parent 12a6cd74
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -27,8 +27,10 @@ import com.android.internal.annotations.VisibleForTesting;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Objects;

/**
@@ -191,6 +193,7 @@ public class CachedBluetoothDeviceManager {
            log("updateHearingAidsDevices: getHearingAidProfile() is null");
            return;
        }
        final Set<Long> syncIdChangedSet = new HashSet<Long>();
        for (CachedBluetoothDevice cachedDevice : mCachedDevices) {
            if (cachedDevice.getHiSyncId() != BluetoothHearingAid.HI_SYNC_ID_INVALID) {
                continue;
@@ -200,9 +203,12 @@ public class CachedBluetoothDeviceManager {

            if (newHiSyncId != BluetoothHearingAid.HI_SYNC_ID_INVALID) {
                cachedDevice.setHiSyncId(newHiSyncId);
                onHiSyncIdChanged(newHiSyncId);
                syncIdChangedSet.add(newHiSyncId);
            }
        }
        for (Long syncId : syncIdChangedSet) {
            onHiSyncIdChanged(syncId);
        }
    }

    /**
+4 −1
Original line number Diff line number Diff line
@@ -486,11 +486,14 @@ public class CachedBluetoothDeviceManagerTest {
        doAnswer((invocation) -> mHearingAidProfile).when(mLocalProfileManager)
            .getHearingAidProfile();
        doAnswer((invocation) -> HISYNCID1).when(mHearingAidProfile).getHiSyncId(mDevice1);
        doAnswer((invocation) -> HISYNCID1).when(mHearingAidProfile).getHiSyncId(mDevice2);
        mCachedDeviceManager.mCachedDevices.add(mCachedDevice1);
        mCachedDeviceManager.mCachedDevices.add(mCachedDevice2);
        mCachedDeviceManager.updateHearingAidsDevices(mLocalProfileManager);

        // Assert that the mCachedDevice1 has an updated HiSyncId.
        // Assert that the mCachedDevice1 and mCachedDevice2 have an updated HiSyncId.
        assertThat(mCachedDevice1.getHiSyncId()).isEqualTo(HISYNCID1);
        assertThat(mCachedDevice2.getHiSyncId()).isEqualTo(HISYNCID1);
    }

    /**