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 OnClickListener when useController is false. 3. Delivery of events to a registered OnLongClickListener in all configurations. 4. Incorrectly treating a sequence of touch events that exit the bounds of the view before ACTION_UP as a click, both for delivery to OnClickListener and for toggling the controls. Note: After this change, control visibility will not be toggled if the application developer explicitly sets the view to be non-clickable. I think that's probably working as intended though. It seems correct that a non-clickable view would not respond to clicks. Issue: google/ExoPlayer#8627 Issue: google/ExoPlayer#9605 Issue: google/ExoPlayer#9861 PiperOrigin-RevId: 433016626
This commit is contained in:
parent
b2a5298e27
commit
20282151b5
@ -35,6 +35,17 @@
|
|||||||
views to be used with other `Player` implementations, and removes the
|
views to be used with other `Player` implementations, and removes the
|
||||||
dependency from the UI module to the ExoPlayer module. This is a
|
dependency from the UI module to the ExoPlayer module. This is a
|
||||||
breaking change.
|
breaking change.
|
||||||
|
* UI:
|
||||||
|
* Fix delivery of events to `OnClickListener`s set on `StyledPlayerView`
|
||||||
|
and `PlayerView`, in the case that `useController=false`
|
||||||
|
([#9605](https://github.com/google/ExoPlayer/issues/9605)). Also fix
|
||||||
|
delivery of events to `OnLongClickListener` for all view configurations.
|
||||||
|
* Fix incorrectly treating a sequence of touch events that exit the bounds
|
||||||
|
of `StyledPlayerView` and `PlayerView` before `ACTION_UP` as a click
|
||||||
|
([#9861](https://github.com/google/ExoPlayer/issues/9861)).
|
||||||
|
* Fix `StyledPlayerView` accessibility issue where it was not possible to
|
||||||
|
tapping would toggle playback rather than hiding the controls
|
||||||
|
([#8627](https://github.com/google/ExoPlayer/issues/8627)).
|
||||||
* RTSP:
|
* RTSP:
|
||||||
* Add RTP reader for HEVC
|
* Add RTP reader for HEVC
|
||||||
([#36](https://github.com/androidx/media/pull/36)).
|
([#36](https://github.com/androidx/media/pull/36)).
|
||||||
|
@ -397,6 +397,7 @@ public class PlayerView extends FrameLayout implements AdViewProvider {
|
|||||||
|
|
||||||
LayoutInflater.from(context).inflate(playerLayoutId, this);
|
LayoutInflater.from(context).inflate(playerLayoutId, this);
|
||||||
setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
|
setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
|
||||||
|
setClickable(true);
|
||||||
|
|
||||||
// Content frame.
|
// Content frame.
|
||||||
contentFrame = findViewById(R.id.exo_content_frame);
|
contentFrame = findViewById(R.id.exo_content_frame);
|
||||||
@ -1072,31 +1073,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 +1172,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. */
|
||||||
|
@ -311,6 +311,7 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider {
|
|||||||
|
|
||||||
LayoutInflater.from(context).inflate(playerLayoutId, this);
|
LayoutInflater.from(context).inflate(playerLayoutId, this);
|
||||||
setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
|
setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
|
||||||
|
setClickable(true);
|
||||||
|
|
||||||
// Content frame.
|
// Content frame.
|
||||||
contentFrame = findViewById(R.id.exo_content_frame);
|
contentFrame = findViewById(R.id.exo_content_frame);
|
||||||
@ -1018,30 +1019,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 +1118,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. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user