diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 959ca6fc86..61452f12d6 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -48,6 +48,11 @@ `PlayerView.setEnableComposeSurfaceSyncWorkaround` in order to opt-in ([#1237](https://github.com/androidx/media/issues/1237), [#1594](https://github.com/androidx/media/issues/1594)). + * Add `setFullscreenButtonState` to `PlayerView` to allow updates of + fullscreen button's icon on demand, i.e. out-of-band and not reactively + to a click interaction + ([#1590](https://github.com/androidx/media/issues/1590), + [#184](https://github.com/androidx/media/issues/184)). * Downloads: * OkHttp Extension: * Cronet Extension: diff --git a/libraries/ui/src/main/java/androidx/media3/ui/PlayerControlView.java b/libraries/ui/src/main/java/androidx/media3/ui/PlayerControlView.java index a8e4c831b6..f19d4e90b5 100644 --- a/libraries/ui/src/main/java/androidx/media3/ui/PlayerControlView.java +++ b/libraries/ui/src/main/java/androidx/media3/ui/PlayerControlView.java @@ -1575,15 +1575,30 @@ public class PlayerControlView extends FrameLayout { } private void onFullScreenButtonClicked(View v) { - if (onFullScreenModeChangedListener == null) { + updateIsFullscreen(!isFullScreen); + } + + /** + * Updates whether the controller is in fullscreen, changing its fullscreen icon and reports it to + * to the listener. + * + *
For {@code isFullscreen} equals {@code true} the icon will be set to + * {@code @drawable/exo_styled_controls_fullscreen_exit} or else + * {@code @drawable/exo_styled_controls_fullscreen_enter}. + * + * @param isFullscreen If the view is in full screen. + */ + public void updateIsFullscreen(boolean isFullscreen) { + if (this.isFullScreen == isFullscreen) { return; } - isFullScreen = !isFullScreen; - updateFullScreenButtonForState(fullScreenButton, isFullScreen); - updateFullScreenButtonForState(minimalFullScreenButton, isFullScreen); + this.isFullScreen = isFullscreen; + updateFullScreenButtonForState(fullScreenButton, isFullscreen); + updateFullScreenButtonForState(minimalFullScreenButton, isFullscreen); + if (onFullScreenModeChangedListener != null) { - onFullScreenModeChangedListener.onFullScreenModeChanged(isFullScreen); + onFullScreenModeChangedListener.onFullScreenModeChanged(isFullscreen); } } diff --git a/libraries/ui/src/main/java/androidx/media3/ui/PlayerView.java b/libraries/ui/src/main/java/androidx/media3/ui/PlayerView.java index e4c4d0b013..535802b098 100644 --- a/libraries/ui/src/main/java/androidx/media3/ui/PlayerView.java +++ b/libraries/ui/src/main/java/androidx/media3/ui/PlayerView.java @@ -1139,6 +1139,21 @@ public class PlayerView extends FrameLayout implements AdViewProvider { controller.setOnFullScreenModeChangedListener(componentListener); } + /** + * Sets whether the player is currently in fullscreen, this will change the displayed icon. + * + *
If {@code isFullscreen} is {@code true}, + * {@code @drawable/exo_styled_controls_fullscreen_exit} will be displayed or else + * {@code @drawable/exo_styled_controls_fullscreen_enter}. + * + * @param isFullscreen Whether the player is currently in fullscreen. + */ + @UnstableApi + public void setFullscreenButtonState(boolean isFullscreen) { + Assertions.checkStateNotNull(controller); + controller.updateIsFullscreen(isFullscreen); + } + /** * Sets the {@link PlayerControlView.OnFullScreenModeChangedListener}. *