Merge "Accessibility: Handle a missed case when clicking focused views." into lmp-mr1-dev

This commit is contained in:
Baligh Uddin
2015-02-10 00:57:19 +00:00
committed by Android (Google) Code Review
2 changed files with 25 additions and 21 deletions

View File

@@ -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;

View File

@@ -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) {