*** Original commit ***

Rollback of 20282151b5

*** Original commit ***

Fix PlayerView touch handling

Overriding onTouchEvent was causing multiple issues, and
appears to be unnecessary. Removing the override fixes:

1. StyledPlayerView accessibility issue where "hide player
   controls" actually toggled play/pause.
2. Delivery of events to a registered OnClick...

***

PiperOrigin-RevId: 434502423
This commit is contained in:
olly 2022-03-14 17:29:56 +00:00 committed by Oliver Woodman
parent dadfea0211
commit dacf8f847c
2 changed files with 24 additions and 55 deletions

View File

@ -514,11 +514,14 @@ public class PlayerView extends FrameLayout implements AdViewProvider {
this.controllerAutoShow = controllerAutoShow; this.controllerAutoShow = controllerAutoShow;
this.controllerHideDuringAds = controllerHideDuringAds; this.controllerHideDuringAds = controllerHideDuringAds;
this.useController = useController && controller != null; this.useController = useController && controller != null;
hideController();
updateContentDescription();
if (controller != null) { if (controller != null) {
controller.hide();
controller.addVisibilityListener(/* listener= */ componentListener); controller.addVisibilityListener(/* listener= */ componentListener);
} }
if (useController) {
setClickable(true);
}
updateContentDescription();
} }
/** /**
@ -682,10 +685,14 @@ public class PlayerView extends FrameLayout implements AdViewProvider {
* Sets whether the playback controls can be shown. If set to {@code false} the playback controls * Sets whether the playback controls can be shown. If set to {@code false} the playback controls
* are never visible and are disconnected from the player. * are never visible and are disconnected from the player.
* *
* <p>This call will update whether the view is clickable. After the call, the view will be
* clickable if playback controls can be shown or if the view has a registered click listener.
*
* @param useController Whether the playback controls can be shown. * @param useController Whether the playback controls can be shown.
*/ */
public void setUseController(boolean useController) { public void setUseController(boolean useController) {
Assertions.checkState(!useController || controller != null); Assertions.checkState(!useController || controller != null);
setClickable(useController || hasOnClickListeners());
if (this.useController == useController) { if (this.useController == useController) {
return; return;
} }
@ -1072,31 +1079,10 @@ public class PlayerView extends FrameLayout implements AdViewProvider {
return subtitleView; return subtitleView;
} }
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!useController() || player == null) {
return false;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isTouching = true;
return true;
case MotionEvent.ACTION_UP:
if (isTouching) {
isTouching = false;
performClick();
return true;
}
return false;
default:
return false;
}
}
@Override @Override
public boolean performClick() { public boolean performClick() {
super.performClick(); toggleControllerVisibility();
return toggleControllerVisibility(); return super.performClick();
} }
@Override @Override
@ -1192,16 +1178,15 @@ public class PlayerView extends FrameLayout implements AdViewProvider {
return false; return false;
} }
private boolean toggleControllerVisibility() { private void toggleControllerVisibility() {
if (!useController() || player == null) { if (!useController() || player == null) {
return false; return;
} }
if (!controller.isVisible()) { if (!controller.isVisible()) {
maybeShowController(true); maybeShowController(true);
} else if (controllerHideOnTouch) { } else if (controllerHideOnTouch) {
controller.hide(); controller.hide();
} }
return true;
} }
/** Shows the playback controls, but only if forced or shown indefinitely. */ /** Shows the playback controls, but only if forced or shown indefinitely. */

View File

@ -432,6 +432,9 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider {
controller.hideImmediately(); controller.hideImmediately();
controller.addVisibilityListener(/* listener= */ componentListener); controller.addVisibilityListener(/* listener= */ componentListener);
} }
if (useController) {
setClickable(true);
}
updateContentDescription(); updateContentDescription();
} }
@ -596,10 +599,14 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider {
* Sets whether the playback controls can be shown. If set to {@code false} the playback controls * Sets whether the playback controls can be shown. If set to {@code false} the playback controls
* are never visible and are disconnected from the player. * are never visible and are disconnected from the player.
* *
* <p>This call will update whether the view is clickable. After the call, the view will be
* clickable if playback controls can be shown or if the view has a registered click listener.
*
* @param useController Whether the playback controls can be shown. * @param useController Whether the playback controls can be shown.
*/ */
public void setUseController(boolean useController) { public void setUseController(boolean useController) {
Assertions.checkState(!useController || controller != null); Assertions.checkState(!useController || controller != null);
setClickable(useController || hasOnClickListeners());
if (this.useController == useController) { if (this.useController == useController) {
return; return;
} }
@ -1018,30 +1025,10 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider {
return subtitleView; return subtitleView;
} }
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!useController() || player == null) {
return false;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isTouching = true;
return true;
case MotionEvent.ACTION_UP:
if (isTouching) {
isTouching = false;
return performClick();
}
return false;
default:
return false;
}
}
@Override @Override
public boolean performClick() { public boolean performClick() {
super.performClick(); toggleControllerVisibility();
return toggleControllerVisibility(); return super.performClick();
} }
@Override @Override
@ -1137,18 +1124,15 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider {
return false; return false;
} }
private boolean toggleControllerVisibility() { private void toggleControllerVisibility() {
if (!useController() || player == null) { if (!useController() || player == null) {
return false; return;
} }
if (!controller.isFullyVisible()) { if (!controller.isFullyVisible()) {
maybeShowController(true); maybeShowController(true);
return true;
} else if (controllerHideOnTouch) { } else if (controllerHideOnTouch) {
controller.hide(); controller.hide();
return true;
} }
return false;
} }
/** Shows the playback controls, but only if forced or shown indefinitely. */ /** Shows the playback controls, but only if forced or shown indefinitely. */