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.player.MediaPlayerControllerState
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.togglePlay
import io.element.android.libraries.mediaviewer.impl.local.rememberLocalMediaViewState
import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.delay
@@ -241,10 +243,7 @@ private fun ExoPlayerMediaAudioView(
showCursor = true,
waveform = waveform.toPersistentList(),
onSeek = {
if (exoPlayer.isPlaying.not()) {
exoPlayer.play()
}
exoPlayer.seekTo((it * exoPlayer.duration).toLong())
exoPlayer.seekToEnsurePlaying((it * exoPlayer.duration).toLong())
},
seekEnabled = true,
)
@@ -279,21 +278,10 @@ private fun ExoPlayerMediaAudioView(
MediaPlayerControllerView(
state = mediaPlayerControllerState,
onTogglePlay = {
if (exoPlayer.isPlaying) {
exoPlayer.pause()
} else {
if (exoPlayer.playbackState == Player.STATE_ENDED) {
exoPlayer.seekTo(0)
} else {
exoPlayer.play()
}
}
exoPlayer.togglePlay()
},
onSeekChange = {
if (exoPlayer.isPlaying.not()) {
exoPlayer.play()
}
exoPlayer.seekTo(it.toLong())
exoPlayer.seekToEnsurePlaying(it.toLong())
},
onToggleMute = {
// 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.player.MediaPlayerControllerState
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.togglePlay
import io.element.android.libraries.mediaviewer.impl.local.rememberLocalMediaViewState
import kotlinx.coroutines.delay
import kotlin.time.Duration.Companion.seconds
@@ -208,22 +210,11 @@ private fun ExoPlayerMediaVideoView(
state = mediaPlayerControllerState,
onTogglePlay = {
autoHideController++
if (exoPlayer.isPlaying) {
exoPlayer.pause()
} else {
if (exoPlayer.playbackState == Player.STATE_ENDED) {
exoPlayer.seekTo(0)
} else {
exoPlayer.play()
}
}
exoPlayer.togglePlay()
},
onSeekChange = {
autoHideController++
if (exoPlayer.isPlaying.not()) {
exoPlayer.play()
}
exoPlayer.seekTo(it.toLong())
exoPlayer.seekToEnsurePlaying(it.toLong())
},
onToggleMute = {
autoHideController++