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

Commit 95e716b9 authored by Jin Seok Park's avatar Jin Seok Park Committed by Android (Google) Code Review
Browse files

Merge "Change using Handler to using Executor" into sc-dev

parents 1284ffd3 11aee2c0
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -135,7 +135,7 @@ package android.media.session {
  }

  public final class MediaSessionManager {
    method public void addOnActiveSessionsChangedListener(@NonNull android.media.session.MediaSessionManager.OnActiveSessionsChangedListener, @Nullable android.content.ComponentName, @NonNull android.os.UserHandle, @Nullable android.os.Handler);
    method public void addOnActiveSessionsChangedListener(@Nullable android.content.ComponentName, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.media.session.MediaSessionManager.OnActiveSessionsChangedListener);
    method public void dispatchMediaKeyEvent(@NonNull android.view.KeyEvent);
    method public void dispatchMediaKeyEvent(@NonNull android.view.KeyEvent, boolean);
    method public void dispatchMediaKeyEventAsSystemService(@NonNull android.view.KeyEvent);
+5 −2
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import android.media.session.MediaController;
import android.media.session.MediaSessionManager;
import android.media.session.PlaybackState;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.UserHandle;

import androidx.annotation.Nullable;
@@ -76,6 +77,7 @@ public class PipMediaController {

    private final Context mContext;
    private final Handler mMainHandler;
    private final HandlerExecutor mHandlerExecutor;

    private final MediaSessionManager mMediaSessionManager;
    private MediaController mMediaController;
@@ -123,6 +125,7 @@ public class PipMediaController {
    public PipMediaController(Context context, Handler mainHandler) {
        mContext = context;
        mMainHandler = mainHandler;
        mHandlerExecutor = new HandlerExecutor(mMainHandler);
        IntentFilter mediaControlFilter = new IntentFilter();
        mediaControlFilter.addAction(ACTION_PLAY);
        mediaControlFilter.addAction(ACTION_PAUSE);
@@ -247,8 +250,8 @@ public class PipMediaController {
     */
    public void registerSessionListenerForCurrentUser() {
        mMediaSessionManager.removeOnActiveSessionsChangedListener(mSessionsChangedListener);
        mMediaSessionManager.addOnActiveSessionsChangedListener(mSessionsChangedListener, null,
                UserHandle.CURRENT, mMainHandler);
        mMediaSessionManager.addOnActiveSessionsChangedListener(null, UserHandle.CURRENT,
                mHandlerExecutor, mSessionsChangedListener);
    }

    /**
+54 −50
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.media.Session2Token;
import android.media.VolumeProvider;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.UserHandle;
@@ -321,7 +322,7 @@ public final class MediaSessionManager {
            @NonNull OnActiveSessionsChangedListener sessionListener,
            @Nullable ComponentName notificationListener, @Nullable Handler handler) {
        addOnActiveSessionsChangedListener(sessionListener, notificationListener,
                UserHandle.myUserId(), handler);
                UserHandle.myUserId(), handler == null ? null : new HandlerExecutor(handler));
    }

    /**
@@ -337,38 +338,40 @@ public final class MediaSessionManager {
     * {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL} permission in order to
     * add listeners for user ids that do not belong to current process.
     *
     * @param sessionListener The listener to add.
     * @param notificationListener The enabled notification listener component. May be null.
     * @param userHandle The user handle to listen for changes on.
     * @param handler The handler to post updates on.
     * @param executor The executor on which the listener should be invoked
     * @param sessionListener The listener to add.
     * @hide
     */
    @SuppressLint({"ExecutorRegistration", "SamShouldBeLast", "UserHandle"})
    @SuppressLint("UserHandle")
    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
    public void addOnActiveSessionsChangedListener(
            @NonNull OnActiveSessionsChangedListener sessionListener,
            @Nullable ComponentName notificationListener, @NonNull UserHandle userHandle,
            @Nullable Handler handler) {
            @Nullable ComponentName notificationListener,
            @NonNull UserHandle userHandle, @NonNull Executor executor,
            @NonNull OnActiveSessionsChangedListener sessionListener) {
        Objects.requireNonNull(userHandle, "userHandle shouldn't be null");
        Objects.requireNonNull(executor, "executor shouldn't be null");
        addOnActiveSessionsChangedListener(sessionListener, notificationListener,
                userHandle.getIdentifier(), handler);
                userHandle.getIdentifier(), executor);
    }

    private void addOnActiveSessionsChangedListener(
            @NonNull OnActiveSessionsChangedListener sessionListener,
            @Nullable ComponentName notificationListener, int userId,
            @Nullable Handler handler) {
            @Nullable Executor executor) {
        Objects.requireNonNull(sessionListener, "sessionListener shouldn't be null");
        if (handler == null) {
            handler = new Handler();
        if (executor == null) {
            executor = new HandlerExecutor(new Handler());
        }

        synchronized (mLock) {
            if (mListeners.get(sessionListener) != null) {
                Log.w(TAG, "Attempted to add session listener twice, ignoring.");
                return;
            }
            SessionsChangedWrapper wrapper = new SessionsChangedWrapper(mContext, sessionListener,
                    handler);
                    executor);
            try {
                mService.addSessionsListener(wrapper.mStub, notificationListener, userId);
                mListeners.put(sessionListener, wrapper);
@@ -412,7 +415,8 @@ public final class MediaSessionManager {
     */
    public void addOnSession2TokensChangedListener(
            @NonNull OnSession2TokensChangedListener listener) {
        addOnSession2TokensChangedListener(UserHandle.myUserId(), listener, new Handler());
        addOnSession2TokensChangedListener(UserHandle.myUserId(), listener,
                new HandlerExecutor(new Handler()));
    }

    /**
@@ -428,7 +432,9 @@ public final class MediaSessionManager {
     */
    public void addOnSession2TokensChangedListener(
            @NonNull OnSession2TokensChangedListener listener, @NonNull Handler handler) {
        addOnSession2TokensChangedListener(UserHandle.myUserId(), listener, handler);
        Objects.requireNonNull(handler, "handler shouldn't be null");
        addOnSession2TokensChangedListener(UserHandle.myUserId(), listener,
                new HandlerExecutor(handler));
    }

    /**
@@ -445,20 +451,19 @@ public final class MediaSessionManager {
     *
     * @param userHandle The userHandle to listen for changes on
     * @param listener The listener to add
     * @param handler The handler to call listener on. If {@code null}, calling thread's looper will
     *                be used.
     * @param executor The executor on which the listener should be invoked
     * @hide
     */
    @SuppressLint("UserHandle")
    public void addOnSession2TokensChangedListener(@NonNull UserHandle userHandle,
            @NonNull OnSession2TokensChangedListener listener, @NonNull Handler handler) {
            @NonNull OnSession2TokensChangedListener listener, @NonNull Executor executor) {
        Objects.requireNonNull(userHandle, "userHandle shouldn't be null");
        addOnSession2TokensChangedListener(userHandle.getIdentifier(), listener, handler);
        Objects.requireNonNull(executor, "executor shouldn't be null");
        addOnSession2TokensChangedListener(userHandle.getIdentifier(), listener, executor);
    }

    private void addOnSession2TokensChangedListener(int userId,
            OnSession2TokensChangedListener listener, Handler handler) {
        Objects.requireNonNull(handler, "handler shouldn't be null");
            OnSession2TokensChangedListener listener, Executor executor) {
        Objects.requireNonNull(listener, "listener shouldn't be null");
        synchronized (mLock) {
            if (mSession2TokensListeners.get(listener) != null) {
@@ -466,7 +471,7 @@ public final class MediaSessionManager {
                return;
            }
            Session2TokensChangedWrapper wrapper =
                    new Session2TokensChangedWrapper(listener, handler);
                    new Session2TokensChangedWrapper(listener, executor);
            try {
                mService.addSession2TokensListener(wrapper.getStub(), userId);
                mSession2TokensListeners.put(listener, wrapper);
@@ -847,7 +852,7 @@ public final class MediaSessionManager {
    /**
     * Add a {@link OnMediaKeyEventDispatchedListener}.
     *
     * @param executor The executor on which the callback should be invoked
     * @param executor The executor on which the listener should be invoked
     * @param listener A {@link OnMediaKeyEventDispatchedListener}.
     * @hide
     */
@@ -898,7 +903,7 @@ public final class MediaSessionManager {
    /**
     * Add a {@link OnMediaKeyEventDispatchedListener}.
     *
     * @param executor The executor on which the callback should be invoked
     * @param executor The executor on which the listener should be invoked
     * @param listener A {@link OnMediaKeyEventSessionChangedListener}.
     * @hide
     */
@@ -1257,23 +1262,26 @@ public final class MediaSessionManager {
    private static final class SessionsChangedWrapper {
        private Context mContext;
        private OnActiveSessionsChangedListener mListener;
        private Handler mHandler;
        private Executor mExecutor;

        public SessionsChangedWrapper(Context context, OnActiveSessionsChangedListener listener,
                Handler handler) {
                Executor executor) {
            mContext = context;
            mListener = listener;
            mHandler = handler;
            mExecutor = executor;
        }

        private final IActiveSessionsListener.Stub mStub = new IActiveSessionsListener.Stub() {
            @Override
            public void onActiveSessionsChanged(final List<MediaSession.Token> tokens) {
                final Handler handler = mHandler;
                if (handler != null) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                if (mExecutor != null) {
                    final Executor executor = mExecutor;
                    executor.execute(() -> callOnActiveSessionsChangedListener(tokens));
                }
            }
        };

        private void callOnActiveSessionsChangedListener(final List<MediaSession.Token> tokens) {
            final Context context = mContext;
            if (context != null) {
                ArrayList<MediaController> controllers = new ArrayList<>();
@@ -1287,32 +1295,28 @@ public final class MediaSessionManager {
                }
            }
        }
                    });
                }
            }
        };

        private void release() {
            mListener = null;
            mContext = null;
            mHandler = null;
            mExecutor = null;
        }
    }

    private static final class Session2TokensChangedWrapper {
        private final OnSession2TokensChangedListener mListener;
        private final Handler mHandler;
        private final Executor mExecutor;
        private final ISession2TokensListener.Stub mStub =
                new ISession2TokensListener.Stub() {
                    @Override
                    public void onSession2TokensChanged(final List<Session2Token> tokens) {
                        mHandler.post(() -> mListener.onSession2TokensChanged(tokens));
                        mExecutor.execute(() -> mListener.onSession2TokensChanged(tokens));
                    }
                };

        Session2TokensChangedWrapper(OnSession2TokensChangedListener listener, Handler handler) {
        Session2TokensChangedWrapper(OnSession2TokensChangedListener listener, Executor executor) {
            mListener = listener;
            mHandler = (handler == null) ? new Handler() : new Handler(handler.getLooper());
            mExecutor = executor;
        }

        public ISession2TokensListener.Stub getStub() {