Make possible to start the radio from the currently playing song (#118)

This commit is contained in:
vfsfitvnm
2022-07-22 15:20:38 +02:00
parent 3b9b5a5124
commit dd200e1374
3 changed files with 63 additions and 46 deletions

View File

@@ -184,13 +184,13 @@ fun QueuedMediaItemMenu(
onGlobalRouteEmitted: (() -> Unit)? = null onGlobalRouteEmitted: (() -> Unit)? = null
) { ) {
val menuState = LocalMenuState.current val menuState = LocalMenuState.current
val player = LocalPlayerServiceBinder.current?.player val binder = LocalPlayerServiceBinder.current
BaseMediaItemMenu( BaseMediaItemMenu(
mediaItem = mediaItem, mediaItem = mediaItem,
onDismiss = onDismiss ?: menuState::hide, onDismiss = onDismiss ?: menuState::hide,
onRemoveFromQueue = if (indexInQueue != null) ({ onRemoveFromQueue = if (indexInQueue != null) ({
player?.removeMediaItem(indexInQueue) binder?.player?.removeMediaItem(indexInQueue)
}) else null, }) else null,
onGlobalRouteEmitted = onGlobalRouteEmitted, onGlobalRouteEmitted = onGlobalRouteEmitted,
modifier = modifier modifier = modifier
@@ -359,6 +359,50 @@ fun MediaItemMenu(
detectTapGestures { } 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 -> onGoToEqualizer?.let { onGoToEqualizer ->
MenuEntry( MenuEntry(
icon = R.drawable.equalizer, 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) { if (onAddToPlaylist != null) {
MenuEntry( MenuEntry(
icon = R.drawable.playlist, icon = R.drawable.playlist,

View File

@@ -55,6 +55,7 @@ import it.vfsfitvnm.vimusic.ui.components.themed.*
import it.vfsfitvnm.vimusic.ui.styling.* import it.vfsfitvnm.vimusic.ui.styling.*
import it.vfsfitvnm.vimusic.utils.* import it.vfsfitvnm.vimusic.utils.*
import it.vfsfitvnm.youtubemusic.YouTube import it.vfsfitvnm.youtubemusic.YouTube
import it.vfsfitvnm.youtubemusic.models.NavigationEndpoint
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
@@ -281,6 +282,13 @@ fun PlayerView(
BaseMediaItemMenu( BaseMediaItemMenu(
mediaItem = mediaItem, mediaItem = mediaItem,
onStartRadio = {
binder.stopRadio()
binder.player.seamlessPlay(mediaItem)
binder.setupRadio(
NavigationEndpoint.Endpoint.Watch(videoId = mediaItem.mediaId)
)
},
onGoToEqualizer = { onGoToEqualizer = {
val intent = val intent =
Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL).apply { Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL).apply {

View File

@@ -18,6 +18,15 @@ val Timeline.windows: List<Timeline.Window>
val Player.shouldBePlaying: Boolean val Player.shouldBePlaying: Boolean
get() = !(playbackState == Player.STATE_ENDED || !playWhenReady) 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) { fun Player.forcePlay(mediaItem: MediaItem) {
setMediaItem(mediaItem, true) setMediaItem(mediaItem, true)
playWhenReady = true playWhenReady = true