diff options
author | Svetoslav Ganov <svetoslavganov@google.com> | 2012-06-18 11:27:44 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-06-18 11:27:44 -0700 |
commit | ec7c7ebf01121d17f7a12e827bd77c024eab54e8 (patch) | |
tree | 1d02570b105306215d1d2ec716a807535c751c42 /core | |
parent | 9fba9925c58f1b34792cd9edc8ad93b22e772f5b (diff) | |
parent | 45a02e0809c14a52aa24658666df0d41ce661857 (diff) | |
download | frameworks_base-ec7c7ebf01121d17f7a12e827bd77c024eab54e8.zip frameworks_base-ec7c7ebf01121d17f7a12e827bd77c024eab54e8.tar.gz frameworks_base-ec7c7ebf01121d17f7a12e827bd77c024eab54e8.tar.bz2 |
Merge "API for finding accessibility focus in virtual tree not needed." into jb-dev
Diffstat (limited to 'core')
4 files changed, 42 insertions, 68 deletions
diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java index 29926ca..0aabc44 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<View, AccessibilityNodeInfo> addedChildren = new HashMap<View, AccessibilityNodeInfo>(); ArrayList<View> children = mTempViewList; diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index db3ba40..b1caa2f 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 51fd346..6959b84 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: @@ -2320,9 +2320,6 @@ public final class ViewRootImpl implements ViewParent, } } else { if (mAccessibilityFocusedVirtualView == null) { - mAccessibilityFocusedVirtualView = provider.findAccessibilityFocus(View.NO_ID); - } - if (mAccessibilityFocusedVirtualView == null) { return; } mAccessibilityFocusedVirtualView.getBoundsInScreen(bounds); @@ -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 c17cb8a..b3f3cee 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; |