Loading core/java/android/view/AccessibilityInteractionController.java +21 −58 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ import android.util.Slog; import android.view.View.AttachInfo; import android.view.accessibility.AccessibilityInteractionClient; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeIdManager; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.view.accessibility.AccessibilityNodeProvider; Loading Loading @@ -154,13 +155,7 @@ public final class AccessibilityInteractionController { } private boolean isShown(View view) { // The first two checks are made also made by isShown() which // however traverses the tree up to the parent to catch that. // Therefore, we do some fail fast check to minimize the up // tree traversal. return (view.mAttachInfo != null && view.mAttachInfo.mWindowVisibility == View.VISIBLE && view.isShown()); return (view != null) && (view.getWindowVisibility() == View.VISIBLE && view.isShown()); } public void findAccessibilityNodeInfoByAccessibilityIdClientThread( Loading Loading @@ -340,13 +335,8 @@ public final class AccessibilityInteractionController { return; } mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags; View root = null; if (accessibilityViewId == AccessibilityNodeInfo.ROOT_ITEM_ID) { root = mViewRootImpl.mView; } else { root = findViewByAccessibilityId(accessibilityViewId); } if (root != null && isShown(root)) { final View root = findViewByAccessibilityId(accessibilityViewId); if (root != null) { mPrefetcher.prefetchAccessibilityNodeInfos( root, virtualDescendantId, flags, infos, arguments); } Loading Loading @@ -396,12 +386,7 @@ public final class AccessibilityInteractionController { return; } mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags; View root = null; if (accessibilityViewId != AccessibilityNodeInfo.ROOT_ITEM_ID) { root = findViewByAccessibilityId(accessibilityViewId); } else { root = mViewRootImpl.mView; } final View root = findViewByAccessibilityId(accessibilityViewId); if (root != null) { final int resolvedViewId = root.getContext().getResources() .getIdentifier(viewId, null, null); Loading Loading @@ -462,13 +447,8 @@ public final class AccessibilityInteractionController { return; } mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags; View root = null; if (accessibilityViewId != AccessibilityNodeInfo.ROOT_ITEM_ID) { root = findViewByAccessibilityId(accessibilityViewId); } else { root = mViewRootImpl.mView; } if (root != null && isShown(root)) { final View root = findViewByAccessibilityId(accessibilityViewId); if (root != null) { AccessibilityNodeProvider provider = root.getAccessibilityNodeProvider(); if (provider != null) { infos = provider.findAccessibilityNodeInfosByText(text, Loading Loading @@ -550,13 +530,8 @@ public final class AccessibilityInteractionController { return; } mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags; View root = null; if (accessibilityViewId != AccessibilityNodeInfo.ROOT_ITEM_ID) { root = findViewByAccessibilityId(accessibilityViewId); } else { root = mViewRootImpl.mView; } if (root != null && isShown(root)) { final View root = findViewByAccessibilityId(accessibilityViewId); if (root != null) { switch (focusType) { case AccessibilityNodeInfo.FOCUS_ACCESSIBILITY: { View host = mViewRootImpl.mAccessibilityFocusedHost; Loading @@ -583,7 +558,7 @@ public final class AccessibilityInteractionController { } break; case AccessibilityNodeInfo.FOCUS_INPUT: { View target = root.findFocus(); if (target == null || !isShown(target)) { if (!isShown(target)) { break; } AccessibilityNodeProvider provider = target.getAccessibilityNodeProvider(); Loading Loading @@ -645,13 +620,8 @@ public final class AccessibilityInteractionController { return; } mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags; View root = null; if (accessibilityViewId != AccessibilityNodeInfo.ROOT_ITEM_ID) { root = findViewByAccessibilityId(accessibilityViewId); } else { root = mViewRootImpl.mView; } if (root != null && isShown(root)) { final View root = findViewByAccessibilityId(accessibilityViewId); if (root != null) { View nextView = root.focusSearch(direction); if (nextView != null) { next = nextView.createAccessibilityNodeInfo(); Loading Loading @@ -705,13 +675,8 @@ public final class AccessibilityInteractionController { return; } mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags; View target = null; if (accessibilityViewId != AccessibilityNodeInfo.ROOT_ITEM_ID) { target = findViewByAccessibilityId(accessibilityViewId); } else { target = mViewRootImpl.mView; } if (target != null && isShown(target)) { final View target = findViewByAccessibilityId(accessibilityViewId); if (target != null) { if (action == R.id.accessibilityActionClickOnClickableSpan) { // Handle this hidden action separately succeeded = handleClickableSpanActionUiThread( Loading Loading @@ -791,15 +756,13 @@ public final class AccessibilityInteractionController { } private View findViewByAccessibilityId(int accessibilityId) { View root = mViewRootImpl.mView; if (root == null) { return null; } View foundView = root.findViewByAccessibilityId(accessibilityId); if (foundView != null && !isShown(foundView)) { return null; if (accessibilityId == AccessibilityNodeInfo.ROOT_ITEM_ID) { return mViewRootImpl.mView; } else { final View foundView = AccessibilityNodeIdManager.getInstance().findView(accessibilityId); return isShown(foundView) ? foundView : null; } return foundView; } private void applyAppScaleAndMagnificationSpecIfNeeded(List<AccessibilityNodeInfo> infos, Loading core/java/android/view/View.java +4 −18 Original line number Diff line number Diff line Loading @@ -103,6 +103,7 @@ import android.view.WindowInsetsAnimationListener.InsetsAnimation; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityEventSource; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeIdManager; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.view.accessibility.AccessibilityNodeProvider; Loading Loading @@ -19041,6 +19042,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, jumpDrawablesToCurrentState(); AccessibilityNodeIdManager.getInstance().registerViewWithId(this, getAccessibilityViewId()); resetSubtreeAccessibilityStateChanged(); // rebuild, since Outline not maintained while View is detached Loading Loading @@ -19433,6 +19435,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, if ((mViewFlags & TOOLTIP) == TOOLTIP) { hideTooltip(); } AccessibilityNodeIdManager.getInstance().unregisterViewWithId(getAccessibilityViewId()); } private void cleanupDraw() { Loading Loading @@ -23946,24 +23950,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, return view; } /** * Finds a view by its unuque and stable accessibility id. * * @param accessibilityId The searched accessibility id. * @return The found view. */ @UnsupportedAppUsage final <T extends View> T findViewByAccessibilityId(int accessibilityId) { if (accessibilityId < 0) { return null; } T view = findViewByAccessibilityIdTraversal(accessibilityId); if (view != null) { return view.includeForAccessibility() ? view : null; } return null; } /** * Performs the traversal to find a view by its unique and stable accessibility id. * core/java/android/view/ViewRootImpl.java +12 −14 Original line number Diff line number Diff line Loading @@ -95,6 +95,7 @@ import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener; import android.view.accessibility.AccessibilityManager.HighTextContrastChangeListener; import android.view.accessibility.AccessibilityNodeIdManager; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.view.accessibility.AccessibilityNodeProvider; Loading Loading @@ -7954,17 +7955,14 @@ public final class ViewRootImpl implements ViewParent, // Intercept accessibility focus events fired by virtual nodes to keep // track of accessibility focus position in such nodes. final int eventType = event.getEventType(); final View source = getSourceForAccessibilityEvent(event); switch (eventType) { case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED: { final long sourceNodeId = event.getSourceNodeId(); final int accessibilityViewId = AccessibilityNodeInfo.getAccessibilityViewId( sourceNodeId); View source = mView.findViewByAccessibilityId(accessibilityViewId); if (source != null) { AccessibilityNodeProvider provider = source.getAccessibilityNodeProvider(); if (provider != null) { final int virtualNodeId = AccessibilityNodeInfo.getVirtualDescendantId( sourceNodeId); event.getSourceNodeId()); final AccessibilityNodeInfo node; node = provider.createAccessibilityNodeInfo(virtualNodeId); setAccessibilityFocus(source, node); Loading @@ -7972,16 +7970,9 @@ public final class ViewRootImpl implements ViewParent, } } break; case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED: { final long sourceNodeId = event.getSourceNodeId(); final int accessibilityViewId = AccessibilityNodeInfo.getAccessibilityViewId( sourceNodeId); View source = mView.findViewByAccessibilityId(accessibilityViewId); if (source != null) { AccessibilityNodeProvider provider = source.getAccessibilityNodeProvider(); if (provider != null) { if (source != null && source.getAccessibilityNodeProvider() != null) { setAccessibilityFocus(null, null); } } } break; Loading @@ -7993,6 +7984,13 @@ public final class ViewRootImpl implements ViewParent, return true; } private View getSourceForAccessibilityEvent(AccessibilityEvent event) { final long sourceNodeId = event.getSourceNodeId(); final int accessibilityViewId = AccessibilityNodeInfo.getAccessibilityViewId( sourceNodeId); return AccessibilityNodeIdManager.getInstance().findView(accessibilityViewId); } /** * Updates the focused virtual view, when necessary, in response to a * content changed event. Loading core/java/android/view/accessibility/AccessibilityNodeIdManager.java 0 → 100644 +68 −0 Original line number Diff line number Diff line /* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.view.accessibility; import android.util.SparseArray; import android.view.View; /** @hide */ public final class AccessibilityNodeIdManager { private SparseArray<View> mIdsToViews = new SparseArray<>(); private static AccessibilityNodeIdManager sIdManager; /** * Gets singleton. * @return The instance. */ public static synchronized AccessibilityNodeIdManager getInstance() { if (sIdManager == null) { sIdManager = new AccessibilityNodeIdManager(); } return sIdManager; } private AccessibilityNodeIdManager() { } /** * Register view to be kept track of by the accessibility system. * Must be paired with unregisterView, otherwise this will leak. * @param view The view to be registered. * @param id The accessibilityViewId of the view. */ public void registerViewWithId(View view, int id) { mIdsToViews.append(id, view); } /** * Unregister view, accessibility won't keep track of this view after this call. * @param id The id returned from registerView when the view as first associated. */ public void unregisterViewWithId(int id) { mIdsToViews.remove(id); } /** * Accessibility uses this to find the view in the hierarchy. * @param id The accessibility view id. * @return The view. */ public View findView(int id) { final View view = mIdsToViews.get(id); return view != null && view.includeForAccessibility() ? view : null; } } core/java/android/widget/AbsListView.java +0 −9 Original line number Diff line number Diff line Loading @@ -1611,15 +1611,6 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te return false; } /** @hide */ @Override public View findViewByAccessibilityIdTraversal(int accessibilityId) { if (accessibilityId == getAccessibilityViewId()) { return this; } return super.findViewByAccessibilityIdTraversal(accessibilityId); } /** * Indicates whether the children's drawing cache is used during a scroll. * By default, the drawing cache is enabled but this will consume more memory. Loading Loading
core/java/android/view/AccessibilityInteractionController.java +21 −58 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ import android.util.Slog; import android.view.View.AttachInfo; import android.view.accessibility.AccessibilityInteractionClient; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeIdManager; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.view.accessibility.AccessibilityNodeProvider; Loading Loading @@ -154,13 +155,7 @@ public final class AccessibilityInteractionController { } private boolean isShown(View view) { // The first two checks are made also made by isShown() which // however traverses the tree up to the parent to catch that. // Therefore, we do some fail fast check to minimize the up // tree traversal. return (view.mAttachInfo != null && view.mAttachInfo.mWindowVisibility == View.VISIBLE && view.isShown()); return (view != null) && (view.getWindowVisibility() == View.VISIBLE && view.isShown()); } public void findAccessibilityNodeInfoByAccessibilityIdClientThread( Loading Loading @@ -340,13 +335,8 @@ public final class AccessibilityInteractionController { return; } mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags; View root = null; if (accessibilityViewId == AccessibilityNodeInfo.ROOT_ITEM_ID) { root = mViewRootImpl.mView; } else { root = findViewByAccessibilityId(accessibilityViewId); } if (root != null && isShown(root)) { final View root = findViewByAccessibilityId(accessibilityViewId); if (root != null) { mPrefetcher.prefetchAccessibilityNodeInfos( root, virtualDescendantId, flags, infos, arguments); } Loading Loading @@ -396,12 +386,7 @@ public final class AccessibilityInteractionController { return; } mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags; View root = null; if (accessibilityViewId != AccessibilityNodeInfo.ROOT_ITEM_ID) { root = findViewByAccessibilityId(accessibilityViewId); } else { root = mViewRootImpl.mView; } final View root = findViewByAccessibilityId(accessibilityViewId); if (root != null) { final int resolvedViewId = root.getContext().getResources() .getIdentifier(viewId, null, null); Loading Loading @@ -462,13 +447,8 @@ public final class AccessibilityInteractionController { return; } mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags; View root = null; if (accessibilityViewId != AccessibilityNodeInfo.ROOT_ITEM_ID) { root = findViewByAccessibilityId(accessibilityViewId); } else { root = mViewRootImpl.mView; } if (root != null && isShown(root)) { final View root = findViewByAccessibilityId(accessibilityViewId); if (root != null) { AccessibilityNodeProvider provider = root.getAccessibilityNodeProvider(); if (provider != null) { infos = provider.findAccessibilityNodeInfosByText(text, Loading Loading @@ -550,13 +530,8 @@ public final class AccessibilityInteractionController { return; } mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags; View root = null; if (accessibilityViewId != AccessibilityNodeInfo.ROOT_ITEM_ID) { root = findViewByAccessibilityId(accessibilityViewId); } else { root = mViewRootImpl.mView; } if (root != null && isShown(root)) { final View root = findViewByAccessibilityId(accessibilityViewId); if (root != null) { switch (focusType) { case AccessibilityNodeInfo.FOCUS_ACCESSIBILITY: { View host = mViewRootImpl.mAccessibilityFocusedHost; Loading @@ -583,7 +558,7 @@ public final class AccessibilityInteractionController { } break; case AccessibilityNodeInfo.FOCUS_INPUT: { View target = root.findFocus(); if (target == null || !isShown(target)) { if (!isShown(target)) { break; } AccessibilityNodeProvider provider = target.getAccessibilityNodeProvider(); Loading Loading @@ -645,13 +620,8 @@ public final class AccessibilityInteractionController { return; } mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags; View root = null; if (accessibilityViewId != AccessibilityNodeInfo.ROOT_ITEM_ID) { root = findViewByAccessibilityId(accessibilityViewId); } else { root = mViewRootImpl.mView; } if (root != null && isShown(root)) { final View root = findViewByAccessibilityId(accessibilityViewId); if (root != null) { View nextView = root.focusSearch(direction); if (nextView != null) { next = nextView.createAccessibilityNodeInfo(); Loading Loading @@ -705,13 +675,8 @@ public final class AccessibilityInteractionController { return; } mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags; View target = null; if (accessibilityViewId != AccessibilityNodeInfo.ROOT_ITEM_ID) { target = findViewByAccessibilityId(accessibilityViewId); } else { target = mViewRootImpl.mView; } if (target != null && isShown(target)) { final View target = findViewByAccessibilityId(accessibilityViewId); if (target != null) { if (action == R.id.accessibilityActionClickOnClickableSpan) { // Handle this hidden action separately succeeded = handleClickableSpanActionUiThread( Loading Loading @@ -791,15 +756,13 @@ public final class AccessibilityInteractionController { } private View findViewByAccessibilityId(int accessibilityId) { View root = mViewRootImpl.mView; if (root == null) { return null; } View foundView = root.findViewByAccessibilityId(accessibilityId); if (foundView != null && !isShown(foundView)) { return null; if (accessibilityId == AccessibilityNodeInfo.ROOT_ITEM_ID) { return mViewRootImpl.mView; } else { final View foundView = AccessibilityNodeIdManager.getInstance().findView(accessibilityId); return isShown(foundView) ? foundView : null; } return foundView; } private void applyAppScaleAndMagnificationSpecIfNeeded(List<AccessibilityNodeInfo> infos, Loading
core/java/android/view/View.java +4 −18 Original line number Diff line number Diff line Loading @@ -103,6 +103,7 @@ import android.view.WindowInsetsAnimationListener.InsetsAnimation; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityEventSource; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeIdManager; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.view.accessibility.AccessibilityNodeProvider; Loading Loading @@ -19041,6 +19042,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, jumpDrawablesToCurrentState(); AccessibilityNodeIdManager.getInstance().registerViewWithId(this, getAccessibilityViewId()); resetSubtreeAccessibilityStateChanged(); // rebuild, since Outline not maintained while View is detached Loading Loading @@ -19433,6 +19435,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, if ((mViewFlags & TOOLTIP) == TOOLTIP) { hideTooltip(); } AccessibilityNodeIdManager.getInstance().unregisterViewWithId(getAccessibilityViewId()); } private void cleanupDraw() { Loading Loading @@ -23946,24 +23950,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, return view; } /** * Finds a view by its unuque and stable accessibility id. * * @param accessibilityId The searched accessibility id. * @return The found view. */ @UnsupportedAppUsage final <T extends View> T findViewByAccessibilityId(int accessibilityId) { if (accessibilityId < 0) { return null; } T view = findViewByAccessibilityIdTraversal(accessibilityId); if (view != null) { return view.includeForAccessibility() ? view : null; } return null; } /** * Performs the traversal to find a view by its unique and stable accessibility id. *
core/java/android/view/ViewRootImpl.java +12 −14 Original line number Diff line number Diff line Loading @@ -95,6 +95,7 @@ import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener; import android.view.accessibility.AccessibilityManager.HighTextContrastChangeListener; import android.view.accessibility.AccessibilityNodeIdManager; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.view.accessibility.AccessibilityNodeProvider; Loading Loading @@ -7954,17 +7955,14 @@ public final class ViewRootImpl implements ViewParent, // Intercept accessibility focus events fired by virtual nodes to keep // track of accessibility focus position in such nodes. final int eventType = event.getEventType(); final View source = getSourceForAccessibilityEvent(event); switch (eventType) { case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED: { final long sourceNodeId = event.getSourceNodeId(); final int accessibilityViewId = AccessibilityNodeInfo.getAccessibilityViewId( sourceNodeId); View source = mView.findViewByAccessibilityId(accessibilityViewId); if (source != null) { AccessibilityNodeProvider provider = source.getAccessibilityNodeProvider(); if (provider != null) { final int virtualNodeId = AccessibilityNodeInfo.getVirtualDescendantId( sourceNodeId); event.getSourceNodeId()); final AccessibilityNodeInfo node; node = provider.createAccessibilityNodeInfo(virtualNodeId); setAccessibilityFocus(source, node); Loading @@ -7972,16 +7970,9 @@ public final class ViewRootImpl implements ViewParent, } } break; case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED: { final long sourceNodeId = event.getSourceNodeId(); final int accessibilityViewId = AccessibilityNodeInfo.getAccessibilityViewId( sourceNodeId); View source = mView.findViewByAccessibilityId(accessibilityViewId); if (source != null) { AccessibilityNodeProvider provider = source.getAccessibilityNodeProvider(); if (provider != null) { if (source != null && source.getAccessibilityNodeProvider() != null) { setAccessibilityFocus(null, null); } } } break; Loading @@ -7993,6 +7984,13 @@ public final class ViewRootImpl implements ViewParent, return true; } private View getSourceForAccessibilityEvent(AccessibilityEvent event) { final long sourceNodeId = event.getSourceNodeId(); final int accessibilityViewId = AccessibilityNodeInfo.getAccessibilityViewId( sourceNodeId); return AccessibilityNodeIdManager.getInstance().findView(accessibilityViewId); } /** * Updates the focused virtual view, when necessary, in response to a * content changed event. Loading
core/java/android/view/accessibility/AccessibilityNodeIdManager.java 0 → 100644 +68 −0 Original line number Diff line number Diff line /* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.view.accessibility; import android.util.SparseArray; import android.view.View; /** @hide */ public final class AccessibilityNodeIdManager { private SparseArray<View> mIdsToViews = new SparseArray<>(); private static AccessibilityNodeIdManager sIdManager; /** * Gets singleton. * @return The instance. */ public static synchronized AccessibilityNodeIdManager getInstance() { if (sIdManager == null) { sIdManager = new AccessibilityNodeIdManager(); } return sIdManager; } private AccessibilityNodeIdManager() { } /** * Register view to be kept track of by the accessibility system. * Must be paired with unregisterView, otherwise this will leak. * @param view The view to be registered. * @param id The accessibilityViewId of the view. */ public void registerViewWithId(View view, int id) { mIdsToViews.append(id, view); } /** * Unregister view, accessibility won't keep track of this view after this call. * @param id The id returned from registerView when the view as first associated. */ public void unregisterViewWithId(int id) { mIdsToViews.remove(id); } /** * Accessibility uses this to find the view in the hierarchy. * @param id The accessibility view id. * @return The view. */ public View findView(int id) { final View view = mIdsToViews.get(id); return view != null && view.includeForAccessibility() ? view : null; } }
core/java/android/widget/AbsListView.java +0 −9 Original line number Diff line number Diff line Loading @@ -1611,15 +1611,6 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te return false; } /** @hide */ @Override public View findViewByAccessibilityIdTraversal(int accessibilityId) { if (accessibilityId == getAccessibilityViewId()) { return this; } return super.findViewByAccessibilityIdTraversal(accessibilityId); } /** * Indicates whether the children's drawing cache is used during a scroll. * By default, the drawing cache is enabled but this will consume more memory. Loading