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

Commit b3c56086 authored by Alan Viverette's avatar Alan Viverette
Browse files

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

Change-Id: I962089ca59684cef28cb4a648d4a91e542bdf5d4
parent c25c7279
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