Skip to content

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

Closed
@DassieKlip

Description

@DassieKlip

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()
        }
    }
}

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions