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

View File

@@ -83,9 +83,11 @@ fun MediaAudioView(
localMedia: LocalMedia?,
info: MediaInfo?,
modifier: Modifier = Modifier,
isDisplayed: Boolean = true,
) {
val exoPlayer = rememberExoPlayer()
ExoPlayerMediaAudioView(
isDisplayed = isDisplayed,
localMediaViewState = localMediaViewState,
bottomPaddingInPixels = bottomPaddingInPixels,
exoPlayer = exoPlayer,
@@ -98,6 +100,7 @@ fun MediaAudioView(
@SuppressLint("UnsafeOptInUsageError")
@Composable
private fun ExoPlayerMediaAudioView(
isDisplayed: Boolean,
localMediaViewState: LocalMediaViewState,
bottomPaddingInPixels: Int,
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) {
LaunchedEffect(localMedia.uri) {
val mediaItem = MediaItem.fromUri(localMedia.uri)

View File

@@ -57,6 +57,7 @@ import kotlin.time.Duration.Companion.seconds
@SuppressLint("UnsafeOptInUsageError")
@Composable
fun MediaVideoView(
isDisplayed: Boolean,
localMediaViewState: LocalMediaViewState,
bottomPaddingInPixels: Int,
localMedia: LocalMedia?,
@@ -64,6 +65,7 @@ fun MediaVideoView(
) {
val exoPlayer = rememberExoPlayer()
ExoPlayerMediaVideoView(
isDisplayed = isDisplayed,
localMediaViewState = localMediaViewState,
bottomPaddingInPixels = bottomPaddingInPixels,
exoPlayer = exoPlayer,
@@ -75,6 +77,7 @@ fun MediaVideoView(
@SuppressLint("UnsafeOptInUsageError")
@Composable
private fun ExoPlayerMediaVideoView(
isDisplayed: Boolean,
localMediaViewState: LocalMediaViewState,
bottomPaddingInPixels: Int,
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) {
LaunchedEffect(localMedia.uri) {
val mediaItem = MediaItem.fromUri(localMedia.uri)
@@ -245,6 +254,7 @@ private fun ExoPlayerMediaVideoView(
@Composable
internal fun MediaVideoViewPreview() = ElementPreview {
MediaVideoView(
isDisplayed = true,
modifier = Modifier.fillMaxSize(),
bottomPaddingInPixels = 0,
localMediaViewState = rememberLocalMediaViewState(),

View File

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