Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 45a02e08 authored by Svetoslav Ganov's avatar Svetoslav Ganov
Browse files

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
parent 130b4572
Loading
Loading
Loading
Loading
+0 −1
Original line number Original line Diff line number Diff line
@@ -25342,7 +25342,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);
  }
  }
+0 −1
Original line number Original line Diff line number Diff line
@@ -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);
  }
  }
+4 −2
Original line number Original line Diff line number Diff line
@@ -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;
+3 −28
Original line number Original line Diff line number Diff line
@@ -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);
                }
                }
            }
            }
        }
        }
+33 −38
Original line number Original line Diff line number Diff line
@@ -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);
Loading