summaryrefslogtreecommitdiffstats
path: root/core/java/android/view
diff options
context:
space:
mode:
authorSvetoslav <svetoslavganov@google.com>2015-02-09 17:14:28 -0800
committerSvetoslav <svetoslavganov@google.com>2015-02-09 18:33:07 -0800
commitc73cfa0ffba344a83d61e2f4eb9715152a2807b8 (patch)
treede6cc787033a731db74112e8753e4f9ddaef3933 /core/java/android/view
parentb2ba6dfc7b33ec9e58d9f556206440a26069e264 (diff)
downloadframeworks_base-c73cfa0ffba344a83d61e2f4eb9715152a2807b8.zip
frameworks_base-c73cfa0ffba344a83d61e2f4eb9715152a2807b8.tar.gz
frameworks_base-c73cfa0ffba344a83d61e2f4eb9715152a2807b8.tar.bz2
Accessibiltiy: missed update to the previous patch.
Change-Id: I4c47d38f5e137dcc1c6db0561b3824a26572027d
Diffstat (limited to 'core/java/android/view')
-rw-r--r--core/java/android/view/ViewGroup.java55
-rw-r--r--core/java/android/view/ViewRootImpl.java7
2 files changed, 55 insertions, 7 deletions
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 2182127..c4b689f 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -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();
}
@@ -2115,6 +2142,34 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
}
/**
+ * 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.
*/
private void resetTouchState() {
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 15d47ba..e4d82b1 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -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) {