Merge "Make LD stateful / opacity management look more like DC"
diff --git a/graphics/java/android/graphics/drawable/DrawableContainer.java b/graphics/java/android/graphics/drawable/DrawableContainer.java
index abdc2b9..d88aee9 100644
--- a/graphics/java/android/graphics/drawable/DrawableContainer.java
+++ b/graphics/java/android/graphics/drawable/DrawableContainer.java
@@ -1128,8 +1128,6 @@
 
             createAllFutures();
 
-            mCheckedOpacity = true;
-
             final int N = mNumChildren;
             final Drawable[] drawables = mDrawables;
             int op = (N > 0) ? drawables[0].getOpacity() : PixelFormat.TRANSPARENT;
@@ -1138,6 +1136,7 @@
             }
 
             mOpacity = op;
+            mCheckedOpacity = true;
             return op;
         }
 
@@ -1148,19 +1147,19 @@
 
             createAllFutures();
 
-            mCheckedStateful = true;
-
             final int N = mNumChildren;
             final Drawable[] drawables = mDrawables;
+            boolean isStateful = false;
             for (int i = 0; i < N; i++) {
                 if (drawables[i].isStateful()) {
-                    mStateful = true;
-                    return true;
+                    isStateful = true;
+                    break;
                 }
             }
 
-            mStateful = false;
-            return false;
+            mStateful = isStateful;
+            mCheckedStateful = true;
+            return isStateful;
         }
 
         public void growArray(int oldSize, int newSize) {
diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java
index e09fea5..355e45e 100644
--- a/graphics/java/android/graphics/drawable/LayerDrawable.java
+++ b/graphics/java/android/graphics/drawable/LayerDrawable.java
@@ -137,7 +137,7 @@
             layers[i].setCallback(this);
             mLayerState.mChildrenChangingConfigurations |= layers[i].getChangingConfigurations();
         }
-        mLayerState.mNum = length;
+        mLayerState.mNumChildren = length;
         mLayerState.mChildren = r;
 
         ensurePadding();
