Description
Good day,
I am using ExoPlayer and PlayerView with Jetpack Compose.
Dependencies:
androidx.media3:media3-exoplayer:1.0.0-beta02
androidx.media3:media3-ui:1.0.0-beta02
The ExoPlayer instance is kept in the view model.
If the user enters fullscreen mode, and then changes the device orientation, then the view is recomposed, and the PlayerView recreated with the fullscreen button state defaulting to 'false'.
Consequently, the user has to tap the fullscreen button twice to exit fullscreen mode.
There isn't an exposed property to set the fullscreen state, so is there a way to have PlayerView created with the fullscreen state of 'true' or have it remember that is was 'true'?
Is this an oversight? Or am I using PlayerView incorrectly?
I do not think that the fullscreen button should force a particular orientation change, because the video could have been recorded in landscape mode or portrait mode.
import android.view.ViewGroup
import android.widget.FrameLayout
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.ui.viewinterop.AndroidView
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.ui.AspectRatioFrameLayout
import androidx.media3.ui.PlayerView
private const val KEY = "VIDEO_VIEWER_KEY"
@Composable
fun VideoViewer(
exoPlayer: ExoPlayer,
onFullscreenToggle: (Boolean) -> Unit
) {
AndroidView(factory = { context ->
PlayerView(context).apply {
setFullscreenButtonClickListener { isFullscreen -> onFullscreenToggle(isFullscreen) }
showController()
useController = true
resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIT
player = exoPlayer
layoutParams = FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
}
})
DisposableEffect(key1 = KEY) {
onDispose {
exoPlayer.pause()
exoPlayer.seekToDefaultPosition()
exoPlayer.clearMediaItems()
}
}
}