From 45a02e0809c14a52aa24658666df0d41ce661857 Mon Sep 17 00:00:00 2001 From: Svetoslav Ganov Date: Sun, 17 Jun 2012 15:07:29 -0700 Subject: [PATCH] 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 --- api/16.txt | 1 - api/current.txt | 1 - .../AccessibilityInteractionController.java | 6 +- core/java/android/view/View.java | 31 +------- core/java/android/view/ViewRootImpl.java | 71 +++++++++---------- .../AccessibilityNodeProvider.java | 2 + 6 files changed, 42 insertions(+), 70 deletions(-) diff --git a/api/16.txt b/api/16.txt index a1ba90c485229..3c7fe303bc375 100644 --- a/api/16.txt +++ b/api/16.txt @@ -25342,7 +25342,6 @@ package android.view.accessibility { public abstract class AccessibilityNodeProvider { ctor public AccessibilityNodeProvider(); method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(int); - method public android.view.accessibility.AccessibilityNodeInfo findAccessibilityFocus(int); method public java.util.List findAccessibilityNodeInfosByText(java.lang.String, int); method public boolean performAction(int, int, android.os.Bundle); } diff --git a/api/current.txt b/api/current.txt index 12f032e515db4..71d46a8c34489 100644 --- a/api/current.txt +++ b/api/current.txt @@ -25344,7 +25344,6 @@ package android.view.accessibility { public abstract class AccessibilityNodeProvider { ctor public AccessibilityNodeProvider(); method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(int); - method public android.view.accessibility.AccessibilityNodeInfo findAccessibilityFocus(int); method public java.util.List findAccessibilityNodeInfosByText(java.lang.String, int); method public boolean performAction(int, int, android.os.Bundle); } diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java index 29926caf83326..0aabc44a5a99d 100644 --- a/core/java/android/view/AccessibilityInteractionController.java +++ b/core/java/android/view/AccessibilityInteractionController.java @@ -480,7 +480,10 @@ final class AccessibilityInteractionController { // focus instead fetching all provider nodes to do the search here. AccessibilityNodeProvider provider = host.getAccessibilityNodeProvider(); if (provider != null) { - focused = provider.findAccessibilityFocus(virtualDescendantId); + if (mViewRootImpl.mAccessibilityFocusedVirtualView != null) { + focused = AccessibilityNodeInfo.obtain( + mViewRootImpl.mAccessibilityFocusedVirtualView); + } } else if (virtualDescendantId == View.NO_ID) { focused = host.createAccessibilityNodeInfo(); } @@ -804,7 +807,6 @@ final class AccessibilityInteractionController { if (!(root instanceof ViewGroup)) { return; } - ViewGroup rootGroup = (ViewGroup) root; HashMap addedChildren = new HashMap(); ArrayList children = mTempViewList; diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index db3ba405c2717..b1caa2f4519b8 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -4558,31 +4558,6 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal if ((event.getEventType() & POPULATING_ACCESSIBILITY_EVENT_TYPES) != 0) { dispatchPopulateAccessibilityEvent(event); } - // Intercept accessibility focus events fired by virtual nodes to keep - // track of accessibility focus position in such nodes. - final int eventType = event.getEventType(); - switch (eventType) { - case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED: { - final long virtualNodeId = AccessibilityNodeInfo.getVirtualDescendantId( - event.getSourceNodeId()); - if (virtualNodeId != AccessibilityNodeInfo.UNDEFINED) { - ViewRootImpl viewRootImpl = getViewRootImpl(); - if (viewRootImpl != null) { - viewRootImpl.setAccessibilityFocusedHost(this); - } - } - } break; - case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED: { - final long virtualNodeId = AccessibilityNodeInfo.getVirtualDescendantId( - event.getSourceNodeId()); - if (virtualNodeId != AccessibilityNodeInfo.UNDEFINED) { - ViewRootImpl viewRootImpl = getViewRootImpl(); - if (viewRootImpl != null) { - viewRootImpl.setAccessibilityFocusedHost(null); - } - } - } break; - } // In the beginning we called #isShown(), so we know that getParent() is not null. getParent().requestSendAccessibilityEvent(this, event); } @@ -6311,7 +6286,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal mPrivateFlags2 |= ACCESSIBILITY_FOCUSED; ViewRootImpl viewRootImpl = getViewRootImpl(); if (viewRootImpl != null) { - viewRootImpl.setAccessibilityFocusedHost(this); + viewRootImpl.setAccessibilityFocus(this, null); } invalidate(); sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED); @@ -6342,7 +6317,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal if (viewRootImpl != null) { View focusHost = viewRootImpl.getAccessibilityFocusedHost(); if (focusHost != null && ViewRootImpl.isViewDescendantOf(focusHost, this)) { - viewRootImpl.setAccessibilityFocusedHost(null); + viewRootImpl.setAccessibilityFocus(null, null); } } } @@ -7953,7 +7928,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal // 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) { - getViewRootImpl().setAccessibilityFocusedHost(null); + getViewRootImpl().setAccessibilityFocus(null, null); } } } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 51fd3460d0a2a..6959b84f87def 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -489,7 +489,7 @@ public final class ViewRootImpl implements ViewParent, // Keep track of the actual window flags supplied by the client. mClientWindowLayoutFlags = attrs.flags; - setAccessibilityFocusedHost(null); + setAccessibilityFocus(null, null); if (view instanceof RootViewSurfaceTaker) { mSurfaceHolderCallback = @@ -558,7 +558,7 @@ public final class ViewRootImpl implements ViewParent, mInputChannel = null; mFallbackEventHandler.setView(null); unscheduleTraversals(); - setAccessibilityFocusedHost(null); + setAccessibilityFocus(null, null); throw new RuntimeException("Adding window failed", e); } finally { if (restore) { @@ -578,7 +578,7 @@ public final class ViewRootImpl implements ViewParent, mAdded = false; mFallbackEventHandler.setView(null); unscheduleTraversals(); - setAccessibilityFocusedHost(null); + setAccessibilityFocus(null, null); switch (res) { case WindowManagerImpl.ADD_BAD_APP_TOKEN: case WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN: @@ -2319,9 +2319,6 @@ public final class ViewRootImpl implements ViewParent, viewGroup.offsetDescendantRectToMyCoords(mAccessibilityFocusedHost, bounds); } } else { - if (mAccessibilityFocusedVirtualView == null) { - mAccessibilityFocusedVirtualView = provider.findAccessibilityFocus(View.NO_ID); - } if (mAccessibilityFocusedVirtualView == null) { return; } @@ -2498,7 +2495,7 @@ public final class ViewRootImpl implements ViewParent, return mAccessibilityFocusedVirtualView; } - void setAccessibilityFocusedHost(View host) { + void setAccessibilityFocus(View view, AccessibilityNodeInfo node) { // If we have a virtual view with accessibility focus we need // to clear the focus and invalidate the virtual view bounds. if (mAccessibilityFocusedVirtualView != null) { @@ -2526,24 +2523,16 @@ public final class ViewRootImpl implements ViewParent, provider.performAction(virtualNodeId, AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS, null); } + focusNode.recycle(); } if (mAccessibilityFocusedHost != null) { // Clear accessibility focus in the view. mAccessibilityFocusedHost.clearAccessibilityFocusNoCallbacks(); } - // Set the new focus host. - mAccessibilityFocusedHost = host; - - // If the host has a provide find the virtual descendant that has focus. - if (mAccessibilityFocusedHost != null) { - AccessibilityNodeProvider provider = - mAccessibilityFocusedHost.getAccessibilityNodeProvider(); - if (provider != null) { - mAccessibilityFocusedVirtualView = provider.findAccessibilityFocus(View.NO_ID); - return; - } - } + // Set the new focus host and node. + mAccessibilityFocusedHost = view; + mAccessibilityFocusedVirtualView = node; } public void requestChildFocus(View child, View focused) { @@ -2629,7 +2618,7 @@ public final class ViewRootImpl implements ViewParent, destroyHardwareRenderer(); - setAccessibilityFocusedHost(null); + setAccessibilityFocus(null, null); mView = null; mAttachInfo.mRootView = null; @@ -2910,7 +2899,7 @@ public final class ViewRootImpl implements ViewParent, mHasHadWindowFocus = true; } - setAccessibilityFocusedHost(null); + setAccessibilityFocus(null, null); if (mView != null && mAccessibilityManager.isEnabled()) { if (hasWindowFocus) { @@ -2982,7 +2971,7 @@ public final class ViewRootImpl implements ViewParent, invalidateDisplayLists(); } break; case MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST: { - setAccessibilityFocusedHost(null); + setAccessibilityFocus(null, null); } break; case MSG_DISPATCH_DONE_ANIMATING: { handleDispatchDoneAnimating(); @@ -4538,29 +4527,35 @@ public final class ViewRootImpl implements ViewParent, if (mView == null) { return false; } - // Watch for accessibility focus change events from virtual nodes - // to keep track of accessibility focus being on a virtual node. + // Intercept accessibility focus events fired by virtual nodes to keep + // track of accessibility focus position in such nodes. final int eventType = event.getEventType(); switch (eventType) { case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED: { - final long sourceId = event.getSourceNodeId(); - // If the event is not from a virtual node we are not interested. - final int virtualViewId = AccessibilityNodeInfo.getVirtualDescendantId(sourceId); - if (virtualViewId == AccessibilityNodeInfo.UNDEFINED) { - break; + final long sourceNodeId = event.getSourceNodeId(); + final int accessibilityViewId = AccessibilityNodeInfo.getAccessibilityViewId( + sourceNodeId); + View source = mView.findViewByAccessibilityId(accessibilityViewId); + if (source != null) { + AccessibilityNodeProvider provider = source.getAccessibilityNodeProvider(); + if (provider != null) { + AccessibilityNodeInfo node = provider.createAccessibilityNodeInfo( + AccessibilityNodeInfo.getVirtualDescendantId(sourceNodeId)); + setAccessibilityFocus(source, node); + } } - final int realViewId = AccessibilityNodeInfo.getAccessibilityViewId(sourceId); - View focusHost = mView.findViewByAccessibilityId(realViewId); - setAccessibilityFocusedHost(focusHost); } break; case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED: { - final long sourceId = event.getSourceNodeId(); - // If the event is not from a virtual node we are not interested. - final int virtualViewId = AccessibilityNodeInfo.getVirtualDescendantId(sourceId); - if (virtualViewId == AccessibilityNodeInfo.UNDEFINED) { - break; + final long sourceNodeId = event.getSourceNodeId(); + final int accessibilityViewId = AccessibilityNodeInfo.getAccessibilityViewId( + sourceNodeId); + View source = mView.findViewByAccessibilityId(accessibilityViewId); + if (source != null) { + AccessibilityNodeProvider provider = source.getAccessibilityNodeProvider(); + if (provider != null) { + setAccessibilityFocus(null, null); + } } - setAccessibilityFocusedHost(null); } break; } mAccessibilityManager.sendAccessibilityEvent(event); diff --git a/core/java/android/view/accessibility/AccessibilityNodeProvider.java b/core/java/android/view/accessibility/AccessibilityNodeProvider.java index c17cb8ac00820..b3f3cee430a7d 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeProvider.java +++ b/core/java/android/view/accessibility/AccessibilityNodeProvider.java @@ -150,6 +150,8 @@ public abstract class AccessibilityNodeProvider { * * @see #createAccessibilityNodeInfo(int) * @see AccessibilityNodeInfo + * + * @hide */ public AccessibilityNodeInfo findAccessibilityFocus(int virtualViewId) { return null;