Merge "Change using Handler to using Executor" into sc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
95e716b904
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user