From 35c9585f5fa30ab18da8b55492e1f97cc44c4d44 Mon Sep 17 00:00:00 2001 From: christosts Date: Wed, 8 Jun 2022 16:23:18 +0000 Subject: [PATCH] Avoid using ConcurrentHashMap Use Collections.synchronizedSet() instead of creating a set from a ConcurrentHashMap because ConcurrentHashMap has a bug in APIs 21/22 that can result in lost updates. PiperOrigin-RevId: 453696565 (cherry picked from commit d506c709c9a793d751908aac879f2f85b74f7b58) --- .../java/androidx/media3/session/MediaSessionService.java | 5 +++-- .../main/java/androidx/media3/session/MediaSessionStub.java | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaSessionService.java b/libraries/session/src/main/java/androidx/media3/session/MediaSessionService.java index 0cb00a915f..d44c3d0da1 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaSessionService.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaSessionService.java @@ -43,10 +43,10 @@ import androidx.media3.session.MediaSession.ControllerInfo; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** @@ -472,7 +472,8 @@ public abstract class MediaSessionService extends Service { Context context = serviceReference.getApplicationContext(); handler = new Handler(context.getMainLooper()); mediaSessionManager = MediaSessionManager.getSessionManager(context); - pendingControllers = Collections.newSetFromMap(new ConcurrentHashMap<>()); + // ConcurrentHashMap has a bug in APIs 21-22 that can result in lost updates. + pendingControllers = Collections.synchronizedSet(new HashSet<>()); } @Override diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaSessionStub.java b/libraries/session/src/main/java/androidx/media3/session/MediaSessionStub.java index 672edf3a30..2a8bbb8b59 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaSessionStub.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaSessionStub.java @@ -83,10 +83,10 @@ import com.google.common.util.concurrent.MoreExecutors; import java.lang.ref.WeakReference; import java.util.Collections; import java.util.Deque; +import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.CancellationException; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutionException; /** @@ -109,7 +109,8 @@ import java.util.concurrent.ExecutionException; this.sessionImpl = new WeakReference<>(sessionImpl); sessionManager = MediaSessionManager.getSessionManager(sessionImpl.getContext()); connectedControllersManager = new ConnectedControllersManager<>(sessionImpl); - pendingControllers = Collections.newSetFromMap(new ConcurrentHashMap<>()); + // ConcurrentHashMap has a bug in APIs 21-22 that can result in lost updates. + pendingControllers = Collections.synchronizedSet(new HashSet<>()); } public ConnectedControllersManager getConnectedControllersManager() {