Make possible to start the radio from the currently playing song (#118)
This commit is contained in:
parent
3b9b5a5124
commit
dd200e1374
|
@ -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,
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -18,6 +18,15 @@ val Timeline.windows: List<Timeline.Window>
|
|||
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
|
||||
|
|
Loading…
Reference in a new issue