Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b7946d37 authored by Alan Viverette's avatar Alan Viverette Committed by Android (Google) Code Review
Browse files

Merge "Add support for setTint in all Drawables, clean up lint warnings"

parents 9ab3dbf6 b3c56086
Loading
Loading
Loading
Loading
+38 −14
Original line number Diff line number Diff line
@@ -19,6 +19,8 @@ package android.graphics.drawable;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.ColorFilter;
import android.graphics.PorterDuff.Mode;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.content.res.Resources.Theme;
@@ -88,6 +90,7 @@ public class AnimatedRotateDrawable extends Drawable implements Drawable.Callbac
        canvas.restoreToCount(saveCount);
    }

    @Override
    public void start() {
        if (!mRunning) {
            mRunning = true;
@@ -95,11 +98,13 @@ public class AnimatedRotateDrawable extends Drawable implements Drawable.Callbac
        }
    }

    @Override
    public void stop() {
        mRunning = false;
        unscheduleSelf(this);
    }

    @Override
    public boolean isRunning() {
        return mRunning;
    }
@@ -109,6 +114,7 @@ public class AnimatedRotateDrawable extends Drawable implements Drawable.Callbac
        scheduleSelf(this, SystemClock.uptimeMillis() + mState.mFrameDuration);
    }

    @Override
    public void run() {
        // TODO: This should be computed in draw(Canvas), based on the amount
        // of time since the last frame drawn
@@ -164,11 +170,17 @@ public class AnimatedRotateDrawable extends Drawable implements Drawable.Callbac
        mState.mDrawable.setColorFilter(cf);
    }

    @Override
    public void setTint(ColorStateList tint, Mode tintMode) {
        mState.mDrawable.setTint(tint, tintMode);
    }

    @Override
    public int getOpacity() {
        return mState.mDrawable.getOpacity();
    }

    @Override
    public void invalidateDrawable(Drawable who) {
        final Callback callback = getCallback();
        if (callback != null) {
@@ -176,6 +188,7 @@ public class AnimatedRotateDrawable extends Drawable implements Drawable.Callbac
        }
    }

    @Override
    public void scheduleDrawable(Drawable who, Runnable what, long when) {
        final Callback callback = getCallback();
        if (callback != null) {
@@ -183,6 +196,7 @@ public class AnimatedRotateDrawable extends Drawable implements Drawable.Callbac
        }
    }

    @Override
    public void unscheduleDrawable(Drawable who, Runnable what) {
        final Callback callback = getCallback();
        if (callback != null) {
@@ -205,6 +219,16 @@ public class AnimatedRotateDrawable extends Drawable implements Drawable.Callbac
        mState.mDrawable.setBounds(bounds.left, bounds.top, bounds.right, bounds.bottom);
    }

    @Override
    protected boolean onLevelChange(int level) {
        return mState.mDrawable.setLevel(level);
    }

    @Override
    protected boolean onStateChange(int[] state) {
        return mState.mDrawable.setState(state);
    }

    @Override
    public int getIntrinsicWidth() {
        return mState.mDrawable.getIntrinsicWidth();
+23 −20
Original line number Diff line number Diff line
@@ -28,7 +28,6 @@ import android.os.SystemClock;
import android.util.AttributeSet;

/**
 * 
 * An object used to create frame-by-frame animations, defined by a series of Drawable objects,
 * which can be used as a View object's background.
 * <p>
@@ -114,6 +113,7 @@ public class AnimationDrawable extends DrawableContainer implements Runnable, An
     * @see #isRunning()
     * @see #stop()
     */
    @Override
    public void start() {
        if (!isRunning()) {
            run();
@@ -127,6 +127,7 @@ public class AnimationDrawable extends DrawableContainer implements Runnable, An
     * @see #isRunning()
     * @see #start()
     */
    @Override
    public void stop() {
        if (isRunning()) {
            unscheduleSelf(this);
@@ -138,6 +139,7 @@ public class AnimationDrawable extends DrawableContainer implements Runnable, An
     *
     * @return true if the animation is running, false otherwise
     */
    @Override
    public boolean isRunning() {
        return mAnimating;
    }
@@ -148,6 +150,7 @@ public class AnimationDrawable extends DrawableContainer implements Runnable, An
     *
     * @see #start()
     */
    @Override
    public void run() {
        nextFrame(false);
    }
+11 −29
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.PorterDuff.Mode;
import android.graphics.drawable.ColorDrawable.ColorState;
import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.graphics.Shader;
@@ -618,9 +619,11 @@ public class BitmapDrawable extends Drawable {

    @Override
    public void setTint(ColorStateList tint, PorterDuff.Mode tintMode) {
        mBitmapState.mTint = tint;
        mBitmapState.mTintMode = tintMode;
        computeTintFilter();
        final BitmapState state = mBitmapState;
        state.mTint = tint;
        state.mTintMode = tintMode;

        mTintFilter = updateTintFilter(mTintFilter, tint, tintMode);
        invalidateSelf();
    }

@@ -638,21 +641,6 @@ public class BitmapDrawable extends Drawable {
        return mBitmapState.mTintMode;
    }

    private void computeTintFilter() {
        final BitmapState state = mBitmapState;
        if (state.mTint != null && state.mTintMode != null) {
            final int color = state.mTint.getColorForState(getState(), 0);
            if (mTintFilter != null) {
                mTintFilter.setColor(color);
                mTintFilter.setMode(state.mTintMode);
            } else {
                mTintFilter = new PorterDuffColorFilter(color, state.mTintMode);
            }
        } else {
            mTintFilter = null;
        }
    }

    /**
     * @hide Candidate for future API inclusion
     */
@@ -679,17 +667,11 @@ public class BitmapDrawable extends Drawable {

    @Override
    protected boolean onStateChange(int[] stateSet) {
        final ColorStateList tint = mBitmapState.mTint;
        if (tint != null) {
            final int newColor = tint.getColorForState(stateSet, 0);
            final int oldColor = mTintFilter.getColor();
            if (oldColor != newColor) {
                mTintFilter.setColor(newColor);
                invalidateSelf();
        final BitmapState state = mBitmapState;
        if (state.mTint != null && state.mTintMode != null) {
            mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
            return true;
        }
        }

        return false;
    }

@@ -946,7 +928,7 @@ public class BitmapDrawable extends Drawable {
            mTargetDensity = state.mTargetDensity;
        }

        computeTintFilter();
        updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
        computeBitmapSize();
    }
}
+12 −2
Original line number Diff line number Diff line
@@ -19,10 +19,12 @@ package android.graphics.drawable;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.content.res.Resources.Theme;
import android.graphics.*;
import android.graphics.PorterDuff.Mode;
import android.view.Gravity;
import android.util.AttributeSet;

@@ -111,6 +113,7 @@ public class ClipDrawable extends Drawable implements Drawable.Callback {

    // overrides from Drawable.Callback

    @Override
    public void invalidateDrawable(Drawable who) {
        final Callback callback = getCallback();
        if (callback != null) {
@@ -118,6 +121,7 @@ public class ClipDrawable extends Drawable implements Drawable.Callback {
        }
    }

    @Override
    public void scheduleDrawable(Drawable who, Runnable what, long when) {
        final Callback callback = getCallback();
        if (callback != null) {
@@ -125,6 +129,7 @@ public class ClipDrawable extends Drawable implements Drawable.Callback {
        }
    }

    @Override
    public void unscheduleDrawable(Drawable who, Runnable what) {
        final Callback callback = getCallback();
        if (callback != null) {
@@ -168,6 +173,11 @@ public class ClipDrawable extends Drawable implements Drawable.Callback {
        mClipState.mDrawable.setColorFilter(cf);
    }

    @Override
    public void setTint(ColorStateList tint, Mode tintMode) {
        mClipState.mDrawable.setTint(tint, tintMode);
    }

    @Override
    public int getOpacity() {
        return mClipState.mDrawable.getOpacity();
+61 −9
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
package android.graphics.drawable;

import android.graphics.*;
import android.graphics.PorterDuff.Mode;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.Resources.Theme;
import android.content.res.TypedArray;
@@ -39,9 +41,13 @@ import java.io.IOException;
 * @attr ref android.R.styleable#ColorDrawable_color
 */
public class ColorDrawable extends Drawable {
    private final Paint mPaint = new Paint();

    @ViewDebug.ExportedProperty(deepExport = true, prefix = "state_")
    private ColorState mColorState;
    private final Paint mPaint = new Paint();
    private ColorStateList mTint;
    private PorterDuffColorFilter mTintFilter;

    private boolean mMutated;

    /**
@@ -84,9 +90,17 @@ public class ColorDrawable extends Drawable {

    @Override
    public void draw(Canvas canvas) {
        if ((mColorState.mUseColor >>> 24) != 0) {
        final ColorFilter colorFilter = mPaint.getColorFilter();
        if ((mColorState.mUseColor >>> 24) != 0 || colorFilter != null || mTintFilter != null) {
            if (colorFilter == null) {
                mPaint.setColorFilter(mTintFilter);
            }

            mPaint.setColor(mColorState.mUseColor);
            canvas.drawRect(getBounds(), mPaint);

            // Restore original color filter.
            mPaint.setColorFilter(colorFilter);
        }
    }

@@ -141,16 +155,51 @@ public class ColorDrawable extends Drawable {
    }

    /**
     * Setting a color filter on a ColorDrawable has no effect.
     * Sets the color filter applied to this color.
     * <p>
     * Only supported on version {@link android.os.Build.VERSION_CODES#L} and
     * above. Calling this method has no effect on earlier versions.
     *
     * @param colorFilter Ignore.
     * @see android.graphics.drawable.Drawable#setColorFilter(ColorFilter)
     */
    @Override
    public void setColorFilter(ColorFilter colorFilter) {
        mPaint.setColorFilter(colorFilter);
    }

    @Override
    public void setTint(ColorStateList tint, Mode tintMode) {
        final ColorState state = mColorState;
        if (state.mTint != tint || state.mTintMode != tintMode) {
            state.mTint = tint;
            state.mTintMode = tintMode;

            mTintFilter = updateTintFilter(mTintFilter, tint, tintMode);
            invalidateSelf();
        }
    }

    @Override
    protected boolean onStateChange(int[] stateSet) {
        final ColorState state = mColorState;
        if (state.mTint != null && state.mTintMode != null) {
            mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
            return true;
        }
        return false;
    }

    @Override
    public boolean isStateful() {
        return mTint != null && mTint.isStateful();
    }

    @Override
    public int getOpacity() {
        if (mTintFilter != null || mPaint.getColorFilter() != null) {
            return PixelFormat.TRANSLUCENT;
        }

        switch (mColorState.mUseColor >>> 24) {
            case 255:
                return PixelFormat.OPAQUE;
@@ -165,8 +214,7 @@ public class ColorDrawable extends Drawable {
            throws XmlPullParserException, IOException {
        super.inflate(r, parser, attrs, theme);

        final TypedArray a = obtainAttributes(
                r, theme, attrs, R.styleable.ColorDrawable);
        final TypedArray a = obtainAttributes(r, theme, attrs, R.styleable.ColorDrawable);
        inflateStateFromTypedArray(a);
        a.recycle();
    }
@@ -225,21 +273,25 @@ public class ColorDrawable extends Drawable {
    }

    final static class ColorState extends ConstantState {
        int[] mThemeAttrs;
        int mBaseColor; // base color, independent of setAlpha()
        @ViewDebug.ExportedProperty
        int mUseColor;  // basecolor modulated by setAlpha()
        int mChangingConfigurations;
        int[] mThemeAttrs;
        ColorStateList mTint;
        Mode mTintMode;

        ColorState() {
            // Empty constructor.
        }

        ColorState(ColorState state) {
            mThemeAttrs = state.mThemeAttrs;
            mBaseColor = state.mBaseColor;
            mUseColor = state.mUseColor;
            mChangingConfigurations = state.mChangingConfigurations;
            mThemeAttrs = state.mThemeAttrs;
            mTint = state.mTint;
            mTintMode = state.mTintMode;
        }

        @Override
@@ -276,6 +328,6 @@ public class ColorDrawable extends Drawable {
            mColorState = state;
        }

        // No local properties to initialize.
        mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
    }
}
Loading