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

Commit eaf278ad authored by Alan Viverette's avatar Alan Viverette Committed by Android Git Automerger
Browse files

am 2f4b1cd9: am 50b30be2: am 75a857ce: Merge "Handle error states when...

am 2f4b1cd9: am 50b30be2: am 75a857ce: Merge "Handle error states when refreshing accessibility node" into mnc-dev

* commit '2f4b1cd9':
  Handle error states when refreshing accessibility node
parents e8264c5e 2f4b1cd9
Loading
Loading
Loading
Loading
+25 −9
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener;
import android.view.accessibility.AccessibilityManager.HighTextContrastChangeListener;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
import android.view.accessibility.AccessibilityNodeProvider;
import android.view.accessibility.IAccessibilityInteractionConnection;
import android.view.accessibility.IAccessibilityInteractionConnectionCallback;
@@ -6354,16 +6355,18 @@ public final class ViewRootImpl implements ViewParent,
     *              {@link AccessibilityEvent#TYPE_WINDOW_CONTENT_CHANGED}
     */
    private void handleWindowContentChangedEvent(AccessibilityEvent event) {
        final View focusedHost = mAccessibilityFocusedHost;
        if (focusedHost == null || mAccessibilityFocusedVirtualView == null) {
            // No virtual view focused, nothing to do here.
        if (mAccessibilityFocusedHost == null || mAccessibilityFocusedVirtualView == null) {
            return;
        }

        // If we have a node but no provider, abort.
        final AccessibilityNodeProvider provider =
                mAccessibilityFocusedHost.getAccessibilityNodeProvider();
        final AccessibilityNodeProvider provider = focusedHost.getAccessibilityNodeProvider();
        if (provider == null) {
            // TODO: Should we clear the focused virtual view?
            // Error state: virtual view with no provider. Clear focus.
            mAccessibilityFocusedHost = null;
            mAccessibilityFocusedVirtualView = null;
            focusedHost.clearAccessibilityFocusNoCallbacks();
            return;
        }

@@ -6410,12 +6413,25 @@ public final class ViewRootImpl implements ViewParent,
        final Rect oldBounds = mTempRect;
        mAccessibilityFocusedVirtualView.getBoundsInScreen(oldBounds);
        mAccessibilityFocusedVirtualView = provider.createAccessibilityNodeInfo(focusedChildId);
        if (mAccessibilityFocusedVirtualView == null) {
            // Error state: The node no longer exists. Clear focus.
            mAccessibilityFocusedHost = null;
            focusedHost.clearAccessibilityFocusNoCallbacks();

            // This will probably fail, but try to keep the provider's internal
            // state consistent by clearing focus.
            provider.performAction(focusedChildId,
                    AccessibilityAction.ACTION_CLEAR_ACCESSIBILITY_FOCUS.getId(), null);
            invalidateRectOnScreen(oldBounds);
        } else {
            // The node was refreshed, invalidate bounds if necessary.
            final Rect newBounds = mAccessibilityFocusedVirtualView.getBoundsInScreen();
            if (!oldBounds.equals(newBounds)) {
                oldBounds.union(newBounds);
                invalidateRectOnScreen(oldBounds);
            }
        }
    }

    @Override
    public void notifySubtreeAccessibilityStateChanged(View child, View source, int changeType) {