Код: Выделить всё
@Composable
fun MediaPlayerController(
isMediaPlaying: Boolean,
onStart: () -> Unit,
onNext: () -> Unit
) {
Row() {
FloatingActionButton(
onClick = { onStart() },
) {
Icon(imageVector = if (isMediaPlaying) Icons.Filled.Pause else Icons.Filled.PlayArrow, contentDescription = null)
}
}
}
Код: Выделить всё
@Composable
fun BottomBarPlayer(
media: Media,
isMediaPlaying: Boolean,
onStart: () -> Unit,
onNext: () -> Unit,
) {
BottomAppBar(content = {
Column(
) {
Row(
) {
MediaPlayerController(
isMediaPlaying = isMediaPlaying,
onStart = onStart,
onNext = onNext
)
}
}
})
}
Код: Выделить всё
@Composable
fun App(
isMediaPlaying: Boolean,
mediaList: MutableList,
currentPlayingMedia: Media,
onItemClicked: (Int) -> Unit,
) {
Scaffold( bottomBar = {
BottomBarPlayer(media = currentPlayingMedia , isMediaPlaying =isMediaPlaying , onStart = onStart,onNext=onNext,navController=navController)
}
)
}
}
Код: Выделить всё
@Composable
fun Main() {
LMusicTheme {
Surface(
) {
App(
isMediaPlaying = viewModel.isPlaying,
mediaList = viewModel.mediaList,
currentPlayingMedia = viewModel.currentSelectedMedia,
onStart = {
viewModel.onUiEvents(UIEvents.PlayToggle)
},
onItemClicked = {
viewModel.onUiEvents(UIEvents.SelectedMediaChange(it))
startService()
},
onNext = { viewModel.onUiEvents(UIEvents.SeekToNext) })
}
}
}
Код: Выделить всё
fun onUiEvents(uiEvents: UIEvents) = viewModelScope.launch {
when(uiEvents){
UIEvents.SeekToNext ->mediaPlayerServiceHandle.onPlayerEvents(PlayerEvent.SeekToNext)
is UIEvents.PlayToggle -> {
mediaPlayerServiceHandle.onPlayerEvents(
PlayerEvent.PlayToggle
)
}
is UIEvents.SelectedMediaChange -> {
mediaPlayerServiceHandle.onPlayerEvents(
PlayerEvent.SelectMediaChange,
selectedAudioIndex = uiEvents.index
)
}
}
}
Код: Выделить всё
suspend fun onPlayerEvents(
playerEvent: PlayerEvent, selectedAudioIndex: Int = -1, seekPosition: Long = 0
) {
when (playerEvent) {
PlayerEvent.PlayToggle -> playToggle()
PlayerEvent.SelectMediaChange -> {
when (selectedAudioIndex) {
exoPlayer.currentMediaItemIndex -> {
if (exoPlayer.isPlaying){
_mediaState.value = MediaState.Playing(
isPlaying = false
)
playToggle()
}else{
_mediaState.value = MediaState.Playing(
isPlaying = true
)
playToggle()
}
}
else -> {
exoPlayer.seekToDefaultPosition(selectedAudioIndex)
_mediaState.value = MediaState.Playing(
isPlaying = true
)
exoPlayer.playWhenReady = true
startProgressUpdate()
}
}
}
}
}
}
Код: Выделить всё
private suspend fun playToggle() {
if (exoPlayer.isPlaying) {
exoPlayer.pause()
_mediaState.value = MediaState.CurrentPlaying(
exoPlayer.currentMediaItemIndex
)
_mediaState.value = MediaState.Playing(
isPlaying = false
)
Log.e("MediaPlayerServiceHandle", "playToggle: isPlaying ${exoPlayer.isPlaying}")
stopProgressUpdate()
} else {
_mediaState.value = MediaState.Playing(
isPlaying = true
)
exoPlayer.play()
_mediaState.value = MediaState.CurrentPlaying(
exoPlayer.currentMediaItemIndex
)
Log.e("MediaPlayerServiceHandle", "playToggle: isPlaying ${exoPlayer.isPlaying}")
startProgressUpdate()
}
}
Я не знаю, как это изменилось, я нуд, пожалуйста, помогите мне, спасибо
я не могу публиковать больше кода, я пытаюсь удалить код, который кажется бесполезным для этого вопроса, если нужно, я опубликую, извините, я нуб
p>
Честно говоря, я хочу попробовать использовать currentRecomposeScope.invalidate(), но думаю, что это нехорошо, есть другие способы?
Подробнее здесь: https://stackoverflow.com/questions/787 ... -value-cha
Мобильная версия