summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Viverette <alanv@google.com>2014-10-07 22:09:48 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-10-07 22:09:49 +0000
commit0660042a26b99614e4bed88eb21ef7b46526d73b (patch)
tree5b2660c6c7c9e6060d1f2ba5b7dad15a4ebbe0f0
parent152893dd66a8cdecab14595c20085a0f10917f21 (diff)
parent727cae197b123ef764a1f8fbe08a995b000d14c3 (diff)
downloadframeworks_base-0660042a26b99614e4bed88eb21ef7b46526d73b.zip
frameworks_base-0660042a26b99614e4bed88eb21ef7b46526d73b.tar.gz
frameworks_base-0660042a26b99614e4bed88eb21ef7b46526d73b.tar.bz2
Merge "Mutate and apply theme if needed before caching themed drawables" into lmp-mr1-dev
-rw-r--r--core/java/android/content/res/Resources.java9
-rw-r--r--graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java9
-rw-r--r--graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java8
-rw-r--r--graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java9
-rw-r--r--graphics/java/android/graphics/drawable/AnimationDrawable.java8
-rw-r--r--graphics/java/android/graphics/drawable/BitmapDrawable.java8
-rw-r--r--graphics/java/android/graphics/drawable/ClipDrawable.java20
-rw-r--r--graphics/java/android/graphics/drawable/ColorDrawable.java8
-rw-r--r--graphics/java/android/graphics/drawable/Drawable.java14
-rw-r--r--graphics/java/android/graphics/drawable/DrawableContainer.java21
-rw-r--r--graphics/java/android/graphics/drawable/GradientDrawable.java8
-rw-r--r--graphics/java/android/graphics/drawable/InsetDrawable.java9
-rw-r--r--graphics/java/android/graphics/drawable/LayerDrawable.java13
-rw-r--r--graphics/java/android/graphics/drawable/LevelListDrawable.java8
-rw-r--r--graphics/java/android/graphics/drawable/NinePatchDrawable.java8
-rw-r--r--graphics/java/android/graphics/drawable/RotateDrawable.java9
-rw-r--r--graphics/java/android/graphics/drawable/ScaleDrawable.java9
-rw-r--r--graphics/java/android/graphics/drawable/ShapeDrawable.java8
-rw-r--r--graphics/java/android/graphics/drawable/StateListDrawable.java8
-rw-r--r--graphics/java/android/graphics/drawable/VectorDrawable.java8
20 files changed, 201 insertions, 1 deletions
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index 7f276c2..e34ce3e 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -2323,7 +2323,14 @@ public class Resources {
final Drawable dr;
if (cs != null) {
- dr = cs.newDrawable(this, theme);
+ final Drawable clonedDr = cs.newDrawable(this);
+ if (theme != null) {
+ dr = clonedDr.mutate();
+ dr.applyTheme(theme);
+ dr.clearMutated();
+ } else {
+ dr = clonedDr;
+ }
} else if (isColorDrawable) {
dr = new ColorDrawable(value.data);
} else {
diff --git a/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java b/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java
index 9fb3fb4..f4b8a69 100644
--- a/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java
@@ -331,6 +331,15 @@ public class AnimatedRotateDrawable extends Drawable implements Drawable.Callbac
return this;
}
+ /**
+ * @hide
+ */
+ public void clearMutated() {
+ super.clearMutated();
+ mState.mDrawable.clearMutated();
+ mMutated = false;
+ }
+
final static class AnimatedRotateState extends Drawable.ConstantState {
Drawable mDrawable;
diff --git a/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java b/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java
index cb09bbf..9bcad3e 100644
--- a/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java
@@ -507,6 +507,14 @@ public class AnimatedStateListDrawable extends StateListDrawable {
return this;
}
+ /**
+ * @hide
+ */
+ public void clearMutated() {
+ super.clearMutated();
+ mMutated = false;
+ }
+
static class AnimatedStateListState extends StateListState {
private static final int REVERSE_SHIFT = 32;
private static final int REVERSE_MASK = 0x1;
diff --git a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
index ad0b415..47b3bdd 100644
--- a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
@@ -157,6 +157,15 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable {
return this;
}
+ /**
+ * @hide
+ */
+ public void clearMutated() {
+ super.clearMutated();
+ mAnimatedVectorState.mVectorDrawable.clearMutated();
+ mMutated = false;
+ }
+
@Override
public ConstantState getConstantState() {
mAnimatedVectorState.mChangingConfigurations = getChangingConfigurations();
diff --git a/graphics/java/android/graphics/drawable/AnimationDrawable.java b/graphics/java/android/graphics/drawable/AnimationDrawable.java
index 9a9fd82..c730a20 100644
--- a/graphics/java/android/graphics/drawable/AnimationDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimationDrawable.java
@@ -347,6 +347,14 @@ public class AnimationDrawable extends DrawableContainer implements Runnable, An
return this;
}
+ /**
+ * @hide
+ */
+ public void clearMutated() {
+ super.clearMutated();
+ mMutated = false;
+ }
+
private final static class AnimationState extends DrawableContainerState {
private int[] mDurations;
private boolean mOneShot;
diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java
index cf6be48..b504a6e 100644
--- a/graphics/java/android/graphics/drawable/BitmapDrawable.java
+++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java
@@ -684,6 +684,14 @@ public class BitmapDrawable extends Drawable {
return this;
}
+ /**
+ * @hide
+ */
+ public void clearMutated() {
+ super.clearMutated();
+ mMutated = false;
+ }
+
@Override
protected boolean onStateChange(int[] stateSet) {
final BitmapState state = mBitmapState;
diff --git a/graphics/java/android/graphics/drawable/ClipDrawable.java b/graphics/java/android/graphics/drawable/ClipDrawable.java
index 40711cf..b2b9101 100644
--- a/graphics/java/android/graphics/drawable/ClipDrawable.java
+++ b/graphics/java/android/graphics/drawable/ClipDrawable.java
@@ -55,6 +55,8 @@ public class ClipDrawable extends Drawable implements Drawable.Callback {
public static final int HORIZONTAL = 1;
public static final int VERTICAL = 2;
+ private boolean mMutated;
+
ClipDrawable() {
this(null, null);
}
@@ -268,6 +270,24 @@ public class ClipDrawable extends Drawable implements Drawable.Callback {
super.setLayoutDirection(layoutDirection);
}
+ @Override
+ public Drawable mutate() {
+ if (!mMutated && super.mutate() == this) {
+ mClipState.mDrawable.mutate();
+ mMutated = true;
+ }
+ return this;
+ }
+
+ /**
+ * @hide
+ */
+ public void clearMutated() {
+ super.clearMutated();
+ mClipState.mDrawable.clearMutated();
+ mMutated = false;
+ }
+
final static class ClipState extends ConstantState {
Drawable mDrawable;
int mChangingConfigurations;
diff --git a/graphics/java/android/graphics/drawable/ColorDrawable.java b/graphics/java/android/graphics/drawable/ColorDrawable.java
index 0608065..a73bce6 100644
--- a/graphics/java/android/graphics/drawable/ColorDrawable.java
+++ b/graphics/java/android/graphics/drawable/ColorDrawable.java
@@ -88,6 +88,14 @@ public class ColorDrawable extends Drawable {
return this;
}
+ /**
+ * @hide
+ */
+ public void clearMutated() {
+ super.clearMutated();
+ mMutated = false;
+ }
+
@Override
public void draw(Canvas canvas) {
final ColorFilter colorFilter = mPaint.getColorFilter();
diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java
index 9ae788c..196351b 100644
--- a/graphics/java/android/graphics/drawable/Drawable.java
+++ b/graphics/java/android/graphics/drawable/Drawable.java
@@ -917,6 +917,20 @@ public abstract class Drawable {
}
/**
+ * Clears the mutated state, allowing this drawable to be cached and
+ * mutated again.
+ * <p>
+ * This is hidden because only framework drawables can be cached, so
+ * custom drawables don't need to support constant state, mutate(), or
+ * clearMutated().
+ *
+ * @hide
+ */
+ public void clearMutated() {
+ // Default implementation is no-op.
+ }
+
+ /**
* Create a drawable from an inputstream
*/
public static Drawable createFromStream(InputStream is, String srcName) {
diff --git a/graphics/java/android/graphics/drawable/DrawableContainer.java b/graphics/java/android/graphics/drawable/DrawableContainer.java
index 4a719fe..eb12d89 100644
--- a/graphics/java/android/graphics/drawable/DrawableContainer.java
+++ b/graphics/java/android/graphics/drawable/DrawableContainer.java
@@ -574,6 +574,15 @@ public class DrawableContainer extends Drawable implements Drawable.Callback {
}
/**
+ * @hide
+ */
+ public void clearMutated() {
+ super.clearMutated();
+ mDrawableContainerState.clearMutated();
+ mMutated = false;
+ }
+
+ /**
* A ConstantState that can contain several {@link Drawable}s.
*
* This class was made public to enable testing, and its visibility may change in a future
@@ -840,6 +849,18 @@ public class DrawableContainer extends Drawable implements Drawable.Callback {
mMutated = true;
}
+ final void clearMutated() {
+ final int N = mNumChildren;
+ final Drawable[] drawables = mDrawables;
+ for (int i = 0; i < N; i++) {
+ if (drawables[i] != null) {
+ drawables[i].clearMutated();
+ }
+ }
+
+ mMutated = false;
+ }
+
/**
* A boolean value indicating whether to use the maximum padding value
* of all frames in the set (false), or to use the padding value of the
diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java
index cd6297b..0fd7cad 100644
--- a/graphics/java/android/graphics/drawable/GradientDrawable.java
+++ b/graphics/java/android/graphics/drawable/GradientDrawable.java
@@ -1479,6 +1479,14 @@ public class GradientDrawable extends Drawable {
return this;
}
+ /**
+ * @hide
+ */
+ public void clearMutated() {
+ super.clearMutated();
+ mMutated = false;
+ }
+
final static class GradientState extends ConstantState {
public int mChangingConfigurations;
public int mShape = RECTANGLE;
diff --git a/graphics/java/android/graphics/drawable/InsetDrawable.java b/graphics/java/android/graphics/drawable/InsetDrawable.java
index 961d160..88c36d4 100644
--- a/graphics/java/android/graphics/drawable/InsetDrawable.java
+++ b/graphics/java/android/graphics/drawable/InsetDrawable.java
@@ -371,6 +371,15 @@ public class InsetDrawable extends Drawable implements Drawable.Callback {
}
/**
+ * @hide
+ */
+ public void clearMutated() {
+ super.clearMutated();
+ mInsetState.mDrawable.clearMutated();
+ mMutated = false;
+ }
+
+ /**
* Returns the drawable wrapped by this InsetDrawable. May be null.
*/
public Drawable getDrawable() {
diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java
index 001ed88..900060a 100644
--- a/graphics/java/android/graphics/drawable/LayerDrawable.java
+++ b/graphics/java/android/graphics/drawable/LayerDrawable.java
@@ -940,6 +940,19 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
return this;
}
+ /**
+ * @hide
+ */
+ public void clearMutated() {
+ super.clearMutated();
+ final ChildDrawable[] array = mLayerState.mChildren;
+ final int N = mLayerState.mNum;
+ for (int i = 0; i < N; i++) {
+ array[i].mDrawable.clearMutated();
+ }
+ mMutated = false;
+ }
+
/** @hide */
@Override
public void setLayoutDirection(int layoutDirection) {
diff --git a/graphics/java/android/graphics/drawable/LevelListDrawable.java b/graphics/java/android/graphics/drawable/LevelListDrawable.java
index bc1c61d..9e918f6 100644
--- a/graphics/java/android/graphics/drawable/LevelListDrawable.java
+++ b/graphics/java/android/graphics/drawable/LevelListDrawable.java
@@ -153,6 +153,14 @@ public class LevelListDrawable extends DrawableContainer {
return this;
}
+ /**
+ * @hide
+ */
+ public void clearMutated() {
+ super.clearMutated();
+ mMutated = false;
+ }
+
private final static class LevelListState extends DrawableContainerState {
private int[] mLows;
private int[] mHighs;
diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
index 6c62ccf..8cd0d13 100644
--- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java
+++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
@@ -563,6 +563,14 @@ public class NinePatchDrawable extends Drawable {
return this;
}
+ /**
+ * @hide
+ */
+ public void clearMutated() {
+ super.clearMutated();
+ mMutated = false;
+ }
+
@Override
protected boolean onStateChange(int[] stateSet) {
final NinePatchState state = mNinePatchState;
diff --git a/graphics/java/android/graphics/drawable/RotateDrawable.java b/graphics/java/android/graphics/drawable/RotateDrawable.java
index 55c9637..fc1c4e5 100644
--- a/graphics/java/android/graphics/drawable/RotateDrawable.java
+++ b/graphics/java/android/graphics/drawable/RotateDrawable.java
@@ -485,6 +485,15 @@ public class RotateDrawable extends Drawable implements Drawable.Callback {
}
/**
+ * @hide
+ */
+ public void clearMutated() {
+ super.clearMutated();
+ mState.mDrawable.clearMutated();
+ mMutated = false;
+ }
+
+ /**
* Represents the state of a rotation for a given drawable. The same
* rotate drawable can be invoked with different states to drive several
* rotations at the same time.
diff --git a/graphics/java/android/graphics/drawable/ScaleDrawable.java b/graphics/java/android/graphics/drawable/ScaleDrawable.java
index b990249..31f2775 100644
--- a/graphics/java/android/graphics/drawable/ScaleDrawable.java
+++ b/graphics/java/android/graphics/drawable/ScaleDrawable.java
@@ -276,6 +276,15 @@ public class ScaleDrawable extends Drawable implements Drawable.Callback {
return this;
}
+ /**
+ * @hide
+ */
+ public void clearMutated() {
+ super.clearMutated();
+ mScaleState.mDrawable.clearMutated();
+ mMutated = false;
+ }
+
final static class ScaleState extends ConstantState {
Drawable mDrawable;
int mChangingConfigurations;
diff --git a/graphics/java/android/graphics/drawable/ShapeDrawable.java b/graphics/java/android/graphics/drawable/ShapeDrawable.java
index bd69d76..e252d80 100644
--- a/graphics/java/android/graphics/drawable/ShapeDrawable.java
+++ b/graphics/java/android/graphics/drawable/ShapeDrawable.java
@@ -508,6 +508,14 @@ public class ShapeDrawable extends Drawable {
}
/**
+ * @hide
+ */
+ public void clearMutated() {
+ super.clearMutated();
+ mMutated = false;
+ }
+
+ /**
* Defines the intrinsic properties of this ShapeDrawable's Shape.
*/
final static class ShapeState extends ConstantState {
diff --git a/graphics/java/android/graphics/drawable/StateListDrawable.java b/graphics/java/android/graphics/drawable/StateListDrawable.java
index 2eb8a80..0309cb4 100644
--- a/graphics/java/android/graphics/drawable/StateListDrawable.java
+++ b/graphics/java/android/graphics/drawable/StateListDrawable.java
@@ -263,6 +263,14 @@ public class StateListDrawable extends DrawableContainer {
return this;
}
+ /**
+ * @hide
+ */
+ public void clearMutated() {
+ super.clearMutated();
+ mMutated = false;
+ }
+
/** @hide */
@Override
public void setLayoutDirection(int layoutDirection) {
diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java
index 4c83e55..d9b3957 100644
--- a/graphics/java/android/graphics/drawable/VectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/VectorDrawable.java
@@ -233,6 +233,14 @@ public class VectorDrawable extends Drawable {
return this;
}
+ /**
+ * @hide
+ */
+ public void clearMutated() {
+ super.clearMutated();
+ mMutated = false;
+ }
+
Object getTargetByName(String name) {
return mVectorState.mVPathRenderer.mVGTargetsMap.get(name);
}