Merge "Accessibility: Handle a missed case when clicking focused views." into lmp-mr1-dev
This commit is contained in:
@@ -1931,12 +1931,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
|
||||
mInputEventConsistencyVerifier.onTouchEvent(ev, 1);
|
||||
}
|
||||
|
||||
// Whether this event should be handled by the accessibility focus first.
|
||||
final boolean targetAccessibilityFocus = ev.isTargetAccessibilityFocus();
|
||||
|
||||
// If the event targets the accessibility focused view and this is it, start
|
||||
// normal event dispatch. Maybe a descendant is what will handle the click.
|
||||
if (targetAccessibilityFocus && isAccessibilityFocusedViewOrHost()) {
|
||||
if (ev.isTargetAccessibilityFocus() && isAccessibilityFocusedViewOrHost()) {
|
||||
ev.setTargetAccessibilityFocus(false);
|
||||
}
|
||||
|
||||
@@ -1956,24 +1953,25 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
|
||||
|
||||
// Check for interception.
|
||||
final boolean intercepted;
|
||||
if (!targetAccessibilityFocus) {
|
||||
if (actionMasked == MotionEvent.ACTION_DOWN
|
||||
|| mFirstTouchTarget != null) {
|
||||
final boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0;
|
||||
if (!disallowIntercept) {
|
||||
intercepted = onInterceptTouchEvent(ev);
|
||||
ev.setAction(action); // restore action in case it was changed
|
||||
} else {
|
||||
intercepted = false;
|
||||
}
|
||||
if (actionMasked == MotionEvent.ACTION_DOWN
|
||||
|| mFirstTouchTarget != null) {
|
||||
final boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0;
|
||||
if (!disallowIntercept) {
|
||||
intercepted = onInterceptTouchEvent(ev);
|
||||
ev.setAction(action); // restore action in case it was changed
|
||||
} else {
|
||||
// There are no touch targets and this action is not an initial down
|
||||
// so this view group continues to intercept touches.
|
||||
intercepted = true;
|
||||
intercepted = false;
|
||||
}
|
||||
} else {
|
||||
// If event should reach the accessibility focus first, do not intercept it.
|
||||
intercepted = false;
|
||||
// There are no touch targets and this action is not an initial down
|
||||
// so this view group continues to intercept touches.
|
||||
intercepted = true;
|
||||
}
|
||||
|
||||
// If intercepted, start normal event dispatch. Also if there is already
|
||||
// a view that is handling the gesture, do normal event dispatch.
|
||||
if (intercepted || mFirstTouchTarget != null) {
|
||||
ev.setTargetAccessibilityFocus(false);
|
||||
}
|
||||
|
||||
// Check for cancelation.
|
||||
@@ -1987,8 +1985,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
|
||||
if (!canceled && !intercepted) {
|
||||
if (actionMasked == MotionEvent.ACTION_DOWN
|
||||
|| (split && actionMasked == MotionEvent.ACTION_POINTER_DOWN)
|
||||
|| actionMasked == MotionEvent.ACTION_HOVER_MOVE
|
||||
|| targetAccessibilityFocus) {
|
||||
|| actionMasked == MotionEvent.ACTION_HOVER_MOVE) {
|
||||
final int actionIndex = ev.getActionIndex(); // always 0 for down
|
||||
final int idBitsToAssign = split ? 1 << ev.getPointerId(actionIndex)
|
||||
: TouchTarget.ALL_POINTER_IDS;
|
||||
|
||||
@@ -4121,6 +4121,13 @@ public final class ViewRootImpl implements ViewParent,
|
||||
|
||||
mAttachInfo.mUnbufferedDispatchRequested = false;
|
||||
boolean handled = mView.dispatchPointerEvent(event);
|
||||
if (!handled && event.isTargetAccessibilityFocus()) {
|
||||
// The event was targeting accessibility focused view and is not handled,
|
||||
// it is very rare but possible that a predecessor of the focused view handles
|
||||
// the event but didn't due to special dispatch, perform normal event dispatch.
|
||||
event.setTargetAccessibilityFocus(false);
|
||||
handled = mView.dispatchPointerEvent(event);
|
||||
}
|
||||
if (mAttachInfo.mUnbufferedDispatchRequested && !mUnbufferedInputDispatch) {
|
||||
mUnbufferedInputDispatch = true;
|
||||
if (mConsumeBatchedInputScheduled) {
|
||||
|
||||
Reference in New Issue
Block a user