From 75e5816102ec417cda1aa95d5d936140cff12aa1 Mon Sep 17 00:00:00 2001 From: Svet Ganov Date: Fri, 19 Feb 2016 16:29:24 -0800 Subject: [PATCH] Discard prefetched disconnected predecessors of a virtual node. bug:18247269 Change-Id: I24f1ed1e9aa44fbb847722833fe68a1eef7e92c5 --- .../android/view/AccessibilityInteractionController.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java index 664c02a707711..c7b1d03b120b5 100644 --- a/core/java/android/view/AccessibilityInteractionController.java +++ b/core/java/android/view/AccessibilityInteractionController.java @@ -1053,6 +1053,7 @@ final class AccessibilityInteractionController { private void prefetchPredecessorsOfVirtualNode(AccessibilityNodeInfo root, View providerHost, AccessibilityNodeProvider provider, List outInfos) { + final int initialResultSize = outInfos.size(); long parentNodeId = root.getParentNodeId(); int accessibilityViewId = AccessibilityNodeInfo.getAccessibilityViewId(parentNodeId); while (accessibilityViewId != AccessibilityNodeInfo.UNDEFINED_ITEM_ID) { @@ -1071,6 +1072,12 @@ final class AccessibilityInteractionController { AccessibilityNodeProvider.HOST_VIEW_ID); } if (parent == null) { + // Going up the parent relation we found a null predecessor, + // so remove these disconnected nodes form the result. + final int currentResultSize = outInfos.size(); + for (int i = currentResultSize - 1; i >= initialResultSize; i--) { + outInfos.remove(i); + } // Couldn't obtain the parent, which means we have a // disconnected sub-tree. Abort prefetch immediately. return;