From 1424df59f7b46e96ceca66dad1bffe29f8d83a85 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 12 Dec 2024 17:16:40 +0100 Subject: [PATCH] Extract methods to toggle play and seek the player --- .../impl/local/audio/MediaAudioView.kt | 22 ++++---------- .../impl/local/player/ExoPlayerExtensions.kt | 30 +++++++++++++++++++ .../impl/local/video/MediaVideoView.kt | 17 +++-------- 3 files changed, 39 insertions(+), 30 deletions(-) create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/ExoPlayerExtensions.kt diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/audio/MediaAudioView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/audio/MediaAudioView.kt index 9e42e29ec4..edacda6fad 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/audio/MediaAudioView.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/audio/MediaAudioView.kt @@ -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 diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/ExoPlayerExtensions.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/ExoPlayerExtensions.kt new file mode 100644 index 0000000000..2de6d62065 --- /dev/null +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/ExoPlayerExtensions.kt @@ -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) +} diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/video/MediaVideoView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/video/MediaVideoView.kt index 7bddcb9b4d..9f5317d933 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/video/MediaVideoView.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/video/MediaVideoView.kt @@ -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++