19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.graphics.drawable;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
193f873d86441c30f5d45640a9f70b3b7331985c90Chris Craikimport android.annotation.NonNull;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.*;
21b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.PorterDuff.Mode;
22b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.content.res.ColorStateList;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
2452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viveretteimport android.content.res.Resources.Theme;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
27dfab363807b3b44be4032e410f016e0a0d018426Romain Guyimport android.view.ViewDebug;
2852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
2952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viveretteimport com.android.internal.R;
3052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParser;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
3795930e13faac8c17dabfaa1478089baa772f091bRomain Guy * A specialized Drawable that fills the Canvas with a specified color.
3895930e13faac8c17dabfaa1478089baa772f091bRomain Guy * Note that a ColorDrawable ignores the ColorFilter.
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>It can be defined in an XML file with the <code>&lt;color></code> element.</p>
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ColorDrawable_color
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ColorDrawable extends Drawable {
45b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    private final Paint mPaint = new Paint();
46b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
47dfab363807b3b44be4032e410f016e0a0d018426Romain Guy    @ViewDebug.ExportedProperty(deepExport = true, prefix = "state_")
4852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    private ColorState mColorState;
49b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    private PorterDuffColorFilter mTintFilter;
50b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
515f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy    private boolean mMutated;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates a new black ColorDrawable.
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ColorDrawable() {
5752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        mColorState = new ColorState();
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates a new ColorDrawable with the specified color.
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param color The color to draw.
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ColorDrawable(int color) {
6652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        mColorState = new ColorState();
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        setColor(color);
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getChangingConfigurations() {
7352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        return super.getChangingConfigurations() | mColorState.mChangingConfigurations;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
765f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy    /**
775f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy     * A mutable BitmapDrawable still shares its Bitmap with any other Drawable
785f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy     * that comes from the same resource.
795f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy     *
805f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy     * @return This drawable.
815f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy     */
825f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy    @Override
835f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy    public Drawable mutate() {
845f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy        if (!mMutated && super.mutate() == this) {
8552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            mColorState = new ColorState(mColorState);
865f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy            mMutated = true;
875f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy        }
885f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy        return this;
895f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy    }
905f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy
91727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette    /**
92727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     * @hide
93727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     */
94727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette    public void clearMutated() {
95727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette        super.clearMutated();
96727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette        mMutated = false;
97727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette    }
98727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void draw(Canvas canvas) {
101b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        final ColorFilter colorFilter = mPaint.getColorFilter();
102b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        if ((mColorState.mUseColor >>> 24) != 0 || colorFilter != null || mTintFilter != null) {
103b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette            if (colorFilter == null) {
104b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette                mPaint.setColorFilter(mTintFilter);
105b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette            }
106b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
10752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            mPaint.setColor(mColorState.mUseColor);
10895930e13faac8c17dabfaa1478089baa772f091bRomain Guy            canvas.drawRect(getBounds(), mPaint);
109b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
110b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette            // Restore original color filter.
111b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette            mPaint.setColorFilter(colorFilter);
11295930e13faac8c17dabfaa1478089baa772f091bRomain Guy        }
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11670d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase     * Gets the drawable's color value.
11770d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase     *
11870d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase     * @return int The color to draw.
11970d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase     */
12070d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase    public int getColor() {
12152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        return mColorState.mUseColor;
12270d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase    }
12370d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase
12470d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase    /**
12552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * Sets the drawable's color value. This action will clobber the results of
12652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * prior calls to {@link #setAlpha(int)} on this object, which side-affected
12752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * the underlying color.
12870d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase     *
12970d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase     * @param color The color to draw.
13070d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase     */
13170d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase    public void setColor(int color) {
13252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        if (mColorState.mBaseColor != color || mColorState.mUseColor != color) {
13352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            mColorState.mBaseColor = mColorState.mUseColor = color;
1349891e1fce5f29d0421d34aa481037417bd70853dChet Haase            invalidateSelf();
1359891e1fce5f29d0421d34aa481037417bd70853dChet Haase        }
13670d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase    }
13770d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase
13870d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase    /**
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the alpha value of this drawable's color.
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A value between 0 and 255.
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
143b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase    @Override
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getAlpha() {
14552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        return mColorState.mUseColor >>> 24;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the color's alpha value.
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param alpha The alpha value to set, between 0 and 255.
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    @Override
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAlpha(int alpha) {
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        alpha += alpha >> 7;   // make it 0..256
15652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        final int baseAlpha = mColorState.mBaseColor >>> 24;
15752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        final int useAlpha = baseAlpha * alpha >> 8;
15852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        final int useColor = (mColorState.mBaseColor << 8 >>> 8) | (useAlpha << 24);
15952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        if (mColorState.mUseColor != useColor) {
16052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            mColorState.mUseColor = useColor;
16141bff38d3060dbcb55133cedaf5d962c3082efc2Chet Haase            invalidateSelf();
16241bff38d3060dbcb55133cedaf5d962c3082efc2Chet Haase        }
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
165cda212d79d449468384cc7744878b8c99984059cJeff Brown    /**
166b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette     * Sets the color filter applied to this color.
167b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette     * <p>
168955d8d69ea6caabce1461dc25b339b9bf9dc61a6Dianne Hackborn     * Only supported on version {@link android.os.Build.VERSION_CODES#LOLLIPOP} and
169b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette     * above. Calling this method has no effect on earlier versions.
170cda212d79d449468384cc7744878b8c99984059cJeff Brown     *
171b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette     * @see android.graphics.drawable.Drawable#setColorFilter(ColorFilter)
172cda212d79d449468384cc7744878b8c99984059cJeff Brown     */
17352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    @Override
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setColorFilter(ColorFilter colorFilter) {
175b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        mPaint.setColorFilter(colorFilter);
176b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    }
177b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
178b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    @Override
179a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    public void setTintList(ColorStateList tint) {
180a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette        mColorState.mTint = tint;
181a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette        mTintFilter = updateTintFilter(mTintFilter, tint, mColorState.mTintMode);
182a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette        invalidateSelf();
183a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    }
184b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
185a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    @Override
186a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    public void setTintMode(Mode tintMode) {
187a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette        mColorState.mTintMode = tintMode;
188a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette        mTintFilter = updateTintFilter(mTintFilter, mColorState.mTint, tintMode);
189a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette        invalidateSelf();
190b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    }
191b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
192b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    @Override
193b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    protected boolean onStateChange(int[] stateSet) {
194b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        final ColorState state = mColorState;
195b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        if (state.mTint != null && state.mTintMode != null) {
196b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette            mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
197b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette            return true;
198b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        }
199b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        return false;
200b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    }
201b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
202b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    @Override
203b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    public boolean isStateful() {
20413d965485e5ca1355071eb0f04c4cd2683c371bfAlan Viverette        return mColorState.mTint != null && mColorState.mTint.isStateful();
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    @Override
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getOpacity() {
209b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        if (mTintFilter != null || mPaint.getColorFilter() != null) {
210b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette            return PixelFormat.TRANSLUCENT;
211b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        }
212b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
21352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        switch (mColorState.mUseColor >>> 24) {
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 255:
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PixelFormat.OPAQUE;
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 0:
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PixelFormat.TRANSPARENT;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PixelFormat.TRANSLUCENT;
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2233f873d86441c30f5d45640a9f70b3b7331985c90Chris Craik    public void getOutline(@NonNull Outline outline) {
2243f873d86441c30f5d45640a9f70b3b7331985c90Chris Craik        outline.setRect(getBounds());
2253f873d86441c30f5d45640a9f70b3b7331985c90Chris Craik        outline.setAlpha(getAlpha() / 255.0f);
2263f873d86441c30f5d45640a9f70b3b7331985c90Chris Craik    }
2273f873d86441c30f5d45640a9f70b3b7331985c90Chris Craik
2283f873d86441c30f5d45640a9f70b3b7331985c90Chris Craik    @Override
22952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs, Theme theme)
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
23152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        super.inflate(r, parser, attrs, theme);
23252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
233b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        final TypedArray a = obtainAttributes(r, theme, attrs, R.styleable.ColorDrawable);
2348e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        updateStateFromTypedArray(a);
23552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        a.recycle();
23652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    }
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    /**
2398e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette     * Updates the constant state from the values in the typed array.
24052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     */
2418e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette    private void updateStateFromTypedArray(TypedArray a) {
24252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        final ColorState state = mColorState;
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2448e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        // Account for any configuration changes.
2458e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        state.mChangingConfigurations |= a.getChangingConfigurations();
2468e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette
24752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        // Extract the theme attributes, if any.
2488e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        state.mThemeAttrs = a.extractThemeAttrs();
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2508e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        state.mBaseColor = a.getColor(R.styleable.ColorDrawable_color, state.mBaseColor);
2518e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        state.mUseColor = state.mBaseColor;
25252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    }
25352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
25452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    @Override
255419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette    public boolean canApplyTheme() {
256419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette        return mColorState.canApplyTheme() || super.canApplyTheme();
257419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette    }
258419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette
259419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette    @Override
26052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    public void applyTheme(Theme t) {
26152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        super.applyTheme(t);
26252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
26352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        final ColorState state = mColorState;
2648e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        if (state == null || state.mThemeAttrs == null) {
2658e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette            return;
26652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        }
26752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
2688e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        final TypedArray a = t.resolveAttributes(state.mThemeAttrs, R.styleable.ColorDrawable);
2698e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        updateStateFromTypedArray(a);
2708e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        a.recycle();
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ConstantState getConstantState() {
27552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        return mColorState;
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final static class ColorState extends ConstantState {
279b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        int[] mThemeAttrs;
28070d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase        int mBaseColor; // base color, independent of setAlpha()
281dfab363807b3b44be4032e410f016e0a0d018426Romain Guy        @ViewDebug.ExportedProperty
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mUseColor;  // basecolor modulated by setAlpha()
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mChangingConfigurations;
284607bd848269fb802550e63aa61945790616f97a7Alan Viverette        ColorStateList mTint = null;
285607bd848269fb802550e63aa61945790616f97a7Alan Viverette        Mode mTintMode = DEFAULT_TINT_MODE;
28652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
28752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        ColorState() {
28852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            // Empty constructor.
28952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        }
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ColorState(ColorState state) {
292b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette            mThemeAttrs = state.mThemeAttrs;
29352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            mBaseColor = state.mBaseColor;
29452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            mUseColor = state.mUseColor;
29552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            mChangingConfigurations = state.mChangingConfigurations;
296b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette            mTint = state.mTint;
297b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette            mTintMode = state.mTintMode;
29852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        }
29952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
30052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        @Override
30152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        public boolean canApplyTheme() {
30252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            return mThemeAttrs != null;
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Drawable newDrawable() {
30717cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette            return new ColorDrawable(this);
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
311c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        public Drawable newDrawable(Resources res) {
31217cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette            return new ColorDrawable(this);
313c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        }
314c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn
315c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        @Override
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getChangingConfigurations() {
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mChangingConfigurations;
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
32117cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette    private ColorDrawable(ColorState state) {
32217cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette        mColorState = state;
323b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
32452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    }
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
326