Loading core/java/android/view/ViewRootImpl.java +25 −9 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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) { Loading Loading
core/java/android/view/ViewRootImpl.java +25 −9 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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) { Loading