Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7269a247 authored by Jaewan Kim's avatar Jaewan Kim Committed by Automerger Merge Worker
Browse files

Merge "Fix finding media button session" into rvc-dev am: f8448d15 am: c1b9a5c8

Change-Id: Ibb689d8f23cddad4c407a52b6d63da022c0352c6
parents de0e5cf8 c1b9a5c8
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -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 {
+39 −12
Original line number Diff line number Diff line
@@ -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,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
@@ -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(