Extract methods to toggle play and seek the player

This commit is contained in:
Benoit Marty 2024-12-12 17:16:40 +01:00 committed by Benoit Marty
parent ad0cc678d8
commit 1424df59f7
3 changed files with 39 additions and 30 deletions

View file

@ -69,7 +69,9 @@ import io.element.android.libraries.mediaviewer.impl.local.LocalMediaViewState
import io.element.android.libraries.mediaviewer.impl.local.PlayableState import io.element.android.libraries.mediaviewer.impl.local.PlayableState
import io.element.android.libraries.mediaviewer.impl.local.player.MediaPlayerControllerState import io.element.android.libraries.mediaviewer.impl.local.player.MediaPlayerControllerState
import io.element.android.libraries.mediaviewer.impl.local.player.MediaPlayerControllerView import io.element.android.libraries.mediaviewer.impl.local.player.MediaPlayerControllerView
import io.element.android.libraries.mediaviewer.impl.local.player.seekToEnsurePlaying
import io.element.android.libraries.mediaviewer.impl.local.player.rememberExoPlayer import io.element.android.libraries.mediaviewer.impl.local.player.rememberExoPlayer
import io.element.android.libraries.mediaviewer.impl.local.player.togglePlay
import io.element.android.libraries.mediaviewer.impl.local.rememberLocalMediaViewState import io.element.android.libraries.mediaviewer.impl.local.rememberLocalMediaViewState
import kotlinx.collections.immutable.toPersistentList import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
@ -241,10 +243,7 @@ private fun ExoPlayerMediaAudioView(
showCursor = true, showCursor = true,
waveform = waveform.toPersistentList(), waveform = waveform.toPersistentList(),
onSeek = { onSeek = {
if (exoPlayer.isPlaying.not()) { exoPlayer.seekToEnsurePlaying((it * exoPlayer.duration).toLong())
exoPlayer.play()
}
exoPlayer.seekTo((it * exoPlayer.duration).toLong())
}, },
seekEnabled = true, seekEnabled = true,
) )
@ -279,21 +278,10 @@ private fun ExoPlayerMediaAudioView(
MediaPlayerControllerView( MediaPlayerControllerView(
state = mediaPlayerControllerState, state = mediaPlayerControllerState,
onTogglePlay = { onTogglePlay = {
if (exoPlayer.isPlaying) { exoPlayer.togglePlay()
exoPlayer.pause()
} else {
if (exoPlayer.playbackState == Player.STATE_ENDED) {
exoPlayer.seekTo(0)
} else {
exoPlayer.play()
}
}
}, },
onSeekChange = { onSeekChange = {
if (exoPlayer.isPlaying.not()) { exoPlayer.seekToEnsurePlaying(it.toLong())
exoPlayer.play()
}
exoPlayer.seekTo(it.toLong())
}, },
onToggleMute = { onToggleMute = {
// Cannot happen for audio files // Cannot happen for audio files

View file

@ -0,0 +1,30 @@
/*
* Copyright 2024 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only
* Please see LICENSE in the repository root for full details.
*/
package io.element.android.libraries.mediaviewer.impl.local.player
import androidx.media3.common.Player
import androidx.media3.exoplayer.ExoPlayer
fun ExoPlayer.togglePlay() {
if (isPlaying) {
pause()
} else {
if (playbackState == Player.STATE_ENDED) {
seekTo(0)
} else {
play()
}
}
}
fun ExoPlayer.seekToEnsurePlaying(positionMs: Long) {
if (isPlaying.not()) {
play()
}
seekTo(positionMs)
}

View file

@ -47,7 +47,9 @@ import io.element.android.libraries.mediaviewer.impl.local.LocalMediaViewState
import io.element.android.libraries.mediaviewer.impl.local.PlayableState import io.element.android.libraries.mediaviewer.impl.local.PlayableState
import io.element.android.libraries.mediaviewer.impl.local.player.MediaPlayerControllerState import io.element.android.libraries.mediaviewer.impl.local.player.MediaPlayerControllerState
import io.element.android.libraries.mediaviewer.impl.local.player.MediaPlayerControllerView import io.element.android.libraries.mediaviewer.impl.local.player.MediaPlayerControllerView
import io.element.android.libraries.mediaviewer.impl.local.player.seekToEnsurePlaying
import io.element.android.libraries.mediaviewer.impl.local.player.rememberExoPlayer import io.element.android.libraries.mediaviewer.impl.local.player.rememberExoPlayer
import io.element.android.libraries.mediaviewer.impl.local.player.togglePlay
import io.element.android.libraries.mediaviewer.impl.local.rememberLocalMediaViewState import io.element.android.libraries.mediaviewer.impl.local.rememberLocalMediaViewState
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlin.time.Duration.Companion.seconds import kotlin.time.Duration.Companion.seconds
@ -208,22 +210,11 @@ private fun ExoPlayerMediaVideoView(
state = mediaPlayerControllerState, state = mediaPlayerControllerState,
onTogglePlay = { onTogglePlay = {
autoHideController++ autoHideController++
if (exoPlayer.isPlaying) { exoPlayer.togglePlay()
exoPlayer.pause()
} else {
if (exoPlayer.playbackState == Player.STATE_ENDED) {
exoPlayer.seekTo(0)
} else {
exoPlayer.play()
}
}
}, },
onSeekChange = { onSeekChange = {
autoHideController++ autoHideController++
if (exoPlayer.isPlaying.not()) { exoPlayer.seekToEnsurePlaying(it.toLong())
exoPlayer.play()
}
exoPlayer.seekTo(it.toLong())
}, },
onToggleMute = { onToggleMute = {
autoHideController++ autoHideController++