Skip to content

Commit ec7c7eb

Browse files
sganovAndroid (Google) Code Review
authored andcommitted
Merge "API for finding accessibility focus in virtual tree not needed." into jb-dev
2 parents 9fba992 + 45a02e0 commit ec7c7eb

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
@@ -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
}

api/current.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25353,7 +25353,6 @@ package android.view.accessibility {
2535325353
public abstract class AccessibilityNodeProvider {
2535425354
ctor public AccessibilityNodeProvider();
2535525355
method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(int);
25356-
method public android.view.accessibility.AccessibilityNodeInfo findAccessibilityFocus(int);
2535725356
method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByText(java.lang.String, int);
2535825357
method public boolean performAction(int, int, android.os.Bundle);
2535925358
}

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)