Make possible to start the radio from the currently playing song (#118)
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user