ColorDrawable.java revision cda212d79d449468384cc7744878b8c99984059c
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
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.*;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
2152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viveretteimport android.content.res.Resources.Theme;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
24dfab363807b3b44be4032e410f016e0a0d018426Romain Guyimport android.view.ViewDebug;
2552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
2652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viveretteimport com.android.internal.R;
2752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParser;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
3495930e13faac8c17dabfaa1478089baa772f091bRomain Guy * A specialized Drawable that fills the Canvas with a specified color.
3595930e13faac8c17dabfaa1478089baa772f091bRomain Guy * Note that a ColorDrawable ignores the ColorFilter.
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>It can be defined in an XML file with the <code>&lt;color></code> element.</p>
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ColorDrawable_color
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ColorDrawable extends Drawable {
42dfab363807b3b44be4032e410f016e0a0d018426Romain Guy    @ViewDebug.ExportedProperty(deepExport = true, prefix = "state_")
4352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    private ColorState mColorState;
44cda212d79d449468384cc7744878b8c99984059cJeff Brown    private final Paint mPaint = new Paint();
455f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy    private boolean mMutated;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates a new black ColorDrawable.
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ColorDrawable() {
5152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        mColorState = new ColorState();
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates a new ColorDrawable with the specified color.
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param color The color to draw.
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ColorDrawable(int color) {
6052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        mColorState = new ColorState();
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        setColor(color);
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getChangingConfigurations() {
6752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        return super.getChangingConfigurations() | mColorState.mChangingConfigurations;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
705f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy    /**
715f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy     * A mutable BitmapDrawable still shares its Bitmap with any other Drawable
725f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy     * that comes from the same resource.
735f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy     *
745f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy     * @return This drawable.
755f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy     */
765f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy    @Override
775f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy    public Drawable mutate() {
785f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy        if (!mMutated && super.mutate() == this) {
7952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            mColorState = new ColorState(mColorState);
805f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy            mMutated = true;
815f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy        }
825f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy        return this;
835f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy    }
845f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void draw(Canvas canvas) {
87cda212d79d449468384cc7744878b8c99984059cJeff Brown        if ((mColorState.mUseColor >>> 24) != 0) {
8852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            mPaint.setColor(mColorState.mUseColor);
8995930e13faac8c17dabfaa1478089baa772f091bRomain Guy            canvas.drawRect(getBounds(), mPaint);
9095930e13faac8c17dabfaa1478089baa772f091bRomain Guy        }
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9470d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase     * Gets the drawable's color value.
9570d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase     *
9670d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase     * @return int The color to draw.
9770d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase     */
9870d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase    public int getColor() {
9952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        return mColorState.mUseColor;
10070d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase    }
10170d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase
10270d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase    /**
10352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * Sets the drawable's color value. This action will clobber the results of
10452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * prior calls to {@link #setAlpha(int)} on this object, which side-affected
10552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * the underlying color.
10670d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase     *
10770d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase     * @param color The color to draw.
10870d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase     */
10970d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase    public void setColor(int color) {
11052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        if (mColorState.mBaseColor != color || mColorState.mUseColor != color) {
11152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            mColorState.mBaseColor = mColorState.mUseColor = color;
1129891e1fce5f29d0421d34aa481037417bd70853dChet Haase            invalidateSelf();
1139891e1fce5f29d0421d34aa481037417bd70853dChet Haase        }
11470d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase    }
11570d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase
11670d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase    /**
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the alpha value of this drawable's color.
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A value between 0 and 255.
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
121b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase    @Override
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getAlpha() {
12352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        return mColorState.mUseColor >>> 24;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the color's alpha value.
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param alpha The alpha value to set, between 0 and 255.
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    @Override
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAlpha(int alpha) {
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        alpha += alpha >> 7;   // make it 0..256
13452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        final int baseAlpha = mColorState.mBaseColor >>> 24;
13552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        final int useAlpha = baseAlpha * alpha >> 8;
13652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        final int useColor = (mColorState.mBaseColor << 8 >>> 8) | (useAlpha << 24);
13752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        if (mColorState.mUseColor != useColor) {
13852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            mColorState.mUseColor = useColor;
13941bff38d3060dbcb55133cedaf5d962c3082efc2Chet Haase            invalidateSelf();
14041bff38d3060dbcb55133cedaf5d962c3082efc2Chet Haase        }
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
143cda212d79d449468384cc7744878b8c99984059cJeff Brown    /**
144cda212d79d449468384cc7744878b8c99984059cJeff Brown     * Setting a color filter on a ColorDrawable has no effect.
145cda212d79d449468384cc7744878b8c99984059cJeff Brown     *
146cda212d79d449468384cc7744878b8c99984059cJeff Brown     * @param colorFilter Ignore.
147cda212d79d449468384cc7744878b8c99984059cJeff Brown     */
14852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    @Override
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setColorFilter(ColorFilter colorFilter) {
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    @Override
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getOpacity() {
15452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        switch (mColorState.mUseColor >>> 24) {
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 255:
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PixelFormat.OPAQUE;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 0:
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PixelFormat.TRANSPARENT;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PixelFormat.TRANSLUCENT;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
16452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs, Theme theme)
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
16652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        super.inflate(r, parser, attrs, theme);
16752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
168cda212d79d449468384cc7744878b8c99984059cJeff Brown        final TypedArray a = obtainAttributes(
169cda212d79d449468384cc7744878b8c99984059cJeff Brown                r, theme, attrs, R.styleable.ColorDrawable);
17052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        inflateStateFromTypedArray(a);
17152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        a.recycle();
17252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    }
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    /**
17552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * Initializes the constant state from the values in the typed array.
17652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     */
17752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    private void inflateStateFromTypedArray(TypedArray a) {
17852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        final ColorState state = mColorState;
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        // Extract the theme attributes, if any.
18152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        final int[] themeAttrs = a.extractThemeAttrs();
18252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        state.mThemeAttrs = themeAttrs;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        if (themeAttrs == null || themeAttrs[R.styleable.ColorDrawable_color] == 0) {
18552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            final int color = a.getColor(R.styleable.ColorDrawable_color, 0);
18652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            state.mBaseColor = color;
18752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            state.mUseColor = color;
18852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        }
18952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    }
19052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
19152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    @Override
19252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    public void applyTheme(Theme t) {
19352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        super.applyTheme(t);
19452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
19552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        final ColorState state = mColorState;
19652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        if (state == null) {
19752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            throw new RuntimeException("Can't apply theme to <color> with no constant state");
19852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        }
19952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
20052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        final int[] themeAttrs = state.mThemeAttrs;
20152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        if (themeAttrs != null) {
2020cfb877f5a0a1bff82d9c3ee969195bf7812c0b5Alan Viverette            final TypedArray a = t.resolveAttributes(themeAttrs, R.styleable.ColorDrawable);
20352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            updateStateFromTypedArray(a);
20452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            a.recycle();
20552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        }
20652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    }
20752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
20852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    /**
20952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * Updates the constant state from the values in the typed array.
21052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     */
21152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    private void updateStateFromTypedArray(TypedArray a) {
21252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        final ColorState state = mColorState;
21352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
21452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        if (a.hasValue(R.styleable.ColorDrawable_color)) {
21552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            final int color = a.getColor(R.styleable.ColorDrawable_color, 0);
21652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            state.mBaseColor = color;
21752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            state.mUseColor = color;
21852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ConstantState getConstantState() {
22352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        mColorState.mChangingConfigurations = getChangingConfigurations();
22452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        return mColorState;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final static class ColorState extends ConstantState {
22870d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase        int mBaseColor; // base color, independent of setAlpha()
229dfab363807b3b44be4032e410f016e0a0d018426Romain Guy        @ViewDebug.ExportedProperty
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mUseColor;  // basecolor modulated by setAlpha()
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mChangingConfigurations;
232cda212d79d449468384cc7744878b8c99984059cJeff Brown        int[] mThemeAttrs;
23352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
23452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        ColorState() {
23552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            // Empty constructor.
23652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        }
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ColorState(ColorState state) {
23952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            mBaseColor = state.mBaseColor;
24052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            mUseColor = state.mUseColor;
24152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            mChangingConfigurations = state.mChangingConfigurations;
242cda212d79d449468384cc7744878b8c99984059cJeff Brown            mThemeAttrs = state.mThemeAttrs;
24352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        }
24452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
24552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        @Override
24652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        public boolean canApplyTheme() {
24752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            return mThemeAttrs != null;
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Drawable newDrawable() {
25252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            return new ColorDrawable(this, null, null);
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
256c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        public Drawable newDrawable(Resources res) {
25752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            return new ColorDrawable(this, res, null);
25852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        }
25952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
26052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        @Override
26152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        public Drawable newDrawable(Resources res, Theme theme) {
26252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            return new ColorDrawable(this, res, theme);
263c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        }
264c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn
265c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        @Override
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getChangingConfigurations() {
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mChangingConfigurations;
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
27152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    private ColorDrawable(ColorState state, Resources res, Theme theme) {
27252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        if (theme != null && state.canApplyTheme()) {
27352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            mColorState = new ColorState(state);
27452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            applyTheme(theme);
27552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        } else {
27652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            mColorState = state;
27752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        }
27852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
27952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        // No local properties to initialize.
28052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    }
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
282