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