From cc19772447ae2f14a68371a005b4136a29e89437 Mon Sep 17 00:00:00 2001 From: Sungsoo Lim Date: Fri, 12 Apr 2019 19:10:56 +0900 Subject: [PATCH] Tweak the selection of media button session Key events were sent to the session which the lastly activated player app has. After this CL, key events will be sent to a session 1) which the app making sounds has, or 2) which the lastly activated player app has. Bug: 113240750 Test: manually Change-Id: I6ac128458fd0d30c9e0ed3382939ca9e4e581e22 --- .../server/media/AudioPlayerStateMonitor.java | 23 ++++++++++++++++++- .../server/media/MediaSessionServiceImpl.java | 2 +- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/media/AudioPlayerStateMonitor.java b/services/core/java/com/android/server/media/AudioPlayerStateMonitor.java index 603d7cfb45250..eb706d7791d3f 100644 --- a/services/core/java/com/android/server/media/AudioPlayerStateMonitor.java +++ b/services/core/java/com/android/server/media/AudioPlayerStateMonitor.java @@ -142,7 +142,8 @@ class AudioPlayerStateMonitor { /** * Returns the sorted list of UIDs that have had active audio playback. (i.e. playing an - * audio/video) The UID whose audio playback becomes active at the last comes first. + * audio/video) The UID whose audio is currently playing comes first, then the UID whose audio + * playback becomes active at the last comes next. */ public IntArray getSortedAudioPlaybackClientUids() { IntArray sortedAudioPlaybackClientUids = new IntArray(); @@ -253,6 +254,26 @@ class AudioPlayerStateMonitor { mSortedAudioPlaybackClientUids.add(0, uid); } } + + if (mActiveAudioUids.size() > 0 + && !mActiveAudioUids.contains(mSortedAudioPlaybackClientUids.get(0))) { + int firstActiveUid = -1; + int firatActiveUidIndex = -1; + for (int i = 1; i < mSortedAudioPlaybackClientUids.size(); ++i) { + int uid = mSortedAudioPlaybackClientUids.get(i); + if (mActiveAudioUids.contains(uid)) { + firatActiveUidIndex = i; + firstActiveUid = uid; + break; + } + } + for (int i = firatActiveUidIndex; i > 0; --i) { + mSortedAudioPlaybackClientUids.set(i, + mSortedAudioPlaybackClientUids.get(i - 1)); + } + mSortedAudioPlaybackClientUids.set(0, firstActiveUid); + } + // Notify the active state change of audio players. for (AudioPlaybackConfiguration config : configs) { final int pii = config.getPlayerInterfaceId(); diff --git a/services/core/java/com/android/server/media/MediaSessionServiceImpl.java b/services/core/java/com/android/server/media/MediaSessionServiceImpl.java index cdfd948f4bd42..a5f22175331d7 100644 --- a/services/core/java/com/android/server/media/MediaSessionServiceImpl.java +++ b/services/core/java/com/android/server/media/MediaSessionServiceImpl.java @@ -171,7 +171,7 @@ public class MediaSessionServiceImpl extends MediaSessionService.ServiceImpl { mAudioPlayerStateMonitor = AudioPlayerStateMonitor.getInstance(mContext); mAudioPlayerStateMonitor.registerListener( (config, isRemoved) -> { - if (isRemoved || !config.isActive() || config.getPlayerType() + if (config.getPlayerType() == AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL) { return; }