am c73cfa0f: Accessibiltiy: missed update to the previous patch.

* commit 'c73cfa0ffba344a83d61e2f4eb9715152a2807b8':
  Accessibiltiy: missed update to the previous patch.
This commit is contained in:
Svetoslav
2015-02-10 02:51:30 +00:00
committed by Android Git Automerger
2 changed files with 55 additions and 7 deletions

View File

@@ -1983,6 +1983,15 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
TouchTarget newTouchTarget = null;
boolean alreadyDispatchedToNewTouchTarget = false;
if (!canceled && !intercepted) {
// If the event is targeting accessiiblity focus we give it to the
// view that has accessibility focus and if it does not handle it
// we clear the flag and dispatch the event to all children as usual.
// We are looking up the accessibility focused host to avoid keeping
// state since these events are very rare.
View childWithAccessibilityFocus = ev.isTargetAccessibilityFocus()
? findChildWithAccessibilityFocus() : null;
if (actionMasked == MotionEvent.ACTION_DOWN
|| (split && actionMasked == MotionEvent.ACTION_POINTER_DOWN)
|| actionMasked == MotionEvent.ACTION_HOVER_MOVE) {
@@ -2009,8 +2018,22 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
? getChildDrawingOrder(childrenCount, i) : i;
final View child = (preorderedList == null)
? children[childIndex] : preorderedList.get(childIndex);
// If there is a view that has accessibility focus we want it
// to get the event first and if not handled we will perform a
// normal dispatch. We may do a double iteration but this is
// safer given the timeframe.
if (childWithAccessibilityFocus != null) {
if (childWithAccessibilityFocus != child) {
continue;
}
childWithAccessibilityFocus = null;
i = childrenCount - 1;
}
if (!canViewReceivePointerEvents(child)
|| !isTransformedTouchPointInView(x, y, child, null)) {
ev.setTargetAccessibilityFocus(false);
continue;
}
@@ -2043,6 +2066,10 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
alreadyDispatchedToNewTouchTarget = true;
break;
}
// The accessibility focus didn't handle the event, so clear
// the flag and do a normal dispatch to all children.
ev.setTargetAccessibilityFocus(false);
}
if (preorderedList != null) preorderedList.clear();
}
@@ -2114,6 +2141,34 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
return handled;
}
/**
* Finds the child which has accessibility focus.
*
* @return The child that has focus.
*/
private View findChildWithAccessibilityFocus() {
ViewRootImpl viewRoot = getViewRootImpl();
if (viewRoot == null) {
return null;
}
View current = viewRoot.getAccessibilityFocusedHost();
if (current == null) {
return null;
}
ViewParent parent = current.getParent();
while (parent instanceof View) {
if (parent == this) {
return current;
}
current = (View) parent;
parent = current.getParent();
}
return null;
}
/**
* Resets all touch state in preparation for a new cycle.
*/

View File

@@ -4121,13 +4121,6 @@ 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) {