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 = AudioPlayerStateMonitor.getInstance(mContext);
|
||||||
mAudioPlayerStateMonitor.registerListener(
|
mAudioPlayerStateMonitor.registerListener(
|
||||||
(config, isRemoved) -> {
|
(config, isRemoved) -> {
|
||||||
|
if (DEBUG) {
|
||||||
|
Log.d(TAG, "Audio playback is changed, config=" + config
|
||||||
|
+ ", removed=" + isRemoved);
|
||||||
|
}
|
||||||
if (config.getPlayerType()
|
if (config.getPlayerType()
|
||||||
== AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL) {
|
== AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL) {
|
||||||
return;
|
return;
|
||||||
@@ -1993,7 +1997,7 @@ public class MediaSessionService extends SystemService implements Monitor {
|
|||||||
FullUserRecord user = getFullUserRecordLocked(record.getUserId());
|
FullUserRecord user = getFullUserRecordLocked(record.getUserId());
|
||||||
if (record != null && user != null) {
|
if (record != null && user != null) {
|
||||||
record.setSessionPolicies(policies);
|
record.setSessionPolicies(policies);
|
||||||
user.mPriorityStack.updateMediaButtonSessionIfNeeded();
|
user.mPriorityStack.updateMediaButtonSessionBySessionPolicyChange(record);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package com.android.server.media;
|
package com.android.server.media;
|
||||||
|
|
||||||
|
import static com.android.server.media.SessionPolicyProvider.SESSION_POLICY_IGNORE_BUTTON_SESSION;
|
||||||
|
|
||||||
import android.media.Session2Token;
|
import android.media.Session2Token;
|
||||||
import android.media.session.MediaSession;
|
import android.media.session.MediaSession;
|
||||||
import android.os.Debug;
|
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
|
// 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
|
// 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.
|
// 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);
|
updateMediaButtonSession(null);
|
||||||
}
|
}
|
||||||
clearCache(record.getUserId());
|
clearCache(record.getUserId());
|
||||||
@@ -158,7 +161,7 @@ class MediaSessionStack {
|
|||||||
findMediaButtonSession(mMediaButtonSession.getUid());
|
findMediaButtonSession(mMediaButtonSession.getUid());
|
||||||
if (newMediaButtonSession != mMediaButtonSession
|
if (newMediaButtonSession != mMediaButtonSession
|
||||||
&& (newMediaButtonSession.getSessionPolicies()
|
&& (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
|
// Check if the policy states that this session should not be updated as a media
|
||||||
// button session.
|
// button session.
|
||||||
updateMediaButtonSession(newMediaButtonSession);
|
updateMediaButtonSession(newMediaButtonSession);
|
||||||
@@ -189,19 +192,43 @@ class MediaSessionStack {
|
|||||||
}
|
}
|
||||||
IntArray audioPlaybackUids = mAudioPlayerStateMonitor.getSortedAudioPlaybackClientUids();
|
IntArray audioPlaybackUids = mAudioPlayerStateMonitor.getSortedAudioPlaybackClientUids();
|
||||||
for (int i = 0; i < audioPlaybackUids.size(); i++) {
|
for (int i = 0; i < audioPlaybackUids.size(); i++) {
|
||||||
MediaSessionRecordImpl mediaButtonSession =
|
int audioPlaybackUid = audioPlaybackUids.get(i);
|
||||||
findMediaButtonSession(audioPlaybackUids.get(i));
|
MediaSessionRecordImpl mediaButtonSession = findMediaButtonSession(audioPlaybackUid);
|
||||||
if (mediaButtonSession == null) continue;
|
if (mediaButtonSession == null) {
|
||||||
boolean ignoreButtonSession = (mediaButtonSession.getSessionPolicies()
|
if (DEBUG) {
|
||||||
& SessionPolicyProvider.SESSION_POLICY_IGNORE_BUTTON_SESSION) != 0;
|
Log.d(TAG, "updateMediaButtonSessionIfNeeded, skipping uid="
|
||||||
if (mediaButtonSession == mMediaButtonSession && ignoreButtonSession) {
|
+ 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);
|
updateMediaButtonSession(null);
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (mediaButtonSession != mMediaButtonSession && !ignoreButtonSession) {
|
|
||||||
updateMediaButtonSession(mediaButtonSession);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
updateMediaButtonSessionIfNeeded();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -280,7 +307,7 @@ class MediaSessionStack {
|
|||||||
return mMediaButtonSession;
|
return mMediaButtonSession;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateMediaButtonSession(MediaSessionRecordImpl newMediaButtonSession) {
|
public void updateMediaButtonSession(MediaSessionRecordImpl newMediaButtonSession) {
|
||||||
MediaSessionRecordImpl oldMediaButtonSession = mMediaButtonSession;
|
MediaSessionRecordImpl oldMediaButtonSession = mMediaButtonSession;
|
||||||
mMediaButtonSession = newMediaButtonSession;
|
mMediaButtonSession = newMediaButtonSession;
|
||||||
mOnMediaButtonSessionChangedListener.onMediaButtonSessionChanged(
|
mOnMediaButtonSessionChangedListener.onMediaButtonSessionChanged(
|
||||||
|
|||||||
Reference in New Issue
Block a user