From fa85b603ef2a89c985647e3395caa4467e0aab63 Mon Sep 17 00:00:00 2001 From: Jaewan Kim Date: Tue, 10 Oct 2017 16:49:58 +0900 Subject: [PATCH] Set the global priority session immediately after its flag is set The MediaSessionService has set the global priority session only after the session becomes active for the first time. From the bug reports, com.android.settings (shares the UID with the global priority session) made sound before that. So the global priority session became the media button session before the service handle it specially. This CL fixes the issue by moving the global priority session immediately after the FLAG_EXCLUSIVE_GLOBAL_PRIORITY is set. Bug: 67322829 Test: Run CtsMediaTest and CtsMediaHostTest. Also did the manual test described in the issue. Change-Id: Iea9543b00a783b32dbc26f682d2352068c69e413 --- .../server/media/MediaSessionRecord.java | 8 +++++ .../server/media/MediaSessionService.java | 29 ++++++++++++------- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java index 0b11479a162a6..664d2f9789f08 100644 --- a/services/core/java/com/android/server/media/MediaSessionRecord.java +++ b/services/core/java/com/android/server/media/MediaSessionRecord.java @@ -784,6 +784,14 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { mService.enforcePhoneStatePermission(pid, uid); } mFlags = flags; + if ((flags & MediaSession.FLAG_EXCLUSIVE_GLOBAL_PRIORITY) != 0) { + final long token = Binder.clearCallingIdentity(); + try { + mService.setGlobalPrioritySession(MediaSessionRecord.this); + } finally { + Binder.restoreCallingIdentity(token); + } + } mHandler.post(MessageHandler.MSG_UPDATE_SESSION_STATE); } diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index b102dde30a944..aa652445c45a1 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -178,17 +178,6 @@ public class MediaSessionService extends SystemService implements Monitor { return; } if ((record.getFlags() & MediaSession.FLAG_EXCLUSIVE_GLOBAL_PRIORITY) != 0) { - if (mGlobalPrioritySession != record) { - Log.d(TAG, "Global priority session is changed from " + mGlobalPrioritySession - + " to " + record); - mGlobalPrioritySession = record; - if (user != null && user.mPriorityStack.contains(record)) { - // Handle the global priority session separately. - // Otherwise, it will be the media button session even after it becomes - // inactive because it has been the lastly played media app. - user.mPriorityStack.removeSession(record); - } - } if (DEBUG_KEY_EVENT) { Log.d(TAG, "Global priority session is updated, active=" + record.isActive()); } @@ -204,6 +193,24 @@ public class MediaSessionService extends SystemService implements Monitor { } } + public void setGlobalPrioritySession(MediaSessionRecord record) { + synchronized (mLock) { + FullUserRecord user = getFullUserRecordLocked(record.getUserId()); + if (mGlobalPrioritySession != record) { + Log.d(TAG, "Global priority session is changed from " + mGlobalPrioritySession + + " to " + record); + mGlobalPrioritySession = record; + if (user != null && user.mPriorityStack.contains(record)) { + // Handle the global priority session separately. + // Otherwise, it can be the media button session regardless of the active state + // because it or other system components might have been the lastly played media + // app. + user.mPriorityStack.removeSession(record); + } + } + } + } + private List getActiveSessionsLocked(int userId) { List records = new ArrayList<>(); if (userId == UserHandle.USER_ALL) {