From 1bdc1204306b59f68c389770273822dbfd670fe3 Mon Sep 17 00:00:00 2001 From: vfsfitvnm Date: Sun, 23 Oct 2022 18:10:01 +0200 Subject: [PATCH] Add queue items to media session (#499) --- .../vimusic/service/PlayerService.kt | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/service/PlayerService.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/service/PlayerService.kt index 56159ad..c014145 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/service/PlayerService.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/service/PlayerService.kt @@ -18,6 +18,7 @@ import android.graphics.Color import android.media.AudioDeviceCallback import android.media.AudioDeviceInfo import android.media.AudioManager +import android.media.MediaDescription import android.media.MediaMetadata import android.media.audiofx.AudioEffect import android.media.session.MediaSession @@ -338,6 +339,51 @@ class PlayerService : InvincibleService(), Player.Listener, PlaybackStatsListene } else if (mediaItem.mediaMetadata.artworkUri == bitmapProvider.lastUri) { bitmapProvider.listener?.invoke(bitmapProvider.lastBitmap) } + + if (reason == Player.MEDIA_ITEM_TRANSITION_REASON_AUTO || reason == Player.MEDIA_ITEM_TRANSITION_REASON_SEEK) { + updateMediaSessionQueue(player.currentTimeline) + } + } + + override fun onTimelineChanged(timeline: Timeline, reason: Int) { + if (reason == Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED) { + updateMediaSessionQueue(timeline) + } + } + + private fun updateMediaSessionQueue(timeline: Timeline) { + val builder = MediaDescription.Builder() + + val currentMediaItemIndex = player.currentMediaItemIndex + val lastIndex = timeline.windowCount - 1 + var startIndex = currentMediaItemIndex - 7 + var endIndex = currentMediaItemIndex + 7 + + if (startIndex < 0) { + endIndex -= startIndex + } + + if (endIndex > lastIndex) { + startIndex -= (endIndex - lastIndex) + endIndex = lastIndex + } + + startIndex = startIndex.coerceAtLeast(0) + + mediaSession.setQueue( + List(endIndex - startIndex + 1) { index -> + val mediaItem = timeline.getWindow(index + startIndex, Timeline.Window()).mediaItem + MediaSession.QueueItem( + builder + .setMediaId(mediaItem.mediaId) + .setTitle(mediaItem.mediaMetadata.title) + .setSubtitle(mediaItem.mediaMetadata.artist) + .setIconUri(mediaItem.mediaMetadata.artworkUri) + .build(), + index.toLong() + ) + } + ) } private fun maybeRecoverPlaybackError() {