From 3cb0195c185502487bd9b607e67ebaaf31505bab Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 21 Dec 2022 10:58:36 +0000 Subject: [PATCH] Fix recursive loop when registering controller visibility listeners There are two overloads of this method due to a type 'rename' from `PlayerControlView.VisibilityListener` to `PlayerView.ControllerVisibilityListener`. Currently when you call one overload it passes `null` to the other one (to clear the other listener). Unfortunately this results in it clearing itself, because it receives a null call back! This change tweaks the documentation to clarify that the 'other' listener is only cleared if you pass a non-null listener in. This solves the recursive problem, and allows the 'legacy' visibility listener to be successfully registered. Issue: androidx/media#229 #minor-release PiperOrigin-RevId: 496876397 (cherry picked from commit 37fd65a8e51ddba92584109217114d9f2c2f009d) --- .../android/exoplayer2/ui/StyledPlayerView.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java index 33b95c087b4..48e6821f525 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java @@ -868,8 +868,8 @@ public void setControllerHideDuringAds(boolean controllerHideDuringAds) { /** * Sets the {@link StyledPlayerControlView.VisibilityListener}. * - *

Removes any listener set by {@link - * #setControllerVisibilityListener(StyledPlayerControlView.VisibilityListener)}. + *

If {@code listener} is non-null then any listener set by {@link + * #setControllerVisibilityListener(StyledPlayerControlView.VisibilityListener)} is removed. * * @param listener The listener to be notified about visibility changes, or null to remove the * current listener. @@ -877,14 +877,16 @@ public void setControllerHideDuringAds(boolean controllerHideDuringAds) { @SuppressWarnings("deprecation") // Clearing the legacy listener. public void setControllerVisibilityListener(@Nullable ControllerVisibilityListener listener) { this.controllerVisibilityListener = listener; - setControllerVisibilityListener((StyledPlayerControlView.VisibilityListener) null); + if (listener != null) { + setControllerVisibilityListener((StyledPlayerControlView.VisibilityListener) null); + } } /** * Sets the {@link StyledPlayerControlView.VisibilityListener}. * - *

Removes any listener set by {@link - * #setControllerVisibilityListener(ControllerVisibilityListener)}. + *

If {@code listener} is non-null then any listener set by {@link + * #setControllerVisibilityListener(ControllerVisibilityListener)} is removed. * * @deprecated Use {@link #setControllerVisibilityListener(ControllerVisibilityListener)} instead. */ @@ -903,8 +905,8 @@ public void setControllerVisibilityListener( this.legacyControllerVisibilityListener = listener; if (listener != null) { controller.addVisibilityListener(listener); + setControllerVisibilityListener((ControllerVisibilityListener) null); } - setControllerVisibilityListener((ControllerVisibilityListener) null); } /**