If not displayed, make sure to pause the audio / video

This commit is contained in:
Benoit Marty 2025-01-17 12:43:41 +01:00 committed by Benoit Marty
parent 3e9528fa93
commit b02c12d92a
4 changed files with 25 additions and 0 deletions

View file

@ -27,6 +27,7 @@ fun LocalMediaView(
bottomPaddingInPixels: Int, bottomPaddingInPixels: Int,
onClick: () -> Unit, onClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
isDisplayed: Boolean = true,
localMediaViewState: LocalMediaViewState = rememberLocalMediaViewState(), localMediaViewState: LocalMediaViewState = rememberLocalMediaViewState(),
mediaInfo: MediaInfo? = localMedia?.info, mediaInfo: MediaInfo? = localMedia?.info,
) { ) {
@ -39,6 +40,7 @@ fun LocalMediaView(
onClick = onClick, onClick = onClick,
) )
mimeType.isMimeTypeVideo() -> MediaVideoView( mimeType.isMimeTypeVideo() -> MediaVideoView(
isDisplayed = isDisplayed,
localMediaViewState = localMediaViewState, localMediaViewState = localMediaViewState,
bottomPaddingInPixels = bottomPaddingInPixels, bottomPaddingInPixels = bottomPaddingInPixels,
localMedia = localMedia, localMedia = localMedia,
@ -51,6 +53,7 @@ fun LocalMediaView(
onClick = onClick, onClick = onClick,
) )
mimeType.isMimeTypeAudio() -> MediaAudioView( mimeType.isMimeTypeAudio() -> MediaAudioView(
isDisplayed = isDisplayed,
localMediaViewState = localMediaViewState, localMediaViewState = localMediaViewState,
bottomPaddingInPixels = bottomPaddingInPixels, bottomPaddingInPixels = bottomPaddingInPixels,
localMedia = localMedia, localMedia = localMedia,

View file

@ -83,9 +83,11 @@ fun MediaAudioView(
localMedia: LocalMedia?, localMedia: LocalMedia?,
info: MediaInfo?, info: MediaInfo?,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
isDisplayed: Boolean = true,
) { ) {
val exoPlayer = rememberExoPlayer() val exoPlayer = rememberExoPlayer()
ExoPlayerMediaAudioView( ExoPlayerMediaAudioView(
isDisplayed = isDisplayed,
localMediaViewState = localMediaViewState, localMediaViewState = localMediaViewState,
bottomPaddingInPixels = bottomPaddingInPixels, bottomPaddingInPixels = bottomPaddingInPixels,
exoPlayer = exoPlayer, exoPlayer = exoPlayer,
@ -98,6 +100,7 @@ fun MediaAudioView(
@SuppressLint("UnsafeOptInUsageError") @SuppressLint("UnsafeOptInUsageError")
@Composable @Composable
private fun ExoPlayerMediaAudioView( private fun ExoPlayerMediaAudioView(
isDisplayed: Boolean,
localMediaViewState: LocalMediaViewState, localMediaViewState: LocalMediaViewState,
bottomPaddingInPixels: Int, bottomPaddingInPixels: Int,
exoPlayer: ExoPlayer, exoPlayer: ExoPlayer,
@ -176,6 +179,12 @@ private fun ExoPlayerMediaAudioView(
) )
} }
} }
LaunchedEffect(isDisplayed) {
// If not displayed, make sure to pause the audio
if (!isDisplayed) {
exoPlayer.pause()
}
}
if (localMedia?.uri != null) { if (localMedia?.uri != null) {
LaunchedEffect(localMedia.uri) { LaunchedEffect(localMedia.uri) {
val mediaItem = MediaItem.fromUri(localMedia.uri) val mediaItem = MediaItem.fromUri(localMedia.uri)

View file

@ -57,6 +57,7 @@ import kotlin.time.Duration.Companion.seconds
@SuppressLint("UnsafeOptInUsageError") @SuppressLint("UnsafeOptInUsageError")
@Composable @Composable
fun MediaVideoView( fun MediaVideoView(
isDisplayed: Boolean,
localMediaViewState: LocalMediaViewState, localMediaViewState: LocalMediaViewState,
bottomPaddingInPixels: Int, bottomPaddingInPixels: Int,
localMedia: LocalMedia?, localMedia: LocalMedia?,
@ -64,6 +65,7 @@ fun MediaVideoView(
) { ) {
val exoPlayer = rememberExoPlayer() val exoPlayer = rememberExoPlayer()
ExoPlayerMediaVideoView( ExoPlayerMediaVideoView(
isDisplayed = isDisplayed,
localMediaViewState = localMediaViewState, localMediaViewState = localMediaViewState,
bottomPaddingInPixels = bottomPaddingInPixels, bottomPaddingInPixels = bottomPaddingInPixels,
exoPlayer = exoPlayer, exoPlayer = exoPlayer,
@ -75,6 +77,7 @@ fun MediaVideoView(
@SuppressLint("UnsafeOptInUsageError") @SuppressLint("UnsafeOptInUsageError")
@Composable @Composable
private fun ExoPlayerMediaVideoView( private fun ExoPlayerMediaVideoView(
isDisplayed: Boolean,
localMediaViewState: LocalMediaViewState, localMediaViewState: LocalMediaViewState,
bottomPaddingInPixels: Int, bottomPaddingInPixels: Int,
exoPlayer: ExoPlayer, exoPlayer: ExoPlayer,
@ -161,6 +164,12 @@ private fun ExoPlayerMediaVideoView(
) )
} }
} }
LaunchedEffect(isDisplayed) {
// If not displayed, make sure to pause the video
if (!isDisplayed) {
exoPlayer.pause()
}
}
if (localMedia?.uri != null) { if (localMedia?.uri != null) {
LaunchedEffect(localMedia.uri) { LaunchedEffect(localMedia.uri) {
val mediaItem = MediaItem.fromUri(localMedia.uri) val mediaItem = MediaItem.fromUri(localMedia.uri)
@ -245,6 +254,7 @@ private fun ExoPlayerMediaVideoView(
@Composable @Composable
internal fun MediaVideoViewPreview() = ElementPreview { internal fun MediaVideoViewPreview() = ElementPreview {
MediaVideoView( MediaVideoView(
isDisplayed = true,
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
bottomPaddingInPixels = 0, bottomPaddingInPixels = 0,
localMediaViewState = rememberLocalMediaViewState(), localMediaViewState = rememberLocalMediaViewState(),

View file

@ -135,6 +135,7 @@ fun MediaViewerView(
state.eventSink(MediaViewerEvents.LoadMedia(dataForPage)) state.eventSink(MediaViewerEvents.LoadMedia(dataForPage))
} }
MediaViewerPage( MediaViewerPage(
isDisplayed = page == pagerState.settledPage,
showOverlay = showOverlay, showOverlay = showOverlay,
bottomPaddingInPixels = bottomPaddingInPixels, bottomPaddingInPixels = bottomPaddingInPixels,
data = dataForPage, data = dataForPage,
@ -246,6 +247,7 @@ fun MediaViewerView(
@Composable @Composable
private fun MediaViewerPage( private fun MediaViewerPage(
isDisplayed: Boolean,
showOverlay: Boolean, showOverlay: Boolean,
bottomPaddingInPixels: Int, bottomPaddingInPixels: Int,
state: MediaViewerState, state: MediaViewerState,
@ -307,6 +309,7 @@ private fun MediaViewerPage(
LocalMediaView( LocalMediaView(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
isDisplayed = isDisplayed,
bottomPaddingInPixels = bottomPaddingInPixels, bottomPaddingInPixels = bottomPaddingInPixels,
localMediaViewState = localMediaViewState, localMediaViewState = localMediaViewState,
localMedia = data.downloadedMedia.dataOrNull(), localMedia = data.downloadedMedia.dataOrNull(),