Merge "Fix finding media button session" into rvc-dev
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user