diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2019-08-06 22:17:19 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2019-08-06 22:17:19 +0000 |
commit | 115eead20aca565ea7b30703c29eac81e4f19302 (patch) | |
tree | b6cd5d07c28efac9065224da1b40733aad971130 | |
parent | e185ac2b8b582af3422c0762ab4b202aaa98cdb5 (diff) | |
parent | 95c783e2d2b4fe061dc6b128301174f2115ec1d0 (diff) |
Merge "MediaSessionManager: Use Executor instead of Handler"
-rw-r--r-- | api/system-current.txt | 2 | ||||
-rw-r--r-- | media/java/android/media/session/MediaSessionManager.java | 46 |
2 files changed, 28 insertions, 20 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index b4e655489865..18e30bac8dfc 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -3693,7 +3693,7 @@ package android.media.audiopolicy { package android.media.session { public final class MediaSessionManager { - method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void registerCallback(@NonNull android.media.session.MediaSessionManager.Callback, @Nullable android.os.Handler); + method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void registerCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.session.MediaSessionManager.Callback); method @RequiresPermission(android.Manifest.permission.SET_MEDIA_KEY_LISTENER) public void setOnMediaKeyListener(android.media.session.MediaSessionManager.OnMediaKeyListener, @Nullable android.os.Handler); method @RequiresPermission(android.Manifest.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER) public void setOnVolumeKeyLongPressListener(android.media.session.MediaSessionManager.OnVolumeKeyLongPressListener, @Nullable android.os.Handler); method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void unregisterCallback(@NonNull android.media.session.MediaSessionManager.Callback); diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java index 1f2283c6381f..6fd3342fc84e 100644 --- a/media/java/android/media/session/MediaSessionManager.java +++ b/media/java/android/media/session/MediaSessionManager.java @@ -16,6 +16,7 @@ package android.media.session; +import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; @@ -31,6 +32,7 @@ import android.media.MediaSession2; import android.media.Session2Token; import android.os.Bundle; import android.os.Handler; +import android.os.HandlerExecutor; import android.os.IBinder; import android.os.RemoteException; import android.os.ResultReceiver; @@ -50,6 +52,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.concurrent.Executor; /** * Provides support for interacting with {@link MediaSession media sessions} @@ -86,7 +89,7 @@ public final class MediaSessionManager { @GuardedBy("mLock") private final CallbackStub mCbStub = new CallbackStub(); @GuardedBy("mLock") - private final Map<Callback, Handler> mCallbacks = new HashMap<>(); + private final Map<Callback, Executor> mCallbacks = new HashMap<>(); @GuardedBy("mLock") private MediaSession.Token mCurMediaButtonSession; @GuardedBy("mLock") @@ -765,13 +768,16 @@ public final class MediaSessionManager { */ // TODO: Remove this method once Bluetooth app stop calling it. public void setCallback(@Nullable Callback callback, @Nullable Handler handler) { + if (handler == null) { + handler = new Handler(); + } synchronized (mLock) { if (mLegacyCallback != null) { unregisterCallback(mLegacyCallback); } mLegacyCallback = callback; if (callback != null) { - registerCallback(callback, handler); + registerCallback(new HandlerExecutor(handler), callback); } } } @@ -779,27 +785,29 @@ public final class MediaSessionManager { /** * Register a {@link Callback}. * + * @param executor The executor on which the callback should be invoked * @param callback A {@link Callback}. - * @param handler The handler on which the callback should be invoked, or {@code null} - * if the callback should be invoked on the calling thread's looper. * @hide */ @SystemApi @RequiresPermission(value = android.Manifest.permission.MEDIA_CONTENT_CONTROL) - public void registerCallback(@NonNull Callback callback, @Nullable Handler handler) { + public void registerCallback(@NonNull @CallbackExecutor Executor executor, + @NonNull Callback callback) { + if (executor == null) { + throw new NullPointerException("executor shouldn't be null"); + } if (callback == null) { throw new NullPointerException("callback shouldn't be null"); } synchronized (mLock) { try { - if (handler == null) { - handler = new Handler(); - } - mCallbacks.put(callback, handler); + mCallbacks.put(callback, executor); if (mCurMediaButtonSession != null) { - handler.post(() -> callback.onAddressedPlayerChanged(mCurMediaButtonSession)); + executor.execute( + () -> callback.onAddressedPlayerChanged(mCurMediaButtonSession)); } else if (mCurMediaButtonReceiver != null) { - handler.post(() -> callback.onAddressedPlayerChanged(mCurMediaButtonReceiver)); + executor.execute( + () -> callback.onAddressedPlayerChanged(mCurMediaButtonReceiver)); } if (mCallbacks.size() == 1) { @@ -1147,8 +1155,8 @@ public final class MediaSessionManager { public void onMediaKeyEventDispatchedToMediaSession(KeyEvent event, MediaSession.Token sessionToken) { synchronized (mLock) { - for (Map.Entry<Callback, Handler> e : mCallbacks.entrySet()) { - e.getValue().post( + for (Map.Entry<Callback, Executor> e : mCallbacks.entrySet()) { + e.getValue().execute( () -> e.getKey().onMediaKeyEventDispatched(event, sessionToken)); } } @@ -1158,8 +1166,8 @@ public final class MediaSessionManager { public void onMediaKeyEventDispatchedToMediaButtonReceiver(KeyEvent event, ComponentName mediaButtonReceiver) { synchronized (mLock) { - for (Map.Entry<Callback, Handler> e : mCallbacks.entrySet()) { - e.getValue().post( + for (Map.Entry<Callback, Executor> e : mCallbacks.entrySet()) { + e.getValue().execute( () -> e.getKey().onMediaKeyEventDispatched(event, mediaButtonReceiver)); } } @@ -1170,8 +1178,8 @@ public final class MediaSessionManager { synchronized (mLock) { mCurMediaButtonSession = sessionToken; mCurMediaButtonReceiver = null; - for (Map.Entry<Callback, Handler> e : mCallbacks.entrySet()) { - e.getValue().post(() -> e.getKey().onAddressedPlayerChanged(sessionToken)); + for (Map.Entry<Callback, Executor> e : mCallbacks.entrySet()) { + e.getValue().execute(() -> e.getKey().onAddressedPlayerChanged(sessionToken)); } } } @@ -1182,8 +1190,8 @@ public final class MediaSessionManager { synchronized (mLock) { mCurMediaButtonSession = null; mCurMediaButtonReceiver = mediaButtonReceiver; - for (Map.Entry<Callback, Handler> e : mCallbacks.entrySet()) { - e.getValue().post(() -> e.getKey().onAddressedPlayerChanged( + for (Map.Entry<Callback, Executor> e : mCallbacks.entrySet()) { + e.getValue().execute(() -> e.getKey().onAddressedPlayerChanged( mediaButtonReceiver)); } } |