Merge "Propagate DrawableContainer state on mutate, fix ColorDrawable theming" into lmp-mr1-dev

This commit is contained in:
Alan Viverette
2014-12-12 22:00:24 +00:00
committed by Android (Google) Code Review
2 changed files with 53 additions and 30 deletions

View File

@@ -251,6 +251,11 @@ public class ColorDrawable extends Drawable {
state.mUseColor = state.mBaseColor;
}
@Override
public boolean canApplyTheme() {
return mColorState.canApplyTheme() || super.canApplyTheme();
}
@Override
public void applyTheme(Theme t) {
super.applyTheme(t);

View File

@@ -447,36 +447,10 @@ public class DrawableContainer extends Drawable implements Drawable.Callback {
mCurrDrawable = d;
mCurIndex = idx;
if (d != null) {
d.mutate();
if (mDrawableContainerState.mEnterFadeDuration > 0) {
mEnterAnimationEnd = now + mDrawableContainerState.mEnterFadeDuration;
} else if (mHasAlpha) {
d.setAlpha(mAlpha);
}
if (mDrawableContainerState.mHasColorFilter) {
// Color filter always overrides tint.
d.setColorFilter(mDrawableContainerState.mColorFilter);
} else {
if (mDrawableContainerState.mHasTintList) {
d.setTintList(mDrawableContainerState.mTintList);
}
if (mDrawableContainerState.mHasTintMode) {
d.setTintMode(mDrawableContainerState.mTintMode);
}
}
d.setVisible(isVisible(), true);
d.setDither(mDrawableContainerState.mDither);
d.setState(getState());
d.setLevel(getLevel());
d.setBounds(getBounds());
d.setLayoutDirection(getLayoutDirection());
d.setAutoMirrored(mDrawableContainerState.mAutoMirrored);
final Rect hotspotBounds = mHotspotBounds;
if (hotspotBounds != null) {
d.setHotspotBounds(hotspotBounds.left, hotspotBounds.top,
hotspotBounds.right, hotspotBounds.bottom);
}
initializeDrawableForDisplay(d);
}
} else {
mCurrDrawable = null;
@@ -503,6 +477,45 @@ public class DrawableContainer extends Drawable implements Drawable.Callback {
return true;
}
/**
* Initializes a drawable for display in this container.
*
* @param d The drawable to initialize.
*/
private void initializeDrawableForDisplay(Drawable d) {
d.mutate();
if (mDrawableContainerState.mEnterFadeDuration <= 0 && mHasAlpha) {
d.setAlpha(mAlpha);
}
if (mDrawableContainerState.mHasColorFilter) {
// Color filter always overrides tint.
d.setColorFilter(mDrawableContainerState.mColorFilter);
} else {
if (mDrawableContainerState.mHasTintList) {
d.setTintList(mDrawableContainerState.mTintList);
}
if (mDrawableContainerState.mHasTintMode) {
d.setTintMode(mDrawableContainerState.mTintMode);
}
}
d.setVisible(isVisible(), true);
d.setDither(mDrawableContainerState.mDither);
d.setState(getState());
d.setLevel(getLevel());
d.setBounds(getBounds());
d.setLayoutDirection(getLayoutDirection());
d.setAutoMirrored(mDrawableContainerState.mAutoMirrored);
final Rect hotspotBounds = mHotspotBounds;
if (hotspotBounds != null) {
d.setHotspotBounds(hotspotBounds.left, hotspotBounds.top,
hotspotBounds.right, hotspotBounds.bottom);
}
}
void animate(boolean schedule) {
mHasAlpha = true;
@@ -1136,9 +1149,14 @@ public class DrawableContainer extends Drawable implements Drawable.Callback {
// The locally cached drawables may have changed.
if (mCurIndex >= 0) {
mCurrDrawable = state.getChild(mCurIndex);
if (mCurrDrawable != null) {
initializeDrawableForDisplay(mCurrDrawable);
}
}
if (mLastIndex >= 0) {
mLastDrawable = state.getChild(mLastIndex);
}
// Clear out the last drawable. We don't have enough information to
// propagate local state from the past.
mLastIndex = -1;
mLastDrawable = null;
}
}