summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Angela Wang <angelala@google.com> 2023-07-21 07:06:00 +0000
committer Angela Wang <angelala@google.com> 2023-08-04 03:02:17 +0000
commitdd8b54125be46b3e02f59e35f1e1a5717e146585 (patch)
tree519c05a508a129abf50035e618983952d7e5607b
parent852e73de771478aed89a9718630c2315da176c44 (diff)
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 (cherry picked from commit f7077d90fa859ed52a982f81e5758fa7d53d6e9a)
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java8
1 files changed, 5 insertions, 3 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java
index 441d3a52b97f..a6536a8c47d9 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java
@@ -29,6 +29,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;
@@ -365,16 +366,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);