@@ -154,7 +154,7 @@
      */
     LayerDrawable(@Nullable LayerState state, @Nullable Resources res) {
         mLayerState = createConstantState(state, res);
-        if (mLayerState.mNum > 0) {
+        if (mLayerState.mNumChildren > 0) {
             ensurePadding();
             refreshPadding();
         }
@@ -185,7 +185,7 @@
         a.recycle();
 
         final ChildDrawable[] array = state.mChildren;
-        final int N = state.mNum;
+        final int N = state.mNumChildren;
         for (int i = 0; i < N; i++) {
             final ChildDrawable layer = array[i];
             layer.setDensity(density);
@@ -217,7 +217,7 @@
         }
 
         final ChildDrawable[] array = state.mChildren;
-        final int N = state.mNum;
+        final int N = state.mNumChildren;
         for (int i = 0; i < N; i++) {
             final ChildDrawable layer = array[i];
             layer.setDensity(density);
@@ -416,7 +416,7 @@
         }
 
         final ChildDrawable[] layers = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             if (layers[i].mDrawable.isProjected()) {
                 return true;
@@ -435,7 +435,7 @@
     int addLayer(@NonNull ChildDrawable layer) {
         final LayerState st = mLayerState;
         final int N = st.mChildren != null ? st.mChildren.length : 0;
-        final int i = st.mNum;
+        final int i = st.mNumChildren;
         if (i >= N) {
             final ChildDrawable[] nu = new ChildDrawable[N + 10];
             if (i > 0) {
@@ -446,7 +446,7 @@
         }
 
         st.mChildren[i] = layer;
-        st.mNum++;
+        st.mNumChildren++;
         st.invalidateCache();
         return i;
     }
@@ -514,7 +514,7 @@
      */
     public Drawable findDrawableByLayerId(int id) {
         final ChildDrawable[] layers = mLayerState.mChildren;
-        for (int i = mLayerState.mNum - 1; i >= 0; i--) {
+        for (int i = mLayerState.mNumChildren - 1; i >= 0; i--) {
             if (layers[i].mId == id) {
                 return layers[i].mDrawable;
             }
@@ -549,7 +549,7 @@
      * @attr ref android.R.styleable#LayerDrawableItem_id
      */
     public int getId(int index) {
-        if (index >= mLayerState.mNum) {
+        if (index >= mLayerState.mNumChildren) {
             throw new IndexOutOfBoundsException();
         }
         return mLayerState.mChildren[index].mId;
@@ -561,7 +561,7 @@
      * @return The number of layers.
      */
     public int getNumberOfLayers() {
-        return mLayerState.mNum;
+        return mLayerState.mNumChildren;
     }
 
     /**
@@ -593,7 +593,7 @@
      */
     public int findIndexByLayerId(int id) {
         final ChildDrawable[] layers = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             final ChildDrawable childDrawable = layers[i];
             if (childDrawable.mId == id) {
@@ -615,7 +615,7 @@
      * @attr ref android.R.styleable#LayerDrawableItem_drawable
      */
     public void setDrawable(int index, Drawable drawable) {
-        if (index >= mLayerState.mNum) {
+        if (index >= mLayerState.mNumChildren) {
             throw new IndexOutOfBoundsException();
         }
 
@@ -651,7 +651,7 @@
      * @attr ref android.R.styleable#LayerDrawableItem_drawable
      */
     public Drawable getDrawable(int index) {
-        if (index >= mLayerState.mNum) {
+        if (index >= mLayerState.mNumChildren) {
             throw new IndexOutOfBoundsException();
         }
         return mLayerState.mChildren[index].mDrawable;
@@ -1003,7 +1003,7 @@
     @Override
     public void draw(Canvas canvas) {
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             final Drawable dr = array[i].mDrawable;
             if (dr != null) {
@@ -1230,7 +1230,7 @@
 
         // Add all the padding.
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             refreshChildPadding(i, array[i]);
 
@@ -1249,7 +1249,7 @@
 
         // Take the max padding.
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             refreshChildPadding(i, array[i]);
 
@@ -1268,7 +1268,7 @@
     @Override
     public void getOutline(@NonNull Outline outline) {
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             final Drawable dr = array[i].mDrawable;
             if (dr != null) {
@@ -1283,7 +1283,7 @@
     @Override
     public void setHotspot(float x, float y) {
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             final Drawable dr = array[i].mDrawable;
             if (dr != null) {
@@ -1295,7 +1295,7 @@
     @Override
     public void setHotspotBounds(int left, int top, int right, int bottom) {
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             final Drawable dr = array[i].mDrawable;
             if (dr != null) {
@@ -1323,7 +1323,7 @@
     public boolean setVisible(boolean visible, boolean restart) {
         final boolean changed = super.setVisible(visible, restart);
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             final Drawable dr = array[i].mDrawable;
             if (dr != null) {
@@ -1337,7 +1337,7 @@
     @Override
     public void setDither(boolean dither) {
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             final Drawable dr = array[i].mDrawable;
             if (dr != null) {
@@ -1349,7 +1349,7 @@
     @Override
     public void setAlpha(int alpha) {
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             final Drawable dr = array[i].mDrawable;
             if (dr != null) {
@@ -1371,7 +1371,7 @@
     @Override
     public void setColorFilter(ColorFilter colorFilter) {
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             final Drawable dr = array[i].mDrawable;
             if (dr != null) {
@@ -1383,7 +1383,7 @@
     @Override
     public void setTintList(ColorStateList tint) {
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             final Drawable dr = array[i].mDrawable;
             if (dr != null) {
@@ -1395,7 +1395,7 @@
     @Override
     public void setTintMode(Mode tintMode) {
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             final Drawable dr = array[i].mDrawable;
             if (dr != null) {
@@ -1406,7 +1406,7 @@
 
     private Drawable getFirstNonNullDrawable() {
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             final Drawable dr = array[i].mDrawable;
             if (dr != null) {
@@ -1444,7 +1444,7 @@
         mLayerState.mAutoMirrored = mirrored;
 
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             final Drawable dr = array[i].mDrawable;
             if (dr != null) {
@@ -1461,7 +1461,7 @@
     @Override
     public void jumpToCurrentState() {
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             final Drawable dr = array[i].mDrawable;
             if (dr != null) {
@@ -1480,7 +1480,7 @@
         boolean changed = false;
 
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             final Drawable dr = array[i].mDrawable;
             if (dr != null && dr.isStateful() && dr.setState(state)) {
@@ -1501,7 +1501,7 @@
         boolean changed = false;
 
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             final Drawable dr = array[i].mDrawable;
             if (dr != null && dr.setLevel(level)) {
@@ -1543,7 +1543,7 @@
         final boolean isPaddingNested = mLayerState.mPaddingMode == PADDING_MODE_NEST;
         final ChildDrawable[] array = mLayerState.mChildren;
 
-        for (int i = 0, count = mLayerState.mNum; i < count; i++) {
+        for (int i = 0, count = mLayerState.mNumChildren; i < count; i++) {
             final ChildDrawable r = array[i];
             final Drawable d = r.mDrawable;
             if (d == null) {
@@ -1642,7 +1642,7 @@
         final boolean nest = mLayerState.mPaddingMode == PADDING_MODE_NEST;
         final boolean isLayoutRtl = getLayoutDirection() == LayoutDirection.RTL;
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             final ChildDrawable r = array[i];
             if (r.mDrawable == null) {
@@ -1684,7 +1684,7 @@
 
         final boolean nest = mLayerState.mPaddingMode == PADDING_MODE_NEST;
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             final ChildDrawable r = array[i];
             if (r.mDrawable == null) {
@@ -1733,7 +1733,7 @@
      * Ensures the child padding caches are large enough.
      */
     void ensurePadding() {
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         if (mPaddingL != null && mPaddingL.length >= N) {
             return;
         }
@@ -1745,7 +1745,7 @@
     }
 
     void refreshPadding() {
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         final ChildDrawable[] array = mLayerState.mChildren;
         for (int i = 0; i < N; i++) {
             refreshChildPadding(i, array[i]);
@@ -1766,7 +1766,7 @@
         if (!mMutated && super.mutate() == this) {
             mLayerState = createConstantState(mLayerState, null);
             final ChildDrawable[] array = mLayerState.mChildren;
-            final int N = mLayerState.mNum;
+            final int N = mLayerState.mNumChildren;
             for (int i = 0; i < N; i++) {
                 final Drawable dr = array[i].mDrawable;
                 if (dr != null) {
@@ -1785,7 +1785,7 @@
         super.clearMutated();
 
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             final Drawable dr = array[i].mDrawable;
             if (dr != null) {
@@ -1800,7 +1800,7 @@
         boolean changed = false;
 
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int N = mLayerState.mNum;
+        final int N = mLayerState.mNumChildren;
         for (int i = 0; i < N; i++) {
             final Drawable dr = array[i].mDrawable;
             if (dr != null) {
@@ -1905,7 +1905,7 @@
     static class LayerState extends ConstantState {
         private int[] mThemeAttrs;
 
-        int mNum;
+        int mNumChildren;
         ChildDrawable[] mChildren;
 
         int mDensity;
@@ -1922,10 +1922,10 @@
         @Config int mChangingConfigurations;
         @Config int mChildrenChangingConfigurations;
 
-        private boolean mHaveOpacity;
+        private boolean mCheckedOpacity;
         private int mOpacity;
 
-        private boolean mHaveIsStateful;
+        private boolean mCheckedStateful;
         private boolean mIsStateful;
 
         private boolean mAutoMirrored = false;
@@ -1938,9 +1938,9 @@
 
             if (orig != null) {
                 final ChildDrawable[] origChildDrawable = orig.mChildren;
-                final int N = orig.mNum;
+                final int N = orig.mNumChildren;
 
-                mNum = N;
+                mNumChildren = N;
                 mChildren = new ChildDrawable[N];
 
                 mChangingConfigurations = orig.mChangingConfigurations;
@@ -1951,9 +1951,9 @@
                     mChildren[i] = new ChildDrawable(or, owner, res);
                 }
 
-                mHaveOpacity = orig.mHaveOpacity;
+                mCheckedOpacity = orig.mCheckedOpacity;
                 mOpacity = orig.mOpacity;
-                mHaveIsStateful = orig.mHaveIsStateful;
+                mCheckedStateful = orig.mCheckedStateful;
                 mIsStateful = orig.mIsStateful;
                 mAutoMirrored = orig.mAutoMirrored;
                 mPaddingMode = orig.mPaddingMode;
@@ -1970,7 +1970,7 @@
                     applyDensityScaling(orig.mDensity, mDensity);
                 }
             } else {
-                mNum = 0;
+                mNumChildren = 0;
                 mChildren = null;
             }
         }
@@ -2022,7 +2022,7 @@
             }
 
             final ChildDrawable[] array = mChildren;
-            final int N = mNum;
+            final int N = mNumChildren;
             for (int i = 0; i < N; i++) {
                 final ChildDrawable layer = array[i];
                 if (layer.canApplyTheme()) {
@@ -2050,12 +2050,12 @@
         }
 
         public final int getOpacity() {
-            if (mHaveOpacity) {
+            if (mCheckedOpacity) {
                 return mOpacity;
             }
 
+            final int N = mNumChildren;
             final ChildDrawable[] array = mChildren;
-            final int N = mNum;
 
             // Seek to the first non-null drawable.
             int firstIndex = -1;
@@ -2082,17 +2082,17 @@
             }
 
             mOpacity = op;
-            mHaveOpacity = true;
+            mCheckedOpacity = true;
             return op;
         }
 
         public final boolean isStateful() {
-            if (mHaveIsStateful) {
+            if (mCheckedStateful) {
                 return mIsStateful;
             }
 
+            final int N = mNumChildren;
             final ChildDrawable[] array = mChildren;
-            final int N = mNum;
             boolean isStateful = false;
             for (int i = 0; i < N; i++) {
                 final Drawable dr = array[i].mDrawable;
@@ -2103,13 +2103,13 @@
             }
 
             mIsStateful = isStateful;
-            mHaveIsStateful = true;
+            mCheckedStateful = true;
             return isStateful;
         }
 
         public final boolean canConstantState() {
             final ChildDrawable[] array = mChildren;
-            final int N = mNum;
+            final int N = mNumChildren;
             for (int i = 0; i < N; i++) {
                 final Drawable dr = array[i].mDrawable;
                 if (dr != null && dr.getConstantState() == null) {
@@ -2122,8 +2122,8 @@
         }
 
         public void invalidateCache() {
-            mHaveOpacity = false;
-            mHaveIsStateful = false;
+            mCheckedOpacity = false;
+            mCheckedStateful = false;
         }
 
     }
diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java
index caf2e7a..f83c160 100644
--- a/graphics/java/android/graphics/drawable/RippleDrawable.java
+++ b/graphics/java/android/graphics/drawable/RippleDrawable.java
@@ -667,7 +667,7 @@
     public void getOutline(@NonNull Outline outline) {
         final LayerState state = mLayerState;
         final ChildDrawable[] children = state.mChildren;
-        final int N = state.mNum;
+        final int N = state.mNumChildren;
         for (int i = 0; i < N; i++) {
             if (children[i].mId != R.id.mask) {
                 children[i].mDrawable.getOutline(outline);
@@ -815,7 +815,7 @@
 
         // Check for non-opaque, non-mask content.
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int count = mLayerState.mNum;
+        final int count = mLayerState.mNumChildren;
         for (int i = 0; i < count; i++) {
             if (array[i].mDrawable.getOpacity() != PixelFormat.OPAQUE) {
                 return MASK_CONTENT;
@@ -829,7 +829,7 @@
     private void drawContent(Canvas canvas) {
         // Draw everything except the mask.
         final ChildDrawable[] array = mLayerState.mChildren;
-        final int count = mLayerState.mNum;
+        final int count = mLayerState.mNumChildren;
         for (int i = 0; i < count; i++) {
             if (array[i].mId != R.id.mask) {
                 array[i].mDrawable.draw(canvas);
@@ -1045,7 +1045,7 @@
         mLayerState = mState;
         mDensity = Drawable.resolveDensity(res, mState.mDensity);
 
-        if (mState.mNum > 0) {
+        if (mState.mNumChildren > 0) {
             ensurePadding();
             refreshPadding();
         }