Merge "API for finding accessibility focus in virtual tree not needed." into jb-dev

This commit is contained in:
Svetoslav Ganov
2012-06-18 11:27:44 -07:00
committed by Android (Google) Code Review
6 changed files with 42 additions and 70 deletions

View File

@ -25344,7 +25344,6 @@ package android.view.accessibility {
public abstract class AccessibilityNodeProvider { public abstract class AccessibilityNodeProvider {
ctor public AccessibilityNodeProvider(); ctor public AccessibilityNodeProvider();
method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(int); method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(int);
method public android.view.accessibility.AccessibilityNodeInfo findAccessibilityFocus(int);
method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByText(java.lang.String, int); method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByText(java.lang.String, int);
method public boolean performAction(int, int, android.os.Bundle); method public boolean performAction(int, int, android.os.Bundle);
} }

View File

@ -25353,7 +25353,6 @@ package android.view.accessibility {
public abstract class AccessibilityNodeProvider { public abstract class AccessibilityNodeProvider {
ctor public AccessibilityNodeProvider(); ctor public AccessibilityNodeProvider();
method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(int); method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(int);
method public android.view.accessibility.AccessibilityNodeInfo findAccessibilityFocus(int);
method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByText(java.lang.String, int); method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByText(java.lang.String, int);
method public boolean performAction(int, int, android.os.Bundle); method public boolean performAction(int, int, android.os.Bundle);
} }

View File

@ -480,7 +480,10 @@ final class AccessibilityInteractionController {
// focus instead fetching all provider nodes to do the search here. // focus instead fetching all provider nodes to do the search here.
AccessibilityNodeProvider provider = host.getAccessibilityNodeProvider(); AccessibilityNodeProvider provider = host.getAccessibilityNodeProvider();
if (provider != null) { if (provider != null) {
focused = provider.findAccessibilityFocus(virtualDescendantId); if (mViewRootImpl.mAccessibilityFocusedVirtualView != null) {
focused = AccessibilityNodeInfo.obtain(
mViewRootImpl.mAccessibilityFocusedVirtualView);
}
} else if (virtualDescendantId == View.NO_ID) { } else if (virtualDescendantId == View.NO_ID) {
focused = host.createAccessibilityNodeInfo(); focused = host.createAccessibilityNodeInfo();
} }
@ -804,7 +807,6 @@ final class AccessibilityInteractionController {
if (!(root instanceof ViewGroup)) { if (!(root instanceof ViewGroup)) {
return; return;
} }
ViewGroup rootGroup = (ViewGroup) root;
HashMap<View, AccessibilityNodeInfo> addedChildren = HashMap<View, AccessibilityNodeInfo> addedChildren =
new HashMap<View, AccessibilityNodeInfo>(); new HashMap<View, AccessibilityNodeInfo>();
ArrayList<View> children = mTempViewList; ArrayList<View> children = mTempViewList;

View File

@ -4558,31 +4558,6 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
if ((event.getEventType() & POPULATING_ACCESSIBILITY_EVENT_TYPES) != 0) { if ((event.getEventType() & POPULATING_ACCESSIBILITY_EVENT_TYPES) != 0) {
dispatchPopulateAccessibilityEvent(event); 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. // In the beginning we called #isShown(), so we know that getParent() is not null.
getParent().requestSendAccessibilityEvent(this, event); getParent().requestSendAccessibilityEvent(this, event);
} }
@ -6311,7 +6286,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
mPrivateFlags2 |= ACCESSIBILITY_FOCUSED; mPrivateFlags2 |= ACCESSIBILITY_FOCUSED;
ViewRootImpl viewRootImpl = getViewRootImpl(); ViewRootImpl viewRootImpl = getViewRootImpl();
if (viewRootImpl != null) { if (viewRootImpl != null) {
viewRootImpl.setAccessibilityFocusedHost(this); viewRootImpl.setAccessibilityFocus(this, null);
} }
invalidate(); invalidate();
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED); sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
@ -6342,7 +6317,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
if (viewRootImpl != null) { if (viewRootImpl != null) {
View focusHost = viewRootImpl.getAccessibilityFocusedHost(); View focusHost = viewRootImpl.getAccessibilityFocusedHost();
if (focusHost != null && ViewRootImpl.isViewDescendantOf(focusHost, this)) { 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 // If the window does not have input focus we take away accessibility
// focus as soon as the user stop hovering over the view. // focus as soon as the user stop hovering over the view.
if (mAttachInfo != null && !mAttachInfo.mHasWindowFocus) { if (mAttachInfo != null && !mAttachInfo.mHasWindowFocus) {
getViewRootImpl().setAccessibilityFocusedHost(null); getViewRootImpl().setAccessibilityFocus(null, null);
} }
} }
} }

View File

@ -489,7 +489,7 @@ public final class ViewRootImpl implements ViewParent,
// Keep track of the actual window flags supplied by the client. // Keep track of the actual window flags supplied by the client.
mClientWindowLayoutFlags = attrs.flags; mClientWindowLayoutFlags = attrs.flags;
setAccessibilityFocusedHost(null); setAccessibilityFocus(null, null);
if (view instanceof RootViewSurfaceTaker) { if (view instanceof RootViewSurfaceTaker) {
mSurfaceHolderCallback = mSurfaceHolderCallback =
@ -558,7 +558,7 @@ public final class ViewRootImpl implements ViewParent,
mInputChannel = null; mInputChannel = null;
mFallbackEventHandler.setView(null); mFallbackEventHandler.setView(null);
unscheduleTraversals(); unscheduleTraversals();
setAccessibilityFocusedHost(null); setAccessibilityFocus(null, null);
throw new RuntimeException("Adding window failed", e); throw new RuntimeException("Adding window failed", e);
} finally { } finally {
if (restore) { if (restore) {
@ -578,7 +578,7 @@ public final class ViewRootImpl implements ViewParent,
mAdded = false; mAdded = false;
mFallbackEventHandler.setView(null); mFallbackEventHandler.setView(null);
unscheduleTraversals(); unscheduleTraversals();
setAccessibilityFocusedHost(null); setAccessibilityFocus(null, null);
switch (res) { switch (res) {
case WindowManagerImpl.ADD_BAD_APP_TOKEN: case WindowManagerImpl.ADD_BAD_APP_TOKEN:
case WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN: case WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN:
@ -2319,9 +2319,6 @@ public final class ViewRootImpl implements ViewParent,
viewGroup.offsetDescendantRectToMyCoords(mAccessibilityFocusedHost, bounds); viewGroup.offsetDescendantRectToMyCoords(mAccessibilityFocusedHost, bounds);
} }
} else { } else {
if (mAccessibilityFocusedVirtualView == null) {
mAccessibilityFocusedVirtualView = provider.findAccessibilityFocus(View.NO_ID);
}
if (mAccessibilityFocusedVirtualView == null) { if (mAccessibilityFocusedVirtualView == null) {
return; return;
} }
@ -2498,7 +2495,7 @@ public final class ViewRootImpl implements ViewParent,
return mAccessibilityFocusedVirtualView; return mAccessibilityFocusedVirtualView;
} }
void setAccessibilityFocusedHost(View host) { void setAccessibilityFocus(View view, AccessibilityNodeInfo node) {
// If we have a virtual view with accessibility focus we need // If we have a virtual view with accessibility focus we need
// to clear the focus and invalidate the virtual view bounds. // to clear the focus and invalidate the virtual view bounds.
if (mAccessibilityFocusedVirtualView != null) { if (mAccessibilityFocusedVirtualView != null) {
@ -2526,24 +2523,16 @@ public final class ViewRootImpl implements ViewParent,
provider.performAction(virtualNodeId, provider.performAction(virtualNodeId,
AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS, null); AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS, null);
} }
focusNode.recycle();
} }
if (mAccessibilityFocusedHost != null) { if (mAccessibilityFocusedHost != null) {
// Clear accessibility focus in the view. // Clear accessibility focus in the view.
mAccessibilityFocusedHost.clearAccessibilityFocusNoCallbacks(); mAccessibilityFocusedHost.clearAccessibilityFocusNoCallbacks();
} }
// Set the new focus host. // Set the new focus host and node.
mAccessibilityFocusedHost = host; mAccessibilityFocusedHost = view;
mAccessibilityFocusedVirtualView = node;
// 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;
}
}
} }
public void requestChildFocus(View child, View focused) { public void requestChildFocus(View child, View focused) {
@ -2629,7 +2618,7 @@ public final class ViewRootImpl implements ViewParent,
destroyHardwareRenderer(); destroyHardwareRenderer();
setAccessibilityFocusedHost(null); setAccessibilityFocus(null, null);
mView = null; mView = null;
mAttachInfo.mRootView = null; mAttachInfo.mRootView = null;
@ -2910,7 +2899,7 @@ public final class ViewRootImpl implements ViewParent,
mHasHadWindowFocus = true; mHasHadWindowFocus = true;
} }
setAccessibilityFocusedHost(null); setAccessibilityFocus(null, null);
if (mView != null && mAccessibilityManager.isEnabled()) { if (mView != null && mAccessibilityManager.isEnabled()) {
if (hasWindowFocus) { if (hasWindowFocus) {
@ -2982,7 +2971,7 @@ public final class ViewRootImpl implements ViewParent,
invalidateDisplayLists(); invalidateDisplayLists();
} break; } break;
case MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST: { case MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST: {
setAccessibilityFocusedHost(null); setAccessibilityFocus(null, null);
} break; } break;
case MSG_DISPATCH_DONE_ANIMATING: { case MSG_DISPATCH_DONE_ANIMATING: {
handleDispatchDoneAnimating(); handleDispatchDoneAnimating();
@ -4538,29 +4527,35 @@ public final class ViewRootImpl implements ViewParent,
if (mView == null) { if (mView == null) {
return false; return false;
} }
// Watch for accessibility focus change events from virtual nodes // Intercept accessibility focus events fired by virtual nodes to keep
// to keep track of accessibility focus being on a virtual node. // track of accessibility focus position in such nodes.
final int eventType = event.getEventType(); final int eventType = event.getEventType();
switch (eventType) { switch (eventType) {
case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED: { case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED: {
final long sourceId = event.getSourceNodeId(); final long sourceNodeId = event.getSourceNodeId();
// If the event is not from a virtual node we are not interested. final int accessibilityViewId = AccessibilityNodeInfo.getAccessibilityViewId(
final int virtualViewId = AccessibilityNodeInfo.getVirtualDescendantId(sourceId); sourceNodeId);
if (virtualViewId == AccessibilityNodeInfo.UNDEFINED) { View source = mView.findViewByAccessibilityId(accessibilityViewId);
break; 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; } break;
case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED: { case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED: {
final long sourceId = event.getSourceNodeId(); final long sourceNodeId = event.getSourceNodeId();
// If the event is not from a virtual node we are not interested. final int accessibilityViewId = AccessibilityNodeInfo.getAccessibilityViewId(
final int virtualViewId = AccessibilityNodeInfo.getVirtualDescendantId(sourceId); sourceNodeId);
if (virtualViewId == AccessibilityNodeInfo.UNDEFINED) { View source = mView.findViewByAccessibilityId(accessibilityViewId);
break; if (source != null) {
AccessibilityNodeProvider provider = source.getAccessibilityNodeProvider();
if (provider != null) {
setAccessibilityFocus(null, null);
}
} }
setAccessibilityFocusedHost(null);
} break; } break;
} }
mAccessibilityManager.sendAccessibilityEvent(event); mAccessibilityManager.sendAccessibilityEvent(event);

View File

@ -150,6 +150,8 @@ public abstract class AccessibilityNodeProvider {
* *
* @see #createAccessibilityNodeInfo(int) * @see #createAccessibilityNodeInfo(int)
* @see AccessibilityNodeInfo * @see AccessibilityNodeInfo
*
* @hide
*/ */
public AccessibilityNodeInfo findAccessibilityFocus(int virtualViewId) { public AccessibilityNodeInfo findAccessibilityFocus(int virtualViewId) {
return null; return null;