diff options
| author | Svetoslav Ganov <svetoslavganov@google.com> | 2012-06-18 11:33:33 -0700 |
|---|---|---|
| committer | Android Git Automerger <android-git-automerger@android.com> | 2012-06-18 11:33:33 -0700 |
| commit | c32b2091d6441e7709342ca62f0976fc4a0367e4 (patch) | |
| tree | 627fc0f08aae28b10d8aac0b79de1a2eaa5df388 /core/java/android/view/ViewRootImpl.java | |
| parent | 4fd225ca2dd4480dc694e7b8b2da8224db3d581c (diff) | |
| parent | 45c4a8df9487f53af37ded1f5a1ebe500e89b493 (diff) | |
am 45c4a8df: am ec7c7ebf: Merge "API for finding accessibility focus in virtual tree not needed." into jb-dev
* commit '45c4a8df9487f53af37ded1f5a1ebe500e89b493':
API for finding accessibility focus in virtual tree not needed.
Diffstat (limited to 'core/java/android/view/ViewRootImpl.java')
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 71 |
1 files changed, 33 insertions, 38 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 68c8bb7e0d03..17783a49c9ea 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -488,7 +488,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 = @@ -557,7 +557,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) { @@ -577,7 +577,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, } } else { if (mAccessibilityFocusedVirtualView == null) { - mAccessibilityFocusedVirtualView = provider.findAccessibilityFocus(View.NO_ID); - } - if (mAccessibilityFocusedVirtualView == null) { return; } mAccessibilityFocusedVirtualView.getBoundsInScreen(bounds); @@ -2497,7 +2494,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) { @@ -2525,24 +2522,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) { @@ -2628,7 +2617,7 @@ public final class ViewRootImpl implements ViewParent, destroyHardwareRenderer(); - setAccessibilityFocusedHost(null); + setAccessibilityFocus(null, null); mView = null; mAttachInfo.mRootView = null; @@ -2909,7 +2898,7 @@ public final class ViewRootImpl implements ViewParent, mHasHadWindowFocus = true; } - setAccessibilityFocusedHost(null); + setAccessibilityFocus(null, null); if (mView != null && mAccessibilityManager.isEnabled()) { if (hasWindowFocus) { @@ -2981,7 +2970,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(); @@ -4537,29 +4526,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); |
