Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +85 −62 Original line number Diff line number Diff line Loading @@ -436,6 +436,12 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, public void onPlaybackStateChanged(PlaybackState state) { super.onPlaybackStateChanged(state); if (DEBUG_MEDIA) Log.v(TAG, "DEBUG_MEDIA: onPlaybackStateChanged: " + state); if (state != null) { if (!isPlaybackActive(state.getState())) { clearCurrentMediaNotification(); updateMediaMetaData(true); } } } @Override Loading Loading @@ -1199,6 +1205,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, if (mHeadsUpManager.isHeadsUp(key)) { deferRemoval = !mHeadsUpManager.removeNotification(key); } if (key.equals(mMediaNotificationKey)) { clearCurrentMediaNotification(); updateMediaMetaData(true); } if (deferRemoval) { mLatestRankingMap = ranking; mHeadsUpEntriesToRemoveOnSwitch.add(mHeadsUpManager.getEntry(key)); Loading Loading @@ -1492,23 +1502,31 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, synchronized (mNotificationData) { ArrayList<Entry> activeNotifications = mNotificationData.getActiveNotifications(); final int N = activeNotifications.size(); // Promote the media notification with a controller in 'playing' state, if any. Entry mediaNotification = null; MediaController controller = null; for (int i = 0; i < N; i++) { final Entry entry = activeNotifications.get(i); if (isMediaNotification(entry)) { final MediaSession.Token token = entry.notification.getNotification().extras final MediaSession.Token token = entry.notification.getNotification().extras .getParcelable(Notification.EXTRA_MEDIA_SESSION); if (token != null) { controller = new MediaController(mContext, token); if (controller != null) { // we've got a live one, here MediaController aController = new MediaController(mContext, token); if (PlaybackState.STATE_PLAYING == getMediaControllerPlaybackState(aController)) { if (DEBUG_MEDIA) { Log.v(TAG, "DEBUG_MEDIA: found mediastyle controller matching " + entry.notification.getKey()); } mediaNotification = entry; controller = aController; break; } } } } if (mediaNotification == null) { // Still nothing? OK, let's just look for live media sessions and see if they match // one of our notifications. This will catch apps that aren't (yet!) using media Loading @@ -1521,14 +1539,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, UserHandle.USER_ALL); for (MediaController aController : sessions) { if (aController == null) continue; final PlaybackState state = aController.getPlaybackState(); if (state == null) continue; switch (state.getState()) { case PlaybackState.STATE_STOPPED: case PlaybackState.STATE_ERROR: continue; default: if (PlaybackState.STATE_PLAYING == getMediaControllerPlaybackState(aController)) { // now to see if we have one like this final String pkg = aController.getPackageName(); Loading @@ -1549,18 +1561,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } } if (!sameSessions(mMediaController, controller)) { if (controller != null && !sameSessions(mMediaController, controller)) { // We have a new media session if (mMediaController != null) { // something old was playing Log.v(TAG, "DEBUG_MEDIA: Disconnecting from old controller: " + mMediaController); mMediaController.unregisterCallback(mMediaListener); } clearCurrentMediaNotification(); mMediaController = controller; if (mMediaController != null) { mMediaController.registerCallback(mMediaListener); mMediaMetadata = mMediaController.getMetadata(); if (DEBUG_MEDIA) { Loading @@ -1568,34 +1572,53 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, + mMediaMetadata); } final String notificationKey = mediaNotification == null ? null : mediaNotification.notification.getKey(); if (notificationKey == null || !notificationKey.equals(mMediaNotificationKey)) { // we have a new notification! if (mediaNotification != null) { mMediaNotificationKey = mediaNotification.notification.getKey(); if (DEBUG_MEDIA) { Log.v(TAG, "DEBUG_MEDIA: Found new media notification: key=" + notificationKey + " controller=" + controller); + mMediaNotificationKey + " controller=" + mMediaController); } mMediaNotificationKey = notificationKey; } } else { mMediaMetadata = null; mMediaNotificationKey = null; metaDataChanged = true; } } metaDataChanged = true; } else { // Media session unchanged if (metaDataChanged) { updateNotifications(); } updateMediaMetaData(metaDataChanged); } if (DEBUG_MEDIA) { Log.v(TAG, "DEBUG_MEDIA: Continuing media notification: key=" + mMediaNotificationKey); private int getMediaControllerPlaybackState(MediaController controller) { if (controller != null) { final PlaybackState playbackState = controller.getPlaybackState(); if (playbackState != null) { return playbackState.getState(); } } return PlaybackState.STATE_NONE; } updateMediaMetaData(metaDataChanged); private boolean isPlaybackActive(int state) { if (state != PlaybackState.STATE_STOPPED && state != PlaybackState.STATE_ERROR && state != PlaybackState.STATE_NONE) { return true; } return false; } private void clearCurrentMediaNotification() { mMediaNotificationKey = null; mMediaMetadata = null; if (mMediaController != null) { if (DEBUG_MEDIA) { Log.v(TAG, "DEBUG_MEDIA: Disconnecting from old controller: " + mMediaController.getPackageName()); } mMediaController.unregisterCallback(mMediaListener); } mMediaController = null; } private boolean sameSessions(MediaController a, MediaController b) { Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +85 −62 Original line number Diff line number Diff line Loading @@ -436,6 +436,12 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, public void onPlaybackStateChanged(PlaybackState state) { super.onPlaybackStateChanged(state); if (DEBUG_MEDIA) Log.v(TAG, "DEBUG_MEDIA: onPlaybackStateChanged: " + state); if (state != null) { if (!isPlaybackActive(state.getState())) { clearCurrentMediaNotification(); updateMediaMetaData(true); } } } @Override Loading Loading @@ -1199,6 +1205,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, if (mHeadsUpManager.isHeadsUp(key)) { deferRemoval = !mHeadsUpManager.removeNotification(key); } if (key.equals(mMediaNotificationKey)) { clearCurrentMediaNotification(); updateMediaMetaData(true); } if (deferRemoval) { mLatestRankingMap = ranking; mHeadsUpEntriesToRemoveOnSwitch.add(mHeadsUpManager.getEntry(key)); Loading Loading @@ -1492,23 +1502,31 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, synchronized (mNotificationData) { ArrayList<Entry> activeNotifications = mNotificationData.getActiveNotifications(); final int N = activeNotifications.size(); // Promote the media notification with a controller in 'playing' state, if any. Entry mediaNotification = null; MediaController controller = null; for (int i = 0; i < N; i++) { final Entry entry = activeNotifications.get(i); if (isMediaNotification(entry)) { final MediaSession.Token token = entry.notification.getNotification().extras final MediaSession.Token token = entry.notification.getNotification().extras .getParcelable(Notification.EXTRA_MEDIA_SESSION); if (token != null) { controller = new MediaController(mContext, token); if (controller != null) { // we've got a live one, here MediaController aController = new MediaController(mContext, token); if (PlaybackState.STATE_PLAYING == getMediaControllerPlaybackState(aController)) { if (DEBUG_MEDIA) { Log.v(TAG, "DEBUG_MEDIA: found mediastyle controller matching " + entry.notification.getKey()); } mediaNotification = entry; controller = aController; break; } } } } if (mediaNotification == null) { // Still nothing? OK, let's just look for live media sessions and see if they match // one of our notifications. This will catch apps that aren't (yet!) using media Loading @@ -1521,14 +1539,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, UserHandle.USER_ALL); for (MediaController aController : sessions) { if (aController == null) continue; final PlaybackState state = aController.getPlaybackState(); if (state == null) continue; switch (state.getState()) { case PlaybackState.STATE_STOPPED: case PlaybackState.STATE_ERROR: continue; default: if (PlaybackState.STATE_PLAYING == getMediaControllerPlaybackState(aController)) { // now to see if we have one like this final String pkg = aController.getPackageName(); Loading @@ -1549,18 +1561,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } } if (!sameSessions(mMediaController, controller)) { if (controller != null && !sameSessions(mMediaController, controller)) { // We have a new media session if (mMediaController != null) { // something old was playing Log.v(TAG, "DEBUG_MEDIA: Disconnecting from old controller: " + mMediaController); mMediaController.unregisterCallback(mMediaListener); } clearCurrentMediaNotification(); mMediaController = controller; if (mMediaController != null) { mMediaController.registerCallback(mMediaListener); mMediaMetadata = mMediaController.getMetadata(); if (DEBUG_MEDIA) { Loading @@ -1568,34 +1572,53 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, + mMediaMetadata); } final String notificationKey = mediaNotification == null ? null : mediaNotification.notification.getKey(); if (notificationKey == null || !notificationKey.equals(mMediaNotificationKey)) { // we have a new notification! if (mediaNotification != null) { mMediaNotificationKey = mediaNotification.notification.getKey(); if (DEBUG_MEDIA) { Log.v(TAG, "DEBUG_MEDIA: Found new media notification: key=" + notificationKey + " controller=" + controller); + mMediaNotificationKey + " controller=" + mMediaController); } mMediaNotificationKey = notificationKey; } } else { mMediaMetadata = null; mMediaNotificationKey = null; metaDataChanged = true; } } metaDataChanged = true; } else { // Media session unchanged if (metaDataChanged) { updateNotifications(); } updateMediaMetaData(metaDataChanged); } if (DEBUG_MEDIA) { Log.v(TAG, "DEBUG_MEDIA: Continuing media notification: key=" + mMediaNotificationKey); private int getMediaControllerPlaybackState(MediaController controller) { if (controller != null) { final PlaybackState playbackState = controller.getPlaybackState(); if (playbackState != null) { return playbackState.getState(); } } return PlaybackState.STATE_NONE; } updateMediaMetaData(metaDataChanged); private boolean isPlaybackActive(int state) { if (state != PlaybackState.STATE_STOPPED && state != PlaybackState.STATE_ERROR && state != PlaybackState.STATE_NONE) { return true; } return false; } private void clearCurrentMediaNotification() { mMediaNotificationKey = null; mMediaMetadata = null; if (mMediaController != null) { if (DEBUG_MEDIA) { Log.v(TAG, "DEBUG_MEDIA: Disconnecting from old controller: " + mMediaController.getPackageName()); } mMediaController.unregisterCallback(mMediaListener); } mMediaController = null; } private boolean sameSessions(MediaController a, MediaController b) { Loading