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

This commit is contained in:
Jin Seok Park
2021-02-23 07:55:49 +00:00
committed by Android (Google) Code Review
3 changed files with 60 additions and 53 deletions

View File

@@ -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);

View File

@@ -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);
}
/**

View File

@@ -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,62 +1262,61 @@ 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() {
final Context context = mContext;
if (context != null) {
ArrayList<MediaController> controllers = new ArrayList<>();
int size = tokens.size();
for (int i = 0; i < size; i++) {
controllers.add(new MediaController(context, tokens.get(i)));
}
final OnActiveSessionsChangedListener listener = mListener;
if (listener != null) {
listener.onActiveSessionsChanged(controllers);
}
}
}
});
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<>();
int size = tokens.size();
for (int i = 0; i < size; i++) {
controllers.add(new MediaController(context, tokens.get(i)));
}
final OnActiveSessionsChangedListener listener = mListener;
if (listener != null) {
listener.onActiveSessionsChanged(controllers);
}
}
}
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() {