Merge "Fix finding media button session" into rvc-dev

This commit is contained in:
Jaewan Kim
2020-04-20 14:49:43 +00:00
committed by Android (Google) Code Review
2 changed files with 45 additions and 14 deletions

View File

@@ -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 {

View File

@@ -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(