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

Commit 12b97f5d authored by Alan Viverette's avatar Alan Viverette
Browse files

Change colorFilterColor to tint, allow use of ColorStateList

BUG: 13149901
Change-Id: I6487bec372cb74db53d7bbdfa35de071764763b0
parent cc3f3385
Loading
Loading
Loading
Loading
+15 −13
Original line number Diff line number Diff line
@@ -345,7 +345,7 @@ package android {
    field public static final int canRetrieveWindowContent = 16843653; // 0x1010385
    field public static final int candidatesTextStyleSpans = 16843312; // 0x1010230
    field public static final deprecated int capitalize = 16843113; // 0x1010169
    field public static final int castsShadow = 16843778; // 0x1010402
    field public static final int castsShadow = 16843777; // 0x1010401
    field public static final int category = 16843752; // 0x10103e8
    field public static final int centerBright = 16842956; // 0x10100cc
    field public static final int centerColor = 16843275; // 0x101020b
@@ -379,8 +379,6 @@ package android {
    field public static final int colorActivatedHighlight = 16843664; // 0x1010390
    field public static final int colorBackground = 16842801; // 0x1010031
    field public static final int colorBackgroundCacheHint = 16843435; // 0x10102ab
    field public static final int colorFilterColor = 16843767; // 0x10103f7
    field public static final int colorFilterMode = 16843768; // 0x10103f8
    field public static final int colorFocusedHighlight = 16843663; // 0x101038f
    field public static final int colorForeground = 16842800; // 0x1010030
    field public static final int colorForegroundInverse = 16843270; // 0x1010206
@@ -401,10 +399,10 @@ package android {
    field public static final int content = 16843355; // 0x101025b
    field public static final int contentAuthority = 16843408; // 0x1010290
    field public static final int contentDescription = 16843379; // 0x1010273
    field public static final int controlX1 = 16843770; // 0x10103fa
    field public static final int controlX2 = 16843772; // 0x10103fc
    field public static final int controlY1 = 16843771; // 0x10103fb
    field public static final int controlY2 = 16843773; // 0x10103fd
    field public static final int controlX1 = 16843769; // 0x10103f9
    field public static final int controlX2 = 16843771; // 0x10103fb
    field public static final int controlY1 = 16843770; // 0x10103fa
    field public static final int controlY2 = 16843772; // 0x10103fc
    field public static final int cropToPadding = 16843043; // 0x1010123
    field public static final int cursorVisible = 16843090; // 0x1010152
    field public static final int customNavigationLayout = 16843474; // 0x10102d2
@@ -544,7 +542,7 @@ package android {
    field public static final int fromAlpha = 16843210; // 0x10101ca
    field public static final int fromDegrees = 16843187; // 0x10101b3
    field public static final int fromScene = 16843741; // 0x10103dd
    field public static final int fromSceneName = 16843774; // 0x10103fe
    field public static final int fromSceneName = 16843773; // 0x10103fd
    field public static final int fromXDelta = 16843206; // 0x10101c6
    field public static final int fromXScale = 16843202; // 0x10101c2
    field public static final int fromYDelta = 16843208; // 0x10101c8
@@ -639,7 +637,7 @@ package android {
    field public static final int isScrollContainer = 16843342; // 0x101024e
    field public static final int isSticky = 16843335; // 0x1010247
    field public static final int isolatedProcess = 16843689; // 0x10103a9
    field public static final int isolatedZVolume = 16843769; // 0x10103f9
    field public static final int isolatedZVolume = 16843768; // 0x10103f8
    field public static final int itemBackground = 16843056; // 0x1010130
    field public static final int itemIconDisabledAlpha = 16843057; // 0x1010131
    field public static final int itemPadding = 16843565; // 0x101032d
@@ -962,7 +960,7 @@ package android {
    field public static final int shadowRadius = 16843108; // 0x1010164
    field public static final int shape = 16843162; // 0x101019a
    field public static final int shareInterpolator = 16843195; // 0x10101bb
    field public static final int sharedElementName = 16843776; // 0x1010400
    field public static final int sharedElementName = 16843775; // 0x10103ff
    field public static final int sharedUserId = 16842763; // 0x101000b
    field public static final int sharedUserLabel = 16843361; // 0x1010261
    field public static final int shouldDisableView = 16843246; // 0x10101ee
@@ -1139,13 +1137,14 @@ package android {
    field public static final int tileMode = 16843265; // 0x1010201
    field public static final int timeZone = 16843724; // 0x10103cc
    field public static final int tint = 16843041; // 0x1010121
    field public static final int tintMode = 16843767; // 0x10103f7
    field public static final int title = 16843233; // 0x10101e1
    field public static final int titleCondensed = 16843234; // 0x10101e2
    field public static final int titleTextStyle = 16843512; // 0x10102f8
    field public static final int toAlpha = 16843211; // 0x10101cb
    field public static final int toDegrees = 16843188; // 0x10101b4
    field public static final int toScene = 16843742; // 0x10103de
    field public static final int toSceneName = 16843775; // 0x10103ff
    field public static final int toSceneName = 16843774; // 0x10103fe
    field public static final int toXDelta = 16843207; // 0x10101c7
    field public static final int toXScale = 16843203; // 0x10101c3
    field public static final int toYDelta = 16843209; // 0x10101c9
@@ -1161,7 +1160,7 @@ package android {
    field public static final int transformPivotX = 16843552; // 0x1010320
    field public static final int transformPivotY = 16843553; // 0x1010321
    field public static final int transition = 16843743; // 0x10103df
    field public static final int transitionGroup = 16843777; // 0x1010401
    field public static final int transitionGroup = 16843776; // 0x1010400
    field public static final int transitionOrdering = 16843744; // 0x10103e0
    field public static final int translationX = 16843554; // 0x1010322
    field public static final int translationY = 16843555; // 0x1010323
@@ -10410,6 +10409,8 @@ package android.graphics.drawable {
    method public void setTileModeX(android.graphics.Shader.TileMode);
    method public void setTileModeXY(android.graphics.Shader.TileMode, android.graphics.Shader.TileMode);
    method public final void setTileModeY(android.graphics.Shader.TileMode);
    method public void setTint(android.content.res.ColorStateList);
    method public void setTintMode(android.graphics.PorterDuff.Mode);
  }
  public class ClipDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
@@ -10551,7 +10552,6 @@ package android.graphics.drawable {
    method public float getGradientRadius();
    method public int getOpacity();
    method public android.graphics.drawable.GradientDrawable.Orientation getOrientation();
    method public boolean onStateChange(int[]);
    method public void setAlpha(int);
    method public void setColor(int);
    method public void setColor(android.content.res.ColorStateList);
@@ -10646,6 +10646,8 @@ package android.graphics.drawable {
    method public void setTargetDensity(android.graphics.Canvas);
    method public void setTargetDensity(android.util.DisplayMetrics);
    method public void setTargetDensity(int);
    method public void setTint(android.content.res.ColorStateList);
    method public void setTintMode(android.graphics.PorterDuff.Mode);
  }
  public class PaintDrawable extends android.graphics.drawable.ShapeDrawable {
+21 −17
Original line number Diff line number Diff line
@@ -4094,19 +4094,6 @@
             RTL (right-to-left).  See
             {@link android.graphics.drawable.Drawable#setAutoMirrored}. -->
        <attr name="autoMirrored" format="boolean" />
        <!-- If set, specifies the color to apply to the drawable as a color filter. By
             default, no color filter is applied. -->
        <attr name="colorFilterColor" format="color" />
        <!-- When a color filter color is set, specifies its Porter-Duff blending mode.
             The default value is multiply. -->
        <attr name="colorFilterMode">
            <!-- [Sa * Da, Sc * Dc] -->
            <enum name="multiply" value="14" />
            <!-- [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc] -->
            <enum name="screen" value="15" />
            <!-- [Da, Sc * Da + (1 - Sa) * Dc] -->
            <enum name="src_atop" value="9" />
        </attr>
    </declare-styleable>

    <!-- Drawable used to render several states. Each state is represented by
@@ -4391,8 +4378,21 @@
        <!-- Indicates if the drawable needs to be mirrored when its layout direction is
             RTL (right-to-left). -->
        <attr name="autoMirrored" />
        <attr name="colorFilterColor" />
        <attr name="colorFilterMode" />
        <!-- If set, specifies the color to apply to the drawable as a tint. By default,
             no tint is applied. May be a color state list. -->
        <attr name="tint" />
        <!-- When a tint color is set, specifies its Porter-Duff blending mode. The
             default value is src_in, which treats the drawable as an alpha mask. -->
        <attr name="tintMode">
            <!-- [Sa * Da, Sc * Da] -->
            <enum name="src_in" value="0" />
            <!-- [Da, Sc * Da + (1 - Sa) * Dc] -->
            <enum name="src_atop" value="1" />
            <!-- [Sa * Da, Sc * Dc] -->
            <enum name="multiply" value="2" />
            <!-- [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc] -->
            <enum name="screen" value="3" />
        </attr>
    </declare-styleable>

    <!-- Drawable used to draw 9-patches. -->
@@ -4406,8 +4406,12 @@
        <!-- Indicates if the drawable needs to be mirrored when its layout direction is
             RTL (right-to-left). -->
        <attr name="autoMirrored" />
        <attr name="colorFilterColor" />
        <attr name="colorFilterMode" />
        <!-- If set, specifies the color to apply to the drawable as a tint. By default,
             no tint is applied. May be a color state list. -->
        <attr name="tint" />
        <!-- When a tint color is set, specifies its Porter-Duff blending mode. The
             default value is src_in, which treats the drawable as an alpha mask. -->
        <attr name="tintMode" />
    </declare-styleable>

    <!-- Drawable used to draw a single color. -->
+1 −2
Original line number Diff line number Diff line
@@ -2097,8 +2097,7 @@
  <public type="attr" name="windowContentTransitions" />
  <public type="attr" name="windowContentTransitionManager" />
  <public type="attr" name="translationZ" />
  <public type="attr" name="colorFilterColor" />
  <public type="attr" name="colorFilterMode" />
  <public type="attr" name="tintMode" />
  <public type="attr" name="isolatedZVolume" />
  <public type="attr" name="controlX1" />
  <public type="attr" name="controlY1" />
+177 −85
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.graphics.drawable;

import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
@@ -28,6 +29,8 @@ import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.GradientDrawable.GradientState;
import android.graphics.Rect;
import android.graphics.Shader;
import android.graphics.Xfermode;
@@ -68,6 +71,7 @@ public class BitmapDrawable extends Drawable {
            Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG;
    private BitmapState mBitmapState;
    private Bitmap mBitmap;
    private PorterDuffColorFilter mTintFilter;
    private int mTargetDensity;

    private final Rect mDstRect = new Rect();   // Gravity.apply() sets this
@@ -457,25 +461,37 @@ public class BitmapDrawable extends Drawable {

    @Override
    public void draw(Canvas canvas) {
        Bitmap bitmap = mBitmap;
        if (bitmap != null) {
        final Bitmap bitmap = mBitmap;
        if (bitmap == null) {
            return;
        }

        final BitmapState state = mBitmapState;
        final Paint paint = state.mPaint;
        if (state.mRebuildShader) {
                Shader.TileMode tmx = state.mTileModeX;
                Shader.TileMode tmy = state.mTileModeY;

            final Shader.TileMode tmx = state.mTileModeX;
            final Shader.TileMode tmy = state.mTileModeY;
            if (tmx == null && tmy == null) {
                    state.mPaint.setShader(null);
                paint.setShader(null);
            } else {
                    state.mPaint.setShader(new BitmapShader(bitmap,
                paint.setShader(new BitmapShader(bitmap,
                        tmx == null ? Shader.TileMode.CLAMP : tmx,
                        tmy == null ? Shader.TileMode.CLAMP : tmy));
            }

            state.mRebuildShader = false;
            copyBounds(mDstRect);
        }

            Shader shader = state.mPaint.getShader();
        final boolean clearColorFilter;
        if (mTintFilter != null && paint.getColorFilter() == null) {
            paint.setColorFilter(mTintFilter);
            clearColorFilter = true;
        } else {
            clearColorFilter = false;
        }

        final Shader shader = paint.getShader();
        final boolean needMirroring = needMirroring();
        if (shader == null) {
            if (mApplyGravity) {
@@ -484,13 +500,16 @@ public class BitmapDrawable extends Drawable {
                        getBounds(), mDstRect, layoutDirection);
                mApplyGravity = false;
            }

            if (needMirroring) {
                canvas.save();
                // Mirror the bitmap
                canvas.translate(mDstRect.right - mDstRect.left, 0);
                canvas.scale(-1.0f, 1.0f);
            }
                canvas.drawBitmap(bitmap, null, mDstRect, state.mPaint);

            canvas.drawBitmap(bitmap, null, mDstRect, paint);

            if (needMirroring) {
                canvas.restore();
            }
@@ -499,6 +518,7 @@ public class BitmapDrawable extends Drawable {
                copyBounds(mDstRect);
                mApplyGravity = false;
            }

            if (needMirroring) {
                // Mirror the bitmap
                updateMirrorMatrix(mDstRect.right - mDstRect.left);
@@ -509,14 +529,18 @@ public class BitmapDrawable extends Drawable {
                    shader.setLocalMatrix(Matrix.IDENTITY_MATRIX);
                }
            }
                canvas.drawRect(mDstRect, state.mPaint);

            canvas.drawRect(mDstRect, paint);
        }

        if (clearColorFilter) {
            paint.setColorFilter(null);
        }
    }

    @Override
    public void setAlpha(int alpha) {
        int oldAlpha = mBitmapState.mPaint.getAlpha();
        final int oldAlpha = mBitmapState.mPaint.getAlpha();
        if (alpha != oldAlpha) {
            mBitmapState.mPaint.setAlpha(alpha);
            invalidateSelf();
@@ -534,6 +558,43 @@ public class BitmapDrawable extends Drawable {
        invalidateSelf();
    }

    /**
     * Specifies a tint for this drawable.
     * <p>
     * Setting a color filter via {@link #setColorFilter(ColorFilter)} overrides
     * tint.
     *
     * @param tint Color state list to use for tinting this drawable, or null to
     *            clear the tint
     */
    public void setTint(ColorStateList tint) {
        mBitmapState.mTint = tint;
        if (mTintFilter == null) {
            if (tint != null) {
                final int color = tint.getColorForState(getState(), 0);
                mTintFilter = new PorterDuffColorFilter(color, mBitmapState.mTintMode);
            }
        } else {
            if (tint == null) {
                mTintFilter = null;
            }
        }
        invalidateSelf();
    }

    /**
     * Specifies the blending mode used to apply tint.
     *
     * @param tintMode A Porter-Duff blending mode
     */
    public void setTintMode(Mode tintMode) {
        mBitmapState.mTintMode = tintMode;
        if (mTintFilter != null) {
            mTintFilter.setMode(tintMode);
        }
        invalidateSelf();
    }

    /**
     * @hide Candidate for future API inclusion
     */
@@ -557,12 +618,35 @@ public class BitmapDrawable extends Drawable {
        return this;
    }

    @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();
                return true;
            }
        }

        return false;
    }

    @Override
    public boolean isStateful() {
        final BitmapState s = mBitmapState;
        return super.isStateful() || (s.mTint != null && s.mTint.isStateful());
    }

    @Override
    public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs)
            throws XmlPullParserException, IOException {
        super.inflate(r, parser, attrs);

        TypedArray a = r.obtainAttributes(attrs, com.android.internal.R.styleable.BitmapDrawable);
        final BitmapState state = mBitmapState;
        final TypedArray a = r.obtainAttributes(attrs, com.android.internal.R.styleable.BitmapDrawable);

        final int id = a.getResourceId(com.android.internal.R.styleable.BitmapDrawable_src, 0);
        if (id == 0) {
@@ -574,7 +658,7 @@ public class BitmapDrawable extends Drawable {
            throw new XmlPullParserException(parser.getPositionDescription() +
                    ": <bitmap> requires a valid src attribute");
        }
        mBitmapState.mBitmap = bitmap;
        state.mBitmap = bitmap;
        setBitmap(bitmap);
        setTargetDensity(r.getDisplayMetrics());
        setMipMap(a.getBoolean(com.android.internal.R.styleable.BitmapDrawable_mipMap,
@@ -582,19 +666,16 @@ public class BitmapDrawable extends Drawable {
        setAutoMirrored(a.getBoolean(com.android.internal.R.styleable.BitmapDrawable_autoMirrored,
                false));

        if (a.hasValue(com.android.internal.R.styleable.BitmapDrawable_colorFilterColor)) {
            final int colorFilterColor = a.getColor(
                    com.android.internal.R.styleable.BitmapDrawable_colorFilterColor, 0);
            final int modeValue = a.getInt(
                    com.android.internal.R.styleable.BitmapDrawable_colorFilterMode,
                    Mode.MULTIPLY.ordinal());
            final Mode mode = Drawable.parseColorFilterMode(modeValue);
            if (mode != null) {
                setColorFilter(colorFilterColor, mode);
            }
        final int tintModeValue = a.getInt(
                com.android.internal.R.styleable.BitmapDrawable_tintMode, -1);
        state.mTintMode = Drawable.parseTintMode(tintModeValue, Mode.SRC_IN);
        state.mTint = a.getColorStateList(com.android.internal.R.styleable.BitmapDrawable_tint);
        if (state.mTint != null) {
            final int color = state.mTint.getColorForState(getState(), 0);
            mTintFilter = new PorterDuffColorFilter(color, mBitmapState.mTintMode);
        }

        final Paint paint = mBitmapState.mPaint;
        final Paint paint = state.mPaint;
        paint.setAntiAlias(a.getBoolean(com.android.internal.R.styleable.BitmapDrawable_antialias,
                paint.isAntiAlias()));
        paint.setFilterBitmap(a.getBoolean(com.android.internal.R.styleable.BitmapDrawable_filter,
@@ -648,6 +729,8 @@ public class BitmapDrawable extends Drawable {

    final static class BitmapState extends ConstantState {
        Bitmap mBitmap;
        ColorStateList mTint;
        Mode mTintMode;
        int mChangingConfigurations;
        int mGravity = Gravity.FILL;
        Paint mPaint = new Paint(DEFAULT_PAINT_FLAGS);
@@ -663,6 +746,8 @@ public class BitmapDrawable extends Drawable {

        BitmapState(BitmapState bitmapState) {
            mBitmap = bitmapState.mBitmap;
            mTint = bitmapState.mTint;
            mTintMode = bitmapState.mTintMode;
            mChangingConfigurations = bitmapState.mChangingConfigurations;
            mGravity = bitmapState.mGravity;
            mTileModeX = bitmapState.mTileModeX;
@@ -696,11 +781,18 @@ public class BitmapDrawable extends Drawable {

    private BitmapDrawable(BitmapState state, Resources res) {
        mBitmapState = state;

        if (res != null) {
            mTargetDensity = res.getDisplayMetrics().densityDpi;
        } else {
            mTargetDensity = state.mTargetDensity;
        }

        if (state.mTint != null) {
            final int color = state.mTint.getColorForState(getState(), 0);
            mTintFilter = new PorterDuffColorFilter(color, state.mTintMode);
        }

        setBitmap(state != null ? state.mBitmap : null);
    }
}
+14 −6
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.graphics.drawable;
import android.graphics.Insets;
import android.graphics.Xfermode;
import android.os.Trace;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

@@ -34,6 +35,7 @@ import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.graphics.Region;
import android.graphics.PorterDuff.Mode;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.StateSet;
@@ -1137,15 +1139,21 @@ public abstract class Drawable {
    }

    /**
     * Parses a {@link android.graphics.PorterDuff.Mode} from a colorFilterMode
     * Parses a {@link android.graphics.PorterDuff.Mode} from a tintMode
     * attribute's enum value.
     */
    static PorterDuff.Mode parseColorFilterMode(int value) {
        final PorterDuff.Mode[] modes = PorterDuff.Mode.values();
        if (value >= 0 && value < modes.length) {
            return modes[value];
        }
        return null;
    static PorterDuff.Mode parseTintMode(int value, Mode defaultMode) {
        switch (value) {
            case 0:
                return Mode.SRC_IN;
            case 1:
                return Mode.SRC_ATOP;
            case 2:
                return Mode.MULTIPLY;
            case 3:
                return Mode.SCREEN;
        }
        return defaultMode;
    }
}
Loading