Skip to content

Commit 76f287e

Browse files
committed
Removing hierarchical accessibility focus directions.
1. The accessibility focus directions are not needed since an accessibility service just get the root, first child, next sibling, previous sibling and call execute the action to give it accessibility focus. Now the accessibility node info tree is properly ordered taking into account layout manager directions for both layout manager that we report and ones that we have determined as not important for accessibility. Also the position of a node info are ordered properly based on their coordinates after all transformations as opposed to child index. bug:5932640 Change-Id: I994a8297cb1e57c829ecbac73a937c2bcbe0bac7
1 parent b983e27 commit 76f287e

File tree

8 files changed

+149
-378
lines changed

8 files changed

+149
-378
lines changed

api/current.txt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24080,11 +24080,7 @@ package android.view {
2408024080
field public static final int ACCESSIBILITY_FOCUS_BACKWARD = 4097; // 0x1001
2408124081
field public static final int ACCESSIBILITY_FOCUS_DOWN = 4226; // 0x1082
2408224082
field public static final int ACCESSIBILITY_FOCUS_FORWARD = 4098; // 0x1002
24083-
field public static final int ACCESSIBILITY_FOCUS_IN = 4100; // 0x1004
2408424083
field public static final int ACCESSIBILITY_FOCUS_LEFT = 4113; // 0x1011
24085-
field public static final int ACCESSIBILITY_FOCUS_NEXT = 4112; // 0x1010
24086-
field public static final int ACCESSIBILITY_FOCUS_OUT = 4104; // 0x1008
24087-
field public static final int ACCESSIBILITY_FOCUS_PREVIOUS = 4128; // 0x1020
2408824084
field public static final int ACCESSIBILITY_FOCUS_RIGHT = 4162; // 0x1042
2408924085
field public static final int ACCESSIBILITY_FOCUS_UP = 4129; // 0x1021
2409024086
field public static final android.util.Property ALPHA;

core/java/android/view/AccessibilityInteractionController.java

Lines changed: 45 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -662,29 +662,31 @@ private void prefetchSiblingsOfRealNode(View current,
662662
ViewGroup parentGroup = (ViewGroup) parent;
663663
ChildListForAccessibility children = ChildListForAccessibility.obtain(parentGroup,
664664
false);
665-
final int childCount = children.getChildCount();
666-
for (int i = 0; i < childCount; i++) {
667-
if (outInfos.size() >= MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
668-
children.recycle();
669-
return;
670-
}
671-
View child = children.getChildAt(i);
672-
if (child.getAccessibilityViewId() != current.getAccessibilityViewId()
673-
&& child.isDisplayedOnScreen()) {
674-
AccessibilityNodeInfo info = null;
675-
AccessibilityNodeProvider provider = child.getAccessibilityNodeProvider();
676-
if (provider == null) {
677-
info = child.createAccessibilityNodeInfo();
678-
} else {
679-
info = provider.createAccessibilityNodeInfo(
680-
AccessibilityNodeInfo.UNDEFINED);
665+
try {
666+
final int childCount = children.getChildCount();
667+
for (int i = 0; i < childCount; i++) {
668+
if (outInfos.size() >= MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
669+
return;
681670
}
682-
if (info != null) {
683-
outInfos.add(info);
671+
View child = children.getChildAt(i);
672+
if (child.getAccessibilityViewId() != current.getAccessibilityViewId()
673+
&& child.isDisplayedOnScreen()) {
674+
AccessibilityNodeInfo info = null;
675+
AccessibilityNodeProvider provider = child.getAccessibilityNodeProvider();
676+
if (provider == null) {
677+
info = child.createAccessibilityNodeInfo();
678+
} else {
679+
info = provider.createAccessibilityNodeInfo(
680+
AccessibilityNodeInfo.UNDEFINED);
681+
}
682+
if (info != null) {
683+
outInfos.add(info);
684+
}
684685
}
685686
}
687+
} finally {
688+
children.recycle();
686689
}
687-
children.recycle();
688690
}
689691
}
690692

@@ -697,32 +699,34 @@ private void prefetchDescendantsOfRealNode(View root,
697699
HashMap<View, AccessibilityNodeInfo> addedChildren =
698700
new HashMap<View, AccessibilityNodeInfo>();
699701
ChildListForAccessibility children = ChildListForAccessibility.obtain(rootGroup, false);
700-
final int childCount = children.getChildCount();
701-
for (int i = 0; i < childCount; i++) {
702-
if (outInfos.size() >= MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
703-
children.recycle();
704-
return;
705-
}
706-
View child = children.getChildAt(i);
707-
if (child.isDisplayedOnScreen()) {
708-
AccessibilityNodeProvider provider = child.getAccessibilityNodeProvider();
709-
if (provider == null) {
710-
AccessibilityNodeInfo info = child.createAccessibilityNodeInfo();
711-
if (info != null) {
712-
outInfos.add(info);
713-
addedChildren.put(child, null);
714-
}
715-
} else {
716-
AccessibilityNodeInfo info = provider.createAccessibilityNodeInfo(
717-
AccessibilityNodeInfo.UNDEFINED);
718-
if (info != null) {
719-
outInfos.add(info);
720-
addedChildren.put(child, info);
702+
try {
703+
final int childCount = children.getChildCount();
704+
for (int i = 0; i < childCount; i++) {
705+
if (outInfos.size() >= MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
706+
return;
707+
}
708+
View child = children.getChildAt(i);
709+
if (child.isDisplayedOnScreen()) {
710+
AccessibilityNodeProvider provider = child.getAccessibilityNodeProvider();
711+
if (provider == null) {
712+
AccessibilityNodeInfo info = child.createAccessibilityNodeInfo();
713+
if (info != null) {
714+
outInfos.add(info);
715+
addedChildren.put(child, null);
716+
}
717+
} else {
718+
AccessibilityNodeInfo info = provider.createAccessibilityNodeInfo(
719+
AccessibilityNodeInfo.UNDEFINED);
720+
if (info != null) {
721+
outInfos.add(info);
722+
addedChildren.put(child, info);
723+
}
721724
}
722725
}
723726
}
727+
} finally {
728+
children.recycle();
724729
}
725-
children.recycle();
726730
if (outInfos.size() < MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
727731
for (Map.Entry<View, AccessibilityNodeInfo> entry : addedChildren.entrySet()) {
728732
View addedChild = entry.getKey();

0 commit comments

Comments
 (0)