DrawableContainer.java revision 0b6cfe22fda3396b4790ac79fc90488bec4a49a4
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 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 1958945975b256739fdfe78435d7846d1e2fd29da1Chris Craikimport android.annotation.NonNull; 20b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.content.res.ColorStateList; 21c2974809373697147cbe5754835cc871fb93aef1Dianne Hackbornimport android.content.res.Resources; 2252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viveretteimport android.content.res.Resources.Theme; 23dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reckimport android.graphics.Bitmap; 2478aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Canvas; 2578aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.ColorFilter; 26bbd51f1e360b22eece1d74bd65c7e6a0b59dee59Philip Milneimport android.graphics.Insets; 2758945975b256739fdfe78435d7846d1e2fd29da1Chris Craikimport android.graphics.Outline; 2878aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.PixelFormat; 2978aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Rect; 30b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.PorterDuff.Mode; 31079e23575024e103358c982152afb7a720ae1a8aDianne Hackbornimport android.os.SystemClock; 32600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglioimport android.util.LayoutDirection; 33f390f770ee570f1f4def41b165cb9492e381be40Alan Viveretteimport android.util.SparseArray; 34dfa4646eca54511a28f2c61e1f4b9c697e05a913Alan Viveretteimport android.view.View; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reckimport java.util.Collection; 37dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck 3878aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne/** 3978aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * A helper class that contains several {@link Drawable}s and selects which one to use. 4078aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * 4178aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * You can subclass it to create your own DrawableContainers or directly use one its child classes. 4278aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne */ 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class DrawableContainer extends Drawable implements Drawable.Callback { 44079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private static final boolean DEBUG = false; 45079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private static final String TAG = "DrawableContainer"; 46211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed 47211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed /** 48211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * To be proper, we should have a getter for dither (and alpha, etc.) 49211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * so that proxy classes like this can save/restore their delegates' 50211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * values, but we don't have getters. Since we do have setters 51211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * (e.g. setDither), which this proxy forwards on, we have to have some 52211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * default/initial setting. 53211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * 54211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * The initial setting for dither is now true, since it almost always seems 55211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * to improve the quality at negligible cost. 56211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed */ 57211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed private static final boolean DEFAULT_DITHER = true; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private DrawableContainerState mDrawableContainerState; 597068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette private Rect mHotspotBounds; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mCurrDrawable; 61ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette private Drawable mLastDrawable; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mAlpha = 0xFF; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 64729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette /** Whether setAlpha() has been called at least once. */ 65729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette private boolean mHasAlpha; 66729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mCurIndex = -1; 68ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette private int mLastIndex = -1; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mMutated; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 71079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn // Animations. 72079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private Runnable mAnimationRunnable; 73079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private long mEnterAnimationEnd; 74079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private long mExitAnimationEnd; 75079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // overrides from Drawable 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void draw(Canvas canvas) { 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable.draw(canvas); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 83079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 84079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.draw(canvas); 85079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getChangingConfigurations() { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.getChangingConfigurations() 91e0f95f39c5a669a48ee3ebb8dc45bf2d7ee940f1Alan Viverette | mDrawableContainerState.getChangingConfigurations(); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 93f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 94600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio private boolean needsMirroring() { 95600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio return isAutoMirrored() && getLayoutDirection() == LayoutDirection.RTL; 96600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio } 97600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getPadding(Rect padding) { 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Rect r = mDrawableContainerState.getConstantPadding(); 101f7a93ef3847258157d144dfefaa5757128cc807dFabrice Di Meglio boolean result; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (r != null) { 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project padding.set(r); 104f7a93ef3847258157d144dfefaa5757128cc807dFabrice Di Meglio result = (r.left | r.top | r.bottom | r.right) != 0; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 106600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio if (mCurrDrawable != null) { 107600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio result = mCurrDrawable.getPadding(padding); 108600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio } else { 109600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio result = super.getPadding(padding); 110600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio } 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 112600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio if (needsMirroring()) { 113600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio final int left = padding.left; 114600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio final int right = padding.right; 115600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio padding.left = right; 116600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio padding.right = left; 117600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio } 118600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio return result; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1211557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne /** 1221557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne * @hide 1231557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne */ 1241557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne @Override 1257b7578184567f4e4f0740ce935cc192765410ccaPhilip Milne public Insets getOpticalInsets() { 1268de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette if (mCurrDrawable != null) { 1278de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette return mCurrDrawable.getOpticalInsets(); 1288de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette } 1298de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette return Insets.NONE; 1301557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne } 1311557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13331ba192dd201df2cad96a8c503f730130ab0d80fChris Craik public void getOutline(@NonNull Outline outline) { 13458945975b256739fdfe78435d7846d1e2fd29da1Chris Craik if (mCurrDrawable != null) { 13531ba192dd201df2cad96a8c503f730130ab0d80fChris Craik mCurrDrawable.getOutline(outline); 13658945975b256739fdfe78435d7846d1e2fd29da1Chris Craik } 13758945975b256739fdfe78435d7846d1e2fd29da1Chris Craik } 13858945975b256739fdfe78435d7846d1e2fd29da1Chris Craik 13958945975b256739fdfe78435d7846d1e2fd29da1Chris Craik @Override 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAlpha(int alpha) { 14134bd56b546bce47422a430d9d7806dc3cb4254bfAlan Viverette if (!mHasAlpha || mAlpha != alpha) { 14234bd56b546bce47422a430d9d7806dc3cb4254bfAlan Viverette mHasAlpha = true; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAlpha = alpha; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 145079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd == 0) { 1465f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy mCurrDrawable.mutate().setAlpha(alpha); 147079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 148079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animate(false); 149079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 155b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase public int getAlpha() { 156b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase return mAlpha; 157b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase } 158b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase 159b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase @Override 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDither(boolean dither) { 161a41581ed4033004c73115113f45b9844e9b0210fRomain Guy if (mDrawableContainerState.mDither != dither) { 162a41581ed4033004c73115113f45b9844e9b0210fRomain Guy mDrawableContainerState.mDither = dither; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 1645f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy mCurrDrawable.mutate().setDither(mDrawableContainerState.mDither); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 170bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik public void setColorFilter(ColorFilter colorFilter) { 1716f51440a746ef4925ec329cd3a71a9689be2b10bAlan Viverette mDrawableContainerState.mHasColorFilter = true; 172729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette 173bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik if (mDrawableContainerState.mColorFilter != colorFilter) { 174bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik mDrawableContainerState.mColorFilter = colorFilter; 175729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 177bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik mCurrDrawable.mutate().setColorFilter(colorFilter); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 181f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 182b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette @Override 183a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette public void setTintList(ColorStateList tint) { 184bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mDrawableContainerState.mHasTintList = true; 185b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 186bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette if (mDrawableContainerState.mTintList != tint) { 187bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mDrawableContainerState.mTintList = tint; 188a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette 189a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette if (mCurrDrawable != null) { 190a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette mCurrDrawable.mutate().setTintList(tint); 191a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette } 192a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette } 193a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette } 194a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette 195a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette @Override 196a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette public void setTintMode(Mode tintMode) { 197bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mDrawableContainerState.mHasTintMode = true; 198a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette 199a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette if (mDrawableContainerState.mTintMode != tintMode) { 200b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette mDrawableContainerState.mTintMode = tintMode; 201b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 202b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette if (mCurrDrawable != null) { 203a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette mCurrDrawable.mutate().setTintMode(tintMode); 204b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette } 205b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette } 206b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette } 207b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 208079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn /** 209079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * Change the global fade duration when a new drawable is entering 210079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * the scene. 211079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * @param ms The amount of time to fade in milliseconds. 212079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn */ 213079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void setEnterFadeDuration(int ms) { 214079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mDrawableContainerState.mEnterFadeDuration = ms; 215079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 216f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 217079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn /** 218079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * Change the global fade duration when a new drawable is leaving 219079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * the scene. 220079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * @param ms The amount of time to fade in milliseconds. 221079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn */ 222079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void setExitFadeDuration(int ms) { 223079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mDrawableContainerState.mExitFadeDuration = ms; 224079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 225f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onBoundsChange(Rect bounds) { 228079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 229079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.setBounds(bounds); 230079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable.setBounds(bounds); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 235f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isStateful() { 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.isStateful(); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 240f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2423f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio public void setAutoMirrored(boolean mirrored) { 243729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette if (mDrawableContainerState.mAutoMirrored != mirrored) { 244729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette mDrawableContainerState.mAutoMirrored = mirrored; 245729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette if (mCurrDrawable != null) { 246729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette mCurrDrawable.mutate().setAutoMirrored(mDrawableContainerState.mAutoMirrored); 247729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette } 2483f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio } 2493f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio } 2503f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio 2513f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio @Override 2523f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio public boolean isAutoMirrored() { 2533f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio return mDrawableContainerState.mAutoMirrored; 2543f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio } 2553f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio 2563f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio @Override 257079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void jumpToCurrentState() { 258079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn boolean changed = false; 259079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 260079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.jumpToCurrentState(); 261079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable = null; 262ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette mLastIndex = -1; 263079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn changed = true; 264079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 265079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mCurrDrawable != null) { 266079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mCurrDrawable.jumpToCurrentState(); 267729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette if (mHasAlpha) { 268729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette mCurrDrawable.mutate().setAlpha(mAlpha); 269729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette } 270079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 271079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mExitAnimationEnd != 0) { 272079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = 0; 273079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn changed = true; 274079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 275079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd != 0) { 276079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterAnimationEnd = 0; 277079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn changed = true; 278079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 279079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (changed) { 280079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn invalidateSelf(); 281079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 282079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 283079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 284079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn @Override 285c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette public void setHotspot(float x, float y) { 286307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette if (mCurrDrawable != null) { 287c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette mCurrDrawable.setHotspot(x, y); 288307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette } 289307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette } 290307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette 291307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette @Override 29253a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette public void setHotspotBounds(int left, int top, int right, int bottom) { 2937068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette if (mHotspotBounds == null) { 29427cf86939d918b2d6b32a0650a48b8a2afaa26b6Alexander Martinz mHotspotBounds = new Rect(left, top, right, bottom); 2957068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } else { 29627cf86939d918b2d6b32a0650a48b8a2afaa26b6Alexander Martinz mHotspotBounds.set(left, top, right, bottom); 2977068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } 2987068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette 29953a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette if (mCurrDrawable != null) { 30053a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette mCurrDrawable.setHotspotBounds(left, top, right, bottom); 30153a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette } 30253a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette } 30353a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette 3047068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette @Override 3057068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette public void getHotspotBounds(Rect outRect) { 3067068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette if (mHotspotBounds != null) { 3077068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette outRect.set(mHotspotBounds); 3087068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } else { 3097068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette super.getHotspotBounds(outRect); 3107068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } 3117068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } 3127068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette 31353a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette @Override 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean onStateChange(int[] state) { 315079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 316079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn return mLastDrawable.setState(state); 317079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable.setState(state); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3250b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette protected boolean onLevelChange(int level) { 326079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 327079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn return mLastDrawable.setLevel(level); 328079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable.setLevel(level); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 336dfa4646eca54511a28f2c61e1f4b9c697e05a913Alan Viverette public boolean onLayoutDirectionChanged(@View.ResolvedLayoutDir int layoutDirection) { 337a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette // Let the container handle setting its own layout direction. Otherwise, 338a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette // we're accessing potentially unused states. 339a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return mDrawableContainerState.setLayoutDirection(layoutDirection, getCurrentIndex()); 340a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 341a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 342a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIntrinsicWidth() { 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.isConstantSize()) { 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.getConstantWidth(); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable != null ? mCurrDrawable.getIntrinsicWidth() : -1; 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIntrinsicHeight() { 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.isConstantSize()) { 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.getConstantHeight(); 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable != null ? mCurrDrawable.getIntrinsicHeight() : -1; 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 357f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMinimumWidth() { 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.isConstantSize()) { 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.getConstantMinimumWidth(); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable != null ? mCurrDrawable.getMinimumWidth() : 0; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMinimumHeight() { 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.isConstantSize()) { 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.getConstantMinimumHeight(); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable != null ? mCurrDrawable.getMinimumHeight() : 0; 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37472146433322588c1116ee06c27ac758ad09d869cAlan Viverette @Override 375079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void invalidateDrawable(Drawable who) { 376f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (who == mCurrDrawable && getCallback() != null) { 377f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy getCallback().invalidateDrawable(this); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38172146433322588c1116ee06c27ac758ad09d869cAlan Viverette @Override 382079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void scheduleDrawable(Drawable who, Runnable what, long when) { 383f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (who == mCurrDrawable && getCallback() != null) { 384f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy getCallback().scheduleDrawable(this, what, when); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38872146433322588c1116ee06c27ac758ad09d869cAlan Viverette @Override 389079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void unscheduleDrawable(Drawable who, Runnable what) { 390f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (who == mCurrDrawable && getCallback() != null) { 391f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy getCallback().unscheduleDrawable(this, what); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean setVisible(boolean visible, boolean restart) { 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = super.setVisible(visible, restart); 398079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 399079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.setVisible(visible, restart); 400079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable.setVisible(visible, restart); 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return changed; 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getOpacity() { 40983b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy return mCurrDrawable == null || !mCurrDrawable.isVisible() ? PixelFormat.TRANSPARENT : 41083b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy mDrawableContainerState.getOpacity(); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4135e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette /** @hide */ 4145e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette public void setCurrentIndex(int index) { 4155e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette selectDrawable(index); 4165e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette } 4175e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette 4185e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette /** @hide */ 4195e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette public int getCurrentIndex() { 4205e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette return mCurIndex; 4215e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette } 4225e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette 42378aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne public boolean selectDrawable(int idx) { 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (idx == mCurIndex) { 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 427079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 428079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn final long now = SystemClock.uptimeMillis(); 429079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 430079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (DEBUG) android.util.Log.i(TAG, toString() + " from " + mCurIndex + " to " + idx 431079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn + ": exit=" + mDrawableContainerState.mExitFadeDuration 432079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn + " enter=" + mDrawableContainerState.mEnterFadeDuration); 433079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 434079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mDrawableContainerState.mExitFadeDuration > 0) { 435079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 436079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.setVisible(false, false); 437079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 439079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable = mCurrDrawable; 440ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette mLastIndex = mCurIndex; 441079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = now + mDrawableContainerState.mExitFadeDuration; 442079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 443079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable = null; 444ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette mLastIndex = -1; 445079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = 0; 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 447079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else if (mCurrDrawable != null) { 448079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mCurrDrawable.setVisible(false, false); 449079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 450079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 451079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (idx >= 0 && idx < mDrawableContainerState.mNumChildren) { 452f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable d = mDrawableContainerState.getChild(idx); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable = d; 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurIndex = idx; 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 456079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mDrawableContainerState.mEnterFadeDuration > 0) { 457079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterAnimationEnd = now + mDrawableContainerState.mEnterFadeDuration; 4587068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } 459419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette initializeDrawableForDisplay(d); 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable = null; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurIndex = -1; 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 465079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 466079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd != 0 || mExitAnimationEnd != 0) { 467079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mAnimationRunnable == null) { 468079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mAnimationRunnable = new Runnable() { 469079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn @Override public void run() { 470079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animate(true); 471079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn invalidateSelf(); 472079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 473079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn }; 474079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 475079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn unscheduleSelf(mAnimationRunnable); 476079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 477079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn // Compute first frame and schedule next animation. 478079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animate(true); 479079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 480079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidateSelf(); 482079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 485f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 486419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette /** 487419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette * Initializes a drawable for display in this container. 488419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette * 489419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette * @param d The drawable to initialize. 490419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette */ 491419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette private void initializeDrawableForDisplay(Drawable d) { 492419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette d.mutate(); 493419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette 494419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette if (mDrawableContainerState.mEnterFadeDuration <= 0 && mHasAlpha) { 495419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette d.setAlpha(mAlpha); 496419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette } 497419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette 498419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette if (mDrawableContainerState.mHasColorFilter) { 499419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette // Color filter always overrides tint. 500419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette d.setColorFilter(mDrawableContainerState.mColorFilter); 501419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette } else { 502419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette if (mDrawableContainerState.mHasTintList) { 503419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette d.setTintList(mDrawableContainerState.mTintList); 504419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette } 505419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette if (mDrawableContainerState.mHasTintMode) { 506419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette d.setTintMode(mDrawableContainerState.mTintMode); 507419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette } 508419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette } 509419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette 510419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette d.setVisible(isVisible(), true); 511419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette d.setDither(mDrawableContainerState.mDither); 512419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette d.setState(getState()); 5130b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette d.setLevel(getLevel()); 514419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette d.setBounds(getBounds()); 515419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette d.setLayoutDirection(getLayoutDirection()); 516419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette d.setAutoMirrored(mDrawableContainerState.mAutoMirrored); 517419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette 518419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette final Rect hotspotBounds = mHotspotBounds; 519419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette if (hotspotBounds != null) { 520419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette d.setHotspotBounds(hotspotBounds.left, hotspotBounds.top, 521419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette hotspotBounds.right, hotspotBounds.bottom); 522419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette } 523419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette } 524419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette 525079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn void animate(boolean schedule) { 526729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette mHasAlpha = true; 527729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette 528079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn final long now = SystemClock.uptimeMillis(); 529079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn boolean animating = false; 530079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mCurrDrawable != null) { 531079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd != 0) { 532079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd <= now) { 5335f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy mCurrDrawable.mutate().setAlpha(mAlpha); 534079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterAnimationEnd = 0; 535079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 536079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn int animAlpha = (int)((mEnterAnimationEnd-now)*255) 537079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn / mDrawableContainerState.mEnterFadeDuration; 538079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (DEBUG) android.util.Log.i(TAG, toString() + " cur alpha " + animAlpha); 5395f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy mCurrDrawable.mutate().setAlpha(((255-animAlpha)*mAlpha)/255); 540079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animating = true; 541079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 542079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 543079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 544079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterAnimationEnd = 0; 545079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 546079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 547079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mExitAnimationEnd != 0) { 548079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mExitAnimationEnd <= now) { 549079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.setVisible(false, false); 550079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable = null; 551ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette mLastIndex = -1; 552079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = 0; 553079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 554079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn int animAlpha = (int)((mExitAnimationEnd-now)*255) 555079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn / mDrawableContainerState.mExitFadeDuration; 556079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (DEBUG) android.util.Log.i(TAG, toString() + " last alpha " + animAlpha); 5575f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy mLastDrawable.mutate().setAlpha((animAlpha*mAlpha)/255); 558079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animating = true; 559079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 560079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 561079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 562079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = 0; 563079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 564079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 565079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (schedule && animating) { 5668dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette scheduleSelf(mAnimationRunnable, now + 1000 / 60); 567079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 568079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 569079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getCurrent() { 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable; 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 57652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public void applyTheme(Theme theme) { 57752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette mDrawableContainerState.applyTheme(theme); 57852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 57952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 58052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette @Override 58152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public boolean canApplyTheme() { 58252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return mDrawableContainerState.canApplyTheme(); 58352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 58452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 58552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette @Override 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ConstantState getConstantState() { 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.canConstantState()) { 5886efd2bad954e0e5bd74916a32f036a0f149dcd4dChristopher Lais mDrawableContainerState.mChangingConfigurations = getChangingConfigurations(); 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState; 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable mutate() { 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mMutated && super.mutate() == this) { 5975ed8f27858dbdf85203068eca46eef0a65f3344eAlan Viverette final DrawableContainerState clone = cloneConstantState(); 5985ed8f27858dbdf85203068eca46eef0a65f3344eAlan Viverette clone.mutate(); 5995ed8f27858dbdf85203068eca46eef0a65f3344eAlan Viverette setConstantState(clone); 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMutated = true; 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 60578aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne /** 6068dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette * Returns a shallow copy of the container's constant state to be used as 6078dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette * the base state for {@link #mutate()}. 6088dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette * 6098dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette * @return a shallow copy of the constant state 6108dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette */ 6118dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette DrawableContainerState cloneConstantState() { 6128dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette return mDrawableContainerState; 6138dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette } 6148dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette 6158dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette /** 616727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette * @hide 617727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette */ 618727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette public void clearMutated() { 619727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette super.clearMutated(); 620727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette mDrawableContainerState.clearMutated(); 621727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette mMutated = false; 622727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette } 623727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette 624727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette /** 62578aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * A ConstantState that can contain several {@link Drawable}s. 62678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * 62778aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * This class was made public to enable testing, and its visibility may change in a future 62878aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * release. 62978aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne */ 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract static class DrawableContainerState extends ConstantState { 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final DrawableContainer mOwner; 632f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Resources mRes; 633f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 634f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette SparseArray<ConstantStateFuture> mDrawableFutures; 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 636f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mChangingConfigurations; 637f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mChildrenChangingConfigurations; 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette Drawable[] mDrawables; 640f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mNumChildren; 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 642d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette boolean mVariablePadding = false; 643f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mPaddingChecked; 644f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette Rect mConstantPadding; 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 646d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette boolean mConstantSize = false; 647f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mComputedConstantSize; 648f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mConstantWidth; 649f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mConstantHeight; 650f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mConstantMinimumWidth; 651f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mConstantMinimumHeight; 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 653f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mCheckedOpacity; 654f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mOpacity; 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 656f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mCheckedStateful; 657f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mStateful; 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mCheckedConstantState; 660f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mCanConstantState; 6615140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy 662f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mDither = DEFAULT_DITHER; 663f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 664f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mMutated; 665f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mLayoutDirection; 666f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 667d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette int mEnterFadeDuration = 0; 668d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette int mExitFadeDuration = 0; 669079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 6703f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio boolean mAutoMirrored; 6713f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio 672d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette ColorFilter mColorFilter; 673729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette boolean mHasColorFilter; 674d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette 675bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette ColorStateList mTintList; 676b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette Mode mTintMode; 677bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette boolean mHasTintList; 678bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette boolean mHasTintMode; 679b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 680c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn DrawableContainerState(DrawableContainerState orig, DrawableContainer owner, 681c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn Resources res) { 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOwner = owner; 683102a6bff77c618112762245dbd798c8d7f6d44eaAlan Viverette mRes = res != null ? res : orig != null ? orig.mRes : null; 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (orig != null) { 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChangingConfigurations = orig.mChangingConfigurations; 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildrenChangingConfigurations = orig.mChildrenChangingConfigurations; 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedConstantState = true; 690f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCanConstantState = true; 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVariablePadding = orig.mVariablePadding; 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantSize = orig.mConstantSize; 694a41581ed4033004c73115113f45b9844e9b0210fRomain Guy mDither = orig.mDither; 695f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mMutated = orig.mMutated; 696f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mLayoutDirection = orig.mLayoutDirection; 697079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterFadeDuration = orig.mEnterFadeDuration; 698079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitFadeDuration = orig.mExitFadeDuration; 6993f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio mAutoMirrored = orig.mAutoMirrored; 700d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette mColorFilter = orig.mColorFilter; 701729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette mHasColorFilter = orig.mHasColorFilter; 702bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mTintList = orig.mTintList; 703b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette mTintMode = orig.mTintMode; 704bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mHasTintList = orig.mHasTintList; 705bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mHasTintMode = orig.mHasTintMode; 706079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 707f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // Cloning the following values may require creating futures. 708f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mConstantPadding = orig.getConstantPadding(); 709f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mPaddingChecked = true; 710f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 711f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mConstantWidth = orig.getConstantWidth(); 712f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mConstantHeight = orig.getConstantHeight(); 713f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mConstantMinimumWidth = orig.getConstantMinimumWidth(); 714f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mConstantMinimumHeight = orig.getConstantMinimumHeight(); 715f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mComputedConstantSize = true; 716f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 717f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mOpacity = orig.getOpacity(); 718f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedOpacity = true; 719f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 720f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mStateful = orig.isStateful(); 721f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedStateful = true; 722f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 723f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // Postpone cloning children and futures until we're absolutely 724f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // sure that we're done computing values for the original state. 725f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable[] origDr = orig.mDrawables; 726f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawables = new Drawable[origDr.length]; 727f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mNumChildren = orig.mNumChildren; 728f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 729f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final SparseArray<ConstantStateFuture> origDf = orig.mDrawableFutures; 730f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (origDf != null) { 731f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawableFutures = origDf.clone(); 732f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } else { 73306ff2af68aa1041eeb26778e994e0fe196bf8b1eAlan Viverette mDrawableFutures = new SparseArray<>(mNumChildren); 734f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 735f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 73662b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette // Create futures for drawables with constant states. If a 73762b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette // drawable doesn't have a constant state, then we can't clone 73862b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette // it and we'll have to reference the original. 739f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 740f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette for (int i = 0; i < N; i++) { 741f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (origDr[i] != null) { 74262b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette if (origDr[i].getConstantState() != null) { 74362b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette mDrawableFutures.put(i, new ConstantStateFuture(origDr[i])); 74462b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette } else { 74562b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette mDrawables[i] = origDr[i]; 74662b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette } 747f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 748f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawables = new Drawable[10]; 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNumChildren = 0; 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 754f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getChangingConfigurations() { 757dc25d25333d3fac96dccfb9bd31d2474d6bc2d78Fabrice Di Meglio return mChangingConfigurations | mChildrenChangingConfigurations; 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int addChild(Drawable dr) { 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int pos = mNumChildren; 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos >= mDrawables.length) { 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project growArray(pos, pos+10); 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dr.setVisible(false, true); 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dr.setCallback(mOwner); 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawables[pos] = dr; 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNumChildren++; 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildrenChangingConfigurations |= dr.getChangingConfigurations(); 773f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedStateful = false; 774f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedOpacity = false; 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantPadding = null; 7775140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy mPaddingChecked = false; 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mComputedConstantSize = false; 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pos; 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 78372146433322588c1116ee06c27ac758ad09d869cAlan Viverette final int getCapacity() { 78472146433322588c1116ee06c27ac758ad09d869cAlan Viverette return mDrawables.length; 78572146433322588c1116ee06c27ac758ad09d869cAlan Viverette } 78672146433322588c1116ee06c27ac758ad09d869cAlan Viverette 787f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette private final void createAllFutures() { 788f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (mDrawableFutures != null) { 789f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int futureCount = mDrawableFutures.size(); 790f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette for (int keyIndex = 0; keyIndex < futureCount; keyIndex++) { 791f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int index = mDrawableFutures.keyAt(keyIndex); 792f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawables[index] = mDrawableFutures.valueAt(keyIndex).get(this); 793f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 794f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 795f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawableFutures = null; 796f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 797f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 798f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 79983b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getChildCount() { 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNumChildren; 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 80372146433322588c1116ee06c27ac758ad09d869cAlan Viverette /* 80472146433322588c1116ee06c27ac758ad09d869cAlan Viverette * @deprecated Use {@link #getChild} instead. 80572146433322588c1116ee06c27ac758ad09d869cAlan Viverette */ 80683b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final Drawable[] getChildren() { 807f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // Create all futures for backwards compatibility. 808f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 809f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawables; 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 81372146433322588c1116ee06c27ac758ad09d869cAlan Viverette public final Drawable getChild(int index) { 814f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable result = mDrawables[index]; 815f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (result != null) { 816f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return result; 817f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 818f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 819f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // Prepare future drawable if necessary. 820f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (mDrawableFutures != null) { 821f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int keyIndex = mDrawableFutures.indexOfKey(index); 822f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (keyIndex >= 0) { 823f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable prepared = mDrawableFutures.valueAt(keyIndex).get(this); 824f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawables[index] = prepared; 825f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawableFutures.removeAt(keyIndex); 82606ff2af68aa1041eeb26778e994e0fe196bf8b1eAlan Viverette if (mDrawableFutures.size() == 0) { 82706ff2af68aa1041eeb26778e994e0fe196bf8b1eAlan Viverette mDrawableFutures = null; 82806ff2af68aa1041eeb26778e994e0fe196bf8b1eAlan Viverette } 829f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return prepared; 830f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 831f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 832f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 833f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return null; 834f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 835f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 836a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette final boolean setLayoutDirection(int layoutDirection, int currentIndex) { 837a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette boolean changed = false; 838a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 839f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // No need to call createAllFutures, since future drawables will 840f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // change layout direction when they are prepared. 841f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 842f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable[] drawables = mDrawables; 843f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette for (int i = 0; i < N; i++) { 844f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (drawables[i] != null) { 845a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette final boolean childChanged = drawables[i].setLayoutDirection(layoutDirection); 846a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (i == currentIndex) { 847a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette changed = childChanged; 848a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 849f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 850f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 851f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 852f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mLayoutDirection = layoutDirection; 853a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 854a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return changed; 85572146433322588c1116ee06c27ac758ad09d869cAlan Viverette } 85672146433322588c1116ee06c27ac758ad09d869cAlan Viverette 85752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final void applyTheme(Theme theme) { 85817cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette if (theme != null) { 85917cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette createAllFutures(); 86017cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette 86117cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette final int N = mNumChildren; 86217cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette final Drawable[] drawables = mDrawables; 86317cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette for (int i = 0; i < N; i++) { 86417cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette if (drawables[i] != null && drawables[i].canApplyTheme()) { 86517cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette drawables[i].applyTheme(theme); 866e0f95f39c5a669a48ee3ebb8dc45bf2d7ee940f1Alan Viverette 867e0f95f39c5a669a48ee3ebb8dc45bf2d7ee940f1Alan Viverette // Update cached mask of child changing configurations. 868e0f95f39c5a669a48ee3ebb8dc45bf2d7ee940f1Alan Viverette mChildrenChangingConfigurations |= drawables[i].getChangingConfigurations(); 86917cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette } 87052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 87152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 87252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 87352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 87452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette @Override 87552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public boolean canApplyTheme() { 87652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final int N = mNumChildren; 87752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final Drawable[] drawables = mDrawables; 87852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette for (int i = 0; i < N; i++) { 879b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette final Drawable d = drawables[i]; 88052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (d != null) { 88152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (d.canApplyTheme()) { 88252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return true; 88352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 88452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } else { 88552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final ConstantStateFuture future = mDrawableFutures.get(i); 88652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (future != null && future.canApplyTheme()) { 88752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return true; 88852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 88952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 89052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 89152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 89252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return false; 89352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 89452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 8958dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette private void mutate() { 896f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // No need to call createAllFutures, since future drawables will 897f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // mutate when they are prepared. 898f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 89972146433322588c1116ee06c27ac758ad09d869cAlan Viverette final Drawable[] drawables = mDrawables; 90072146433322588c1116ee06c27ac758ad09d869cAlan Viverette for (int i = 0; i < N; i++) { 901f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (drawables[i] != null) { 902f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette drawables[i].mutate(); 903f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 90472146433322588c1116ee06c27ac758ad09d869cAlan Viverette } 905f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 906f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mMutated = true; 90772146433322588c1116ee06c27ac758ad09d869cAlan Viverette } 90872146433322588c1116ee06c27ac758ad09d869cAlan Viverette 909727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette final void clearMutated() { 910727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette final int N = mNumChildren; 911727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette final Drawable[] drawables = mDrawables; 912727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette for (int i = 0; i < N; i++) { 913727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette if (drawables[i] != null) { 914727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette drawables[i].clearMutated(); 915727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette } 916727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette } 917727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette 918727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette mMutated = false; 919727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette } 920727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette 921f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette /** 922f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * A boolean value indicating whether to use the maximum padding value 923f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * of all frames in the set (false), or to use the padding value of the 924f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * frame being shown (true). Default value is false. 925f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette */ 92683b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final void setVariablePadding(boolean variable) { 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVariablePadding = variable; 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 93083b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final Rect getConstantPadding() { 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mVariablePadding) { 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 934f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 935f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if ((mConstantPadding != null) || mPaddingChecked) { 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantPadding; 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 940f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 9415140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy Rect r = null; 94283b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy final Rect t = new Rect(); 943f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 94483b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy final Drawable[] drawables = mDrawables; 94583b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy for (int i = 0; i < N; i++) { 94683b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy if (drawables[i].getPadding(t)) { 9475140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy if (r == null) r = new Rect(0, 0, 0, 0); 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.left > r.left) r.left = t.left; 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.top > r.top) r.top = t.top; 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.right > r.right) r.right = t.right; 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.bottom > r.bottom) r.bottom = t.bottom; 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 954f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 9555140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy mPaddingChecked = true; 9565140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy return (mConstantPadding = r); 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 95983b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final void setConstantSize(boolean constant) { 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantSize = constant; 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 96383b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final boolean isConstantSize() { 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantSize; 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 96783b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getConstantWidth() { 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mComputedConstantSize) { 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeConstantSize(); 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantWidth; 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 97583b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getConstantHeight() { 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mComputedConstantSize) { 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeConstantSize(); 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantHeight; 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 98383b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getConstantMinimumWidth() { 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mComputedConstantSize) { 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeConstantSize(); 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantMinimumWidth; 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 99183b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getConstantMinimumHeight() { 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mComputedConstantSize) { 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeConstantSize(); 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantMinimumHeight; 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 99978aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne protected void computeConstantSize() { 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mComputedConstantSize = true; 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1002f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 1003f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1004f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 100583b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy final Drawable[] drawables = mDrawables; 100678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne mConstantWidth = mConstantHeight = -1; 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantMinimumWidth = mConstantMinimumHeight = 0; 100883b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy for (int i = 0; i < N; i++) { 1009f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable dr = drawables[i]; 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int s = dr.getIntrinsicWidth(); 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s > mConstantWidth) mConstantWidth = s; 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = dr.getIntrinsicHeight(); 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s > mConstantHeight) mConstantHeight = s; 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = dr.getMinimumWidth(); 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s > mConstantMinimumWidth) mConstantMinimumWidth = s; 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = dr.getMinimumHeight(); 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s > mConstantMinimumHeight) mConstantMinimumHeight = s; 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1021079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public final void setEnterFadeDuration(int duration) { 1022079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterFadeDuration = duration; 1023079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 1024079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 1025079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public final int getEnterFadeDuration() { 1026079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn return mEnterFadeDuration; 1027079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 1028079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 1029079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public final void setExitFadeDuration(int duration) { 1030079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitFadeDuration = duration; 1031079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 1032079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 1033079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public final int getExitFadeDuration() { 1034079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn return mExitFadeDuration; 1035079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 1036079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 103783b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getOpacity() { 1038f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (mCheckedOpacity) { 1039f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return mOpacity; 1040f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 1041f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1042f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 1043f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1044f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedOpacity = true; 1045f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1046f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 104783b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy final Drawable[] drawables = mDrawables; 1048f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int op = (N > 0) ? drawables[0].getOpacity() : PixelFormat.TRANSPARENT; 104983b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy for (int i = 1; i < N; i++) { 105083b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy op = Drawable.resolveOpacity(op, drawables[i].getOpacity()); 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1052f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpacity = op; 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return op; 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 105683b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean isStateful() { 1058f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (mCheckedStateful) { 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStateful; 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1061f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1062f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 1063f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1064f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedStateful = true; 1065f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1066f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 1067f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable[] drawables = mDrawables; 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 1069f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (drawables[i].isStateful()) { 1070f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mStateful = true; 1071f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return true; 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1074f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1075f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mStateful = false; 1076f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return false; 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 107983b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public void growArray(int oldSize, int newSize) { 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable[] newDrawables = new Drawable[newSize]; 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(mDrawables, 0, newDrawables, 0, oldSize); 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawables = newDrawables; 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized boolean canConstantState() { 1086f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (mCheckedConstantState) { 1087f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return mCanConstantState; 1088f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 1089f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1090f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 1091f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1092f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedConstantState = true; 1093f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1094f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 1095f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable[] drawables = mDrawables; 1096f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette for (int i = 0; i < N; i++) { 1097f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (drawables[i].getConstantState() == null) { 1098f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCanConstantState = false; 1099f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return false; 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1103f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCanConstantState = true; 1104f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return true; 1105f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 1106f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1107dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck /** @hide */ 1108dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck @Override 1109dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck public int addAtlasableBitmaps(Collection<Bitmap> atlasList) { 1110dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck final int N = mNumChildren; 1111dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck int pixelCount = 0; 1112dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck for (int i = 0; i < N; i++) { 1113dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck final ConstantState state = getChild(i).getConstantState(); 1114dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck if (state != null) { 1115dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck pixelCount += state.addAtlasableBitmaps(atlasList); 1116dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck } 1117dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck } 1118dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck return pixelCount; 1119dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck } 1120dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck 1121f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette /** 1122f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * Class capable of cloning a Drawable from another Drawable's 1123f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * ConstantState. 1124f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette */ 1125f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette private static class ConstantStateFuture { 1126f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette private final ConstantState mConstantState; 1127f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1128f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette private ConstantStateFuture(Drawable source) { 1129f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mConstantState = source.getConstantState(); 1130f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 1131f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1132f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette /** 1133f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * Obtains and prepares the Drawable represented by this future. 1134f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * 1135f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * @param state the container into which this future will be placed 1136f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * @return a prepared Drawable 1137f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette */ 1138f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette public Drawable get(DrawableContainerState state) { 113952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final Drawable result; 114052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (state.mRes == null) { 114152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette result = mConstantState.newDrawable(); 114252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } else { 114317cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette result = mConstantState.newDrawable(state.mRes); 114452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 1145f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette result.setLayoutDirection(state.mLayoutDirection); 1146f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette result.setCallback(state.mOwner); 1147f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1148f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (state.mMutated) { 1149f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette result.mutate(); 1150f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 1151f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1152f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return result; 1153f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 115452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 115552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette /** 115652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * Whether the constant state wrapped by this future can apply a 115752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * theme. 115852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette */ 115952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public boolean canApplyTheme() { 116052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return mConstantState.canApplyTheme(); 116152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1165f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette protected void setConstantState(DrawableContainerState state) { 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawableContainerState = state; 1167ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette 1168ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette // The locally cached drawables may have changed. 1169ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette if (mCurIndex >= 0) { 1170ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette mCurrDrawable = state.getChild(mCurIndex); 1171419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette if (mCurrDrawable != null) { 1172419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette initializeDrawableForDisplay(mCurrDrawable); 1173419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette } 1174ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette } 1175419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette 1176419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette // Clear out the last drawable. We don't have enough information to 1177419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette // propagate local state from the past. 1178419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette mLastIndex = -1; 1179419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette mLastDrawable = null; 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1182