Loading services/core/java/com/android/server/media/MediaSessionService.java +5 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 { Loading services/core/java/com/android/server/media/MediaSessionStack.java +39 −12 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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()); Loading Loading @@ -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); Loading Loading @@ -189,22 +192,46 @@ 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) { updateMediaButtonSession(null); return; 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 (mediaButtonSession != mMediaButtonSession && !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); } } else { updateMediaButtonSessionIfNeeded(); } } /** * Find the media button session with the given {@param uid}. * If the app has multiple media sessions, the media session whose playback state is not null Loading Loading @@ -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( Loading Loading
services/core/java/com/android/server/media/MediaSessionService.java +5 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 { Loading
services/core/java/com/android/server/media/MediaSessionStack.java +39 −12 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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()); Loading Loading @@ -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); Loading Loading @@ -189,22 +192,46 @@ 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) { updateMediaButtonSession(null); return; 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 (mediaButtonSession != mMediaButtonSession && !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); } } else { updateMediaButtonSessionIfNeeded(); } } /** * Find the media button session with the given {@param uid}. * If the app has multiple media sessions, the media session whose playback state is not null Loading Loading @@ -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( Loading