Merge "Fix drawer layout's approximation of addChildrenForAccessibility()" into klp-dev
diff --git a/v4/java/android/support/v4/widget/DrawerLayout.java b/v4/java/android/support/v4/widget/DrawerLayout.java
index deddb0b..bc7321f 100644
--- a/v4/java/android/support/v4/widget/DrawerLayout.java
+++ b/v4/java/android/support/v4/widget/DrawerLayout.java
@@ -1541,11 +1541,38 @@
superNode.recycle();
- final int childCount = getChildCount();
+ addChildrenForAccessibility(info, (ViewGroup) host);
+ }
+
+ private void addChildrenForAccessibility(AccessibilityNodeInfoCompat info, ViewGroup v) {
+ final int childCount = v.getChildCount();
for (int i = 0; i < childCount; i++) {
- final View child = getChildAt(i);
- if (!filter(child)) {
- info.addChild(child);
+ final View child = v.getChildAt(i);
+ if (filter(child)) {
+ continue;
+ }
+
+ // Adding children that are marked as not important for
+ // accessibility will break the hierarchy, so we need to check
+ // that value and re-parent views if necessary.
+ final int importance = ViewCompat.getImportantForAccessibility(child);
+ switch (importance) {
+ case ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS:
+ // Always skip NO_HIDE views and their descendants.
+ break;
+ case ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO:
+ // Re-parent children of NO view groups, skip NO views.
+ if (child instanceof ViewGroup) {
+ addChildrenForAccessibility(info, (ViewGroup) child);
+ }
+ break;
+ case ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO:
+ // Force AUTO views to YES and add them.
+ ViewCompat.setImportantForAccessibility(
+ child, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+ case ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES:
+ info.addChild(child);
+ break;
}
}
}