DrawableContainer.java revision 2b561f1c352df95df23e17e7fce2acc3144df159
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; 20ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viveretteimport android.content.pm.ActivityInfo.Config; 21b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.content.res.ColorStateList; 22c2974809373697147cbe5754835cc871fb93aef1Dianne Hackbornimport android.content.res.Resources; 2352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viveretteimport android.content.res.Resources.Theme; 24dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reckimport android.graphics.Bitmap; 2578aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Canvas; 2678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.ColorFilter; 27bbd51f1e360b22eece1d74bd65c7e6a0b59dee59Philip Milneimport android.graphics.Insets; 2858945975b256739fdfe78435d7846d1e2fd29da1Chris Craikimport android.graphics.Outline; 2978aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.PixelFormat; 3078aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Rect; 31b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.PorterDuff.Mode; 32079e23575024e103358c982152afb7a720ae1a8aDianne Hackbornimport android.os.SystemClock; 33f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viveretteimport android.util.DisplayMetrics; 34600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglioimport android.util.LayoutDirection; 35f390f770ee570f1f4def41b165cb9492e381be40Alan Viveretteimport android.util.SparseArray; 36dfa4646eca54511a28f2c61e1f4b9c697e05a913Alan Viveretteimport android.view.View; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reckimport java.util.Collection; 39dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck 4078aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne/** 4178aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * A helper class that contains several {@link Drawable}s and selects which one to use. 4278aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * 4378aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * You can subclass it to create your own DrawableContainers or directly use one its child classes. 4478aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne */ 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class DrawableContainer extends Drawable implements Drawable.Callback { 46079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private static final boolean DEBUG = false; 47079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private static final String TAG = "DrawableContainer"; 48211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed 49211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed /** 50211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * To be proper, we should have a getter for dither (and alpha, etc.) 51211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * so that proxy classes like this can save/restore their delegates' 52211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * values, but we don't have getters. Since we do have setters 53211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * (e.g. setDither), which this proxy forwards on, we have to have some 54211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * default/initial setting. 55211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * 56211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * The initial setting for dither is now true, since it almost always seems 57211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * to improve the quality at negligible cost. 58211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed */ 59211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed private static final boolean DEFAULT_DITHER = true; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private DrawableContainerState mDrawableContainerState; 617068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette private Rect mHotspotBounds; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mCurrDrawable; 63ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette private Drawable mLastDrawable; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mAlpha = 0xFF; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 66729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette /** Whether setAlpha() has been called at least once. */ 67729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette private boolean mHasAlpha; 68729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mCurIndex = -1; 70ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette private int mLastIndex = -1; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mMutated; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 73079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn // Animations. 74079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private Runnable mAnimationRunnable; 75079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private long mEnterAnimationEnd; 76079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private long mExitAnimationEnd; 77079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // overrides from Drawable 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void draw(Canvas canvas) { 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable.draw(canvas); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 86079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.draw(canvas); 87079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 91ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette public @Config int getChangingConfigurations() { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.getChangingConfigurations() 93e0f95f39c5a669a48ee3ebb8dc45bf2d7ee940f1Alan Viverette | mDrawableContainerState.getChangingConfigurations(); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 95f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 96600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio private boolean needsMirroring() { 97600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio return isAutoMirrored() && getLayoutDirection() == LayoutDirection.RTL; 98600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio } 99600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getPadding(Rect padding) { 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Rect r = mDrawableContainerState.getConstantPadding(); 103f7a93ef3847258157d144dfefaa5757128cc807dFabrice Di Meglio boolean result; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (r != null) { 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project padding.set(r); 106f7a93ef3847258157d144dfefaa5757128cc807dFabrice Di Meglio result = (r.left | r.top | r.bottom | r.right) != 0; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 108600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio if (mCurrDrawable != null) { 109600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio result = mCurrDrawable.getPadding(padding); 110600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio } else { 111600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio result = super.getPadding(padding); 112600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio } 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 114600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio if (needsMirroring()) { 115600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio final int left = padding.left; 116600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio final int right = padding.right; 117600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio padding.left = right; 118600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio padding.right = left; 119600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio } 120600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio return result; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1231557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne /** 1241557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne * @hide 1251557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne */ 1261557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne @Override 1277b7578184567f4e4f0740ce935cc192765410ccaPhilip Milne public Insets getOpticalInsets() { 1288de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette if (mCurrDrawable != null) { 1298de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette return mCurrDrawable.getOpticalInsets(); 1308de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette } 1318de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette return Insets.NONE; 1321557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne } 1331557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13531ba192dd201df2cad96a8c503f730130ab0d80fChris Craik public void getOutline(@NonNull Outline outline) { 13658945975b256739fdfe78435d7846d1e2fd29da1Chris Craik if (mCurrDrawable != null) { 13731ba192dd201df2cad96a8c503f730130ab0d80fChris Craik mCurrDrawable.getOutline(outline); 13858945975b256739fdfe78435d7846d1e2fd29da1Chris Craik } 13958945975b256739fdfe78435d7846d1e2fd29da1Chris Craik } 14058945975b256739fdfe78435d7846d1e2fd29da1Chris Craik 14158945975b256739fdfe78435d7846d1e2fd29da1Chris Craik @Override 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAlpha(int alpha) { 14334bd56b546bce47422a430d9d7806dc3cb4254bfAlan Viverette if (!mHasAlpha || mAlpha != alpha) { 14434bd56b546bce47422a430d9d7806dc3cb4254bfAlan Viverette mHasAlpha = true; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAlpha = alpha; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 147079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd == 0) { 1489b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette mCurrDrawable.setAlpha(alpha); 149079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 150079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animate(false); 151079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 157b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase public int getAlpha() { 158b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase return mAlpha; 159b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase } 160b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase 161b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase @Override 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDither(boolean dither) { 163a41581ed4033004c73115113f45b9844e9b0210fRomain Guy if (mDrawableContainerState.mDither != dither) { 164a41581ed4033004c73115113f45b9844e9b0210fRomain Guy mDrawableContainerState.mDither = dither; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 1669b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette mCurrDrawable.setDither(mDrawableContainerState.mDither); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 172bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik public void setColorFilter(ColorFilter colorFilter) { 1736f51440a746ef4925ec329cd3a71a9689be2b10bAlan Viverette mDrawableContainerState.mHasColorFilter = true; 174729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette 175bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik if (mDrawableContainerState.mColorFilter != colorFilter) { 176bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik mDrawableContainerState.mColorFilter = colorFilter; 177729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 1799b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette mCurrDrawable.setColorFilter(colorFilter); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 183f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 184b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette @Override 185a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette public void setTintList(ColorStateList tint) { 186bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mDrawableContainerState.mHasTintList = true; 187b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 188bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette if (mDrawableContainerState.mTintList != tint) { 189bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mDrawableContainerState.mTintList = tint; 190a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette 191a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette if (mCurrDrawable != null) { 1929b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette mCurrDrawable.setTintList(tint); 193a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette } 194a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette } 195a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette } 196a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette 197a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette @Override 198a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette public void setTintMode(Mode tintMode) { 199bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mDrawableContainerState.mHasTintMode = true; 200a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette 201a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette if (mDrawableContainerState.mTintMode != tintMode) { 202b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette mDrawableContainerState.mTintMode = tintMode; 203b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 204b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette if (mCurrDrawable != null) { 2059b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette mCurrDrawable.setTintMode(tintMode); 206b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette } 207b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette } 208b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette } 209b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 210079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn /** 211079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * Change the global fade duration when a new drawable is entering 212079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * the scene. 213079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * @param ms The amount of time to fade in milliseconds. 214079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn */ 215079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void setEnterFadeDuration(int ms) { 216079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mDrawableContainerState.mEnterFadeDuration = ms; 217079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 218f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 219079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn /** 220079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * Change the global fade duration when a new drawable is leaving 221079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * the scene. 222079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * @param ms The amount of time to fade in milliseconds. 223079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn */ 224079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void setExitFadeDuration(int ms) { 225079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mDrawableContainerState.mExitFadeDuration = ms; 226079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 227f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onBoundsChange(Rect bounds) { 230079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 231079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.setBounds(bounds); 232079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable.setBounds(bounds); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 237f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isStateful() { 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.isStateful(); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 242f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2443f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio public void setAutoMirrored(boolean mirrored) { 245729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette if (mDrawableContainerState.mAutoMirrored != mirrored) { 246729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette mDrawableContainerState.mAutoMirrored = mirrored; 247729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette if (mCurrDrawable != null) { 2489b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette mCurrDrawable.setAutoMirrored(mDrawableContainerState.mAutoMirrored); 249729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette } 2503f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio } 2513f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio } 2523f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio 2533f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio @Override 2543f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio public boolean isAutoMirrored() { 2553f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio return mDrawableContainerState.mAutoMirrored; 2563f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio } 2573f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio 2583f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio @Override 259079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void jumpToCurrentState() { 260079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn boolean changed = false; 261079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 262079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.jumpToCurrentState(); 263079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable = null; 264ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette mLastIndex = -1; 265079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn changed = true; 266079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 267079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mCurrDrawable != null) { 268079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mCurrDrawable.jumpToCurrentState(); 269729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette if (mHasAlpha) { 2709b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette mCurrDrawable.setAlpha(mAlpha); 271729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette } 272079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 273079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mExitAnimationEnd != 0) { 274079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = 0; 275079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn changed = true; 276079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 277079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd != 0) { 278079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterAnimationEnd = 0; 279079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn changed = true; 280079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 281079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (changed) { 282079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn invalidateSelf(); 283079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 284079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 285079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 286079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn @Override 287c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette public void setHotspot(float x, float y) { 288307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette if (mCurrDrawable != null) { 289c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette mCurrDrawable.setHotspot(x, y); 290307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette } 291307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette } 292307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette 293307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette @Override 29453a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette public void setHotspotBounds(int left, int top, int right, int bottom) { 2957068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette if (mHotspotBounds == null) { 29627cf86939d918b2d6b32a0650a48b8a2afaa26b6Alexander Martinz mHotspotBounds = new Rect(left, top, right, bottom); 2977068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } else { 29827cf86939d918b2d6b32a0650a48b8a2afaa26b6Alexander Martinz mHotspotBounds.set(left, top, right, bottom); 2997068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } 3007068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette 30153a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette if (mCurrDrawable != null) { 30253a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette mCurrDrawable.setHotspotBounds(left, top, right, bottom); 30353a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette } 30453a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette } 30553a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette 3067068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette @Override 3077068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette public void getHotspotBounds(Rect outRect) { 3087068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette if (mHotspotBounds != null) { 3097068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette outRect.set(mHotspotBounds); 3107068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } else { 3117068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette super.getHotspotBounds(outRect); 3127068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } 3137068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } 3147068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette 31553a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette @Override 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean onStateChange(int[] state) { 317079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 318079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn return mLastDrawable.setState(state); 319079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable.setState(state); 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3270b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette protected boolean onLevelChange(int level) { 328079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 329079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn return mLastDrawable.setLevel(level); 330079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable.setLevel(level); 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 338dfa4646eca54511a28f2c61e1f4b9c697e05a913Alan Viverette public boolean onLayoutDirectionChanged(@View.ResolvedLayoutDir int layoutDirection) { 339a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette // Let the container handle setting its own layout direction. Otherwise, 340a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette // we're accessing potentially unused states. 341a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return mDrawableContainerState.setLayoutDirection(layoutDirection, getCurrentIndex()); 342a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 343a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 344a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIntrinsicWidth() { 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.isConstantSize()) { 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.getConstantWidth(); 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable != null ? mCurrDrawable.getIntrinsicWidth() : -1; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIntrinsicHeight() { 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.isConstantSize()) { 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.getConstantHeight(); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable != null ? mCurrDrawable.getIntrinsicHeight() : -1; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 359f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMinimumWidth() { 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.isConstantSize()) { 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.getConstantMinimumWidth(); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable != null ? mCurrDrawable.getMinimumWidth() : 0; 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMinimumHeight() { 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.isConstantSize()) { 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.getConstantMinimumHeight(); 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable != null ? mCurrDrawable.getMinimumHeight() : 0; 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37672146433322588c1116ee06c27ac758ad09d869cAlan Viverette @Override 377f6d87ec193f17e8dad82c9994ba7a58e975d364bAlan Viverette public void invalidateDrawable(@NonNull Drawable who) { 378f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (who == mCurrDrawable && getCallback() != null) { 379f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy getCallback().invalidateDrawable(this); 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38372146433322588c1116ee06c27ac758ad09d869cAlan Viverette @Override 384f6d87ec193f17e8dad82c9994ba7a58e975d364bAlan Viverette public void scheduleDrawable(@NonNull Drawable who, @NonNull Runnable what, long when) { 385f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (who == mCurrDrawable && getCallback() != null) { 386f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy getCallback().scheduleDrawable(this, what, when); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39072146433322588c1116ee06c27ac758ad09d869cAlan Viverette @Override 391f6d87ec193f17e8dad82c9994ba7a58e975d364bAlan Viverette public void unscheduleDrawable(@NonNull Drawable who, @NonNull Runnable what) { 392f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (who == mCurrDrawable && getCallback() != null) { 393f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy getCallback().unscheduleDrawable(this, what); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean setVisible(boolean visible, boolean restart) { 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = super.setVisible(visible, restart); 400079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 401079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.setVisible(visible, restart); 402079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable.setVisible(visible, restart); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return changed; 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getOpacity() { 41183b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy return mCurrDrawable == null || !mCurrDrawable.isVisible() ? PixelFormat.TRANSPARENT : 41283b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy mDrawableContainerState.getOpacity(); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4155e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette /** @hide */ 4165e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette public void setCurrentIndex(int index) { 4175e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette selectDrawable(index); 4185e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette } 4195e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette 4205e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette /** @hide */ 4215e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette public int getCurrentIndex() { 4225e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette return mCurIndex; 4235e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette } 4245e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette 425a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette /** 426a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette * Sets the currently displayed drawable by index. 427a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette * <p> 428a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette * If an invalid index is specified, the current drawable will be set to 429a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette * {@code null} and the index will be set to {@code -1}. 430a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette * 431a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette * @param index the index of the drawable to display 432a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette * @return {@code true} if the drawable changed, {@code false} otherwise 433a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette */ 434a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette public boolean selectDrawable(int index) { 435a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette if (index == mCurIndex) { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 438079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 439079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn final long now = SystemClock.uptimeMillis(); 440079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 441a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette if (DEBUG) android.util.Log.i(TAG, toString() + " from " + mCurIndex + " to " + index 442079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn + ": exit=" + mDrawableContainerState.mExitFadeDuration 443079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn + " enter=" + mDrawableContainerState.mEnterFadeDuration); 444079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 445079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mDrawableContainerState.mExitFadeDuration > 0) { 446079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 447079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.setVisible(false, false); 448079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 450079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable = mCurrDrawable; 451ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette mLastIndex = mCurIndex; 452079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = now + mDrawableContainerState.mExitFadeDuration; 453079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 454079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable = null; 455ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette mLastIndex = -1; 456079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = 0; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 458079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else if (mCurrDrawable != null) { 459079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mCurrDrawable.setVisible(false, false); 460079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 461079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 462a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette if (index >= 0 && index < mDrawableContainerState.mNumChildren) { 463a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette final Drawable d = mDrawableContainerState.getChild(index); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable = d; 465a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette mCurIndex = index; 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 467079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mDrawableContainerState.mEnterFadeDuration > 0) { 468079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterAnimationEnd = now + mDrawableContainerState.mEnterFadeDuration; 4697068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } 470419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette initializeDrawableForDisplay(d); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable = null; 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurIndex = -1; 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 476079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 477079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd != 0 || mExitAnimationEnd != 0) { 478079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mAnimationRunnable == null) { 479079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mAnimationRunnable = new Runnable() { 480079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn @Override public void run() { 481079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animate(true); 482079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn invalidateSelf(); 483079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 484079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn }; 485079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 486079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn unscheduleSelf(mAnimationRunnable); 487079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 488079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn // Compute first frame and schedule next animation. 489079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animate(true); 490079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 491079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidateSelf(); 493079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 496f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 497419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette /** 498419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette * Initializes a drawable for display in this container. 499419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette * 500419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette * @param d The drawable to initialize. 501419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette */ 502419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette private void initializeDrawableForDisplay(Drawable d) { 5032b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette // Temporary fix for suspending callbacks during initialization. We 5042b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette // don't want any of these setters causing an invalidate() since that 5052b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette // may call back into DrawableContainer. 5062b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette final Callback cb = d.getCallback(); 5072b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setCallback(null); 5082b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette 5092b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette try { 5102b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette if (mDrawableContainerState.mEnterFadeDuration <= 0 && mHasAlpha) { 5112b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setAlpha(mAlpha); 512419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette } 513419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette 5142b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette if (mDrawableContainerState.mHasColorFilter) { 5152b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette // Color filter always overrides tint. 5162b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setColorFilter(mDrawableContainerState.mColorFilter); 5172b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette } else { 5182b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette if (mDrawableContainerState.mHasTintList) { 5192b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setTintList(mDrawableContainerState.mTintList); 5202b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette } 5212b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette if (mDrawableContainerState.mHasTintMode) { 5222b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setTintMode(mDrawableContainerState.mTintMode); 5232b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette } 5242b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette } 525419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette 5262b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setVisible(isVisible(), true); 5272b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setDither(mDrawableContainerState.mDither); 5282b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setState(getState()); 5292b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setLevel(getLevel()); 5302b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setBounds(getBounds()); 5312b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setLayoutDirection(getLayoutDirection()); 5322b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setAutoMirrored(mDrawableContainerState.mAutoMirrored); 5332b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette 5342b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette final Rect hotspotBounds = mHotspotBounds; 5352b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette if (hotspotBounds != null) { 5362b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setHotspotBounds(hotspotBounds.left, hotspotBounds.top, 5372b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette hotspotBounds.right, hotspotBounds.bottom); 5382b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette } 5392b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette } finally { 5402b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setCallback(cb); 541419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette } 542419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette } 543419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette 544079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn void animate(boolean schedule) { 545729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette mHasAlpha = true; 546729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette 547079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn final long now = SystemClock.uptimeMillis(); 548079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn boolean animating = false; 549079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mCurrDrawable != null) { 550079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd != 0) { 551079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd <= now) { 5529b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette mCurrDrawable.setAlpha(mAlpha); 553079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterAnimationEnd = 0; 554079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 555079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn int animAlpha = (int)((mEnterAnimationEnd-now)*255) 556079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn / mDrawableContainerState.mEnterFadeDuration; 5579b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette mCurrDrawable.setAlpha(((255-animAlpha)*mAlpha)/255); 558079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animating = true; 559079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 560079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 561079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 562079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterAnimationEnd = 0; 563079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 564079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 565079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mExitAnimationEnd != 0) { 566079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mExitAnimationEnd <= now) { 567079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.setVisible(false, false); 568079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable = null; 569ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette mLastIndex = -1; 570079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = 0; 571079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 572079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn int animAlpha = (int)((mExitAnimationEnd-now)*255) 573079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn / mDrawableContainerState.mExitFadeDuration; 5749b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette mLastDrawable.setAlpha((animAlpha*mAlpha)/255); 575079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animating = true; 576079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 577079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 578079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 579079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = 0; 580079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 581079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 582079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (schedule && animating) { 5838dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette scheduleSelf(mAnimationRunnable, now + 1000 / 60); 584079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 585079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 586079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getCurrent() { 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable; 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 592f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette /** 593f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette * Updates the source density based on the resources used to inflate 594f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette * density-dependent values. Implementing classes should call this method 595f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette * during inflation. 596f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette * 597f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette * @param res the resources used to inflate density-dependent values 598f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette */ 599f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette final void updateDensity(Resources res) { 600f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mDrawableContainerState.updateDensity(res); 601f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette } 602f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 60452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public void applyTheme(Theme theme) { 60552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette mDrawableContainerState.applyTheme(theme); 60652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 60752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 60852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette @Override 60952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public boolean canApplyTheme() { 61052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return mDrawableContainerState.canApplyTheme(); 61152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 61252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 61352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette @Override 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ConstantState getConstantState() { 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.canConstantState()) { 6166efd2bad954e0e5bd74916a32f036a0f149dcd4dChristopher Lais mDrawableContainerState.mChangingConfigurations = getChangingConfigurations(); 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState; 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable mutate() { 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mMutated && super.mutate() == this) { 6255ed8f27858dbdf85203068eca46eef0a65f3344eAlan Viverette final DrawableContainerState clone = cloneConstantState(); 6265ed8f27858dbdf85203068eca46eef0a65f3344eAlan Viverette clone.mutate(); 6275ed8f27858dbdf85203068eca46eef0a65f3344eAlan Viverette setConstantState(clone); 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMutated = true; 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63378aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne /** 6348dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette * Returns a shallow copy of the container's constant state to be used as 6358dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette * the base state for {@link #mutate()}. 6368dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette * 6378dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette * @return a shallow copy of the constant state 6388dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette */ 6398dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette DrawableContainerState cloneConstantState() { 6408dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette return mDrawableContainerState; 6418dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette } 6428dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette 6438dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette /** 644727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette * @hide 645727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette */ 646727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette public void clearMutated() { 647727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette super.clearMutated(); 648727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette mDrawableContainerState.clearMutated(); 649727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette mMutated = false; 650727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette } 651727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette 652727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette /** 65378aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * A ConstantState that can contain several {@link Drawable}s. 65478aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * 65578aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * This class was made public to enable testing, and its visibility may change in a future 65678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * release. 65778aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne */ 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract static class DrawableContainerState extends ConstantState { 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final DrawableContainer mOwner; 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 661f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette Resources mSourceRes; 662f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette int mDensity = DisplayMetrics.DENSITY_DEFAULT; 663ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette @Config int mChangingConfigurations; 664ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette @Config int mChildrenChangingConfigurations; 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6661259f616c26f89dd5000745d7c364fae41b23682Alan Viverette SparseArray<ConstantState> mDrawableFutures; 667f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette Drawable[] mDrawables; 668f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mNumChildren; 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 670d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette boolean mVariablePadding = false; 671f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette boolean mCheckedPadding; 672f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette Rect mConstantPadding; 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 674d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette boolean mConstantSize = false; 675f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette boolean mCheckedConstantSize; 676f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mConstantWidth; 677f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mConstantHeight; 678f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mConstantMinimumWidth; 679f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mConstantMinimumHeight; 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 681f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mCheckedOpacity; 682f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mOpacity; 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 684f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mCheckedStateful; 685f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mStateful; 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 687f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mCheckedConstantState; 688f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mCanConstantState; 6895140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy 690f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mDither = DEFAULT_DITHER; 691f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 692f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mMutated; 693f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mLayoutDirection; 694f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 695d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette int mEnterFadeDuration = 0; 696d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette int mExitFadeDuration = 0; 697079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 6983f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio boolean mAutoMirrored; 6993f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio 700d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette ColorFilter mColorFilter; 701729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette boolean mHasColorFilter; 702d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette 703bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette ColorStateList mTintList; 704b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette Mode mTintMode; 705bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette boolean mHasTintList; 706bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette boolean mHasTintMode; 707b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 708c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn DrawableContainerState(DrawableContainerState orig, DrawableContainer owner, 709c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn Resources res) { 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOwner = owner; 711ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette mSourceRes = res != null ? res : (orig != null ? orig.mSourceRes : null); 712ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette mDensity = Drawable.resolveDensity(res, orig != null ? orig.mDensity : 0); 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (orig != null) { 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChangingConfigurations = orig.mChangingConfigurations; 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildrenChangingConfigurations = orig.mChildrenChangingConfigurations; 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 718f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedConstantState = true; 719f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCanConstantState = true; 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVariablePadding = orig.mVariablePadding; 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantSize = orig.mConstantSize; 723a41581ed4033004c73115113f45b9844e9b0210fRomain Guy mDither = orig.mDither; 724f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mMutated = orig.mMutated; 725f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mLayoutDirection = orig.mLayoutDirection; 726079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterFadeDuration = orig.mEnterFadeDuration; 727079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitFadeDuration = orig.mExitFadeDuration; 7283f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio mAutoMirrored = orig.mAutoMirrored; 729d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette mColorFilter = orig.mColorFilter; 730729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette mHasColorFilter = orig.mHasColorFilter; 731bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mTintList = orig.mTintList; 732b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette mTintMode = orig.mTintMode; 733bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mHasTintList = orig.mHasTintList; 734bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mHasTintMode = orig.mHasTintMode; 735079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 736ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette if (orig.mDensity == mDensity) { 737f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette if (orig.mCheckedPadding) { 738f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mConstantPadding = new Rect(orig.mConstantPadding); 739f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mCheckedPadding = true; 740f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette } 741f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 742f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette if (orig.mCheckedConstantSize) { 743f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mConstantWidth = orig.mConstantWidth; 744f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mConstantHeight = orig.mConstantHeight; 745f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mConstantMinimumWidth = orig.mConstantMinimumWidth; 746f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mConstantMinimumHeight = orig.mConstantMinimumHeight; 747f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mCheckedConstantSize = true; 748f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette } 749f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette } 750f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 751f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette if (orig.mCheckedOpacity) { 752f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mOpacity = orig.mOpacity; 753f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mCheckedOpacity = true; 754f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette } 755f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 756f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette if (orig.mCheckedStateful) { 757f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mStateful = orig.mStateful; 758f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mCheckedStateful = true; 759f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette } 760f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 761f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // Postpone cloning children and futures until we're absolutely 762f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // sure that we're done computing values for the original state. 763f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable[] origDr = orig.mDrawables; 764f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawables = new Drawable[origDr.length]; 765f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mNumChildren = orig.mNumChildren; 766f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 7671259f616c26f89dd5000745d7c364fae41b23682Alan Viverette final SparseArray<ConstantState> origDf = orig.mDrawableFutures; 768f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (origDf != null) { 769f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawableFutures = origDf.clone(); 770f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } else { 77106ff2af68aa1041eeb26778e994e0fe196bf8b1eAlan Viverette mDrawableFutures = new SparseArray<>(mNumChildren); 772f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 773f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 77462b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette // Create futures for drawables with constant states. If a 77562b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette // drawable doesn't have a constant state, then we can't clone 77662b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette // it and we'll have to reference the original. 777f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 778f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette for (int i = 0; i < N; i++) { 779f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (origDr[i] != null) { 7801259f616c26f89dd5000745d7c364fae41b23682Alan Viverette final ConstantState cs = origDr[i].getConstantState(); 7811259f616c26f89dd5000745d7c364fae41b23682Alan Viverette if (cs != null) { 7821259f616c26f89dd5000745d7c364fae41b23682Alan Viverette mDrawableFutures.put(i, cs); 78362b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette } else { 78462b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette mDrawables[i] = origDr[i]; 78562b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette } 786f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 787f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawables = new Drawable[10]; 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNumChildren = 0; 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 793f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 795ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette public @Config int getChangingConfigurations() { 796dc25d25333d3fac96dccfb9bd31d2474d6bc2d78Fabrice Di Meglio return mChangingConfigurations | mChildrenChangingConfigurations; 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799a24c9b4791dddc2dbc233dfe8dac1ae682beb272Alan Viverette /** 800a24c9b4791dddc2dbc233dfe8dac1ae682beb272Alan Viverette * Adds the drawable to the end of the list of contained drawables. 801a24c9b4791dddc2dbc233dfe8dac1ae682beb272Alan Viverette * 802a24c9b4791dddc2dbc233dfe8dac1ae682beb272Alan Viverette * @param dr the drawable to add 803a24c9b4791dddc2dbc233dfe8dac1ae682beb272Alan Viverette * @return the position of the drawable within the container 804a24c9b4791dddc2dbc233dfe8dac1ae682beb272Alan Viverette */ 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int addChild(Drawable dr) { 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int pos = mNumChildren; 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos >= mDrawables.length) { 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project growArray(pos, pos+10); 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 811a24c9b4791dddc2dbc233dfe8dac1ae682beb272Alan Viverette dr.mutate(); 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dr.setVisible(false, true); 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dr.setCallback(mOwner); 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawables[pos] = dr; 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNumChildren++; 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildrenChangingConfigurations |= dr.getChangingConfigurations(); 818f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedStateful = false; 819f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedOpacity = false; 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantPadding = null; 822f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mCheckedPadding = false; 823f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mCheckedConstantSize = false; 8245291a9571580d5147331adbdefb017fa395df505Alan Viverette mCheckedConstantState = false; 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pos; 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 82972146433322588c1116ee06c27ac758ad09d869cAlan Viverette final int getCapacity() { 83072146433322588c1116ee06c27ac758ad09d869cAlan Viverette return mDrawables.length; 83172146433322588c1116ee06c27ac758ad09d869cAlan Viverette } 83272146433322588c1116ee06c27ac758ad09d869cAlan Viverette 8331259f616c26f89dd5000745d7c364fae41b23682Alan Viverette private void createAllFutures() { 834f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (mDrawableFutures != null) { 835f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int futureCount = mDrawableFutures.size(); 836f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette for (int keyIndex = 0; keyIndex < futureCount; keyIndex++) { 837f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int index = mDrawableFutures.keyAt(keyIndex); 8381259f616c26f89dd5000745d7c364fae41b23682Alan Viverette final ConstantState cs = mDrawableFutures.valueAt(keyIndex); 8391259f616c26f89dd5000745d7c364fae41b23682Alan Viverette mDrawables[index] = prepareDrawable(cs.newDrawable(mSourceRes)); 840f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 841f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 842f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawableFutures = null; 843f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 844f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 845f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 8461259f616c26f89dd5000745d7c364fae41b23682Alan Viverette private Drawable prepareDrawable(Drawable child) { 8471259f616c26f89dd5000745d7c364fae41b23682Alan Viverette child.setLayoutDirection(mLayoutDirection); 8481259f616c26f89dd5000745d7c364fae41b23682Alan Viverette child.setCallback(mOwner); 8499b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette child = child.mutate(); 8501259f616c26f89dd5000745d7c364fae41b23682Alan Viverette return child; 8511259f616c26f89dd5000745d7c364fae41b23682Alan Viverette } 8521259f616c26f89dd5000745d7c364fae41b23682Alan Viverette 85383b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getChildCount() { 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNumChildren; 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 85772146433322588c1116ee06c27ac758ad09d869cAlan Viverette /* 85872146433322588c1116ee06c27ac758ad09d869cAlan Viverette * @deprecated Use {@link #getChild} instead. 85972146433322588c1116ee06c27ac758ad09d869cAlan Viverette */ 86083b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final Drawable[] getChildren() { 861f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // Create all futures for backwards compatibility. 862f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 863f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawables; 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 86772146433322588c1116ee06c27ac758ad09d869cAlan Viverette public final Drawable getChild(int index) { 868f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable result = mDrawables[index]; 869f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (result != null) { 870f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return result; 871f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 872f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 873f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // Prepare future drawable if necessary. 874f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (mDrawableFutures != null) { 875f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int keyIndex = mDrawableFutures.indexOfKey(index); 876f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (keyIndex >= 0) { 8771259f616c26f89dd5000745d7c364fae41b23682Alan Viverette final ConstantState cs = mDrawableFutures.valueAt(keyIndex); 8781259f616c26f89dd5000745d7c364fae41b23682Alan Viverette final Drawable prepared = prepareDrawable(cs.newDrawable(mSourceRes)); 879f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawables[index] = prepared; 880f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawableFutures.removeAt(keyIndex); 88106ff2af68aa1041eeb26778e994e0fe196bf8b1eAlan Viverette if (mDrawableFutures.size() == 0) { 88206ff2af68aa1041eeb26778e994e0fe196bf8b1eAlan Viverette mDrawableFutures = null; 88306ff2af68aa1041eeb26778e994e0fe196bf8b1eAlan Viverette } 884f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return prepared; 885f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 886f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 887f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 888f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return null; 889f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 890f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 891a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette final boolean setLayoutDirection(int layoutDirection, int currentIndex) { 892a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette boolean changed = false; 893a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 894f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // No need to call createAllFutures, since future drawables will 895f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // change layout direction when they are prepared. 896f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 897f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable[] drawables = mDrawables; 898f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette for (int i = 0; i < N; i++) { 899f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (drawables[i] != null) { 900a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette final boolean childChanged = drawables[i].setLayoutDirection(layoutDirection); 901a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (i == currentIndex) { 902a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette changed = childChanged; 903a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 904f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 905f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 906f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 907f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mLayoutDirection = layoutDirection; 908a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 909a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return changed; 91072146433322588c1116ee06c27ac758ad09d869cAlan Viverette } 91172146433322588c1116ee06c27ac758ad09d869cAlan Viverette 912f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette /** 913f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette * Updates the source density based on the resources used to inflate 914f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette * density-dependent values. 915f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette * 916f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette * @param res the resources used to inflate density-dependent values 917f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette */ 918f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette final void updateDensity(Resources res) { 9192d3ca47ef83c097e3a1aaa66f2d119be0e93e677Alan Viverette if (res != null) { 920f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mSourceRes = res; 921f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette 9222d3ca47ef83c097e3a1aaa66f2d119be0e93e677Alan Viverette // The density may have changed since the last update (if any). Any 9232d3ca47ef83c097e3a1aaa66f2d119be0e93e677Alan Viverette // dimension-type attributes will need their default values scaled. 9242d3ca47ef83c097e3a1aaa66f2d119be0e93e677Alan Viverette final int targetDensity = Drawable.resolveDensity(res, mDensity); 9252d3ca47ef83c097e3a1aaa66f2d119be0e93e677Alan Viverette final int sourceDensity = mDensity; 9262d3ca47ef83c097e3a1aaa66f2d119be0e93e677Alan Viverette mDensity = targetDensity; 927f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette 9282d3ca47ef83c097e3a1aaa66f2d119be0e93e677Alan Viverette if (sourceDensity != targetDensity) { 9292d3ca47ef83c097e3a1aaa66f2d119be0e93e677Alan Viverette mCheckedConstantSize = false; 9302d3ca47ef83c097e3a1aaa66f2d119be0e93e677Alan Viverette mCheckedPadding = false; 9312d3ca47ef83c097e3a1aaa66f2d119be0e93e677Alan Viverette } 932f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette } 933f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette } 934f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette 93552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final void applyTheme(Theme theme) { 93617cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette if (theme != null) { 93717cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette createAllFutures(); 93817cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette 93917cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette final int N = mNumChildren; 94017cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette final Drawable[] drawables = mDrawables; 94117cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette for (int i = 0; i < N; i++) { 94217cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette if (drawables[i] != null && drawables[i].canApplyTheme()) { 94317cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette drawables[i].applyTheme(theme); 944e0f95f39c5a669a48ee3ebb8dc45bf2d7ee940f1Alan Viverette 945e0f95f39c5a669a48ee3ebb8dc45bf2d7ee940f1Alan Viverette // Update cached mask of child changing configurations. 946e0f95f39c5a669a48ee3ebb8dc45bf2d7ee940f1Alan Viverette mChildrenChangingConfigurations |= drawables[i].getChangingConfigurations(); 94717cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette } 94852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 949f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette 950f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette updateDensity(theme.getResources()); 95152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 95252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 95352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 95452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette @Override 95552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public boolean canApplyTheme() { 95652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final int N = mNumChildren; 95752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final Drawable[] drawables = mDrawables; 95852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette for (int i = 0; i < N; i++) { 959b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette final Drawable d = drawables[i]; 96052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (d != null) { 96152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (d.canApplyTheme()) { 96252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return true; 96352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 96452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } else { 9651259f616c26f89dd5000745d7c364fae41b23682Alan Viverette final ConstantState future = mDrawableFutures.get(i); 96652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (future != null && future.canApplyTheme()) { 96752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return true; 96852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 96952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 97052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 97152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 97252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return false; 97352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 97452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 9758dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette private void mutate() { 976f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // No need to call createAllFutures, since future drawables will 977f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // mutate when they are prepared. 978f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 97972146433322588c1116ee06c27ac758ad09d869cAlan Viverette final Drawable[] drawables = mDrawables; 98072146433322588c1116ee06c27ac758ad09d869cAlan Viverette for (int i = 0; i < N; i++) { 981f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (drawables[i] != null) { 982f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette drawables[i].mutate(); 983f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 98472146433322588c1116ee06c27ac758ad09d869cAlan Viverette } 985f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 986f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mMutated = true; 98772146433322588c1116ee06c27ac758ad09d869cAlan Viverette } 98872146433322588c1116ee06c27ac758ad09d869cAlan Viverette 989727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette final void clearMutated() { 990727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette final int N = mNumChildren; 991727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette final Drawable[] drawables = mDrawables; 992727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette for (int i = 0; i < N; i++) { 993727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette if (drawables[i] != null) { 994727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette drawables[i].clearMutated(); 995727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette } 996727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette } 997727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette 998727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette mMutated = false; 999727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette } 1000727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette 1001f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette /** 1002f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * A boolean value indicating whether to use the maximum padding value 1003f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * of all frames in the set (false), or to use the padding value of the 1004f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * frame being shown (true). Default value is false. 1005f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette */ 100683b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final void setVariablePadding(boolean variable) { 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVariablePadding = variable; 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 101083b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final Rect getConstantPadding() { 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mVariablePadding) { 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1014f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1015f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette if ((mConstantPadding != null) || mCheckedPadding) { 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantPadding; 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 1020f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 10215140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy Rect r = null; 102283b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy final Rect t = new Rect(); 1023f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 102483b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy final Drawable[] drawables = mDrawables; 102583b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy for (int i = 0; i < N; i++) { 102683b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy if (drawables[i].getPadding(t)) { 10275140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy if (r == null) r = new Rect(0, 0, 0, 0); 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.left > r.left) r.left = t.left; 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.top > r.top) r.top = t.top; 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.right > r.right) r.right = t.right; 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.bottom > r.bottom) r.bottom = t.bottom; 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1034f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1035f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mCheckedPadding = true; 10365140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy return (mConstantPadding = r); 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 103983b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final void setConstantSize(boolean constant) { 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantSize = constant; 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 104383b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final boolean isConstantSize() { 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantSize; 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 104783b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getConstantWidth() { 1048f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette if (!mCheckedConstantSize) { 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeConstantSize(); 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantWidth; 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 105583b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getConstantHeight() { 1056f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette if (!mCheckedConstantSize) { 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeConstantSize(); 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantHeight; 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 106383b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getConstantMinimumWidth() { 1064f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette if (!mCheckedConstantSize) { 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeConstantSize(); 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantMinimumWidth; 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 107183b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getConstantMinimumHeight() { 1072f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette if (!mCheckedConstantSize) { 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeConstantSize(); 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantMinimumHeight; 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 107978aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne protected void computeConstantSize() { 1080f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mCheckedConstantSize = true; 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1082f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 1083f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1084f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 108583b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy final Drawable[] drawables = mDrawables; 108678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne mConstantWidth = mConstantHeight = -1; 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantMinimumWidth = mConstantMinimumHeight = 0; 108883b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy for (int i = 0; i < N; i++) { 1089f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable dr = drawables[i]; 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int s = dr.getIntrinsicWidth(); 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s > mConstantWidth) mConstantWidth = s; 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = dr.getIntrinsicHeight(); 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s > mConstantHeight) mConstantHeight = s; 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = dr.getMinimumWidth(); 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s > mConstantMinimumWidth) mConstantMinimumWidth = s; 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = dr.getMinimumHeight(); 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s > mConstantMinimumHeight) mConstantMinimumHeight = s; 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1101079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public final void setEnterFadeDuration(int duration) { 1102079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterFadeDuration = duration; 1103079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 1104079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 1105079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public final int getEnterFadeDuration() { 1106079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn return mEnterFadeDuration; 1107079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 1108079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 1109079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public final void setExitFadeDuration(int duration) { 1110079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitFadeDuration = duration; 1111079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 1112079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 1113079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public final int getExitFadeDuration() { 1114079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn return mExitFadeDuration; 1115079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 1116079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 111783b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getOpacity() { 1118f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (mCheckedOpacity) { 1119f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return mOpacity; 1120f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 1121f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1122f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 1123f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1124f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedOpacity = true; 1125f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1126f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 112783b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy final Drawable[] drawables = mDrawables; 1128f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int op = (N > 0) ? drawables[0].getOpacity() : PixelFormat.TRANSPARENT; 112983b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy for (int i = 1; i < N; i++) { 113083b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy op = Drawable.resolveOpacity(op, drawables[i].getOpacity()); 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1132f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpacity = op; 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return op; 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 113683b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean isStateful() { 1138f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (mCheckedStateful) { 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStateful; 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1141f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1142f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 1143f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1144f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedStateful = true; 1145f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1146f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 1147f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable[] drawables = mDrawables; 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 1149f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (drawables[i].isStateful()) { 1150f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mStateful = true; 1151f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return true; 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1154f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1155f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mStateful = false; 1156f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return false; 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 115983b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public void growArray(int oldSize, int newSize) { 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable[] newDrawables = new Drawable[newSize]; 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(mDrawables, 0, newDrawables, 0, oldSize); 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawables = newDrawables; 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized boolean canConstantState() { 1166f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (mCheckedConstantState) { 1167f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return mCanConstantState; 1168f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 1169f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1170f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 1171f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1172f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedConstantState = true; 1173f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1174f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 1175f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable[] drawables = mDrawables; 1176f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette for (int i = 0; i < N; i++) { 1177f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (drawables[i].getConstantState() == null) { 1178f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCanConstantState = false; 1179f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return false; 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1183f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCanConstantState = true; 1184f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return true; 1185f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 1186f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1187dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck /** @hide */ 1188dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck @Override 1189dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck public int addAtlasableBitmaps(Collection<Bitmap> atlasList) { 1190dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck final int N = mNumChildren; 1191dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck int pixelCount = 0; 1192dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck for (int i = 0; i < N; i++) { 1193dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck final ConstantState state = getChild(i).getConstantState(); 1194dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck if (state != null) { 1195dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck pixelCount += state.addAtlasableBitmaps(atlasList); 1196dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck } 1197dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck } 1198dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck return pixelCount; 1199dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck } 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1202f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette protected void setConstantState(DrawableContainerState state) { 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawableContainerState = state; 1204ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette 1205ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette // The locally cached drawables may have changed. 1206ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette if (mCurIndex >= 0) { 1207ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette mCurrDrawable = state.getChild(mCurIndex); 1208419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette if (mCurrDrawable != null) { 1209419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette initializeDrawableForDisplay(mCurrDrawable); 1210419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette } 1211ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette } 1212419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette 1213419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette // Clear out the last drawable. We don't have enough information to 1214419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette // propagate local state from the past. 1215419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette mLastIndex = -1; 1216419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette mLastDrawable = null; 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1219