Loading services/core/java/com/android/server/media/MediaSessionService.java +61 −40 Original line number Diff line number Diff line Loading @@ -171,19 +171,63 @@ public class MediaSessionService extends SystemService implements Monitor { public void updateSession(MediaSessionRecord record) { synchronized (mLock) { FullUserRecord user = getFullUserRecordLocked(record.getUserId()); if (user == null || !user.mPriorityStack.contains(record)) { Log.d(TAG, "Unknown session updated. Ignoring."); if (user == null) { Log.w(TAG, "Unknown session updated. Ignoring."); return; } user.mPriorityStack.onSessionStateChange(record); 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()); } user.pushAddressedPlayerChangedLocked(); } else { if (!user.mPriorityStack.contains(record)) { Log.w(TAG, "Unknown session updated. Ignoring."); return; } user.mPriorityStack.onSessionStateChange(record); } mHandler.postSessionsChanged(record.getUserId()); } } private List<MediaSessionRecord> getActiveSessionsLocked(int userId) { List<MediaSessionRecord> records; if (userId == UserHandle.USER_ALL) { records = new ArrayList<>(); int size = mUserRecords.size(); for (int i = 0; i < size; i++) { records.addAll(mUserRecords.valueAt(i).mPriorityStack.getActiveSessions(userId)); } } else { FullUserRecord user = getFullUserRecordLocked(userId); if (user == null) { Log.w(TAG, "getSessions failed. Unknown user " + userId); return new ArrayList<>(); } records = user.mPriorityStack.getActiveSessions(userId); } // Return global priority session at the first whenever it's asked. if (isGlobalPriorityActiveLocked() && (userId == UserHandle.USER_ALL || userId == mGlobalPrioritySession.getUserId())) { records.add(0, mGlobalPrioritySession); } return records; } /** * Tells the system UI that volume has changed on an active remote session. */ Loading Loading @@ -339,16 +383,16 @@ public class MediaSessionService extends SystemService implements Monitor { if (DEBUG) { Log.d(TAG, "Destroying " + session); } int userId = session.getUserId(); FullUserRecord user = getFullUserRecordLocked(userId); if (user != null) { user.removeSessionLocked(session); } FullUserRecord user = getFullUserRecordLocked(session.getUserId()); if (mGlobalPrioritySession == session) { mGlobalPrioritySession = null; if (session.isActive() && user != null) { user.pushAddressedPlayerChangedLocked(); } } else { if (user != null) { user.mPriorityStack.removeSession(session); } } try { Loading Loading @@ -484,7 +528,7 @@ public class MediaSessionService extends SystemService implements Monitor { throw new RuntimeException("Media Session owner died prematurely.", e); } user.addSessionLocked(session); user.mPriorityStack.addSession(session); mHandler.postSessionsChanged(userId); if (DEBUG) { Loading @@ -509,7 +553,7 @@ public class MediaSessionService extends SystemService implements Monitor { Log.w(TAG, "pushSessionsChanged failed. No user with id=" + userId); return; } List<MediaSessionRecord> records = user.mPriorityStack.getActiveSessions(userId); List<MediaSessionRecord> records = getActiveSessionsLocked(userId); int size = records.size(); ArrayList<MediaSession.Token> tokens = new ArrayList<MediaSession.Token>(); for (int i = 0; i < size; i++) { Loading Loading @@ -637,14 +681,6 @@ public class MediaSessionService extends SystemService implements Monitor { } } public void addSessionLocked(MediaSessionRecord session) { mPriorityStack.addSession(session); } public void removeSessionLocked(MediaSessionRecord session) { mPriorityStack.removeSession(session); } public void dumpLocked(PrintWriter pw, String prefix) { pw.print(prefix + "Record for full_user=" + mFullUserId); // Dump managed profile user ids associated with this user. Loading Loading @@ -816,29 +852,11 @@ public class MediaSessionService extends SystemService implements Monitor { int resolvedUserId = verifySessionsRequest(componentName, userId, pid, uid); ArrayList<IBinder> binders = new ArrayList<IBinder>(); synchronized (mLock) { if (resolvedUserId == UserHandle.USER_ALL) { int size = mUserRecords.size(); for (int i = 0; i < size; i++) { List<MediaSessionRecord> records = mUserRecords.valueAt(i).mPriorityStack.getActiveSessions( resolvedUserId); for (MediaSessionRecord record : records) { binders.add(record.getControllerBinder().asBinder()); } } } else { FullUserRecord user = getFullUserRecordLocked(resolvedUserId); if (user == null) { Log.w(TAG, "getSessions failed. Unknown user " + userId); return binders; } List<MediaSessionRecord> records = user.mPriorityStack .getActiveSessions(resolvedUserId); List<MediaSessionRecord> records = getActiveSessionsLocked(resolvedUserId); for (MediaSessionRecord record : records) { binders.add(record.getControllerBinder().asBinder()); } } } return binders; } finally { Binder.restoreCallingIdentity(token); Loading Loading @@ -1292,6 +1310,9 @@ public class MediaSessionService extends SystemService implements Monitor { synchronized (mLock) { pw.println(mSessionsListeners.size() + " sessions listeners."); pw.println("Global priority session is " + mGlobalPrioritySession); if (mGlobalPrioritySession != null) { mGlobalPrioritySession.dump(pw, " "); } pw.println("User Records:"); int count = mUserRecords.size(); for (int i = 0; i < count; i++) { Loading services/core/java/com/android/server/media/MediaSessionStack.java +1 −8 Original line number Diff line number Diff line Loading @@ -310,7 +310,6 @@ class MediaSessionStack { * Get a priority sorted list of sessions. Can filter to only return active * sessions or sessions. * <p>Here's the priority order. * <li>System priority session (session with FLAG_EXCLUSIVE_GLOBAL_PRIORITY)</li> * <li>Active sessions whose PlaybackState is active</li> * <li>Active sessions whose PlaybackState is inactive</li> * <li>Inactive sessions</li> Loading Loading @@ -344,13 +343,7 @@ class MediaSessionStack { continue; } if (session.isSystemPriority()) { // System priority sessions are special and always go at the // front. We expect there to only be one of these at a time. result.add(0, session); lastPlaybackActiveIndex++; lastActiveIndex++; } else if (session.isPlaybackActive()) { if (session.isPlaybackActive()) { result.add(lastPlaybackActiveIndex++, session); lastActiveIndex++; } else { Loading Loading
services/core/java/com/android/server/media/MediaSessionService.java +61 −40 Original line number Diff line number Diff line Loading @@ -171,19 +171,63 @@ public class MediaSessionService extends SystemService implements Monitor { public void updateSession(MediaSessionRecord record) { synchronized (mLock) { FullUserRecord user = getFullUserRecordLocked(record.getUserId()); if (user == null || !user.mPriorityStack.contains(record)) { Log.d(TAG, "Unknown session updated. Ignoring."); if (user == null) { Log.w(TAG, "Unknown session updated. Ignoring."); return; } user.mPriorityStack.onSessionStateChange(record); 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()); } user.pushAddressedPlayerChangedLocked(); } else { if (!user.mPriorityStack.contains(record)) { Log.w(TAG, "Unknown session updated. Ignoring."); return; } user.mPriorityStack.onSessionStateChange(record); } mHandler.postSessionsChanged(record.getUserId()); } } private List<MediaSessionRecord> getActiveSessionsLocked(int userId) { List<MediaSessionRecord> records; if (userId == UserHandle.USER_ALL) { records = new ArrayList<>(); int size = mUserRecords.size(); for (int i = 0; i < size; i++) { records.addAll(mUserRecords.valueAt(i).mPriorityStack.getActiveSessions(userId)); } } else { FullUserRecord user = getFullUserRecordLocked(userId); if (user == null) { Log.w(TAG, "getSessions failed. Unknown user " + userId); return new ArrayList<>(); } records = user.mPriorityStack.getActiveSessions(userId); } // Return global priority session at the first whenever it's asked. if (isGlobalPriorityActiveLocked() && (userId == UserHandle.USER_ALL || userId == mGlobalPrioritySession.getUserId())) { records.add(0, mGlobalPrioritySession); } return records; } /** * Tells the system UI that volume has changed on an active remote session. */ Loading Loading @@ -339,16 +383,16 @@ public class MediaSessionService extends SystemService implements Monitor { if (DEBUG) { Log.d(TAG, "Destroying " + session); } int userId = session.getUserId(); FullUserRecord user = getFullUserRecordLocked(userId); if (user != null) { user.removeSessionLocked(session); } FullUserRecord user = getFullUserRecordLocked(session.getUserId()); if (mGlobalPrioritySession == session) { mGlobalPrioritySession = null; if (session.isActive() && user != null) { user.pushAddressedPlayerChangedLocked(); } } else { if (user != null) { user.mPriorityStack.removeSession(session); } } try { Loading Loading @@ -484,7 +528,7 @@ public class MediaSessionService extends SystemService implements Monitor { throw new RuntimeException("Media Session owner died prematurely.", e); } user.addSessionLocked(session); user.mPriorityStack.addSession(session); mHandler.postSessionsChanged(userId); if (DEBUG) { Loading @@ -509,7 +553,7 @@ public class MediaSessionService extends SystemService implements Monitor { Log.w(TAG, "pushSessionsChanged failed. No user with id=" + userId); return; } List<MediaSessionRecord> records = user.mPriorityStack.getActiveSessions(userId); List<MediaSessionRecord> records = getActiveSessionsLocked(userId); int size = records.size(); ArrayList<MediaSession.Token> tokens = new ArrayList<MediaSession.Token>(); for (int i = 0; i < size; i++) { Loading Loading @@ -637,14 +681,6 @@ public class MediaSessionService extends SystemService implements Monitor { } } public void addSessionLocked(MediaSessionRecord session) { mPriorityStack.addSession(session); } public void removeSessionLocked(MediaSessionRecord session) { mPriorityStack.removeSession(session); } public void dumpLocked(PrintWriter pw, String prefix) { pw.print(prefix + "Record for full_user=" + mFullUserId); // Dump managed profile user ids associated with this user. Loading Loading @@ -816,29 +852,11 @@ public class MediaSessionService extends SystemService implements Monitor { int resolvedUserId = verifySessionsRequest(componentName, userId, pid, uid); ArrayList<IBinder> binders = new ArrayList<IBinder>(); synchronized (mLock) { if (resolvedUserId == UserHandle.USER_ALL) { int size = mUserRecords.size(); for (int i = 0; i < size; i++) { List<MediaSessionRecord> records = mUserRecords.valueAt(i).mPriorityStack.getActiveSessions( resolvedUserId); for (MediaSessionRecord record : records) { binders.add(record.getControllerBinder().asBinder()); } } } else { FullUserRecord user = getFullUserRecordLocked(resolvedUserId); if (user == null) { Log.w(TAG, "getSessions failed. Unknown user " + userId); return binders; } List<MediaSessionRecord> records = user.mPriorityStack .getActiveSessions(resolvedUserId); List<MediaSessionRecord> records = getActiveSessionsLocked(resolvedUserId); for (MediaSessionRecord record : records) { binders.add(record.getControllerBinder().asBinder()); } } } return binders; } finally { Binder.restoreCallingIdentity(token); Loading Loading @@ -1292,6 +1310,9 @@ public class MediaSessionService extends SystemService implements Monitor { synchronized (mLock) { pw.println(mSessionsListeners.size() + " sessions listeners."); pw.println("Global priority session is " + mGlobalPrioritySession); if (mGlobalPrioritySession != null) { mGlobalPrioritySession.dump(pw, " "); } pw.println("User Records:"); int count = mUserRecords.size(); for (int i = 0; i < count; i++) { Loading
services/core/java/com/android/server/media/MediaSessionStack.java +1 −8 Original line number Diff line number Diff line Loading @@ -310,7 +310,6 @@ class MediaSessionStack { * Get a priority sorted list of sessions. Can filter to only return active * sessions or sessions. * <p>Here's the priority order. * <li>System priority session (session with FLAG_EXCLUSIVE_GLOBAL_PRIORITY)</li> * <li>Active sessions whose PlaybackState is active</li> * <li>Active sessions whose PlaybackState is inactive</li> * <li>Inactive sessions</li> Loading Loading @@ -344,13 +343,7 @@ class MediaSessionStack { continue; } if (session.isSystemPriority()) { // System priority sessions are special and always go at the // front. We expect there to only be one of these at a time. result.add(0, session); lastPlaybackActiveIndex++; lastActiveIndex++; } else if (session.isPlaybackActive()) { if (session.isPlaybackActive()) { result.add(lastPlaybackActiveIndex++, session); lastActiveIndex++; } else { Loading