am c2974809: Fix issue #2116977: buttons are huge and bent

Merge commit 'c2974809373697147cbe5754835cc871fb93aef1' into eclair-plus-aosp

* commit 'c2974809373697147cbe5754835cc871fb93aef1':
  Fix issue #2116977: buttons are huge and bent
This commit is contained in:
Dianne Hackborn
2009-09-14 17:09:28 -07:00
committed by Android Git Automerger
21 changed files with 309 additions and 115 deletions

View File

@@ -63352,7 +63352,7 @@
type="android.graphics.drawable.BitmapDrawable" type="android.graphics.drawable.BitmapDrawable"
static="false" static="false"
final="false" final="false"
deprecated="not deprecated" deprecated="deprecated"
visibility="public" visibility="public"
> >
<parameter name="filepath" type="java.lang.String"> <parameter name="filepath" type="java.lang.String">
@@ -63365,6 +63365,30 @@
deprecated="not deprecated" deprecated="not deprecated"
visibility="public" visibility="public"
> >
<parameter name="res" type="android.content.res.Resources">
</parameter>
<parameter name="filepath" type="java.lang.String">
</parameter>
</constructor>
<constructor name="BitmapDrawable"
type="android.graphics.drawable.BitmapDrawable"
static="false"
final="false"
deprecated="deprecated"
visibility="public"
>
<parameter name="is" type="java.io.InputStream">
</parameter>
</constructor>
<constructor name="BitmapDrawable"
type="android.graphics.drawable.BitmapDrawable"
static="false"
final="false"
deprecated="not deprecated"
visibility="public"
>
<parameter name="res" type="android.content.res.Resources">
</parameter>
<parameter name="is" type="java.io.InputStream"> <parameter name="is" type="java.io.InputStream">
</parameter> </parameter>
</constructor> </constructor>
@@ -64543,6 +64567,19 @@
visibility="public" visibility="public"
> >
</method> </method>
<method name="newDrawable"
return="android.graphics.drawable.Drawable"
abstract="false"
native="false"
synchronized="false"
static="false"
final="false"
deprecated="not deprecated"
visibility="public"
>
<parameter name="res" type="android.content.res.Resources">
</parameter>
</method>
</class> </class>
<class name="DrawableContainer" <class name="DrawableContainer"
extends="android.graphics.drawable.Drawable" extends="android.graphics.drawable.Drawable"

View File

