Skip to content

Commit 45a02e0

Browse files
committed
API for finding accessibility focus in virtual tree not needed.
1. The function for finding where the accessibility focus in a virtual node tree presented by an AccessibilityNodeProvider is not needed API since the framework already keeps track of the accessibility focused virtual node in order to draw the focus rectangle. This API adds unnecessary complexity to developers of AccessibilityNodeProviders. bug:6675330 Change-Id: I84774686b06a995073a39e45b8ef22f2cd04b773
1 parent 130b457 commit 45a02e0

File tree

6 files changed

+42
-70
lines changed

6 files changed

+42
-70
lines changed

api/16.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25342,7 +25342,6 @@ package android.view.accessibility {
2534225342
public abstract class AccessibilityNodeProvider {
2534325343
ctor public AccessibilityNodeProvider();
2534425344
method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(int);
25345-
method public android.view.accessibility.AccessibilityNodeInfo findAccessibilityFocus(int);
2534625345
method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByText(java.lang.String, int);
2534725346
method public boolean performAction(int, int, android.os.Bundle);
2534825347
}

api/current.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25344,7 +25344,6 @@ package android.view.accessibility {
2534425344
public abstract class AccessibilityNodeProvider {
2534525345
ctor public AccessibilityNodeProvider();
2534625346
method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(int);
25347-
method public android.view.accessibility.AccessibilityNodeInfo findAccessibilityFocus(int);
2534825347
method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByText(java.lang.String, int);
2534925348
method public boolean performAction(int, int, android.os.Bundle);
2535025349
}

core/java/android/view/AccessibilityInteractionController.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,10 @@ private void findFocusUiThread(Message message) {
480480
// focus instead fetching all provider nodes to do the search here.
481481
AccessibilityNodeProvider provider = host.getAccessibilityNodeProvider();
482482
if (provider != null) {
483-
focused = provider.findAccessibilityFocus(virtualDescendantId);
483+
if (mViewRootImpl.mAccessibilityFocusedVirtualView != null) {
484+
focused = AccessibilityNodeInfo.obtain(
485+
mViewRootImpl.mAccessibilityFocusedVirtualView);
486+
}
484487
} else if (virtualDescendantId == View.NO_ID) {
485488
focused = host.createAccessibilityNodeInfo();
486489
}
@@ -804,7 +807,6 @@ private void prefetchDescendantsOfRealNode(View root,
804807
if (!(root instanceof ViewGroup)) {
805808
return;
806809
}
807-
ViewGroup rootGroup = (ViewGroup) root;
808810
HashMap<View, AccessibilityNodeInfo> addedChildren =
809811
new HashMap<View, AccessibilityNodeInfo>();
810812
ArrayList<View> children = mTempViewList;

core/java/android/view/View.java

Lines changed: 3 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4558,31 +4558,6 @@ void sendAccessibilityEventUncheckedInternal(AccessibilityEvent event) {
45584558
if ((event.getEventType() & POPULATING_ACCESSIBILITY_EVENT_TYPES) != 0) {
45594559
dispatchPopulateAccessibilityEvent(event);
45604560
}
4561-
// Intercept accessibility focus events fired by virtual nodes to keep
4562-
// track of accessibility focus position in such nodes.
4563-
final int eventType = event.getEventType();
4564-
switch (eventType) {
4565-
case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED: {
4566-
final long virtualNodeId = AccessibilityNodeInfo.getVirtualDescendantId(
4567-
event.getSourceNodeId());
4568-
if (virtualNodeId != AccessibilityNodeInfo.UNDEFINED) {
4569-
ViewRootImpl viewRootImpl = getViewRootImpl();
4570-
if (viewRootImpl != null) {
4571-
viewRootImpl.setAccessibilityFocusedHost(this);
4572-
}
4573-
}
4574-
} break;
4575-
case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED: {
4576-
final long virtualNodeId = AccessibilityNodeInfo.getVirtualDescendantId(
4577-
event.getSourceNodeId());
4578-
if (virtualNodeId != AccessibilityNodeInfo.UNDEFINED) {
4579-
ViewRootImpl viewRootImpl = getViewRootImpl();
4580-
if (viewRootImpl != null) {
4581-
viewRootImpl.setAccessibilityFocusedHost(null);
4582-
}
4583-
}
4584-
} break;
4585-
}
45864561
// In the beginning we called #isShown(), so we know that getParent() is not null.
45874562
getParent().requestSendAccessibilityEvent(this, event);
45884563
}
@@ -6311,7 +6286,7 @@ public boolean requestAccessibilityFocus() {
63116286
mPrivateFlags2 |= ACCESSIBILITY_FOCUSED;
63126287
ViewRootImpl viewRootImpl = getViewRootImpl();
63136288
if (viewRootImpl != null) {
6314-
viewRootImpl.setAccessibilityFocusedHost(this);
6289+
viewRootImpl.setAccessibilityFocus(this, null);
63156290
}
63166291
invalidate();
63176292
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
@@ -6342,7 +6317,7 @@ public void clearAccessibilityFocus() {
63426317
if (viewRootImpl != null) {
63436318
View focusHost = viewRootImpl.getAccessibilityFocusedHost();
63446319
if (focusHost != null && ViewRootImpl.isViewDescendantOf(focusHost, this)) {
6345-
viewRootImpl.setAccessibilityFocusedHost(null);
6320+
viewRootImpl.setAccessibilityFocus(null, null);
63466321
}
63476322
}
63486323
}
@@ -7953,7 +7928,7 @@ && pointInView(event.getX(), event.getY())) {
79537928
// If the window does not have input focus we take away accessibility
79547929
// focus as soon as the user stop hovering over the view.
79557930
if (mAttachInfo != null && !mAttachInfo.mHasWindowFocus) {
7956-
getViewRootImpl().setAccessibilityFocusedHost(null);
7931+
getViewRootImpl().setAccessibilityFocus(null, null);
79577932
}
79587933
}
79597934
}

core/java/android/view/ViewRootImpl.java

Lines changed: 33 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ public void setView(View view, WindowManager.LayoutParams attrs, View panelParen
489489
// Keep track of the actual window flags supplied by the client.
490490
mClientWindowLayoutFlags = attrs.flags;
491491

492-
setAccessibilityFocusedHost(null);
492+
setAccessibilityFocus(null, null);
493493

494494
if (view instanceof RootViewSurfaceTaker) {
495495
mSurfaceHolderCallback =
@@ -558,7 +558,7 @@ public void setView(View view, WindowManager.LayoutParams attrs, View panelParen
558558
mInputChannel = null;
559559
mFallbackEventHandler.setView(null);
560560
unscheduleTraversals();
561-
setAccessibilityFocusedHost(null);
561+
setAccessibilityFocus(null, null);
562562
throw new RuntimeException("Adding window failed", e);
563563
} finally {
564564
if (restore) {
@@ -578,7 +578,7 @@ public void setView(View view, WindowManager.LayoutParams attrs, View panelParen
578578
mAdded = false;
579579
mFallbackEventHandler.setView(null);
580580
unscheduleTraversals();
581-
setAccessibilityFocusedHost(null);
581+
setAccessibilityFocus(null, null);
582582
switch (res) {
583583
case WindowManagerImpl.ADD_BAD_APP_TOKEN:
584584
case WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN:
@@ -2319,9 +2319,6 @@ private void drawAccessibilityFocusedDrawableIfNeeded(Canvas canvas) {
23192319
viewGroup.offsetDescendantRectToMyCoords(mAccessibilityFocusedHost, bounds);
23202320
}
23212321
} else {
2322-
if (mAccessibilityFocusedVirtualView == null) {
2323-
mAccessibilityFocusedVirtualView = provider.findAccessibilityFocus(View.NO_ID);
2324-
}
23252322
if (mAccessibilityFocusedVirtualView == null) {
23262323
return;
23272324
}
@@ -2498,7 +2495,7 @@ public AccessibilityNodeInfo getAccessibilityFocusedVirtualView() {
24982495
return mAccessibilityFocusedVirtualView;
24992496
}
25002497

2501-
void setAccessibilityFocusedHost(View host) {
2498+
void setAccessibilityFocus(View view, AccessibilityNodeInfo node) {
25022499
// If we have a virtual view with accessibility focus we need
25032500
// to clear the focus and invalidate the virtual view bounds.
25042501
if (mAccessibilityFocusedVirtualView != null) {
@@ -2526,24 +2523,16 @@ void setAccessibilityFocusedHost(View host) {
25262523
provider.performAction(virtualNodeId,
25272524
AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS, null);
25282525
}
2526+
focusNode.recycle();
25292527
}
25302528
if (mAccessibilityFocusedHost != null) {
25312529
// Clear accessibility focus in the view.
25322530
mAccessibilityFocusedHost.clearAccessibilityFocusNoCallbacks();
25332531
}
25342532

2535-
// Set the new focus host.
2536-
mAccessibilityFocusedHost = host;
2537-
2538-
// If the host has a provide find the virtual descendant that has focus.
2539-
if (mAccessibilityFocusedHost != null) {
2540-
AccessibilityNodeProvider provider =
2541-
mAccessibilityFocusedHost.getAccessibilityNodeProvider();
2542-
if (provider != null) {
2543-
mAccessibilityFocusedVirtualView = provider.findAccessibilityFocus(View.NO_ID);
2544-
return;
2545-
}
2546-
}
2533+
// Set the new focus host and node.
2534+
mAccessibilityFocusedHost = view;
2535+
mAccessibilityFocusedVirtualView = node;
25472536
}
25482537

25492538
public void requestChildFocus(View child, View focused) {
@@ -2629,7 +2618,7 @@ void dispatchDetachedFromWindow() {
26292618

26302619
destroyHardwareRenderer();
26312620

2632-
setAccessibilityFocusedHost(null);
2621+
setAccessibilityFocus(null, null);
26332622

26342623
mView = null;
26352624
mAttachInfo.mRootView = null;
@@ -2910,7 +2899,7 @@ public void handleMessage(Message msg) {
29102899
mHasHadWindowFocus = true;
29112900
}
29122901

2913-
setAccessibilityFocusedHost(null);
2902+
setAccessibilityFocus(null, null);
29142903

29152904
if (mView != null && mAccessibilityManager.isEnabled()) {
29162905
if (hasWindowFocus) {
@@ -2982,7 +2971,7 @@ public void handleMessage(Message msg) {
29822971
invalidateDisplayLists();
29832972
} break;
29842973
case MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST: {
2985-
setAccessibilityFocusedHost(null);
2974+
setAccessibilityFocus(null, null);
29862975
} break;
29872976
case MSG_DISPATCH_DONE_ANIMATING: {
29882977
handleDispatchDoneAnimating();
@@ -4538,29 +4527,35 @@ public boolean requestSendAccessibilityEvent(View child, AccessibilityEvent even
45384527
if (mView == null) {
45394528
return false;
45404529
}
4541-
// Watch for accessibility focus change events from virtual nodes
4542-
// to keep track of accessibility focus being on a virtual node.
4530+
// Intercept accessibility focus events fired by virtual nodes to keep
4531+
// track of accessibility focus position in such nodes.
45434532
final int eventType = event.getEventType();
45444533
switch (eventType) {
45454534
case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED: {
4546-
final long sourceId = event.getSourceNodeId();
4547-
// If the event is not from a virtual node we are not interested.
4548-
final int virtualViewId = AccessibilityNodeInfo.getVirtualDescendantId(sourceId);
4549-
if (virtualViewId == AccessibilityNodeInfo.UNDEFINED) {
4550-
break;
4535+
final long sourceNodeId = event.getSourceNodeId();
4536+
final int accessibilityViewId = AccessibilityNodeInfo.getAccessibilityViewId(
4537+
sourceNodeId);
4538+
View source = mView.findViewByAccessibilityId(accessibilityViewId);
4539+
if (source != null) {
4540+
AccessibilityNodeProvider provider = source.getAccessibilityNodeProvider();
4541+
if (provider != null) {
4542+
AccessibilityNodeInfo node = provider.createAccessibilityNodeInfo(
4543+
AccessibilityNodeInfo.getVirtualDescendantId(sourceNodeId));
4544+
setAccessibilityFocus(source, node);
4545+
}
45514546
}
4552-
final int realViewId = AccessibilityNodeInfo.getAccessibilityViewId(sourceId);
4553-
View focusHost = mView.findViewByAccessibilityId(realViewId);
4554-
setAccessibilityFocusedHost(focusHost);
45554547
} break;
45564548
case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED: {
4557-
final long sourceId = event.getSourceNodeId();
4558-
// If the event is not from a virtual node we are not interested.
4559-
final int virtualViewId = AccessibilityNodeInfo.getVirtualDescendantId(sourceId);
4560-
if (virtualViewId == AccessibilityNodeInfo.UNDEFINED) {
4561-
break;
4549+
final long sourceNodeId = event.getSourceNodeId();
4550+
final int accessibilityViewId = AccessibilityNodeInfo.getAccessibilityViewId(
4551+
sourceNodeId);
4552+
View source = mView.findViewByAccessibilityId(accessibilityViewId);
4553+
if (source != null) {
4554+
AccessibilityNodeProvider provider = source.getAccessibilityNodeProvider();
4555+
if (provider != null) {
4556+
setAccessibilityFocus(null, null);
4557+
}
45624558
}
4563-
setAccessibilityFocusedHost(null);
45644559
} break;
45654560
}
45664561
mAccessibilityManager.sendAccessibilityEvent(event);

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@ public List<AccessibilityNodeInfo> findAccessibilityNodeInfosByText(String text,
150150
*
151151
* @see #createAccessibilityNodeInfo(int)
152152
* @see AccessibilityNodeInfo
153+
*
154+
* @hide
153155
*/
154156
public AccessibilityNodeInfo findAccessibilityFocus(int virtualViewId) {
155157
return null;

0 commit comments

Comments
 (0)