diff options
| author | 2024-03-26 15:26:30 +0800 | |
|---|---|---|
| committer | 2024-03-26 15:26:30 +0800 | |
| commit | 1853357fbe7cf0b690df5e1f6eaab83d2db2d74c (patch) | |
| tree | f524a20d939900d0fda79ce5ac2851d2443e7904 | |
| parent | cab0c542fa90ab6c530820c3d45c054b4170e657 (diff) | |
MediaSessionRecord: add synchronize control for modification of mControllerCallbackHolders
// ArrayIndexOutOfBoundsException thrown when unregisterCallback()
03-13 18:57:16.455 2112 6787 E JavaBinder: *** Uncaught remote exception! Exceptions are not yet supported across processes. Client PID 3726 UID 1000.
03-13 18:57:16.455 2112 6787 E JavaBinder: java.lang.ArrayIndexOutOfBoundsException: length=0; index=1
03-13 18:57:16.455 2112 6787 E JavaBinder: at java.util.concurrent.CopyOnWriteArrayList.elementAt(CopyOnWriteArrayList.java:389)
03-13 18:57:16.455 2112 6787 E JavaBinder: at java.util.concurrent.CopyOnWriteArrayList.remove(CopyOnWriteArrayList.java:482)
03-13 18:57:16.455 2112 6787 E JavaBinder: at com.android.server.media.MediaSessionRecord$ControllerStub.unregisterCallback(MediaSessionRecord.java:1714)
03-13 18:57:16.455 2112 6787 E JavaBinder: at android.media.session.ISessionController$Stub.onTransact(ISessionController.java:394)
03-13 18:57:16.455 2112 6787 E JavaBinder: at android.os.Binder.execTransactInternal(Binder.java:1351)
03-13 18:57:16.455 2112 6787 E JavaBinder: at android.os.Binder.execTransact(Binder.java:1282)
Change-Id: I02c3011ac8d27171016dd15ce7dbbadff4a2bb65
Signed-off-by: wumin3 <wumin3@xiaomi.com>
| -rw-r--r-- | services/core/java/com/android/server/media/MediaSessionRecord.java | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java index 994d3ca1124f..6f8a46be089f 100644 --- a/services/core/java/com/android/server/media/MediaSessionRecord.java +++ b/services/core/java/com/android/server/media/MediaSessionRecord.java @@ -786,7 +786,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR } } if (deadCallbackHolders != null) { - mControllerCallbackHolders.removeAll(deadCallbackHolders); + removeControllerHoldersSafely(deadCallbackHolders); } } @@ -813,7 +813,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR } } if (deadCallbackHolders != null) { - mControllerCallbackHolders.removeAll(deadCallbackHolders); + removeControllerHoldersSafely(deadCallbackHolders); } } @@ -848,7 +848,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR } } if (deadCallbackHolders != null) { - mControllerCallbackHolders.removeAll(deadCallbackHolders); + removeControllerHoldersSafely(deadCallbackHolders); } } @@ -875,7 +875,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR } } if (deadCallbackHolders != null) { - mControllerCallbackHolders.removeAll(deadCallbackHolders); + removeControllerHoldersSafely(deadCallbackHolders); } } @@ -902,7 +902,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR } } if (deadCallbackHolders != null) { - mControllerCallbackHolders.removeAll(deadCallbackHolders); + removeControllerHoldersSafely(deadCallbackHolders); } } @@ -929,7 +929,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR } } if (deadCallbackHolders != null) { - mControllerCallbackHolders.removeAll(deadCallbackHolders); + removeControllerHoldersSafely(deadCallbackHolders); } } @@ -954,7 +954,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR } } if (deadCallbackHolders != null) { - mControllerCallbackHolders.removeAll(deadCallbackHolders); + removeControllerHoldersSafely(deadCallbackHolders); } } @@ -979,7 +979,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR } } // After notifying clear all listeners - mControllerCallbackHolders.clear(); + removeControllerHoldersSafely(null); } private PlaybackState getStateWithUpdatedPosition() { @@ -1027,6 +1027,17 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR return -1; } + private void removeControllerHoldersSafely( + Collection<ISessionControllerCallbackHolder> holders) { + synchronized (mLock) { + if (holders == null) { + mControllerCallbackHolders.clear(); + } else { + mControllerCallbackHolders.removeAll(holders); + } + } + } + private PlaybackInfo getVolumeAttributes() { int volumeType; AudioAttributes attributes; |