diff options
| author | 2015-04-24 14:50:08 +0000 | |
|---|---|---|
| committer | 2015-04-24 14:50:09 +0000 | |
| commit | f74a212ffbdfdf39de128682ec174a9ee1403a9e (patch) | |
| tree | 96340ff650ab07bd9cc49bd7ba80093b1321cf71 | |
| parent | c552da4324a45548a9cf90e1013d01dc95cf5c20 (diff) | |
| parent | 8c3dc85de5d6c2ab15a5d9a43feefe608df3cb35 (diff) | |
Merge "AudioService: Fix mConnectedDevices iteration issues."
| -rw-r--r-- | services/core/java/com/android/server/audio/AudioService.java | 45 |
1 files changed, 26 insertions, 19 deletions
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 9a30f0dd8371..6b56279354ba 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -86,6 +86,8 @@ import android.provider.Settings; import android.provider.Settings.System; import android.telecom.TelecomManager; import android.text.TextUtils; +import android.util.ArrayMap; +import android.util.ArraySet; import android.util.Log; import android.util.MathUtils; import android.util.Slog; @@ -110,10 +112,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; -import java.util.Map; import java.util.NoSuchElementException; import java.util.Objects; -import java.util.Set; /** * The implementation of the volume manager service. @@ -407,8 +407,7 @@ public class AudioService extends IAudioService.Stub { return "0x" + Integer.toHexString(device) + ":" + deviceAddress; } - private final HashMap<String, DeviceListSpec> mConnectedDevices = - new HashMap<String, DeviceListSpec>(); + private final ArrayMap<String, DeviceListSpec> mConnectedDevices = new ArrayMap<>(); // Forced device usage for communications private int mForcedUseForComm; @@ -2830,16 +2829,22 @@ public class AudioService extends IAudioService.Stub { } } public void onServiceDisconnected(int profile) { + ArraySet<String> toRemove = null; switch (profile) { case BluetoothProfile.A2DP: synchronized (mConnectedDevices) { synchronized (mA2dpAvrcpLock) { // Disconnect ALL DEVICE_OUT_BLUETOOTH_A2DP devices - for(Map.Entry<String, DeviceListSpec> entry - : mConnectedDevices.entrySet()) { - DeviceListSpec deviceSpec = entry.getValue(); + for (int i = 0; i < mConnectedDevices.size(); i++) { + DeviceListSpec deviceSpec = mConnectedDevices.valueAt(i); if (deviceSpec.mDeviceType == AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP) { - makeA2dpDeviceUnavailableNow(deviceSpec.mDeviceAddress); + toRemove = toRemove != null ? toRemove : new ArraySet<String>(); + toRemove.add(deviceSpec.mDeviceAddress); + } + } + if (toRemove != null) { + for (int i = 0; i < toRemove.size(); i++) { + makeA2dpDeviceUnavailableNow(toRemove.valueAt(i)); } } } @@ -2849,11 +2854,16 @@ public class AudioService extends IAudioService.Stub { case BluetoothProfile.A2DP_SINK: synchronized (mConnectedDevices) { // Disconnect ALL DEVICE_IN_BLUETOOTH_A2DP devices - for(Map.Entry<String, DeviceListSpec> entry - : mConnectedDevices.entrySet()) { - DeviceListSpec deviceSpec = entry.getValue(); + for(int i = 0; i < mConnectedDevices.size(); i++) { + DeviceListSpec deviceSpec = mConnectedDevices.valueAt(i); if (deviceSpec.mDeviceType == AudioSystem.DEVICE_IN_BLUETOOTH_A2DP) { - makeA2dpSrcUnavailable(deviceSpec.mDeviceAddress); + toRemove = toRemove != null ? toRemove : new ArraySet<String>(); + toRemove.add(deviceSpec.mDeviceAddress); + } + } + if (toRemove != null) { + for (int i = 0; i < toRemove.size(); i++) { + makeA2dpSrcUnavailable(toRemove.valueAt(i)); } } } @@ -4147,11 +4157,8 @@ public class AudioService extends IAudioService.Stub { // Restore device connection states synchronized (mConnectedDevices) { - Set set = mConnectedDevices.entrySet(); - Iterator i = set.iterator(); - while (i.hasNext()) { - Map.Entry device = (Map.Entry)i.next(); - DeviceListSpec spec = (DeviceListSpec)device.getValue(); + for (int i = 0; i < mConnectedDevices.size(); i++) { + DeviceListSpec spec = mConnectedDevices.valueAt(i); AudioSystem.setDeviceConnectionState( spec.mDeviceType, AudioSystem.DEVICE_STATE_AVAILABLE, @@ -4600,8 +4607,8 @@ public class AudioService extends IAudioService.Stub { int delay = 0; if ((state == 0) && ((device & mBecomingNoisyIntentDevices) != 0)) { int devices = 0; - for (String key : mConnectedDevices.keySet()) { - int dev = mConnectedDevices.get(key).mDeviceType; + for (int i = 0; i < mConnectedDevices.size(); i++) { + int dev = mConnectedDevices.valueAt(i).mDeviceType; if (((dev & AudioSystem.DEVICE_BIT_IN) == 0) && ((dev & mBecomingNoisyIntentDevices) != 0)) { devices |= dev; |