Fix media cover placeholder floating (#6484)

This commit is contained in:
bxdxnn 2026-03-30 12:26:16 +03:00 committed by GitHub
parent 43e0d2d1ce
commit 69aeee67a5

View file

@ -25,6 +25,7 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@ -51,6 +52,7 @@ import androidx.media3.common.Timeline
import androidx.media3.exoplayer.ExoPlayer import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.ui.AspectRatioFrameLayout import androidx.media3.ui.AspectRatioFrameLayout
import androidx.media3.ui.PlayerView import androidx.media3.ui.PlayerView
import com.bumble.appyx.core.node.LocalNodeTargetVisibility
import io.element.android.compound.theme.ElementTheme import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.libraries.audio.api.AudioFocus import io.element.android.libraries.audio.api.AudioFocus
@ -130,6 +132,8 @@ private fun ExoPlayerMediaAudioView(
mutableStateOf(null) mutableStateOf(null)
} }
val isTargetVisible = LocalNodeTargetVisibility.current
val playableState: PlayableState.Playable by remember { val playableState: PlayableState.Playable by remember {
derivedStateOf { derivedStateOf {
PlayableState.Playable( PlayableState.Playable(
@ -196,13 +200,21 @@ private fun ExoPlayerMediaAudioView(
exoPlayer.pause() exoPlayer.pause()
} }
} }
LaunchedEffect(isTargetVisible) {
if (!isTargetVisible) {
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)
exoPlayer.setMediaItem(mediaItem) exoPlayer.setMediaItem(mediaItem)
exoPlayer.prepare()
} }
} else { } else {
exoPlayer.setMediaItems(emptyList()) LaunchedEffect(Unit) {
exoPlayer.setMediaItems(emptyList())
}
} }
val context = LocalContext.current val context = LocalContext.current
val waveform = info?.waveform val waveform = info?.waveform
@ -247,7 +259,7 @@ private fun ExoPlayerMediaAudioView(
} }
}, },
update = { playerView -> update = { playerView ->
playerView.isVisible = metadata.hasArtwork() playerView.isVisible = metadata.hasArtwork() && isTargetVisible
}, },
onRelease = { playerView -> onRelease = { playerView ->
playerView.player = null playerView.player = null
@ -317,16 +329,19 @@ private fun ExoPlayerMediaAudioView(
) )
} }
OnLifecycleEvent { _, event -> DisposableEffect(exoPlayer) {
when (event) { exoPlayer.addListener(playerListener)
Lifecycle.Event.ON_CREATE -> exoPlayer.addListener(playerListener) onDispose {
Lifecycle.Event.ON_RESUME -> exoPlayer.prepare() if (!exoPlayer.isReleased) {
Lifecycle.Event.ON_PAUSE -> exoPlayer.pause()
Lifecycle.Event.ON_DESTROY -> {
exoPlayer.release()
exoPlayer.removeListener(playerListener) exoPlayer.removeListener(playerListener)
exoPlayer.release()
} }
else -> Unit }
}
OnLifecycleEvent { _, event ->
if (event == Lifecycle.Event.ON_PAUSE) {
exoPlayer.pause()
} }
} }
} }