From dd200e13748b3069a49c4376036aa8732b7f3c08 Mon Sep 17 00:00:00 2001 From: vfsfitvnm Date: Fri, 22 Jul 2022 15:20:38 +0200 Subject: [PATCH] Make possible to start the radio from the currently playing song (#118) --- .../ui/components/themed/MediaItemMenu.kt | 92 +++++++++---------- .../vfsfitvnm/vimusic/ui/views/PlayerView.kt | 8 ++ .../it/vfsfitvnm/vimusic/utils/Player.kt | 9 ++ 3 files changed, 63 insertions(+), 46 deletions(-) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/themed/MediaItemMenu.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/themed/MediaItemMenu.kt index 9235db8..60f8d81 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/themed/MediaItemMenu.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/themed/MediaItemMenu.kt @@ -184,13 +184,13 @@ fun QueuedMediaItemMenu( onGlobalRouteEmitted: (() -> Unit)? = null ) { val menuState = LocalMenuState.current - val player = LocalPlayerServiceBinder.current?.player + val binder = LocalPlayerServiceBinder.current BaseMediaItemMenu( mediaItem = mediaItem, onDismiss = onDismiss ?: menuState::hide, onRemoveFromQueue = if (indexInQueue != null) ({ - player?.removeMediaItem(indexInQueue) + binder?.player?.removeMediaItem(indexInQueue) }) else null, onGlobalRouteEmitted = onGlobalRouteEmitted, modifier = modifier @@ -359,6 +359,50 @@ fun MediaItemMenu( detectTapGestures { } } ) { + onStartRadio?.let { onStartRadio -> + MenuEntry( + icon = R.drawable.radio, + text = "Start radio", + onClick = { + onDismiss() + onStartRadio() + } + ) + } + + onPlaySingle?.let { onPlaySingle -> + MenuEntry( + icon = R.drawable.play, + text = "Play single", + onClick = { + onDismiss() + onPlaySingle() + } + ) + } + + onPlayNext?.let { onPlayNext -> + MenuEntry( + icon = R.drawable.play_skip_forward, + text = "Play next", + onClick = { + onDismiss() + onPlayNext() + } + ) + } + + onEnqueue?.let { onEnqueue -> + MenuEntry( + icon = R.drawable.enqueue, + text = "Enqueue", + onClick = { + onDismiss() + onEnqueue() + } + ) + } + onGoToEqualizer?.let { onGoToEqualizer -> MenuEntry( icon = R.drawable.equalizer, @@ -496,50 +540,6 @@ fun MediaItemMenu( ) } - onStartRadio?.let { onStartRadio -> - MenuEntry( - icon = R.drawable.radio, - text = "Start radio", - onClick = { - onDismiss() - onStartRadio() - } - ) - } - - onPlaySingle?.let { onPlaySingle -> - MenuEntry( - icon = R.drawable.play, - text = "Play single", - onClick = { - onDismiss() - onPlaySingle() - } - ) - } - - onPlayNext?.let { onPlayNext -> - MenuEntry( - icon = R.drawable.play_skip_forward, - text = "Play next", - onClick = { - onDismiss() - onPlayNext() - } - ) - } - - onEnqueue?.let { onEnqueue -> - MenuEntry( - icon = R.drawable.enqueue, - text = "Enqueue", - onClick = { - onDismiss() - onEnqueue() - } - ) - } - if (onAddToPlaylist != null) { MenuEntry( icon = R.drawable.playlist, diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlayerView.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlayerView.kt index 8b1789c..bff9c2f 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlayerView.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlayerView.kt @@ -55,6 +55,7 @@ import it.vfsfitvnm.vimusic.ui.components.themed.* import it.vfsfitvnm.vimusic.ui.styling.* import it.vfsfitvnm.vimusic.utils.* import it.vfsfitvnm.youtubemusic.YouTube +import it.vfsfitvnm.youtubemusic.models.NavigationEndpoint import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map @@ -281,6 +282,13 @@ fun PlayerView( BaseMediaItemMenu( mediaItem = mediaItem, + onStartRadio = { + binder.stopRadio() + binder.player.seamlessPlay(mediaItem) + binder.setupRadio( + NavigationEndpoint.Endpoint.Watch(videoId = mediaItem.mediaId) + ) + }, onGoToEqualizer = { val intent = Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL).apply { diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/Player.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/Player.kt index de8189e..efe118c 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/Player.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/Player.kt @@ -18,6 +18,15 @@ val Timeline.windows: List val Player.shouldBePlaying: Boolean get() = !(playbackState == Player.STATE_ENDED || !playWhenReady) +fun Player.seamlessPlay(mediaItem: MediaItem) { + if (mediaItem.mediaId == currentMediaItem?.mediaId) { + if (currentMediaItemIndex > 0) removeMediaItems(0, currentMediaItemIndex) + if (currentMediaItemIndex < mediaItemCount - 1) removeMediaItems(currentMediaItemIndex + 1, mediaItemCount) + } else { + forcePlay(mediaItem) + } +} + fun Player.forcePlay(mediaItem: MediaItem) { setMediaItem(mediaItem, true) playWhenReady = true