From 4a99dc4c94f1be29b415d6d672acdddd64600406 Mon Sep 17 00:00:00 2001 From: Googler Date: Wed, 31 Jul 2024 02:28:33 -0700 Subject: [PATCH] Reserve space for the skip buttons in the media3 demo This is to avoid the shuffle custom action jumping around when skipping to the first or last item of a playlist. PiperOrigin-RevId: 657925696 --- .../media3/demo/session/DemoPlaybackService.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/demos/session_service/src/main/java/androidx/media3/demo/session/DemoPlaybackService.kt b/demos/session_service/src/main/java/androidx/media3/demo/session/DemoPlaybackService.kt index f34d864658..f63b8678ee 100644 --- a/demos/session_service/src/main/java/androidx/media3/demo/session/DemoPlaybackService.kt +++ b/demos/session_service/src/main/java/androidx/media3/demo/session/DemoPlaybackService.kt @@ -24,11 +24,13 @@ import android.os.Build import androidx.annotation.OptIn import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.os.bundleOf import androidx.media3.common.AudioAttributes import androidx.media3.common.util.UnstableApi import androidx.media3.demo.session.service.R import androidx.media3.exoplayer.ExoPlayer import androidx.media3.exoplayer.util.EventLogger +import androidx.media3.session.MediaConstants import androidx.media3.session.MediaLibraryService import androidx.media3.session.MediaSession import androidx.media3.session.MediaSession.ControllerInfo @@ -111,6 +113,17 @@ open class DemoPlaybackService : MediaLibraryService() { MediaLibrarySession.Builder(this, player, createLibrarySessionCallback()) .also { builder -> getSingleTopActivity()?.let { builder.setSessionActivity(it) } } .build() + .also { mediaLibrarySession -> + // The media session always supports skip, except at the start and end of the playlist. + // Reserve the space for the skip action in these cases to avoid custom actions jumping + // around when the user skips. + mediaLibrarySession.setSessionExtras( + bundleOf( + MediaConstants.EXTRAS_KEY_SLOT_RESERVATION_SEEK_TO_PREV to true, + MediaConstants.EXTRAS_KEY_SLOT_RESERVATION_SEEK_TO_NEXT to true, + ) + ) + } } @OptIn(UnstableApi::class) // MediaSessionService.Listener