@@ -395,7 +395,7 @@ class SuggestionsAdapter extends ResourceCursorAdapter {
Drawable.ConstantState cachedBg = mBackgroundsCache.get(backgroundColor); Drawable.ConstantState cachedBg = mBackgroundsCache.get(backgroundColor);
if (cachedBg != null) { if (cachedBg != null) {
if (DBG) Log.d(LOG_TAG, "Background cache hit for color " + backgroundColor); if (DBG) Log.d(LOG_TAG, "Background cache hit for color " + backgroundColor);
return cachedBg.newDrawable(); return cachedBg.newDrawable(mProviderContext.getResources());
} }
if (DBG) Log.d(LOG_TAG, "Creating new background for color " + backgroundColor); if (DBG) Log.d(LOG_TAG, "Creating new background for color " + backgroundColor);
ColorDrawable transparent = new ColorDrawable(0); ColorDrawable transparent = new ColorDrawable(0);
@@ -572,7 +572,7 @@ class SuggestionsAdapter extends ResourceCursorAdapter {
Drawable.ConstantState cached = mOutsideDrawablesCache.get(drawableId); Drawable.ConstantState cached = mOutsideDrawablesCache.get(drawableId);
if (cached != null) { if (cached != null) {
if (DBG) Log.d(LOG_TAG, "Found icon in cache: " + drawableId); if (DBG) Log.d(LOG_TAG, "Found icon in cache: " + drawableId);
return cached.newDrawable(); return cached.newDrawable(mProviderContext.getResources());
} }
Drawable drawable = null; Drawable drawable = null;
@@ -663,7 +663,7 @@ class SuggestionsAdapter extends ResourceCursorAdapter {
// Using containsKey() since we also store null values. // Using containsKey() since we also store null values.
if (mOutsideDrawablesCache.containsKey(componentIconKey)) { if (mOutsideDrawablesCache.containsKey(componentIconKey)) {
Drawable.ConstantState cached = mOutsideDrawablesCache.get(componentIconKey); Drawable.ConstantState cached = mOutsideDrawablesCache.get(componentIconKey);
return cached == null ? null : cached.newDrawable(); return cached == null ? null : cached.newDrawable(mProviderContext.getResources());
} }
// Then try the activity or application icon // Then try the activity or application icon
Drawable drawable = getActivityIcon(component); Drawable drawable = getActivityIcon(component);

View File

@@ -1662,7 +1662,7 @@ public class Resources {
Drawable.ConstantState cs = sPreloadedDrawables.get(key); Drawable.ConstantState cs = sPreloadedDrawables.get(key);
if (cs != null) { if (cs != null) {
dr = cs.newDrawable(); dr = cs.newDrawable(this);
} else { } else {
if (value.type >= TypedValue.TYPE_FIRST_COLOR_INT && if (value.type >= TypedValue.TYPE_FIRST_COLOR_INT &&
value.type <= TypedValue.TYPE_LAST_COLOR_INT) { value.type <= TypedValue.TYPE_LAST_COLOR_INT) {
@@ -1743,7 +1743,7 @@ public class Resources {
//Log.i(TAG, "Returning cached drawable @ #" + //Log.i(TAG, "Returning cached drawable @ #" +
// Integer.toHexString(((Integer)key).intValue()) // Integer.toHexString(((Integer)key).intValue())
// + " in " + this + ": " + entry); // + " in " + this + ": " + entry);
return entry.newDrawable(); return entry.newDrawable(this);
} }
else { // our entry has been purged else { // our entry has been purged
mDrawableCache.delete(key); mDrawableCache.delete(key);

View File

@@ -282,7 +282,9 @@ public final class IconMenuView extends ViewGroup implements ItemInvoker, MenuVi
itemView.setIconMenuView(this); itemView.setIconMenuView(this);
// Apply the background to the item view // Apply the background to the item view
itemView.setBackgroundDrawable(mItemBackground.getConstantState().newDrawable()); itemView.setBackgroundDrawable(
mItemBackground.getConstantState().newDrawable(
getContext().getResources()));
// This class is the invoker for all its item views // This class is the invoker for all its item views
itemView.setItemInvoker(this); itemView.setItemInvoker(this);

View File

@@ -45,11 +45,11 @@ public class AnimatedRotateDrawable extends Drawable implements Drawable.Callbac
private boolean mRunning; private boolean mRunning;
public AnimatedRotateDrawable() { public AnimatedRotateDrawable() {
this(null); this(null, null);
} }
private AnimatedRotateDrawable(AnimatedRotateState rotateState) { private AnimatedRotateDrawable(AnimatedRotateState rotateState, Resources res) {
mState = new AnimatedRotateState(rotateState, this); mState = new AnimatedRotateState(rotateState, this, res);
init(); init();
} }
@@ -296,9 +296,14 @@ public class AnimatedRotateDrawable extends Drawable implements Drawable.Callbac
private boolean mCanConstantState; private boolean mCanConstantState;
private boolean mCheckedConstantState; private boolean mCheckedConstantState;
public AnimatedRotateState(AnimatedRotateState source, AnimatedRotateDrawable owner) { public AnimatedRotateState(AnimatedRotateState source, AnimatedRotateDrawable owner,
Resources res) {
if (source != null) { if (source != null) {
mDrawable = source.mDrawable.getConstantState().newDrawable(); if (res != null) {
mDrawable = source.mDrawable.getConstantState().newDrawable(res);
} else {
mDrawable = source.mDrawable.getConstantState().newDrawable();
}
mDrawable.setCallback(owner); mDrawable.setCallback(owner);
mPivotXRel = source.mPivotXRel; mPivotXRel = source.mPivotXRel;
mPivotX = source.mPivotX; mPivotX = source.mPivotX;
@@ -312,7 +317,12 @@ public class AnimatedRotateDrawable extends Drawable implements Drawable.Callbac
@Override @Override
public Drawable newDrawable() { public Drawable newDrawable() {
return new AnimatedRotateDrawable(this); return new AnimatedRotateDrawable(this, null);
}
@Override
public Drawable newDrawable(Resources res) {
return new AnimatedRotateDrawable(this, res);
} }
@Override @Override

View File

@@ -77,7 +77,7 @@ public class AnimationDrawable extends DrawableContainer implements Runnable, An
private boolean mMutated; private boolean mMutated;
public AnimationDrawable() { public AnimationDrawable() {
this(null); this(null, null);
} }
@Override @Override
@@ -297,8 +297,9 @@ public class AnimationDrawable extends DrawableContainer implements Runnable, An
private int[] mDurations; private int[] mDurations;
private boolean mOneShot; private boolean mOneShot;
AnimationState(AnimationState orig, AnimationDrawable owner) { AnimationState(AnimationState orig, AnimationDrawable owner,
super(orig, owner); Resources res) {
super(orig, owner, res);
if (orig != null) { if (orig != null) {
mDurations = orig.mDurations; mDurations = orig.mDurations;
@@ -311,7 +312,12 @@ public class AnimationDrawable extends DrawableContainer implements Runnable, An
@Override @Override
public Drawable newDrawable() { public Drawable newDrawable() {
return new AnimationDrawable(this); return new AnimationDrawable(this, null);
}
@Override
public Drawable newDrawable(Resources res) {
return new AnimationDrawable(this, res);
} }
public void addFrame(Drawable dr, int dur) { public void addFrame(Drawable dr, int dur) {
@@ -330,8 +336,8 @@ public class AnimationDrawable extends DrawableContainer implements Runnable, An
} }
} }
private AnimationDrawable(AnimationState state) { private AnimationDrawable(AnimationState state, Resources res) {
AnimationState as = new AnimationState(state, this); AnimationState as = new AnimationState(state, this, res);
mAnimationState = as; mAnimationState = as;
setConstantState(as); setConstantState(as);
if (state != null) { if (state != null) {

View File

@@ -60,15 +60,15 @@ public class BitmapDrawable extends Drawable {
Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG; Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG;
private BitmapState mBitmapState; private BitmapState mBitmapState;
private Bitmap mBitmap; private Bitmap mBitmap;
private int mTargetDensity;
private final Rect mDstRect = new Rect(); // Gravity.apply() sets this private final Rect mDstRect = new Rect(); // Gravity.apply() sets this
private boolean mApplyGravity; private boolean mApplyGravity;
private boolean mRebuildShader; private boolean mRebuildShader;
private boolean mMutated; private boolean mMutated;
private int mTargetDensity = DisplayMetrics.DENSITY_DEFAULT; // These are scaled to match the target density.
// These are scaled to match the target density.
private int mBitmapWidth; private int mBitmapWidth;
private int mBitmapHeight; private int mBitmapHeight;
@@ -88,10 +88,7 @@ public class BitmapDrawable extends Drawable {
*/ */
public BitmapDrawable(Resources res) { public BitmapDrawable(Resources res) {
mBitmapState = new BitmapState((Bitmap) null); mBitmapState = new BitmapState((Bitmap) null);
if (res != null) { mBitmapState.mTargetDensity = mTargetDensity;
setTargetDensity(res.getDisplayMetrics());
mBitmapState.mTargetDensity = mTargetDensity;
}
} }
/** /**
@@ -101,7 +98,7 @@ public class BitmapDrawable extends Drawable {
*/ */
@Deprecated @Deprecated
public BitmapDrawable(Bitmap bitmap) { public BitmapDrawable(Bitmap bitmap) {
this(new BitmapState(bitmap)); this(new BitmapState(bitmap), null);
} }
/** /**
@@ -109,22 +106,51 @@ public class BitmapDrawable extends Drawable {
* the display metrics of the resources. * the display metrics of the resources.
*/ */
public BitmapDrawable(Resources res, Bitmap bitmap) { public BitmapDrawable(Resources res, Bitmap bitmap) {
this(new BitmapState(bitmap)); this(new BitmapState(bitmap), res);
if (res != null) { mBitmapState.mTargetDensity = mTargetDensity;
setTargetDensity(res.getDisplayMetrics());
mBitmapState.mTargetDensity = mTargetDensity;
}
} }
/**
* Create a drawable by opening a given file path and decoding the bitmap.
* @deprecated Use {@link #BitmapDrawable(Resources, String)} to ensure
* that the drawable has correctly set its target density.
*/
public BitmapDrawable(String filepath) { public BitmapDrawable(String filepath) {
this(new BitmapState(BitmapFactory.decodeFile(filepath))); this(new BitmapState(BitmapFactory.decodeFile(filepath)), null);
if (mBitmap == null) { if (mBitmap == null) {
android.util.Log.w("BitmapDrawable", "BitmapDrawable cannot decode " + filepath); android.util.Log.w("BitmapDrawable", "BitmapDrawable cannot decode " + filepath);
} }
} }
/**
* Create a drawable by opening a given file path and decoding the bitmap.
*/
public BitmapDrawable(Resources res, String filepath) {
this(new BitmapState(BitmapFactory.decodeFile(filepath)), null);
mBitmapState.mTargetDensity = mTargetDensity;
if (mBitmap == null) {
android.util.Log.w("BitmapDrawable", "BitmapDrawable cannot decode " + filepath);
}
}
/**
* Create a drawable by decoding a bitmap from the given input stream.
* @deprecated Use {@link #BitmapDrawable(Resources, java.io.InputStream)} to ensure
* that the drawable has correctly set its target density.
*/
public BitmapDrawable(java.io.InputStream is) { public BitmapDrawable(java.io.InputStream is) {
this(new BitmapState(BitmapFactory.decodeStream(is))); this(new BitmapState(BitmapFactory.decodeStream(is)), null);
if (mBitmap == null) {
android.util.Log.w("BitmapDrawable", "BitmapDrawable cannot decode " + is);
}
}
/**
* Create a drawable by decoding a bitmap from the given input stream.
*/
public BitmapDrawable(Resources res, java.io.InputStream is) {
this(new BitmapState(BitmapFactory.decodeStream(is)), null);
mBitmapState.mTargetDensity = mTargetDensity;
if (mBitmap == null) { if (mBitmap == null) {
android.util.Log.w("BitmapDrawable", "BitmapDrawable cannot decode " + is); android.util.Log.w("BitmapDrawable", "BitmapDrawable cannot decode " + is);
} }
@@ -425,7 +451,12 @@ public class BitmapDrawable extends Drawable {
@Override @Override
public Drawable newDrawable() { public Drawable newDrawable() {
return new BitmapDrawable(this); return new BitmapDrawable(this, null);
}
@Override
public Drawable newDrawable(Resources res) {
return new BitmapDrawable(this, res);
} }
@Override @Override
@@ -434,9 +465,15 @@ public class BitmapDrawable extends Drawable {
} }
} }
private BitmapDrawable(BitmapState state) { private BitmapDrawable(BitmapState state, Resources res) {
mBitmapState = state; mBitmapState = state;
mTargetDensity = state.mTargetDensity; if (res != null) {
mTargetDensity = res.getDisplayMetrics().densityDpi;
} else if (state != null) {
mTargetDensity = state.mTargetDensity;
} else {
mTargetDensity = DisplayMetrics.DENSITY_DEFAULT;
}
setBitmap(state.mBitmap); setBitmap(state.mBitmap);
} }
} }

View File

@@ -48,14 +48,14 @@ public class ClipDrawable extends Drawable implements Drawable.Callback {
public static final int VERTICAL = 2; public static final int VERTICAL = 2;
ClipDrawable() { ClipDrawable() {
this(null); this(null, null);
} }
/** /**
* @param orientation Bitwise-or of {@link #HORIZONTAL} and/or {@link #VERTICAL} * @param orientation Bitwise-or of {@link #HORIZONTAL} and/or {@link #VERTICAL}
*/ */
public ClipDrawable(Drawable drawable, int gravity, int orientation) { public ClipDrawable(Drawable drawable, int gravity, int orientation) {
this(null); this(null, null);
mClipState.mDrawable = drawable; mClipState.mDrawable = drawable;
mClipState.mGravity = gravity; mClipState.mGravity = gravity;
@@ -241,9 +241,13 @@ public class ClipDrawable extends Drawable implements Drawable.Callback {
private boolean mCheckedConstantState; private boolean mCheckedConstantState;
private boolean mCanConstantState; private boolean mCanConstantState;
ClipState(ClipState orig, ClipDrawable owner) { ClipState(ClipState orig, ClipDrawable owner, Resources res) {
if (orig != null) { if (orig != null) {
mDrawable = orig.mDrawable.getConstantState().newDrawable(); if (res != null) {
mDrawable = orig.mDrawable.getConstantState().newDrawable(res);
} else {
mDrawable = orig.mDrawable.getConstantState().newDrawable();
}
mDrawable.setCallback(owner); mDrawable.setCallback(owner);
mOrientation = orig.mOrientation; mOrientation = orig.mOrientation;
mGravity = orig.mGravity; mGravity = orig.mGravity;
@@ -253,7 +257,12 @@ public class ClipDrawable extends Drawable implements Drawable.Callback {
@Override @Override
public Drawable newDrawable() { public Drawable newDrawable() {
return new ClipDrawable(this); return new ClipDrawable(this, null);
}
@Override
public Drawable newDrawable(Resources res) {
return new ClipDrawable(this, res);
} }
@Override @Override
@@ -271,8 +280,8 @@ public class ClipDrawable extends Drawable implements Drawable.Callback {
} }
} }
private ClipDrawable(ClipState state) { private ClipDrawable(ClipState state, Resources res) {
mClipState = new ClipState(state, this); mClipState = new ClipState(state, this, res);
} }
} }

View File

@@ -145,6 +145,11 @@ public class ColorDrawable extends Drawable {
return new ColorDrawable(this); return new ColorDrawable(this);
} }
@Override
public Drawable newDrawable(Resources res) {
return new ColorDrawable(this);
}
@Override @Override
public int getChangingConfigurations() { public int getChangingConfigurations() {
return mChangingConfigurations; return mChangingConfigurations;

View File

@@ -822,7 +822,26 @@ public abstract class Drawable {
} }
public static abstract class ConstantState { public static abstract class ConstantState {
/**
* Create a new drawable without supplying resources the caller
* is running in. Note that using this means the density-dependent
* drawables (like bitmaps) will not be able to update their target
* density correctly.
*/
public abstract Drawable newDrawable(); public abstract Drawable newDrawable();
/**
* Create a new Drawable instance from its constant state. This
* must be implemented for drawables that change based on the target
* density of their caller (that is depending on whether it is
* in compatibility mode).
*/
public Drawable newDrawable(Resources res) {
return newDrawable();
}
/**
* Return a bit mask of configuration changes that will impact
* this drawable (and thus require completely reloading it).
*/
public abstract int getChangingConfigurations(); public abstract int getChangingConfigurations();
} }

View File

@@ -16,6 +16,7 @@
package android.graphics.drawable; package android.graphics.drawable;
import android.content.res.Resources;
import android.graphics.*; import android.graphics.*;
public class DrawableContainer extends Drawable implements Drawable.Callback { public class DrawableContainer extends Drawable implements Drawable.Callback {
@@ -285,7 +286,8 @@ public class DrawableContainer extends Drawable implements Drawable.Callback {
boolean mPaddingChecked = false; boolean mPaddingChecked = false;
DrawableContainerState(DrawableContainerState orig, DrawableContainer owner) { DrawableContainerState(DrawableContainerState orig, DrawableContainer owner,
Resources res) {
mOwner = owner; mOwner = owner;
if (orig != null) { if (orig != null) {
@@ -299,7 +301,11 @@ public class DrawableContainer extends Drawable implements Drawable.Callback {
final int N = mNumChildren; final int N = mNumChildren;
for (int i=0; i<N; i++) { for (int i=0; i<N; i++) {
mDrawables[i] = origDr[i].getConstantState().newDrawable(); if (res != null) {
mDrawables[i] = origDr[i].getConstantState().newDrawable(res);
} else {
mDrawables[i] = origDr[i].getConstantState().newDrawable();
}
mDrawables[i].setCallback(owner); mDrawables[i].setCallback(owner);
} }

View File

@@ -916,6 +916,11 @@ public class GradientDrawable extends Drawable {
return new GradientDrawable(this); return new GradientDrawable(this);
} }
@Override
public Drawable newDrawable(Resources res) {
return new GradientDrawable(this);
}
@Override @Override
public int getChangingConfigurations() { public int getChangingConfigurations() {
return mChangingConfigurations; return mChangingConfigurations;

View File

@@ -49,7 +49,7 @@ public class InsetDrawable extends Drawable implements Drawable.Callback
private boolean mMutated; private boolean mMutated;
/*package*/ InsetDrawable() { /*package*/ InsetDrawable() {
this(null); this(null, null);
} }
public InsetDrawable(Drawable drawable, int inset) { public InsetDrawable(Drawable drawable, int inset) {
@@ -58,7 +58,7 @@ public class InsetDrawable extends Drawable implements Drawable.Callback
public InsetDrawable(Drawable drawable, int insetLeft, int insetTop, public InsetDrawable(Drawable drawable, int insetLeft, int insetTop,
int insetRight, int insetBottom) { int insetRight, int insetBottom) {
this(null); this(null, null);
mInsetState.mDrawable = drawable; mInsetState.mDrawable = drawable;
mInsetState.mInsetLeft = insetLeft; mInsetState.mInsetLeft = insetLeft;
@@ -263,9 +263,13 @@ public class InsetDrawable extends Drawable implements Drawable.Callback
boolean mCheckedConstantState; boolean mCheckedConstantState;
boolean mCanConstantState; boolean mCanConstantState;
InsetState(InsetState orig, InsetDrawable owner) { InsetState(InsetState orig, InsetDrawable owner, Resources res) {
if (orig != null) { if (orig != null) {
mDrawable = orig.mDrawable.getConstantState().newDrawable(); if (res != null) {
mDrawable = orig.mDrawable.getConstantState().newDrawable(res);
} else {
mDrawable = orig.mDrawable.getConstantState().newDrawable();
}
mDrawable.setCallback(owner); mDrawable.setCallback(owner);
mInsetLeft = orig.mInsetLeft; mInsetLeft = orig.mInsetLeft;
mInsetTop = orig.mInsetTop; mInsetTop = orig.mInsetTop;
@@ -277,7 +281,12 @@ public class InsetDrawable extends Drawable implements Drawable.Callback
@Override @Override
public Drawable newDrawable() { public Drawable newDrawable() {
return new InsetDrawable(this); return new InsetDrawable(this, null);
}
@Override
public Drawable newDrawable(Resources res) {
return new InsetDrawable(this, res);
} }
@Override @Override
@@ -295,8 +304,8 @@ public class InsetDrawable extends Drawable implements Drawable.Callback
} }
} }
private InsetDrawable(InsetState state) { private InsetDrawable(InsetState state, Resources res) {
mInsetState = new InsetState(state, this); mInsetState = new InsetState(state, this, res);
} }
} }

View File

@@ -70,7 +70,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
* @param state The constant drawable state. * @param state The constant drawable state.
*/ */
LayerDrawable(Drawable[] layers, LayerState state) { LayerDrawable(Drawable[] layers, LayerState state) {
this(state); this(state, null);
int length = layers.length; int length = layers.length;
ChildDrawable[] r = new ChildDrawable[length]; ChildDrawable[] r = new ChildDrawable[length];
@@ -87,19 +87,19 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
} }
LayerDrawable() { LayerDrawable() {
this((LayerState) null); this((LayerState) null, null);
} }
LayerDrawable(LayerState state) { LayerDrawable(LayerState state, Resources res) {
LayerState as = createConstantState(state); LayerState as = createConstantState(state, res);
mLayerState = as; mLayerState = as;
if (as.mNum > 0) { if (as.mNum > 0) {
ensurePadding(); ensurePadding();
} }
} }
LayerState createConstantState(LayerState state) { LayerState createConstantState(LayerState state, Resources res) {
return new LayerState(state, this); return new LayerState(state, this, res);
} }
@Override @Override
@@ -563,7 +563,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
private boolean mCheckedConstantState; private boolean mCheckedConstantState;
private boolean mCanConstantState; private boolean mCanConstantState;
LayerState(LayerState orig, LayerDrawable owner) { LayerState(LayerState orig, LayerDrawable owner, Resources res) {
if (orig != null) { if (orig != null) {
final ChildDrawable[] origChildDrawable = orig.mChildren; final ChildDrawable[] origChildDrawable = orig.mChildren;
final int N = orig.mNum; final int N = orig.mNum;
@@ -577,7 +577,11 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
for (int i = 0; i < N; i++) { for (int i = 0; i < N; i++) {
final ChildDrawable r = mChildren[i] = new ChildDrawable(); final ChildDrawable r = mChildren[i] = new ChildDrawable();
final ChildDrawable or = origChildDrawable[i]; final ChildDrawable or = origChildDrawable[i];
r.mDrawable = or.mDrawable.getConstantState().newDrawable(); if (res != null) {
r.mDrawable = or.mDrawable.getConstantState().newDrawable(res);
} else {
r.mDrawable = or.mDrawable.getConstantState().newDrawable();
}
r.mDrawable.setCallback(owner); r.mDrawable.setCallback(owner);
r.mInsetL = or.mInsetL; r.mInsetL = or.mInsetL;
r.mInsetT = or.mInsetT; r.mInsetT = or.mInsetT;
@@ -599,7 +603,12 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
@Override @Override
public Drawable newDrawable() { public Drawable newDrawable() {
return new LayerDrawable(this); return new LayerDrawable(this, null);
}
@Override
public Drawable newDrawable(Resources res) {
return new LayerDrawable(this, res);
} }
@Override @Override

View File

@@ -57,7 +57,7 @@ public class LevelListDrawable extends DrawableContainer {
private boolean mMutated; private boolean mMutated;
public LevelListDrawable() { public LevelListDrawable() {
this(null); this(null, null);
} }
public void addLevel(int low, int high, Drawable drawable) { public void addLevel(int low, int high, Drawable drawable) {
@@ -154,8 +154,8 @@ public class LevelListDrawable extends DrawableContainer {
private int[] mLows; private int[] mLows;
private int[] mHighs; private int[] mHighs;
LevelListState(LevelListState orig, LevelListDrawable owner) { LevelListState(LevelListState orig, LevelListDrawable owner, Resources res) {
super(orig, owner); super(orig, owner, res);
if (orig != null) { if (orig != null) {
mLows = orig.mLows; mLows = orig.mLows;
@@ -186,7 +186,12 @@ public class LevelListDrawable extends DrawableContainer {
@Override @Override
public Drawable newDrawable() { public Drawable newDrawable() {
return new LevelListDrawable(this); return new LevelListDrawable(this, null);
}
@Override
public Drawable newDrawable(Resources res) {
return new LevelListDrawable(this, res);
} }
@Override @Override
@@ -201,8 +206,8 @@ public class LevelListDrawable extends DrawableContainer {
} }
} }
private LevelListDrawable(LevelListState state) { private LevelListDrawable(LevelListState state, Resources res) {
LevelListState as = new LevelListState(state, this); LevelListState as = new LevelListState(state, this, res);
mLevelListState = as; mLevelListState = as;
setConstantState(as); setConstantState(as);
onLevelChange(getLevel()); onLevelChange(getLevel());

View File

@@ -61,7 +61,7 @@ public class NinePatchDrawable extends Drawable {
*/ */
@Deprecated @Deprecated
public NinePatchDrawable(Bitmap bitmap, byte[] chunk, Rect padding, String srcName) { public NinePatchDrawable(Bitmap bitmap, byte[] chunk, Rect padding, String srcName) {
this(new NinePatchState(new NinePatch(bitmap, chunk, srcName), padding)); this(new NinePatchState(new NinePatch(bitmap, chunk, srcName), padding), null);
} }
/** /**
@@ -70,11 +70,8 @@ public class NinePatchDrawable extends Drawable {
*/ */
public NinePatchDrawable(Resources res, Bitmap bitmap, byte[] chunk, public NinePatchDrawable(Resources res, Bitmap bitmap, byte[] chunk,
Rect padding, String srcName) { Rect padding, String srcName) {
this(new NinePatchState(new NinePatch(bitmap, chunk, srcName), padding)); this(new NinePatchState(new NinePatch(bitmap, chunk, srcName), padding), res);
if (res != null) { mNinePatchState.mTargetDensity = mTargetDensity;
setTargetDensity(res.getDisplayMetrics());
mNinePatchState.mTargetDensity = mTargetDensity;
}
} }
/** /**
@@ -84,7 +81,7 @@ public class NinePatchDrawable extends Drawable {
*/ */
@Deprecated @Deprecated
public NinePatchDrawable(NinePatch patch) { public NinePatchDrawable(NinePatch patch) {
this(new NinePatchState(patch, null)); this(new NinePatchState(patch, null), null);
} }
/** /**
@@ -92,18 +89,16 @@ public class NinePatchDrawable extends Drawable {
* based on the display metrics of the resources. * based on the display metrics of the resources.
*/ */
public NinePatchDrawable(Resources res, NinePatch patch) { public NinePatchDrawable(Resources res, NinePatch patch) {
this(new NinePatchState(patch, null)); this(new NinePatchState(patch, null), res);
if (res != null) { mNinePatchState.mTargetDensity = mTargetDensity;
setTargetDensity(res.getDisplayMetrics());
mNinePatchState.mTargetDensity = mTargetDensity;
}
} }
private void setNinePatchState(NinePatchState state) { private void setNinePatchState(NinePatchState state, Resources res) {
mNinePatchState = state; mNinePatchState = state;
mNinePatch = state.mNinePatch; mNinePatch = state.mNinePatch;
mPadding = state.mPadding; mPadding = state.mPadding;
mTargetDensity = state.mTargetDensity; mTargetDensity = res != null ? res.getDisplayMetrics().densityDpi
: state.mTargetDensity;
if (DEFAULT_DITHER != state.mDither) { if (DEFAULT_DITHER != state.mDither) {
// avoid calling the setter unless we need to, since it does a // avoid calling the setter unless we need to, since it does a
// lazy allocation of a paint // lazy allocation of a paint
@@ -258,7 +253,8 @@ public class NinePatchDrawable extends Drawable {
} }
setNinePatchState(new NinePatchState( setNinePatchState(new NinePatchState(
new NinePatch(bitmap, bitmap.getNinePatchChunk(), "XML 9-patch"), padding, dither)); new NinePatch(bitmap, bitmap.getNinePatchChunk(), "XML 9-patch"),
padding, dither), r);
mNinePatchState.mTargetDensity = mTargetDensity; mNinePatchState.mTargetDensity = mTargetDensity;
a.recycle(); a.recycle();
@@ -357,7 +353,12 @@ public class NinePatchDrawable extends Drawable {
@Override @Override
public Drawable newDrawable() { public Drawable newDrawable() {
return new NinePatchDrawable(this); return new NinePatchDrawable(this, null);
}
@Override
public Drawable newDrawable(Resources res) {
return new NinePatchDrawable(this, res);
} }
@Override @Override
@@ -366,8 +367,7 @@ public class NinePatchDrawable extends Drawable {
} }
} }
private NinePatchDrawable(NinePatchState state) { private NinePatchDrawable(NinePatchState state, Resources res) {
setNinePatchState(state); setNinePatchState(state, res);
} }
} }

View File

@@ -54,7 +54,7 @@ public class RotateDrawable extends Drawable implements Drawable.Callback {
* <p>Create a new rotating drawable with an empty state.</p> * <p>Create a new rotating drawable with an empty state.</p>
*/ */
public RotateDrawable() { public RotateDrawable() {
this(null); this(null, null);
} }
/** /**
@@ -64,8 +64,8 @@ public class RotateDrawable extends Drawable implements Drawable.Callback {
* *
* @param rotateState the state for this drawable * @param rotateState the state for this drawable
*/ */
private RotateDrawable(RotateState rotateState) { private RotateDrawable(RotateState rotateState, Resources res) {
mState = new RotateState(rotateState, this); mState = new RotateState(rotateState, this, res);
} }
public void draw(Canvas canvas) { public void draw(Canvas canvas) {
@@ -291,9 +291,13 @@ public class RotateDrawable extends Drawable implements Drawable.Callback {
private boolean mCanConstantState; private boolean mCanConstantState;
private boolean mCheckedConstantState; private boolean mCheckedConstantState;
public RotateState(RotateState source, RotateDrawable owner) { public RotateState(RotateState source, RotateDrawable owner, Resources res) {
if (source != null) { if (source != null) {
mDrawable = source.mDrawable.getConstantState().newDrawable(); if (res != null) {
mDrawable = source.mDrawable.getConstantState().newDrawable(res);
} else {
mDrawable = source.mDrawable.getConstantState().newDrawable();
}
mDrawable.setCallback(owner); mDrawable.setCallback(owner);
mPivotXRel = source.mPivotXRel; mPivotXRel = source.mPivotXRel;
mPivotX = source.mPivotX; mPivotX = source.mPivotX;
@@ -307,7 +311,12 @@ public class RotateDrawable extends Drawable implements Drawable.Callback {
@Override @Override
public Drawable newDrawable() { public Drawable newDrawable() {
return new RotateDrawable(this); return new RotateDrawable(this, null);
}
@Override
public Drawable newDrawable(Resources res) {
return new RotateDrawable(this, res);
} }
@Override @Override

View File

@@ -47,11 +47,11 @@ public class ScaleDrawable extends Drawable implements Drawable.Callback {
private final Rect mTmpRect = new Rect(); private final Rect mTmpRect = new Rect();
ScaleDrawable() { ScaleDrawable() {
this(null); this(null, null);
} }
public ScaleDrawable(Drawable drawable, int gravity, float scaleWidth, float scaleHeight) { public ScaleDrawable(Drawable drawable, int gravity, float scaleWidth, float scaleHeight) {
this(null); this(null, null);
mScaleState.mDrawable = drawable; mScaleState.mDrawable = drawable;
mScaleState.mGravity = gravity; mScaleState.mGravity = gravity;
@@ -260,9 +260,13 @@ public class ScaleDrawable extends Drawable implements Drawable.Callback {
private boolean mCheckedConstantState; private boolean mCheckedConstantState;
private boolean mCanConstantState; private boolean mCanConstantState;
ScaleState(ScaleState orig, ScaleDrawable owner) { ScaleState(ScaleState orig, ScaleDrawable owner, Resources res) {
if (orig != null) { if (orig != null) {
mDrawable = orig.mDrawable.getConstantState().newDrawable(); if (res != null) {
mDrawable = orig.mDrawable.getConstantState().newDrawable(res);
} else {
mDrawable = orig.mDrawable.getConstantState().newDrawable();
}
mDrawable.setCallback(owner); mDrawable.setCallback(owner);
mScaleWidth = orig.mScaleWidth; mScaleWidth = orig.mScaleWidth;
mScaleHeight = orig.mScaleHeight; mScaleHeight = orig.mScaleHeight;
@@ -273,7 +277,12 @@ public class ScaleDrawable extends Drawable implements Drawable.Callback {
@Override @Override
public Drawable newDrawable() { public Drawable newDrawable() {
return new ScaleDrawable(this); return new ScaleDrawable(this, null);
}
@Override
public Drawable newDrawable(Resources res) {
return new ScaleDrawable(this, res);
} }
@Override @Override
@@ -291,8 +300,8 @@ public class ScaleDrawable extends Drawable implements Drawable.Callback {
} }
} }
private ScaleDrawable(ScaleState state) { private ScaleDrawable(ScaleState state, Resources res) {
mScaleState = new ScaleState(state, this); mScaleState = new ScaleState(state, this, res);
} }
} }

View File

@@ -395,6 +395,11 @@ public class ShapeDrawable extends Drawable {
return new ShapeDrawable(this); return new ShapeDrawable(this);
} }
@Override
public Drawable newDrawable(Resources res) {
return new ShapeDrawable(this);
}
@Override @Override
public int getChangingConfigurations() { public int getChangingConfigurations() {
return mChangingConfigurations; return mChangingConfigurations;

View File

@@ -65,7 +65,7 @@ public class StateListDrawable extends DrawableContainer {
private boolean mMutated; private boolean mMutated;
public StateListDrawable() { public StateListDrawable() {
this(null); this(null, null);
} }
/** /**
@@ -248,8 +248,8 @@ public class StateListDrawable extends DrawableContainer {
static final class StateListState extends DrawableContainerState { static final class StateListState extends DrawableContainerState {
private int[][] mStateSets; private int[][] mStateSets;
StateListState(StateListState orig, StateListDrawable owner) { StateListState(StateListState orig, StateListDrawable owner, Resources res) {
super(orig, owner); super(orig, owner, res);
if (orig != null) { if (orig != null) {
mStateSets = orig.mStateSets; mStateSets = orig.mStateSets;
@@ -277,7 +277,12 @@ public class StateListDrawable extends DrawableContainer {
@Override @Override
public Drawable newDrawable() { public Drawable newDrawable() {
return new StateListDrawable(this); return new StateListDrawable(this, null);
}
@Override
public Drawable newDrawable(Resources res) {
return new StateListDrawable(this, res);
} }
@Override @Override
@@ -289,8 +294,8 @@ public class StateListDrawable extends DrawableContainer {
} }
} }
private StateListDrawable(StateListState state) { private StateListDrawable(StateListState state, Resources res) {
StateListState as = new StateListState(state, this); StateListState as = new StateListState(state, this, res);
mStateListState = as; mStateListState = as;
setConstantState(as); setConstantState(as);
onStateChange(getState()); onStateChange(getState());

View File

@@ -16,6 +16,7 @@
package android.graphics.drawable; package android.graphics.drawable;
import android.content.res.Resources;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.os.SystemClock; import android.os.SystemClock;
@@ -72,7 +73,7 @@ public class TransitionDrawable extends LayerDrawable implements Drawable.Callba
* 2 layers are required for this drawable to work properly. * 2 layers are required for this drawable to work properly.
*/ */
public TransitionDrawable(Drawable[] layers) { public TransitionDrawable(Drawable[] layers) {
this(new TransitionState(null, null), layers); this(new TransitionState(null, null, null), layers);
} }
/** /**
@@ -82,11 +83,11 @@ public class TransitionDrawable extends LayerDrawable implements Drawable.Callba
* @see #TransitionDrawable(Drawable[]) * @see #TransitionDrawable(Drawable[])
*/ */
TransitionDrawable() { TransitionDrawable() {
this(new TransitionState(null, null)); this(new TransitionState(null, null, null), (Resources)null);
} }
private TransitionDrawable(TransitionState state) { private TransitionDrawable(TransitionState state, Resources res) {
super(state); super(state, res);
} }
private TransitionDrawable(TransitionState state, Drawable[] layers) { private TransitionDrawable(TransitionState state, Drawable[] layers) {
@@ -94,8 +95,8 @@ public class TransitionDrawable extends LayerDrawable implements Drawable.Callba
} }
@Override @Override
LayerState createConstantState(LayerState state) { LayerState createConstantState(LayerState state, Resources res) {
return new TransitionState((TransitionState) state, this); return new TransitionState((TransitionState) state, this, res);
} }
/** /**
@@ -229,13 +230,19 @@ public class TransitionDrawable extends LayerDrawable implements Drawable.Callba
} }
static class TransitionState extends LayerState { static class TransitionState extends LayerState {
TransitionState(TransitionState orig, TransitionDrawable owner) { TransitionState(TransitionState orig, TransitionDrawable owner,
super(orig, owner); Resources res) {
super(orig, owner, res);
} }
@Override @Override
public Drawable newDrawable() { public Drawable newDrawable() {
return new TransitionDrawable(this); return new TransitionDrawable(this, (Resources)null);
}
@Override
public Drawable newDrawable(Resources res) {
return new TransitionDrawable(this, res);
} }
@Override @Override