diff options
3 files changed, 20 insertions, 1 deletions
diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java index c95ac82..ef6c085 100644 --- a/graphics/java/android/graphics/drawable/BitmapDrawable.java +++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java @@ -706,10 +706,24 @@ public class BitmapDrawable extends Drawable { final TypedArray a = obtainAttributes(r, theme, attrs, R.styleable.BitmapDrawable); updateStateFromTypedArray(a); + verifyState(a); a.recycle(); } /** + * Ensures all required attributes are set. + * + * @throws XmlPullParserException if any required attributes are missing + */ + private void verifyState(TypedArray a) throws XmlPullParserException { + final BitmapState state = mBitmapState; + if (state.mBitmap == null) { + throw new XmlPullParserException(a.getPositionDescription() + + ": <bitmap> requires a valid src attribute"); + } + } + + /** * Updates the constant state from the values in the typed array. */ private void updateStateFromTypedArray(TypedArray a) throws XmlPullParserException { @@ -912,6 +926,7 @@ public class BitmapDrawable extends Drawable { */ private BitmapDrawable(BitmapState state, Resources res, Theme theme) { if (theme != null && state.canApplyTheme()) { + // If we need to apply a theme, implicitly mutate. mBitmapState = new BitmapState(state); applyTheme(theme); } else { diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java index 241b89e..005b8ef 100644 --- a/graphics/java/android/graphics/drawable/GradientDrawable.java +++ b/graphics/java/android/graphics/drawable/GradientDrawable.java @@ -1662,9 +1662,12 @@ public class GradientDrawable extends Drawable { * @param theme Theme to apply to the drawable */ private GradientDrawable(GradientState state, Theme theme) { - mGradientState = new GradientState(state); if (theme != null && state.canApplyTheme()) { + // If we need to apply a theme, implicitly mutate. + mGradientState = new GradientState(state); applyTheme(theme); + } else { + mGradientState = state; } initializeWithState(state); diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java index 77ed29a..fea68ee 100644 --- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java +++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java @@ -659,6 +659,7 @@ public class NinePatchDrawable extends Drawable { */ private NinePatchDrawable(NinePatchState state, Resources res, Theme theme) { if (theme != null && state.canApplyTheme()) { + // If we need to apply a theme, implicitly mutate. mNinePatchState = new NinePatchState(state); applyTheme(theme); } else { |