diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs index 8f6cdce0808..82b99938f3b 100644 --- a/components/constellation/constellation.rs +++ b/components/constellation/constellation.rs @@ -1790,7 +1790,8 @@ where match event { MediaSessionEvent::PlaybackStateChange(ref state) => { match state { - MediaSessionPlaybackState::Playing => (), + MediaSessionPlaybackState::Playing | + MediaSessionPlaybackState::Paused => (), _ => return, }; }, diff --git a/support/android/apk/servoapp/src/main/java/org/mozilla/servo/MainActivity.java b/support/android/apk/servoapp/src/main/java/org/mozilla/servo/MainActivity.java index f95cfe4a64e..60abbc43747 100644 --- a/support/android/apk/servoapp/src/main/java/org/mozilla/servo/MainActivity.java +++ b/support/android/apk/servoapp/src/main/java/org/mozilla/servo/MainActivity.java @@ -237,16 +237,17 @@ public class MainActivity extends Activity implements Servo.Client { @Override public void onMediaSessionPlaybackStateChange(int state) { + Log.d("SERVOMEDIA", "PLAYBACK STATE CHANGED " + state); if (mMediaSession == null) { mMediaSession = new MediaSession(mServoView, this, getApplicationContext()); } - Log.d("SERVOMEDIA", "PLAYBACK STATE CHANGED " + state); if (state == MediaSession.PLAYBACK_STATE_NONE) { mMediaSession.hideMediaSessionControls(); return; } - if (state == MediaSession.PLAYBACK_STATE_PLAYING) { - mMediaSession.showMediaSessionControls(); + if (state == MediaSession.PLAYBACK_STATE_PLAYING || + state == MediaSession.PLAYBACK_STATE_PAUSED) { + mMediaSession.showMediaSessionControls(state); return; } } diff --git a/support/android/apk/servoapp/src/main/java/org/mozilla/servo/MediaSession.java b/support/android/apk/servoapp/src/main/java/org/mozilla/servo/MediaSession.java index b1f8c3794de..2b03206931a 100644 --- a/support/android/apk/servoapp/src/main/java/org/mozilla/servo/MediaSession.java +++ b/support/android/apk/servoapp/src/main/java/org/mozilla/servo/MediaSession.java @@ -49,6 +49,7 @@ public class MediaSession { private static final int ACTION_SEEK_TO = 9; private static final String MEDIA_CHANNEL_ID = "MediaNotificationChannel"; + private static final String KEY_MEDIA_PLAY = "org.mozilla.servoview.MainActivity.play"; private static final String KEY_MEDIA_PAUSE = "org.mozilla.servoview.MainActivity.pause"; private static final String KEY_MEDIA_PREV = "org.mozilla.servoview.MainActivity.prev"; private static final String KEY_MEDIA_NEXT = "org.mozilla.servoview.MainActivity.next"; @@ -84,9 +85,14 @@ public class MediaSession { } } - public void showMediaSessionControls() { + public void showMediaSessionControls(int playbackState) { IntentFilter filter = new IntentFilter(); - filter.addAction(KEY_MEDIA_PAUSE); + if (playbackState == PLAYBACK_STATE_PAUSED) { + filter.addAction(KEY_MEDIA_PLAY); + } + if (playbackState == PLAYBACK_STATE_PLAYING) { + filter.addAction(KEY_MEDIA_PAUSE); + } filter.addAction(KEY_MEDIA_STOP); mMediaSessionActionReceiver = new BroadcastReceiver() { @@ -95,6 +101,9 @@ public class MediaSession { if (intent.getAction().equals(KEY_MEDIA_PAUSE)) { mView.mediaSessionAction(ACTION_PAUSE); Log.d("SERVOMEDIA", "PAUSE"); + } else if (intent.getAction().equals(KEY_MEDIA_PLAY)) { + mView.mediaSessionAction(ACTION_PLAY); + Log.d("SERVOMEDIA", "PLAY"); } else if (intent.getAction().equals(KEY_MEDIA_STOP)) { mView.mediaSessionAction(ACTION_STOP); Log.d("SERVOMEDIA", "STOP"); @@ -104,11 +113,6 @@ public class MediaSession { mContext.registerReceiver(mMediaSessionActionReceiver, filter); - Intent pauseIntent = new Intent(KEY_MEDIA_PAUSE); - Notification.Action pauseAction = - new Notification.Action(R.drawable.media_session_pause, "Pause", - PendingIntent.getBroadcast(mContext, 0, pauseIntent, 0)); - Intent stopIntent = new Intent(KEY_MEDIA_STOP); Notification.Action stopAction = new Notification.Action(R.drawable.media_session_stop, "Stop", @@ -119,11 +123,24 @@ public class MediaSession { .setSmallIcon(R.drawable.media_session_icon) .setContentTitle("This is the notification title") .setVisibility(Notification.VISIBILITY_PUBLIC) - .addAction(pauseAction) .addAction(stopAction) - .setStyle(new Notification.MediaStyle() - .setShowActionsInCompactView(0 /* pause button */ ) - .setShowActionsInCompactView(1 /* stop button */)); + .setStyle(new Notification.MediaStyle()); + + if (playbackState == PLAYBACK_STATE_PAUSED) { + Intent playIntent = new Intent(KEY_MEDIA_PLAY); + Notification.Action playAction = + new Notification.Action(R.drawable.media_session_play, "Play", + PendingIntent.getBroadcast(mContext, 0, playIntent, 0)); + builder.addAction(playAction); + } + + if (playbackState == PLAYBACK_STATE_PLAYING) { + Intent pauseIntent = new Intent(KEY_MEDIA_PAUSE); + Notification.Action pauseAction = + new Notification.Action(R.drawable.media_session_pause, "Pause", + PendingIntent.getBroadcast(mContext, 0, pauseIntent, 0)); + builder.addAction(pauseAction); + } NotificationManager notificationManager = mContext.getSystemService(NotificationManager.class); diff --git a/support/android/apk/servoapp/src/main/res/drawable/media_session_play.png b/support/android/apk/servoapp/src/main/res/drawable/media_session_play.png new file mode 100755 index 00000000000..65b46201718 Binary files /dev/null and b/support/android/apk/servoapp/src/main/res/drawable/media_session_play.png differ