OSDN Git Service

Fix ViewPager crash for a11y z order.
authorPhil Weaver <pweaver@google.com>
Wed, 10 Feb 2016 19:19:52 +0000 (11:19 -0800)
committerPhil Weaver <pweaver@google.com>
Wed, 10 Feb 2016 19:19:52 +0000 (11:19 -0800)
The ViewPager requires measure/layout to initialize a list used
in getChildDrawingOrder, and crashes when this method is called
too early. Protecting against that by assigning a default value
to the drawing order value of AccessibilityNodeInfo if the View
bounds have not yet been set.

Bug: 27076826
Change-Id: Ic42dbb81d15340f6b021626b1c27ad5abce7e7d1

core/java/android/view/View.java

index f52b290..a06a5b0 100644 (file)
@@ -6851,6 +6851,15 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
      * @param info The info whose drawing order should be populated
      */
     private void populateAccessibilityNodeInfoDrawingOrderInParent(AccessibilityNodeInfo info) {
+        /*
+         * If the view's bounds haven't been set yet, layout has not completed. In that situation,
+         * drawing order may not be well-defined, and some Views with custom drawing order may
+         * not be initialized sufficiently to respond properly getChildDrawingOrder.
+         */
+        if ((mPrivateFlags & PFLAG_HAS_BOUNDS) == 0) {
+            info.setDrawingOrder(0);
+            return;
+        }
         int drawingOrderInParent = 1;
         // Iterate up the hierarchy if parents are not important for a11y
         View viewAtDrawingLevel = this;