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><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