Skip to content

Commit 8ffe8b3

Browse files
committed
Accessibility focus search and setting it from hover are performed by the client.
1. Currently we are providing accessibility focus search algorithm in the framework and we are also setting accessibility focus from hover. It appears that implementing a focus search strategy that works for all accessibility services is non trivial task if feasible. Based on feedback from the developers of two such services at Google - TalkBack and BarilleBack - the built in focus search does not quite match what they need and they would like to implement a custom strategy. Hence, having APIs for accessibility focus search in the framework does not make. Therefore, we are hiding this APIs and later will take out the focus search logic and allow the accessibility service to implement search. Also putting accessibility focus from hover is tightly integrated with the focus search since the set of views that get accessibility focus from hover should be the same as the set of views returned by the focus search routine. Therefore, we are letting the accessibility service decide where to put accessibility focus when it gets an accessibility hover event. bug:6675330 Change-Id: Ie152230990a6602f3fd1d82de2177d0b1444d654
1 parent 68a808b commit 8ffe8b3

File tree

5 files changed

+44
-26
lines changed

5 files changed

+44
-26
lines changed

api/16.txt

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24358,12 +24358,6 @@ package android.view {
2435824358
method protected boolean verifyDrawable(android.graphics.drawable.Drawable);
2435924359
method public boolean willNotCacheDrawing();
2436024360
method public boolean willNotDraw();
24361-
field public static final int ACCESSIBILITY_FOCUS_BACKWARD = 4097; // 0x1001
24362-
field public static final int ACCESSIBILITY_FOCUS_DOWN = 4226; // 0x1082
24363-
field public static final int ACCESSIBILITY_FOCUS_FORWARD = 4098; // 0x1002
24364-
field public static final int ACCESSIBILITY_FOCUS_LEFT = 4113; // 0x1011
24365-
field public static final int ACCESSIBILITY_FOCUS_RIGHT = 4162; // 0x1042
24366-
field public static final int ACCESSIBILITY_FOCUS_UP = 4129; // 0x1021
2436724361
field public static final android.util.Property ALPHA;
2436824362
field public static final int DRAWING_CACHE_QUALITY_AUTO = 0; // 0x0
2436924363
field public static final int DRAWING_CACHE_QUALITY_HIGH = 1048576; // 0x100000
@@ -24385,7 +24379,6 @@ package android.view {
2438524379
field protected static final int[] FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
2438624380
field protected static final int[] FOCUSED_STATE_SET;
2438724381
field protected static final int[] FOCUSED_WINDOW_FOCUSED_STATE_SET;
24388-
field public static final int FOCUS_ACCESSIBILITY = 4096; // 0x1000
2438924382
field public static final int FOCUS_BACKWARD = 1; // 0x1
2439024383
field public static final int FOCUS_DOWN = 130; // 0x82
2439124384
field public static final int FOCUS_FORWARD = 2; // 0x2
@@ -25332,7 +25325,6 @@ package android.view.accessibility {
2533225325

2533325326
public abstract class AccessibilityNodeProvider {
2533425327
ctor public AccessibilityNodeProvider();
25335-
method public android.view.accessibility.AccessibilityNodeInfo accessibilityFocusSearch(int, int);
2533625328
method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(int);
2533725329
method public android.view.accessibility.AccessibilityNodeInfo findAccessibilityFocus(int);
2533825330
method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByText(java.lang.String, int);

api/current.txt

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24369,12 +24369,6 @@ package android.view {
2436924369
method protected boolean verifyDrawable(android.graphics.drawable.Drawable);
2437024370
method public boolean willNotCacheDrawing();
2437124371
method public boolean willNotDraw();
24372-
field public static final int ACCESSIBILITY_FOCUS_BACKWARD = 4097; // 0x1001
24373-
field public static final int ACCESSIBILITY_FOCUS_DOWN = 4226; // 0x1082
24374-
field public static final int ACCESSIBILITY_FOCUS_FORWARD = 4098; // 0x1002
24375-
field public static final int ACCESSIBILITY_FOCUS_LEFT = 4113; // 0x1011
24376-
field public static final int ACCESSIBILITY_FOCUS_RIGHT = 4162; // 0x1042
24377-
field public static final int ACCESSIBILITY_FOCUS_UP = 4129; // 0x1021
2437824372
field public static final android.util.Property ALPHA;
2437924373
field public static final int DRAWING_CACHE_QUALITY_AUTO = 0; // 0x0
2438024374
field public static final int DRAWING_CACHE_QUALITY_HIGH = 1048576; // 0x100000
@@ -24396,7 +24390,6 @@ package android.view {
2439624390
field protected static final int[] FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
2439724391
field protected static final int[] FOCUSED_STATE_SET;
2439824392
field protected static final int[] FOCUSED_WINDOW_FOCUSED_STATE_SET;
24399-
field public static final int FOCUS_ACCESSIBILITY = 4096; // 0x1000
2440024393
field public static final int FOCUS_BACKWARD = 1; // 0x1
2440124394
field public static final int FOCUS_DOWN = 130; // 0x82
2440224395
field public static final int FOCUS_FORWARD = 2; // 0x2
@@ -25343,7 +25336,6 @@ package android.view.accessibility {
2534325336

2534425337
public abstract class AccessibilityNodeProvider {
2534525338
ctor public AccessibilityNodeProvider();
25346-
method public android.view.accessibility.AccessibilityNodeInfo accessibilityFocusSearch(int, int);
2534725339
method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(int);
2534825340
method public android.view.accessibility.AccessibilityNodeInfo findAccessibilityFocus(int);
2534925341
method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByText(java.lang.String, int);

core/java/android/view/View.java

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,36 +1047,50 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
10471047
/**
10481048
* The accessibility focus which is the current user position when
10491049
* interacting with the accessibility framework.
1050+
*
1051+
* @hide
10501052
*/
10511053
public static final int FOCUS_ACCESSIBILITY = 0x00001000;
10521054

10531055
/**
10541056
* Use with {@link #focusSearch(int)}. Move acessibility focus left.
1057+
*
1058+
* @hide
10551059
*/
10561060
public static final int ACCESSIBILITY_FOCUS_LEFT = FOCUS_LEFT | FOCUS_ACCESSIBILITY;
10571061

10581062
/**
10591063
* Use with {@link #focusSearch(int)}. Move acessibility focus up.
1064+
*
1065+
* @hide
10601066
*/
10611067
public static final int ACCESSIBILITY_FOCUS_UP = FOCUS_UP | FOCUS_ACCESSIBILITY;
10621068

10631069
/**
10641070
* Use with {@link #focusSearch(int)}. Move acessibility focus right.
1071+
*
1072+
* @hide
10651073
*/
10661074
public static final int ACCESSIBILITY_FOCUS_RIGHT = FOCUS_RIGHT | FOCUS_ACCESSIBILITY;
10671075

10681076
/**
10691077
* Use with {@link #focusSearch(int)}. Move acessibility focus down.
1078+
*
1079+
* @hide
10701080
*/
10711081
public static final int ACCESSIBILITY_FOCUS_DOWN = FOCUS_DOWN | FOCUS_ACCESSIBILITY;
10721082

10731083
/**
10741084
* Use with {@link #focusSearch(int)}. Move acessibility focus forward.
1085+
*
1086+
* @hide
10751087
*/
10761088
public static final int ACCESSIBILITY_FOCUS_FORWARD = FOCUS_FORWARD | FOCUS_ACCESSIBILITY;
10771089

10781090
/**
10791091
* Use with {@link #focusSearch(int)}. Move acessibility focus backward.
1092+
*
1093+
* @hide
10801094
*/
10811095
public static final int ACCESSIBILITY_FOCUS_BACKWARD = FOCUS_BACKWARD | FOCUS_ACCESSIBILITY;
10821096

@@ -6333,6 +6347,31 @@ public void clearAccessibilityFocus() {
63336347
}
63346348
}
63356349

6350+
private void sendAccessibilityHoverEvent(int eventType) {
6351+
// Since we are not delivering to a client accessibility events from not
6352+
// important views (unless the clinet request that) we need to fire the
6353+
// event from the deepest view exposed to the client. As a consequence if
6354+
// the user crosses a not exposed view the client will see enter and exit
6355+
// of the exposed predecessor followed by and enter and exit of that same
6356+
// predecessor when entering and exiting the not exposed descendant. This
6357+
// is fine since the client has a clear idea which view is hovered at the
6358+
// price of a couple more events being sent. This is a simple and
6359+
// working solution.
6360+
View source = this;
6361+
while (true) {
6362+
if (source.includeForAccessibility()) {
6363+
source.sendAccessibilityEvent(eventType);
6364+
return;
6365+
}
6366+
ViewParent parent = source.getParent();
6367+
if (parent instanceof View) {
6368+
source = (View) parent;
6369+
} else {
6370+
return;
6371+
}
6372+
}
6373+
}
6374+
63366375
private void requestAccessibilityFocusFromHover() {
63376376
if (includeForAccessibility() && isActionableForAccessibility()) {
63386377
requestAccessibilityFocus();
@@ -7902,16 +7941,15 @@ public boolean onHoverEvent(MotionEvent event) {
79027941
|| action == MotionEvent.ACTION_HOVER_MOVE)
79037942
&& !hasHoveredChild()
79047943
&& pointInView(event.getX(), event.getY())) {
7905-
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_HOVER_ENTER);
7944+
sendAccessibilityHoverEvent(AccessibilityEvent.TYPE_VIEW_HOVER_ENTER);
79067945
mSendingHoverAccessibilityEvents = true;
7907-
requestAccessibilityFocusFromHover();
79087946
}
79097947
} else {
79107948
if (action == MotionEvent.ACTION_HOVER_EXIT
79117949
|| (action == MotionEvent.ACTION_MOVE
79127950
&& !pointInView(event.getX(), event.getY()))) {
79137951
mSendingHoverAccessibilityEvents = false;
7914-
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_HOVER_EXIT);
7952+
sendAccessibilityHoverEvent(AccessibilityEvent.TYPE_VIEW_HOVER_EXIT);
79157953
// If the window does not have input focus we take away accessibility
79167954
// focus as soon as the user stop hovering over the view.
79177955
if (mAttachInfo != null && !mAttachInfo.mHasWindowFocus) {

core/java/android/view/accessibility/AccessibilityNodeInfo.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -469,13 +469,7 @@ public AccessibilityNodeInfo findFocus(int focus) {
469469
* {@link View#FOCUS_LEFT},
470470
* {@link View#FOCUS_RIGHT},
471471
* {@link View#FOCUS_FORWARD},
472-
* {@link View#FOCUS_BACKWARD},
473-
* {@link View#ACCESSIBILITY_FOCUS_FORWARD},
474-
* {@link View#ACCESSIBILITY_FOCUS_BACKWARD},
475-
* {@link View#ACCESSIBILITY_FOCUS_UP},
476-
* {@link View#ACCESSIBILITY_FOCUS_RIGHT},
477-
* {@link View#ACCESSIBILITY_FOCUS_DOWN},
478-
* {@link View#ACCESSIBILITY_FOCUS_LEFT}.
472+
* {@link View#FOCUS_BACKWARD}.
479473
*
480474
* @return The node info for the view that can take accessibility focus.
481475
*/

core/java/android/view/accessibility/AccessibilityNodeProvider.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,8 @@ public AccessibilityNodeInfo findAccessibilityFocus(int virtualViewId) {
180180
*
181181
* @see #createAccessibilityNodeInfo(int)
182182
* @see AccessibilityNodeInfo
183+
*
184+
* @hide
183185
*/
184186
public AccessibilityNodeInfo accessibilityFocusSearch(int direction, int virtualViewId) {
185187
return null;

0 commit comments

Comments
 (0)