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
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index 5757b1a..f3ae53f 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 @@
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 @@
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 bd98b9c..402355a 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 @@
// 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 @@
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 @@
}
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 @@
return mMediaButtonSession;
}
- private void updateMediaButtonSession(MediaSessionRecordImpl newMediaButtonSession) {
+ public void updateMediaButtonSession(MediaSessionRecordImpl newMediaButtonSession) {
MediaSessionRecordImpl oldMediaButtonSession = mMediaButtonSession;
mMediaButtonSession = newMediaButtonSession;
mOnMediaButtonSessionChangedListener.onMediaButtonSessionChanged(