Merge "API for finding accessibility focus in virtual tree not needed." into jb-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
ec7c7ebf01
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
Reference in New Issue
Block a user