From 67a0c75c62a737101e1b55142c1f19b4a8991a9d Mon Sep 17 00:00:00 2001 From: Jaewan Kim Date: Fri, 17 Apr 2020 22:11:08 +0900 Subject: [PATCH] Fix finding media button session Problem was cuased by previous CL 9fa9b10a988d [Media ML] Add get/setSessionPolicies APIs Bug: 152252136 Test: Manually checked following scenario Step 1) Play YTM Step 2) Play GPM Step 3) Play YTM via notification panel Change-Id: I62ce38d1c389b2a98bc536a3b232461832db3ee7 --- .../server/media/MediaSessionService.java | 6 ++- .../server/media/MediaSessionStack.java | 53 ++++++++++++++----- 2 files changed, 45 insertions(+), 14 deletions(-) diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index 5757b1a9697b6..f3ae53f8b4c4f 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -165,6 +165,10 @@ public class MediaSessionService extends SystemService implements Monitor { mAudioPlayerStateMonitor = AudioPlayerStateMonitor.getInstance(mContext); mAudioPlayerStateMonitor.registerListener( (config, isRemoved) -> { + if (DEBUG) { + Log.d(TAG, "Audio playback is changed, config=" + config + + ", removed=" + isRemoved); + } if (config.getPlayerType() == AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL) { return; @@ -1993,7 +1997,7 @@ public class MediaSessionService extends SystemService implements Monitor { FullUserRecord user = getFullUserRecordLocked(record.getUserId()); if (record != null && user != null) { record.setSessionPolicies(policies); - user.mPriorityStack.updateMediaButtonSessionIfNeeded(); + user.mPriorityStack.updateMediaButtonSessionBySessionPolicyChange(record); } } } finally { diff --git a/services/core/java/com/android/server/media/MediaSessionStack.java b/services/core/java/com/android/server/media/MediaSessionStack.java index bd98b9cb64b21..402355a0161ac 100644 --- a/services/core/java/com/android/server/media/MediaSessionStack.java +++ b/services/core/java/com/android/server/media/MediaSessionStack.java @@ -16,6 +16,8 @@ package com.android.server.media; +import static com.android.server.media.SessionPolicyProvider.SESSION_POLICY_IGNORE_BUTTON_SESSION; + import android.media.Session2Token; import android.media.session.MediaSession; import android.os.Debug; @@ -102,6 +104,7 @@ class MediaSessionStack { // When the media button session is removed, nullify the media button session and do not // search for the alternative media session within the app. It's because the alternative // media session might be a dummy which isn't able to handle the media key events. + // TODO(b/154456172): Make this decision unaltered by non-media app's playback. updateMediaButtonSession(null); } clearCache(record.getUserId()); @@ -158,7 +161,7 @@ class MediaSessionStack { findMediaButtonSession(mMediaButtonSession.getUid()); if (newMediaButtonSession != mMediaButtonSession && (newMediaButtonSession.getSessionPolicies() - & SessionPolicyProvider.SESSION_POLICY_IGNORE_BUTTON_SESSION) == 0) { + & SESSION_POLICY_IGNORE_BUTTON_SESSION) == 0) { // Check if the policy states that this session should not be updated as a media // button session. updateMediaButtonSession(newMediaButtonSession); @@ -189,19 +192,43 @@ class MediaSessionStack { } IntArray audioPlaybackUids = mAudioPlayerStateMonitor.getSortedAudioPlaybackClientUids(); for (int i = 0; i < audioPlaybackUids.size(); i++) { - MediaSessionRecordImpl mediaButtonSession = - findMediaButtonSession(audioPlaybackUids.get(i)); - if (mediaButtonSession == null) continue; - boolean ignoreButtonSession = (mediaButtonSession.getSessionPolicies() - & SessionPolicyProvider.SESSION_POLICY_IGNORE_BUTTON_SESSION) != 0; - if (mediaButtonSession == mMediaButtonSession && ignoreButtonSession) { + int audioPlaybackUid = audioPlaybackUids.get(i); + MediaSessionRecordImpl mediaButtonSession = findMediaButtonSession(audioPlaybackUid); + if (mediaButtonSession == null) { + if (DEBUG) { + Log.d(TAG, "updateMediaButtonSessionIfNeeded, skipping uid=" + + audioPlaybackUid); + } + // Ignore if the lastly played app isn't a media app (i.e. has no media session) + continue; + } + boolean ignoreButtonSession = + (mediaButtonSession.getSessionPolicies() + & SESSION_POLICY_IGNORE_BUTTON_SESSION) != 0; + if (DEBUG) { + Log.d(TAG, "updateMediaButtonSessionIfNeeded, checking uid=" + audioPlaybackUid + + ", mediaButtonSession=" + mediaButtonSession + + ", ignoreButtonSession=" + ignoreButtonSession); + } + if (!ignoreButtonSession) { + mAudioPlayerStateMonitor.cleanUpAudioPlaybackUids(mediaButtonSession.getUid()); + if (mediaButtonSession != mMediaButtonSession) { + updateMediaButtonSession(mediaButtonSession); + } + return; + } + } + } + + // TODO: Remove this and make updateMediaButtonSessionIfNeeded() to also cover this case. + public void updateMediaButtonSessionBySessionPolicyChange(MediaSessionRecord record) { + if ((record.getSessionPolicies() & SESSION_POLICY_IGNORE_BUTTON_SESSION) != 0) { + if (record == mMediaButtonSession) { + // TODO(b/154456172): Make this decision unaltered by non-media app's playback. updateMediaButtonSession(null); - return; - } - if (mediaButtonSession != mMediaButtonSession && !ignoreButtonSession) { - updateMediaButtonSession(mediaButtonSession); - return; } + } else { + updateMediaButtonSessionIfNeeded(); } } @@ -280,7 +307,7 @@ class MediaSessionStack { return mMediaButtonSession; } - private void updateMediaButtonSession(MediaSessionRecordImpl newMediaButtonSession) { + public void updateMediaButtonSession(MediaSessionRecordImpl newMediaButtonSession) { MediaSessionRecordImpl oldMediaButtonSession = mMediaButtonSession; mMediaButtonSession = newMediaButtonSession; mOnMediaButtonSessionChangedListener.onMediaButtonSessionChanged(