Merge "Replace using integer with UserHandle for user id"

This commit is contained in:
Jin Seok Park
2021-01-13 08:40:15 +00:00
committed by Android (Google) Code Review
4 changed files with 72 additions and 73 deletions

View File

@@ -108,7 +108,7 @@ package android.media.session {
}
public final class MediaSessionManager {
method public void addOnActiveSessionsChangedListener(@NonNull android.media.session.MediaSessionManager.OnActiveSessionsChangedListener, @Nullable android.content.ComponentName, int, @Nullable android.os.Handler);
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 dispatchMediaKeyEvent(@NonNull android.view.KeyEvent);
method public void dispatchMediaKeyEvent(@NonNull android.view.KeyEvent, boolean);
method public void dispatchMediaKeyEventAsSystemService(@NonNull android.view.KeyEvent);
@@ -116,7 +116,7 @@ package android.media.session {
method public void dispatchVolumeKeyEvent(@NonNull android.view.KeyEvent, int, boolean);
method public void dispatchVolumeKeyEventAsSystemService(@NonNull android.view.KeyEvent, int);
method public void dispatchVolumeKeyEventToSessionAsSystemService(@NonNull android.view.KeyEvent, @NonNull android.media.session.MediaSession.Token);
method @NonNull public java.util.List<android.media.session.MediaController> getActiveSessionsForUser(@Nullable android.content.ComponentName, int);
method @NonNull public java.util.List<android.media.session.MediaController> getActiveSessionsForUser(@Nullable android.content.ComponentName, @NonNull android.os.UserHandle);
method public void registerRemoteSessionCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.session.MediaSessionManager.RemoteSessionCallback);
method public void unregisterRemoteSessionCallback(@NonNull android.media.session.MediaSessionManager.RemoteSessionCallback);
field public static final int RESULT_MEDIA_KEY_HANDLED = 1; // 0x1

View File

@@ -138,7 +138,7 @@ public class PipMediaController {
public void onActivityPinned() {
// Once we enter PiP, try to find the active media controller for the top most activity
resolveActiveMediaController(mMediaSessionManager.getActiveSessionsForUser(null,
UserHandle.USER_CURRENT));
UserHandle.CURRENT));
}
/**
@@ -245,7 +245,7 @@ public class PipMediaController {
public void registerSessionListenerForCurrentUser() {
mMediaSessionManager.removeOnActiveSessionsChangedListener(mSessionsChangedListener);
mMediaSessionManager.addOnActiveSessionsChangedListener(mSessionsChangedListener, null,
UserHandle.USER_CURRENT, null);
UserHandle.CURRENT, null);
}
/**

View File

@@ -140,6 +140,8 @@ public final class MediaSessionManager {
@NonNull
public ISession createSession(@NonNull MediaSession.CallbackStub cbStub, @NonNull String tag,
@Nullable Bundle sessionInfo) {
Objects.requireNonNull(cbStub, "cbStub shouldn't be null");
Objects.requireNonNull(tag, "tag shouldn't be null");
try {
return mService.createSession(mContext.getPackageName(), cbStub, tag, sessionInfo,
UserHandle.myUserId());
@@ -163,9 +165,7 @@ public final class MediaSessionManager {
* @param token newly created session2 token
*/
public void notifySession2Created(@NonNull Session2Token token) {
if (token == null) {
throw new IllegalArgumentException("token shouldn't be null");
}
Objects.requireNonNull(token, "token shouldn't be null");
if (token.getType() != Session2Token.TYPE_SESSION) {
throw new IllegalArgumentException("token's type should be TYPE_SESSION");
}
@@ -209,16 +209,24 @@ public final class MediaSessionManager {
* retrieve sessions for user ids that do not belong to current process.
*
* @param notificationListener The enabled notification listener component. May be null.
* @param userId The user id to fetch sessions for.
* @param userHandle The user handle to fetch sessions for.
* @return A list of controllers for ongoing sessions.
* @hide
*/
@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
@SuppressLint("UserHandle")
public @NonNull List<MediaController> getActiveSessionsForUser(
@Nullable ComponentName notificationListener, int userId) {
@Nullable ComponentName notificationListener, @NonNull UserHandle userHandle) {
Objects.requireNonNull(userHandle, "userHandle shouldn't be null");
return getActiveSessionsForUser(notificationListener, userHandle.getIdentifier());
}
private List<MediaController> getActiveSessionsForUser(ComponentName notificationListener,
int userId) {
ArrayList<MediaController> controllers = new ArrayList<MediaController>();
try {
List<MediaSession.Token> tokens = mService.getSessions(notificationListener, userId);
List<MediaSession.Token> tokens = mService.getSessions(notificationListener,
userId);
int size = tokens.size();
for (int i = 0; i < size; i++) {
MediaController controller = new MediaController(mContext, tokens.get(i));
@@ -257,12 +265,19 @@ public final class MediaSessionManager {
* {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL} permission in order to
* retrieve session tokens for user ids that do not belong to current process.
*
* @param userId The user id to fetch sessions for.
* @param userHandle The user handle to fetch sessions for.
* @return A list of {@link Session2Token}
* @hide
*/
@NonNull
public List<Session2Token> getSession2Tokens(int userId) {
@SuppressLint("UserHandle")
public List<Session2Token> getSession2Tokens(@NonNull UserHandle userHandle) {
Objects.requireNonNull(userHandle, "userHandle shouldn't be null");
return getSession2Tokens(userHandle.getIdentifier());
}
private List<Session2Token> getSession2Tokens(int userId) {
try {
ParceledListSlice slice = mService.getSession2Tokens(userId);
return slice == null ? new ArrayList<>() : slice.getList();
@@ -324,18 +339,26 @@ public final class MediaSessionManager {
*
* @param sessionListener The listener to add.
* @param notificationListener The enabled notification listener component. May be null.
* @param userId The userId to listen for changes on.
* @param userHandle The user handle to listen for changes on.
* @param handler The handler to post updates on.
* @hide
*/
@SuppressLint({"ExecutorRegistration", "SamShouldBeLast"})
@SuppressLint({"ExecutorRegistration", "SamShouldBeLast", "UserHandle"})
@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
public void addOnActiveSessionsChangedListener(
@NonNull OnActiveSessionsChangedListener sessionListener,
@Nullable ComponentName notificationListener, int userId, @Nullable Handler handler) {
if (sessionListener == null) {
throw new IllegalArgumentException("listener may not be null");
}
@Nullable ComponentName notificationListener, @NonNull UserHandle userHandle,
@Nullable Handler handler) {
Objects.requireNonNull(userHandle, "userHandle shouldn't be null");
addOnActiveSessionsChangedListener(sessionListener, notificationListener,
userHandle.getIdentifier(), handler);
}
private void addOnActiveSessionsChangedListener(
@NonNull OnActiveSessionsChangedListener sessionListener,
@Nullable ComponentName notificationListener, int userId,
@Nullable Handler handler) {
Objects.requireNonNull(sessionListener, "sessionListener shouldn't be null");
if (handler == null) {
handler = new Handler();
}
@@ -358,15 +381,13 @@ public final class MediaSessionManager {
/**
* Stop receiving active sessions updates on the specified listener.
*
* @param listener The listener to remove.
* @param sessionListener The listener to remove.
*/
public void removeOnActiveSessionsChangedListener(
@NonNull OnActiveSessionsChangedListener listener) {
if (listener == null) {
throw new IllegalArgumentException("listener may not be null");
}
@NonNull OnActiveSessionsChangedListener sessionListener) {
Objects.requireNonNull(sessionListener, "sessionListener shouldn't be null");
synchronized (mLock) {
SessionsChangedWrapper wrapper = mListeners.remove(listener);
SessionsChangedWrapper wrapper = mListeners.remove(sessionListener);
if (wrapper != null) {
try {
mService.removeSessionsListener(wrapper.mStub);
@@ -422,17 +443,23 @@ 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 userId The userId to listen for changes on
* @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.
* @hide
*/
public void addOnSession2TokensChangedListener(int userId,
@NonNull OnSession2TokensChangedListener listener, @Nullable Handler handler) {
if (listener == null) {
throw new IllegalArgumentException("listener shouldn't be null");
}
@SuppressLint("UserHandle")
public void addOnSession2TokensChangedListener(@NonNull UserHandle userHandle,
@NonNull OnSession2TokensChangedListener listener, @NonNull Handler handler) {
Objects.requireNonNull(userHandle, "userHandle shouldn't be null");
addOnSession2TokensChangedListener(userHandle.getIdentifier(), listener, handler);
}
private void addOnSession2TokensChangedListener(int userId,
OnSession2TokensChangedListener listener, Handler handler) {
Objects.requireNonNull(handler, "handler shouldn't be null");
Objects.requireNonNull(listener, "listener shouldn't be null");
synchronized (mLock) {
if (mSession2TokensListeners.get(listener) != null) {
Log.w(TAG, "Attempted to add session listener twice, ignoring.");
@@ -462,9 +489,7 @@ public final class MediaSessionManager {
*/
public void removeOnSession2TokensChangedListener(
@NonNull OnSession2TokensChangedListener listener) {
if (listener == null) {
throw new IllegalArgumentException("listener may not be null");
}
Objects.requireNonNull(listener, "listener shouldn't be null");
final Session2TokensChangedWrapper wrapper;
synchronized (mLock) {
wrapper = mSession2TokensListeners.remove(listener);
@@ -581,9 +606,7 @@ public final class MediaSessionManager {
private void dispatchMediaKeyEventInternal(KeyEvent keyEvent, boolean asSystemService,
boolean needWakeLock) {
if (keyEvent == null) {
throw new NullPointerException("keyEvent shouldn't be null");
}
Objects.requireNonNull(keyEvent, "keyEvent shouldn't be null");
try {
mService.dispatchMediaKeyEvent(mContext.getPackageName(), asSystemService, keyEvent,
needWakeLock);
@@ -606,12 +629,8 @@ public final class MediaSessionManager {
@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
public boolean dispatchMediaKeyEventToSessionAsSystemService(@NonNull KeyEvent keyEvent,
@NonNull MediaSession.Token sessionToken) {
if (sessionToken == null) {
throw new NullPointerException("sessionToken shouldn't be null");
}
if (keyEvent == null) {
throw new NullPointerException("keyEvent shouldn't be null");
}
Objects.requireNonNull(sessionToken, "sessionToken shouldn't be null");
Objects.requireNonNull(keyEvent, "keyEvent shouldn't be null");
if (!KeyEvent.isMediaSessionKey(keyEvent.getKeyCode())) {
return false;
}
@@ -662,9 +681,7 @@ public final class MediaSessionManager {
private void dispatchVolumeKeyEventInternal(@NonNull KeyEvent keyEvent, int stream,
boolean musicOnly, boolean asSystemService) {
if (keyEvent == null) {
throw new NullPointerException("keyEvent shouldn't be null");
}
Objects.requireNonNull(keyEvent, "keyEvent shouldn't be null");
try {
mService.dispatchVolumeKeyEvent(mContext.getPackageName(), mContext.getOpPackageName(),
asSystemService, keyEvent, stream, musicOnly);
@@ -686,12 +703,8 @@ public final class MediaSessionManager {
@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
public void dispatchVolumeKeyEventToSessionAsSystemService(@NonNull KeyEvent keyEvent,
@NonNull MediaSession.Token sessionToken) {
if (sessionToken == null) {
throw new NullPointerException("sessionToken shouldn't be null");
}
if (keyEvent == null) {
throw new NullPointerException("keyEvent shouldn't be null");
}
Objects.requireNonNull(sessionToken, "sessionToken shouldn't be null");
Objects.requireNonNull(keyEvent, "keyEvent shouldn't be null");
try {
mService.dispatchVolumeKeyEventToSessionAsSystemService(mContext.getPackageName(),
mContext.getOpPackageName(), keyEvent, sessionToken);
@@ -735,9 +748,7 @@ public final class MediaSessionManager {
* {@code false} otherwise.
*/
public boolean isTrustedForMediaControl(@NonNull RemoteUserInfo userInfo) {
if (userInfo == null) {
throw new IllegalArgumentException("userInfo may not be null");
}
Objects.requireNonNull(userInfo, "userInfo shouldn't be null");
if (userInfo.getPackageName() == null) {
return false;
}
@@ -845,12 +856,8 @@ public final class MediaSessionManager {
public void addOnMediaKeyEventDispatchedListener(
@NonNull @CallbackExecutor Executor executor,
@NonNull OnMediaKeyEventDispatchedListener listener) {
if (executor == null) {
throw new NullPointerException("executor shouldn't be null");
}
if (listener == null) {
throw new NullPointerException("listener shouldn't be null");
}
Objects.requireNonNull(executor, "executor shouldn't be null");
Objects.requireNonNull(listener, "listener shouldn't be null");
synchronized (mLock) {
try {
mOnMediaKeyEventDispatchedListeners.put(listener, executor);
@@ -874,9 +881,7 @@ public final class MediaSessionManager {
@RequiresPermission(value = android.Manifest.permission.MEDIA_CONTENT_CONTROL)
public void removeOnMediaKeyEventDispatchedListener(
@NonNull OnMediaKeyEventDispatchedListener listener) {
if (listener == null) {
throw new NullPointerException("listener shouldn't be null");
}
Objects.requireNonNull(listener, "listener shouldn't be null");
synchronized (mLock) {
try {
mOnMediaKeyEventDispatchedListeners.remove(listener);
@@ -902,12 +907,8 @@ public final class MediaSessionManager {
public void addOnMediaKeyEventSessionChangedListener(
@NonNull @CallbackExecutor Executor executor,
@NonNull OnMediaKeyEventSessionChangedListener listener) {
if (executor == null) {
throw new NullPointerException("executor shouldn't be null");
}
if (listener == null) {
throw new NullPointerException("listener shouldn't be null");
}
Objects.requireNonNull(executor, "executor shouldn't be null");
Objects.requireNonNull(listener, "listener shouldn't be null");
synchronized (mLock) {
try {
mMediaKeyEventSessionChangedCallbacks.put(listener, executor);
@@ -934,9 +935,7 @@ public final class MediaSessionManager {
@RequiresPermission(value = android.Manifest.permission.MEDIA_CONTENT_CONTROL)
public void removeOnMediaKeyEventSessionChangedListener(
@NonNull OnMediaKeyEventSessionChangedListener listener) {
if (listener == null) {
throw new NullPointerException("listener shouldn't be null");
}
Objects.requireNonNull(listener, "listener shouldn't be null");
synchronized (mLock) {
try {
mMediaKeyEventSessionChangedCallbacks.remove(listener);

View File

@@ -504,7 +504,7 @@ public class NotificationMediaManager implements Dumpable {
// TODO: Should this really be for all users? It appears that inactive users
// can't have active sessions, which would mean it is fine.
final List<MediaController> sessions =
mMediaSessionManager.getActiveSessionsForUser(null, UserHandle.USER_ALL);
mMediaSessionManager.getActiveSessionsForUser(null, UserHandle.ALL);
for (MediaController aController : sessions) {
// now to see if we have one like this