androidx / media

Jetpack Media3 support libraries for media use cases, including ExoPlayer, an extensible media player for Android
https://developer.android.com/media/media3
Apache License 2.0
1.65k stars 390 forks source link

How to make PlayerView remember its fullscreen button state? #184

Closed DassieKlip closed 1 year ago

DassieKlip commented 2 years ago

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()
        }
    }
}
icbaker commented 1 year ago

I think this basically boils down to a duplicate of https://github.com/google/ExoPlayer/issues/10391 (note: StyledPlayerView in ExoPlayer is spelt PlayerView in media3: https://github.com/androidx/media/issues/186#issuecomment-1281979304).

oceanjules commented 1 month ago

Will be fixed by https://github.com/androidx/media/pull/1653