Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 95c783e2 authored by Jaewan Kim's avatar Jaewan Kim
Browse files

MediaSessionManager: Use Executor instead of Handler

Bug: 138648566
Test: Build
Change-Id: I89a612cb1408dfb2cc4f624c7e0f8c8a55e0a732
parent f80171ef
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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);
+27 −19
Original line number Diff line number Diff line
@@ -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));
                }
            }