summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorSvetoslav Ganov <svetoslavganov@google.com>2012-06-18 10:32:16 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2012-06-18 10:32:16 -0700
commit11832db437d04d71dec9a78382138b2dd6518e37 (patch)
tree40a47d1d992de45441e8641176056c1fc7ea61b8 /core
parentd18d623fe95ccf1c8aace064d0fcdd2818c19578 (diff)
parent531d5866d8e2529e2ae1c6ef12202119753bec03 (diff)
downloadframeworks_base-11832db437d04d71dec9a78382138b2dd6518e37.zip
frameworks_base-11832db437d04d71dec9a78382138b2dd6518e37.tar.gz
frameworks_base-11832db437d04d71dec9a78382138b2dd6518e37.tar.bz2
am 531d5866: Merge "Accessibility focus search and setting it from hover are performed by the client." into jb-dev
* commit '531d5866d8e2529e2ae1c6ef12202119753bec03': Accessibility focus search and setting it from hover are performed by the client.
Diffstat (limited to 'core')
-rw-r--r--core/java/android/view/View.java44
-rw-r--r--core/java/android/view/accessibility/AccessibilityNodeInfo.java8
-rw-r--r--core/java/android/view/accessibility/AccessibilityNodeProvider.java2
3 files changed, 44 insertions, 10 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 816b631..db3ba40 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -1047,36 +1047,50 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
/**
* The accessibility focus which is the current user position when
* interacting with the accessibility framework.
+ *
+ * @hide
*/
public static final int FOCUS_ACCESSIBILITY = 0x00001000;
/**
* Use with {@link #focusSearch(int)}. Move acessibility focus left.
+ *
+ * @hide
*/
public static final int ACCESSIBILITY_FOCUS_LEFT = FOCUS_LEFT | FOCUS_ACCESSIBILITY;
/**
* Use with {@link #focusSearch(int)}. Move acessibility focus up.
+ *
+ * @hide
*/
public static final int ACCESSIBILITY_FOCUS_UP = FOCUS_UP | FOCUS_ACCESSIBILITY;
/**
* Use with {@link #focusSearch(int)}. Move acessibility focus right.
+ *
+ * @hide
*/
public static final int ACCESSIBILITY_FOCUS_RIGHT = FOCUS_RIGHT | FOCUS_ACCESSIBILITY;
/**
* Use with {@link #focusSearch(int)}. Move acessibility focus down.
+ *
+ * @hide
*/
public static final int ACCESSIBILITY_FOCUS_DOWN = FOCUS_DOWN | FOCUS_ACCESSIBILITY;
/**
* Use with {@link #focusSearch(int)}. Move acessibility focus forward.
+ *
+ * @hide
*/
public static final int ACCESSIBILITY_FOCUS_FORWARD = FOCUS_FORWARD | FOCUS_ACCESSIBILITY;
/**
* Use with {@link #focusSearch(int)}. Move acessibility focus backward.
+ *
+ * @hide
*/
public static final int ACCESSIBILITY_FOCUS_BACKWARD = FOCUS_BACKWARD | FOCUS_ACCESSIBILITY;
@@ -6333,6 +6347,31 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
}
}
+ private void sendAccessibilityHoverEvent(int eventType) {
+ // Since we are not delivering to a client accessibility events from not
+ // important views (unless the clinet request that) we need to fire the
+ // event from the deepest view exposed to the client. As a consequence if
+ // the user crosses a not exposed view the client will see enter and exit
+ // of the exposed predecessor followed by and enter and exit of that same
+ // predecessor when entering and exiting the not exposed descendant. This
+ // is fine since the client has a clear idea which view is hovered at the
+ // price of a couple more events being sent. This is a simple and
+ // working solution.
+ View source = this;
+ while (true) {
+ if (source.includeForAccessibility()) {
+ source.sendAccessibilityEvent(eventType);
+ return;
+ }
+ ViewParent parent = source.getParent();
+ if (parent instanceof View) {
+ source = (View) parent;
+ } else {
+ return;
+ }
+ }
+ }
+
private void requestAccessibilityFocusFromHover() {
if (includeForAccessibility() && isActionableForAccessibility()) {
requestAccessibilityFocus();
@@ -7902,16 +7941,15 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
|| action == MotionEvent.ACTION_HOVER_MOVE)
&& !hasHoveredChild()
&& pointInView(event.getX(), event.getY())) {
- sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_HOVER_ENTER);
+ sendAccessibilityHoverEvent(AccessibilityEvent.TYPE_VIEW_HOVER_ENTER);
mSendingHoverAccessibilityEvents = true;
- requestAccessibilityFocusFromHover();
}
} else {
if (action == MotionEvent.ACTION_HOVER_EXIT
|| (action == MotionEvent.ACTION_MOVE
&& !pointInView(event.getX(), event.getY()))) {
mSendingHoverAccessibilityEvents = false;
- sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_HOVER_EXIT);
+ sendAccessibilityHoverEvent(AccessibilityEvent.TYPE_VIEW_HOVER_EXIT);
// If the window does not have input focus we take away accessibility
// focus as soon as the user stop hovering over the view.
if (mAttachInfo != null && !mAttachInfo.mHasWindowFocus) {
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
index 3834fd6..3ad3a55 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
@@ -469,13 +469,7 @@ public class AccessibilityNodeInfo implements Parcelable {
* {@link View#FOCUS_LEFT},
* {@link View#FOCUS_RIGHT},
* {@link View#FOCUS_FORWARD},
- * {@link View#FOCUS_BACKWARD},
- * {@link View#ACCESSIBILITY_FOCUS_FORWARD},
- * {@link View#ACCESSIBILITY_FOCUS_BACKWARD},
- * {@link View#ACCESSIBILITY_FOCUS_UP},
- * {@link View#ACCESSIBILITY_FOCUS_RIGHT},
- * {@link View#ACCESSIBILITY_FOCUS_DOWN},
- * {@link View#ACCESSIBILITY_FOCUS_LEFT}.
+ * {@link View#FOCUS_BACKWARD}.
*
* @return The node info for the view that can take accessibility focus.
*/
diff --git a/core/java/android/view/accessibility/AccessibilityNodeProvider.java b/core/java/android/view/accessibility/AccessibilityNodeProvider.java
index e60716d..c17cb8a 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeProvider.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeProvider.java
@@ -180,6 +180,8 @@ public abstract class AccessibilityNodeProvider {
*
* @see #createAccessibilityNodeInfo(int)
* @see AccessibilityNodeInfo
+ *
+ * @hide
*/
public AccessibilityNodeInfo accessibilityFocusSearch(int direction, int virtualViewId) {
return null;