summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java2
-rw-r--r--graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java2
-rw-r--r--graphics/java/android/graphics/drawable/RippleDrawable.java29
-rw-r--r--graphics/java/android/graphics/drawable/VectorDrawable.java31
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);