diff options
4 files changed, 47 insertions, 17 deletions
diff --git a/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java b/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java index 14aa570aa828..f7584d8ff85a 100644 --- a/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java +++ b/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java @@ -492,7 +492,7 @@ public class AnimatedStateListDrawable extends StateListDrawable { @Override public Drawable mutate() { - if (!mMutated) { + if (!mMutated && super.mutate() == this) { final AnimatedStateListState newState = new AnimatedStateListState(mState, this, null); setConstantState(newState); mMutated = true; diff --git a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java index df1b126a79ee..ad0b4157f4d7 100644 --- a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java +++ b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java @@ -151,7 +151,7 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable { @Override public Drawable mutate() { if (!mMutated && super.mutate() == this) { - mAnimatedVectorState = new AnimatedVectorDrawableState(mAnimatedVectorState); + mAnimatedVectorState.mVectorDrawable.mutate(); mMutated = true; } return this; diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java index 4fd98b71b643..c7aa98ea21aa 100644 --- a/graphics/java/android/graphics/drawable/RippleDrawable.java +++ b/graphics/java/android/graphics/drawable/RippleDrawable.java @@ -114,7 +114,8 @@ public class RippleDrawable extends LayerDrawable { /** Current dirty bounds, union of current and previous drawing bounds. */ private final Rect mDirtyBounds = new Rect(); - private final RippleState mState; + /** Mirrors mLayerState with some extra information. */ + private RippleState mState; /** The masking layer, e.g. the layer with id R.id.mask. */ private Drawable mMask; @@ -885,18 +886,34 @@ public class RippleDrawable extends LayerDrawable { return mState; } + @Override + public Drawable mutate() { + super.mutate(); + + // LayerDrawable creates a new state using createConstantState, so + // this should always be a safe cast. + mState = (RippleState) mLayerState; + return this; + } + + @Override + RippleState createConstantState(LayerState state, Resources res) { + return new RippleState(state, this, res); + } + static class RippleState extends LayerState { int[] mTouchThemeAttrs; ColorStateList mColor = ColorStateList.valueOf(Color.MAGENTA); int mMaxRadius = RADIUS_AUTO; - public RippleState(RippleState orig, RippleDrawable owner, Resources res) { + public RippleState(LayerState orig, RippleDrawable owner, Resources res) { super(orig, owner, res); - if (orig != null) { - mTouchThemeAttrs = orig.mTouchThemeAttrs; - mColor = orig.mColor; - mMaxRadius = orig.mMaxRadius; + if (orig != null && orig instanceof RippleState) { + final RippleState origs = (RippleState) orig; + mTouchThemeAttrs = origs.mTouchThemeAttrs; + mColor = origs.mColor; + mMaxRadius = origs.mMaxRadius; } } diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java index bbb0b5063994..80148373d320 100644 --- a/graphics/java/android/graphics/drawable/VectorDrawable.java +++ b/graphics/java/android/graphics/drawable/VectorDrawable.java @@ -507,9 +507,10 @@ public class VectorDrawable extends Drawable { pathRenderer.getAlpha()); pathRenderer.setAlpha(alphaInFloat); - pathRenderer.mRootName = a.getString(R.styleable.VectorDrawable_name); - if (pathRenderer.mRootName != null) { - pathRenderer.mVGTargetsMap.put(pathRenderer.mRootName, pathRenderer); + final String name = a.getString(R.styleable.VectorDrawable_name); + if (name != null) { + pathRenderer.mRootName = name; + pathRenderer.mVGTargetsMap.put(name, pathRenderer); } } @@ -1313,9 +1314,15 @@ public class VectorDrawable extends Drawable { // Account for any configuration changes. mChangingConfigurations |= a.getChangingConfigurations(); - mPathName = a.getString(R.styleable.VectorDrawableClipPath_name); - mNodes = PathParser.createNodesFromPathData(a.getString( - R.styleable.VectorDrawableClipPath_pathData)); + final String pathName = a.getString(R.styleable.VectorDrawableClipPath_name); + if (pathName != null) { + mPathName = pathName; + } + + final String pathData = a.getString(R.styleable.VectorDrawableClipPath_pathData); + if (pathData != null) { + mNodes = PathParser.createNodesFromPathData(pathData); + } } @Override @@ -1415,9 +1422,15 @@ public class VectorDrawable extends Drawable { // Extract the theme attributes, if any. mThemeAttrs = a.extractThemeAttrs(); - mPathName = a.getString(R.styleable.VectorDrawablePath_name); - mNodes = PathParser.createNodesFromPathData(a.getString( - R.styleable.VectorDrawablePath_pathData)); + final String pathName = a.getString(R.styleable.VectorDrawablePath_name); + if (pathName != null) { + mPathName = pathName; + } + + final String pathData = a.getString(R.styleable.VectorDrawablePath_pathData); + if (pathData != null) { + mNodes = PathParser.createNodesFromPathData(pathData); + } mFillColor = a.getColor(R.styleable.VectorDrawablePath_fillColor, mFillColor); |