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