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;
                 }
             }
         }