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
This commit is contained in:
Stanley Tng
2018-04-20 11:54:36 -07:00
parent 12a6cd7457
commit 16a56909a6
2 changed files with 11 additions and 2 deletions

View File

@@ -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);
}
}
/**

View File

@@ -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);
}
/**