From 2db6bcb67a7cc883e241a1e72d40e3bf1e3cac5d Mon Sep 17 00:00:00 2001 From: Jin Seok Park Date: Mon, 21 Dec 2020 23:13:53 +0900 Subject: [PATCH] Replace using integer with UserHandle for user id Official API guideline is to use UserHandle for user id to ensure type safety and avoid conflating user IDs with uids. See go/android-api-guidelines#use-userhandle Bug: 174762061 Test: build Change-Id: I1db55e19fe086544f428783898af623422d37a0d --- core/api/module-lib-current.txt | 4 +- .../wm/shell/pip/PipMediaController.java | 4 +- .../media/session/MediaSessionManager.java | 135 +++++++++--------- .../statusbar/NotificationMediaManager.java | 2 +- 4 files changed, 72 insertions(+), 73 deletions(-) diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt index ef6c8b713c2cc..bf92b34a5657f 100644 --- a/core/api/module-lib-current.txt +++ b/core/api/module-lib-current.txt @@ -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 getActiveSessionsForUser(@Nullable android.content.ComponentName, int); + method @NonNull public java.util.List 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 diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMediaController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMediaController.java index a7c34fd4465aa..d96d4d0a6a3c8 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMediaController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMediaController.java @@ -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); } /** diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java index 1fd132d00f10d..f580ea5d57de0 100644 --- a/media/java/android/media/session/MediaSessionManager.java +++ b/media/java/android/media/session/MediaSessionManager.java @@ -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 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 getActiveSessionsForUser(ComponentName notificationListener, + int userId) { ArrayList controllers = new ArrayList(); try { - List tokens = mService.getSessions(notificationListener, userId); + List 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 getSession2Tokens(int userId) { + @SuppressLint("UserHandle") + public List getSession2Tokens(@NonNull UserHandle userHandle) { + Objects.requireNonNull(userHandle, "userHandle shouldn't be null"); + return getSession2Tokens(userHandle.getIdentifier()); + + } + + private List 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); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java index bb76ac0b26bd3..ca3923f06a13f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java @@ -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 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