DrawableContainer.java revision 6d823891bbfc043f2a8ba6b5d6e6baa84cf750f6
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 786d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette /** Callback that blocks invalidation. Used for drawable initialization. */ 796d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette private BlockInvalidateCallback mBlockInvalidateCallback; 806d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // overrides from Drawable 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void draw(Canvas canvas) { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable.draw(canvas); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 88079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 89079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.draw(canvas); 90079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 94ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette public @Config int getChangingConfigurations() { 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.getChangingConfigurations() 96e0f95f39c5a669a48ee3ebb8dc45bf2d7ee940f1Alan Viverette | mDrawableContainerState.getChangingConfigurations(); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 98f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 99600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio private boolean needsMirroring() { 100600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio return isAutoMirrored() && getLayoutDirection() == LayoutDirection.RTL; 101600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio } 102600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getPadding(Rect padding) { 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Rect r = mDrawableContainerState.getConstantPadding(); 106f7a93ef3847258157d144dfefaa5757128cc807dFabrice Di Meglio boolean result; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (r != null) { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project padding.set(r); 109f7a93ef3847258157d144dfefaa5757128cc807dFabrice Di Meglio result = (r.left | r.top | r.bottom | r.right) != 0; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 111600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio if (mCurrDrawable != null) { 112600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio result = mCurrDrawable.getPadding(padding); 113600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio } else { 114600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio result = super.getPadding(padding); 115600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 117600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio if (needsMirroring()) { 118600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio final int left = padding.left; 119600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio final int right = padding.right; 120600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio padding.left = right; 121600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio padding.right = left; 122600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio } 123600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio return result; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1261557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne /** 1271557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne * @hide 1281557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne */ 1291557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne @Override 1307b7578184567f4e4f0740ce935cc192765410ccaPhilip Milne public Insets getOpticalInsets() { 1318de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette if (mCurrDrawable != null) { 1328de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette return mCurrDrawable.getOpticalInsets(); 1338de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette } 1348de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette return Insets.NONE; 1351557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne } 1361557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13831ba192dd201df2cad96a8c503f730130ab0d80fChris Craik public void getOutline(@NonNull Outline outline) { 13958945975b256739fdfe78435d7846d1e2fd29da1Chris Craik if (mCurrDrawable != null) { 14031ba192dd201df2cad96a8c503f730130ab0d80fChris Craik mCurrDrawable.getOutline(outline); 14158945975b256739fdfe78435d7846d1e2fd29da1Chris Craik } 14258945975b256739fdfe78435d7846d1e2fd29da1Chris Craik } 14358945975b256739fdfe78435d7846d1e2fd29da1Chris Craik 14458945975b256739fdfe78435d7846d1e2fd29da1Chris Craik @Override 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAlpha(int alpha) { 14634bd56b546bce47422a430d9d7806dc3cb4254bfAlan Viverette if (!mHasAlpha || mAlpha != alpha) { 14734bd56b546bce47422a430d9d7806dc3cb4254bfAlan Viverette mHasAlpha = true; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAlpha = alpha; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 150079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd == 0) { 1519b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette mCurrDrawable.setAlpha(alpha); 152079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 153079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animate(false); 154079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 160b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase public int getAlpha() { 161b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase return mAlpha; 162b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase } 163b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase 164b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase @Override 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDither(boolean dither) { 166a41581ed4033004c73115113f45b9844e9b0210fRomain Guy if (mDrawableContainerState.mDither != dither) { 167a41581ed4033004c73115113f45b9844e9b0210fRomain Guy mDrawableContainerState.mDither = dither; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 1699b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette mCurrDrawable.setDither(mDrawableContainerState.mDither); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 175bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik public void setColorFilter(ColorFilter colorFilter) { 1766f51440a746ef4925ec329cd3a71a9689be2b10bAlan Viverette mDrawableContainerState.mHasColorFilter = true; 177729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette 178bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik if (mDrawableContainerState.mColorFilter != colorFilter) { 179bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik mDrawableContainerState.mColorFilter = colorFilter; 180729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 1829b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette mCurrDrawable.setColorFilter(colorFilter); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 186f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 187b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette @Override 188a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette public void setTintList(ColorStateList tint) { 189bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mDrawableContainerState.mHasTintList = true; 190b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 191bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette if (mDrawableContainerState.mTintList != tint) { 192bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mDrawableContainerState.mTintList = tint; 193a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette 194a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette if (mCurrDrawable != null) { 1959b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette mCurrDrawable.setTintList(tint); 196a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette } 197a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette } 198a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette } 199a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette 200a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette @Override 201a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette public void setTintMode(Mode tintMode) { 202bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mDrawableContainerState.mHasTintMode = true; 203a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette 204a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette if (mDrawableContainerState.mTintMode != tintMode) { 205b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette mDrawableContainerState.mTintMode = tintMode; 206b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 207b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette if (mCurrDrawable != null) { 2089b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette mCurrDrawable.setTintMode(tintMode); 209b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette } 210b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette } 211b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette } 212b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 213079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn /** 214079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * Change the global fade duration when a new drawable is entering 215079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * the scene. 216079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * @param ms The amount of time to fade in milliseconds. 217079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn */ 218079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void setEnterFadeDuration(int ms) { 219079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mDrawableContainerState.mEnterFadeDuration = ms; 220079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 221f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 222079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn /** 223079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * Change the global fade duration when a new drawable is leaving 224079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * the scene. 225079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * @param ms The amount of time to fade in milliseconds. 226079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn */ 227079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void setExitFadeDuration(int ms) { 228079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mDrawableContainerState.mExitFadeDuration = ms; 229079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 230f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onBoundsChange(Rect bounds) { 233079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 234079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.setBounds(bounds); 235079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable.setBounds(bounds); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 240f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isStateful() { 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.isStateful(); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 245f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2473f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio public void setAutoMirrored(boolean mirrored) { 248729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette if (mDrawableContainerState.mAutoMirrored != mirrored) { 249729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette mDrawableContainerState.mAutoMirrored = mirrored; 250729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette if (mCurrDrawable != null) { 2519b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette mCurrDrawable.setAutoMirrored(mDrawableContainerState.mAutoMirrored); 252729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette } 2533f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio } 2543f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio } 2553f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio 2563f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio @Override 2573f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio public boolean isAutoMirrored() { 2583f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio return mDrawableContainerState.mAutoMirrored; 2593f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio } 2603f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio 2613f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio @Override 262079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void jumpToCurrentState() { 263079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn boolean changed = false; 264079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 265079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.jumpToCurrentState(); 266079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable = null; 267ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette mLastIndex = -1; 268079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn changed = true; 269079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 270079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mCurrDrawable != null) { 271079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mCurrDrawable.jumpToCurrentState(); 272729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette if (mHasAlpha) { 2739b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette mCurrDrawable.setAlpha(mAlpha); 274729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette } 275079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 276079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mExitAnimationEnd != 0) { 277079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = 0; 278079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn changed = true; 279079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 280079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd != 0) { 281079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterAnimationEnd = 0; 282079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn changed = true; 283079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 284079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (changed) { 285079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn invalidateSelf(); 286079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 287079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 288079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 289079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn @Override 290c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette public void setHotspot(float x, float y) { 291307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette if (mCurrDrawable != null) { 292c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette mCurrDrawable.setHotspot(x, y); 293307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette } 294307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette } 295307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette 296307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette @Override 29753a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette public void setHotspotBounds(int left, int top, int right, int bottom) { 2987068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette if (mHotspotBounds == null) { 29927cf86939d918b2d6b32a0650a48b8a2afaa26b6Alexander Martinz mHotspotBounds = new Rect(left, top, right, bottom); 3007068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } else { 30127cf86939d918b2d6b32a0650a48b8a2afaa26b6Alexander Martinz mHotspotBounds.set(left, top, right, bottom); 3027068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } 3037068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette 30453a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette if (mCurrDrawable != null) { 30553a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette mCurrDrawable.setHotspotBounds(left, top, right, bottom); 30653a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette } 30753a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette } 30853a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette 3097068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette @Override 3107068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette public void getHotspotBounds(Rect outRect) { 3117068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette if (mHotspotBounds != null) { 3127068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette outRect.set(mHotspotBounds); 3137068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } else { 3147068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette super.getHotspotBounds(outRect); 3157068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } 3167068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } 3177068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette 31853a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette @Override 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean onStateChange(int[] state) { 320079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 321079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn return mLastDrawable.setState(state); 322079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable.setState(state); 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3300b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette protected boolean onLevelChange(int level) { 331079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 332079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn return mLastDrawable.setLevel(level); 333079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable.setLevel(level); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 341dfa4646eca54511a28f2c61e1f4b9c697e05a913Alan Viverette public boolean onLayoutDirectionChanged(@View.ResolvedLayoutDir int layoutDirection) { 342a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette // Let the container handle setting its own layout direction. Otherwise, 343a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette // we're accessing potentially unused states. 344a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return mDrawableContainerState.setLayoutDirection(layoutDirection, getCurrentIndex()); 345a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 346a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 347a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIntrinsicWidth() { 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.isConstantSize()) { 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.getConstantWidth(); 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable != null ? mCurrDrawable.getIntrinsicWidth() : -1; 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIntrinsicHeight() { 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.isConstantSize()) { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.getConstantHeight(); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable != null ? mCurrDrawable.getIntrinsicHeight() : -1; 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 362f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMinimumWidth() { 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.isConstantSize()) { 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.getConstantMinimumWidth(); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable != null ? mCurrDrawable.getMinimumWidth() : 0; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMinimumHeight() { 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.isConstantSize()) { 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.getConstantMinimumHeight(); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable != null ? mCurrDrawable.getMinimumHeight() : 0; 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37972146433322588c1116ee06c27ac758ad09d869cAlan Viverette @Override 380f6d87ec193f17e8dad82c9994ba7a58e975d364bAlan Viverette public void invalidateDrawable(@NonNull Drawable who) { 381f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (who == mCurrDrawable && getCallback() != null) { 382f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy getCallback().invalidateDrawable(this); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38672146433322588c1116ee06c27ac758ad09d869cAlan Viverette @Override 387f6d87ec193f17e8dad82c9994ba7a58e975d364bAlan Viverette public void scheduleDrawable(@NonNull Drawable who, @NonNull Runnable what, long when) { 388f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (who == mCurrDrawable && getCallback() != null) { 389f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy getCallback().scheduleDrawable(this, what, when); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39372146433322588c1116ee06c27ac758ad09d869cAlan Viverette @Override 394f6d87ec193f17e8dad82c9994ba7a58e975d364bAlan Viverette public void unscheduleDrawable(@NonNull Drawable who, @NonNull Runnable what) { 395f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (who == mCurrDrawable && getCallback() != null) { 396f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy getCallback().unscheduleDrawable(this, what); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean setVisible(boolean visible, boolean restart) { 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = super.setVisible(visible, restart); 403079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 404079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.setVisible(visible, restart); 405079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable.setVisible(visible, restart); 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return changed; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getOpacity() { 41483b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy return mCurrDrawable == null || !mCurrDrawable.isVisible() ? PixelFormat.TRANSPARENT : 41583b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy mDrawableContainerState.getOpacity(); 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4185e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette /** @hide */ 4195e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette public void setCurrentIndex(int index) { 4205e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette selectDrawable(index); 4215e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette } 4225e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette 4235e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette /** @hide */ 4245e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette public int getCurrentIndex() { 4255e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette return mCurIndex; 4265e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette } 4275e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette 428a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette /** 429a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette * Sets the currently displayed drawable by index. 430a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette * <p> 431a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette * If an invalid index is specified, the current drawable will be set to 432a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette * {@code null} and the index will be set to {@code -1}. 433a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette * 434a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette * @param index the index of the drawable to display 435a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette * @return {@code true} if the drawable changed, {@code false} otherwise 436a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette */ 437a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette public boolean selectDrawable(int index) { 438a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette if (index == mCurIndex) { 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 441079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 442079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn final long now = SystemClock.uptimeMillis(); 443079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 444a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette if (DEBUG) android.util.Log.i(TAG, toString() + " from " + mCurIndex + " to " + index 445079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn + ": exit=" + mDrawableContainerState.mExitFadeDuration 446079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn + " enter=" + mDrawableContainerState.mEnterFadeDuration); 447079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 448079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mDrawableContainerState.mExitFadeDuration > 0) { 449079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 450079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.setVisible(false, false); 451079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 453079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable = mCurrDrawable; 454ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette mLastIndex = mCurIndex; 455079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = now + mDrawableContainerState.mExitFadeDuration; 456079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 457079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable = null; 458ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette mLastIndex = -1; 459079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = 0; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 461079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else if (mCurrDrawable != null) { 462079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mCurrDrawable.setVisible(false, false); 463079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 464079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 465a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette if (index >= 0 && index < mDrawableContainerState.mNumChildren) { 466a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette final Drawable d = mDrawableContainerState.getChild(index); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable = d; 468a02d2748be353393b7b593d5adbd37d80dee427dAlan Viverette mCurIndex = index; 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 470079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mDrawableContainerState.mEnterFadeDuration > 0) { 471079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterAnimationEnd = now + mDrawableContainerState.mEnterFadeDuration; 4727068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } 473419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette initializeDrawableForDisplay(d); 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable = null; 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurIndex = -1; 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 479079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 480079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd != 0 || mExitAnimationEnd != 0) { 481079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mAnimationRunnable == null) { 482079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mAnimationRunnable = new Runnable() { 483079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn @Override public void run() { 484079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animate(true); 485079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn invalidateSelf(); 486079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 487079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn }; 488079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 489079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn unscheduleSelf(mAnimationRunnable); 490079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 491079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn // Compute first frame and schedule next animation. 492079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animate(true); 493079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 494079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidateSelf(); 496079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 499f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 500419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette /** 501419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette * Initializes a drawable for display in this container. 502419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette * 503419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette * @param d The drawable to initialize. 504419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette */ 505419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette private void initializeDrawableForDisplay(Drawable d) { 5066d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette if (mBlockInvalidateCallback == null) { 5076d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette mBlockInvalidateCallback = new BlockInvalidateCallback(); 5086d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette } 5096d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette 5102b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette // Temporary fix for suspending callbacks during initialization. We 5112b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette // don't want any of these setters causing an invalidate() since that 5122b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette // may call back into DrawableContainer. 5136d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette d.setCallback(mBlockInvalidateCallback.wrap(d.getCallback())); 5142b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette 5152b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette try { 5162b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette if (mDrawableContainerState.mEnterFadeDuration <= 0 && mHasAlpha) { 5172b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setAlpha(mAlpha); 518419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette } 519419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette 5202b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette if (mDrawableContainerState.mHasColorFilter) { 5212b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette // Color filter always overrides tint. 5222b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setColorFilter(mDrawableContainerState.mColorFilter); 5232b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette } else { 5242b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette if (mDrawableContainerState.mHasTintList) { 5252b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setTintList(mDrawableContainerState.mTintList); 5262b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette } 5272b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette if (mDrawableContainerState.mHasTintMode) { 5282b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setTintMode(mDrawableContainerState.mTintMode); 5292b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette } 5302b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette } 531419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette 5322b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setVisible(isVisible(), true); 5332b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setDither(mDrawableContainerState.mDither); 5342b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setState(getState()); 5352b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setLevel(getLevel()); 5362b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setBounds(getBounds()); 5372b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setLayoutDirection(getLayoutDirection()); 5382b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setAutoMirrored(mDrawableContainerState.mAutoMirrored); 5392b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette 5402b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette final Rect hotspotBounds = mHotspotBounds; 5412b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette if (hotspotBounds != null) { 5422b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette d.setHotspotBounds(hotspotBounds.left, hotspotBounds.top, 5432b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette hotspotBounds.right, hotspotBounds.bottom); 5442b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette } 5452b561f1c352df95df23e17e7fce2acc3144df159Alan Viverette } finally { 5466d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette d.setCallback(mBlockInvalidateCallback.unwrap()); 547419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette } 548419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette } 549419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette 550079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn void animate(boolean schedule) { 551729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette mHasAlpha = true; 552729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette 553079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn final long now = SystemClock.uptimeMillis(); 554079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn boolean animating = false; 555079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mCurrDrawable != null) { 556079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd != 0) { 557079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd <= now) { 5589b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette mCurrDrawable.setAlpha(mAlpha); 559079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterAnimationEnd = 0; 560079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 561079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn int animAlpha = (int)((mEnterAnimationEnd-now)*255) 562079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn / mDrawableContainerState.mEnterFadeDuration; 5639b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette mCurrDrawable.setAlpha(((255-animAlpha)*mAlpha)/255); 564079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animating = true; 565079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 566079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 567079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 568079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterAnimationEnd = 0; 569079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 570079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 571079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mExitAnimationEnd != 0) { 572079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mExitAnimationEnd <= now) { 573079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.setVisible(false, false); 574079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable = null; 575ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette mLastIndex = -1; 576079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = 0; 577079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 578079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn int animAlpha = (int)((mExitAnimationEnd-now)*255) 579079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn / mDrawableContainerState.mExitFadeDuration; 5809b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette mLastDrawable.setAlpha((animAlpha*mAlpha)/255); 581079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animating = true; 582079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 583079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 584079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 585079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = 0; 586079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 587079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 588079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (schedule && animating) { 5898dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette scheduleSelf(mAnimationRunnable, now + 1000 / 60); 590079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 591079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 592079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getCurrent() { 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable; 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 598f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette /** 599f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette * Updates the source density based on the resources used to inflate 600f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette * density-dependent values. Implementing classes should call this method 601f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette * during inflation. 602f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette * 603f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette * @param res the resources used to inflate density-dependent values 604f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette */ 605f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette final void updateDensity(Resources res) { 606f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mDrawableContainerState.updateDensity(res); 607f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette } 608f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 61052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public void applyTheme(Theme theme) { 61152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette mDrawableContainerState.applyTheme(theme); 61252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 61352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 61452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette @Override 61552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public boolean canApplyTheme() { 61652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return mDrawableContainerState.canApplyTheme(); 61752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 61852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 61952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette @Override 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ConstantState getConstantState() { 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.canConstantState()) { 6226efd2bad954e0e5bd74916a32f036a0f149dcd4dChristopher Lais mDrawableContainerState.mChangingConfigurations = getChangingConfigurations(); 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState; 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable mutate() { 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mMutated && super.mutate() == this) { 6315ed8f27858dbdf85203068eca46eef0a65f3344eAlan Viverette final DrawableContainerState clone = cloneConstantState(); 6325ed8f27858dbdf85203068eca46eef0a65f3344eAlan Viverette clone.mutate(); 6335ed8f27858dbdf85203068eca46eef0a65f3344eAlan Viverette setConstantState(clone); 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMutated = true; 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63978aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne /** 6408dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette * Returns a shallow copy of the container's constant state to be used as 6418dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette * the base state for {@link #mutate()}. 6428dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette * 6438dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette * @return a shallow copy of the constant state 6448dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette */ 6458dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette DrawableContainerState cloneConstantState() { 6468dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette return mDrawableContainerState; 6478dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette } 6488dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette 6498dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette /** 650727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette * @hide 651727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette */ 652727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette public void clearMutated() { 653727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette super.clearMutated(); 654727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette mDrawableContainerState.clearMutated(); 655727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette mMutated = false; 656727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette } 657727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette 658727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette /** 65978aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * A ConstantState that can contain several {@link Drawable}s. 66078aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * 66178aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * This class was made public to enable testing, and its visibility may change in a future 66278aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * release. 66378aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne */ 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract static class DrawableContainerState extends ConstantState { 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final DrawableContainer mOwner; 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 667f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette Resources mSourceRes; 668f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette int mDensity = DisplayMetrics.DENSITY_DEFAULT; 669ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette @Config int mChangingConfigurations; 670ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette @Config int mChildrenChangingConfigurations; 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6721259f616c26f89dd5000745d7c364fae41b23682Alan Viverette SparseArray<ConstantState> mDrawableFutures; 673f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette Drawable[] mDrawables; 674f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mNumChildren; 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 676d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette boolean mVariablePadding = false; 677f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette boolean mCheckedPadding; 678f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette Rect mConstantPadding; 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 680d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette boolean mConstantSize = false; 681f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette boolean mCheckedConstantSize; 682f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mConstantWidth; 683f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mConstantHeight; 684f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mConstantMinimumWidth; 685f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mConstantMinimumHeight; 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 687f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mCheckedOpacity; 688f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mOpacity; 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 690f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mCheckedStateful; 691f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mStateful; 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 693f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mCheckedConstantState; 694f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mCanConstantState; 6955140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy 696f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mDither = DEFAULT_DITHER; 697f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 698f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mMutated; 699f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mLayoutDirection; 700f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 701d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette int mEnterFadeDuration = 0; 702d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette int mExitFadeDuration = 0; 703079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 7043f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio boolean mAutoMirrored; 7053f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio 706d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette ColorFilter mColorFilter; 707729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette boolean mHasColorFilter; 708d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette 709bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette ColorStateList mTintList; 710b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette Mode mTintMode; 711bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette boolean mHasTintList; 712bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette boolean mHasTintMode; 713b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 714c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn DrawableContainerState(DrawableContainerState orig, DrawableContainer owner, 715c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn Resources res) { 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOwner = owner; 717ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette mSourceRes = res != null ? res : (orig != null ? orig.mSourceRes : null); 718ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette mDensity = Drawable.resolveDensity(res, orig != null ? orig.mDensity : 0); 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (orig != null) { 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChangingConfigurations = orig.mChangingConfigurations; 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildrenChangingConfigurations = orig.mChildrenChangingConfigurations; 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 724f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedConstantState = true; 725f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCanConstantState = true; 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVariablePadding = orig.mVariablePadding; 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantSize = orig.mConstantSize; 729a41581ed4033004c73115113f45b9844e9b0210fRomain Guy mDither = orig.mDither; 730f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mMutated = orig.mMutated; 731f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mLayoutDirection = orig.mLayoutDirection; 732079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterFadeDuration = orig.mEnterFadeDuration; 733079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitFadeDuration = orig.mExitFadeDuration; 7343f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio mAutoMirrored = orig.mAutoMirrored; 735d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette mColorFilter = orig.mColorFilter; 736729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette mHasColorFilter = orig.mHasColorFilter; 737bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mTintList = orig.mTintList; 738b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette mTintMode = orig.mTintMode; 739bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mHasTintList = orig.mHasTintList; 740bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mHasTintMode = orig.mHasTintMode; 741079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 742ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette if (orig.mDensity == mDensity) { 743f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette if (orig.mCheckedPadding) { 744f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mConstantPadding = new Rect(orig.mConstantPadding); 745f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mCheckedPadding = true; 746f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette } 747f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 748f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette if (orig.mCheckedConstantSize) { 749f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mConstantWidth = orig.mConstantWidth; 750f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mConstantHeight = orig.mConstantHeight; 751f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mConstantMinimumWidth = orig.mConstantMinimumWidth; 752f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mConstantMinimumHeight = orig.mConstantMinimumHeight; 753f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mCheckedConstantSize = true; 754f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette } 755f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette } 756f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 757f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette if (orig.mCheckedOpacity) { 758f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mOpacity = orig.mOpacity; 759f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mCheckedOpacity = true; 760f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette } 761f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 762f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette if (orig.mCheckedStateful) { 763f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mStateful = orig.mStateful; 764f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mCheckedStateful = true; 765f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette } 766f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 767f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // Postpone cloning children and futures until we're absolutely 768f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // sure that we're done computing values for the original state. 769f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable[] origDr = orig.mDrawables; 770f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawables = new Drawable[origDr.length]; 771f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mNumChildren = orig.mNumChildren; 772f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 7731259f616c26f89dd5000745d7c364fae41b23682Alan Viverette final SparseArray<ConstantState> origDf = orig.mDrawableFutures; 774f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (origDf != null) { 775f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawableFutures = origDf.clone(); 776f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } else { 77706ff2af68aa1041eeb26778e994e0fe196bf8b1eAlan Viverette mDrawableFutures = new SparseArray<>(mNumChildren); 778f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 779f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 78062b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette // Create futures for drawables with constant states. If a 78162b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette // drawable doesn't have a constant state, then we can't clone 78262b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette // it and we'll have to reference the original. 783f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 784f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette for (int i = 0; i < N; i++) { 785f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (origDr[i] != null) { 7861259f616c26f89dd5000745d7c364fae41b23682Alan Viverette final ConstantState cs = origDr[i].getConstantState(); 7871259f616c26f89dd5000745d7c364fae41b23682Alan Viverette if (cs != null) { 7881259f616c26f89dd5000745d7c364fae41b23682Alan Viverette mDrawableFutures.put(i, cs); 78962b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette } else { 79062b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette mDrawables[i] = origDr[i]; 79162b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette } 792f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 793f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawables = new Drawable[10]; 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNumChildren = 0; 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 799f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 801ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette public @Config int getChangingConfigurations() { 802dc25d25333d3fac96dccfb9bd31d2474d6bc2d78Fabrice Di Meglio return mChangingConfigurations | mChildrenChangingConfigurations; 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 805a24c9b4791dddc2dbc233dfe8dac1ae682beb272Alan Viverette /** 806a24c9b4791dddc2dbc233dfe8dac1ae682beb272Alan Viverette * Adds the drawable to the end of the list of contained drawables. 807a24c9b4791dddc2dbc233dfe8dac1ae682beb272Alan Viverette * 808a24c9b4791dddc2dbc233dfe8dac1ae682beb272Alan Viverette * @param dr the drawable to add 809a24c9b4791dddc2dbc233dfe8dac1ae682beb272Alan Viverette * @return the position of the drawable within the container 810a24c9b4791dddc2dbc233dfe8dac1ae682beb272Alan Viverette */ 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int addChild(Drawable dr) { 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int pos = mNumChildren; 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos >= mDrawables.length) { 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project growArray(pos, pos+10); 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 817a24c9b4791dddc2dbc233dfe8dac1ae682beb272Alan Viverette dr.mutate(); 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dr.setVisible(false, true); 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dr.setCallback(mOwner); 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawables[pos] = dr; 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNumChildren++; 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildrenChangingConfigurations |= dr.getChangingConfigurations(); 824f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedStateful = false; 825f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedOpacity = false; 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantPadding = null; 828f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mCheckedPadding = false; 829f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mCheckedConstantSize = false; 8305291a9571580d5147331adbdefb017fa395df505Alan Viverette mCheckedConstantState = false; 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pos; 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 83572146433322588c1116ee06c27ac758ad09d869cAlan Viverette final int getCapacity() { 83672146433322588c1116ee06c27ac758ad09d869cAlan Viverette return mDrawables.length; 83772146433322588c1116ee06c27ac758ad09d869cAlan Viverette } 83872146433322588c1116ee06c27ac758ad09d869cAlan Viverette 8391259f616c26f89dd5000745d7c364fae41b23682Alan Viverette private void createAllFutures() { 840f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (mDrawableFutures != null) { 841f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int futureCount = mDrawableFutures.size(); 842f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette for (int keyIndex = 0; keyIndex < futureCount; keyIndex++) { 843f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int index = mDrawableFutures.keyAt(keyIndex); 8441259f616c26f89dd5000745d7c364fae41b23682Alan Viverette final ConstantState cs = mDrawableFutures.valueAt(keyIndex); 8451259f616c26f89dd5000745d7c364fae41b23682Alan Viverette mDrawables[index] = prepareDrawable(cs.newDrawable(mSourceRes)); 846f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 847f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 848f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawableFutures = null; 849f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 850f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 851f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 8521259f616c26f89dd5000745d7c364fae41b23682Alan Viverette private Drawable prepareDrawable(Drawable child) { 8531259f616c26f89dd5000745d7c364fae41b23682Alan Viverette child.setLayoutDirection(mLayoutDirection); 8541259f616c26f89dd5000745d7c364fae41b23682Alan Viverette child.setCallback(mOwner); 8559b4bdeff6dea5a24a3085a17d2dde9003642af79Alan Viverette child = child.mutate(); 8561259f616c26f89dd5000745d7c364fae41b23682Alan Viverette return child; 8571259f616c26f89dd5000745d7c364fae41b23682Alan Viverette } 8581259f616c26f89dd5000745d7c364fae41b23682Alan Viverette 85983b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getChildCount() { 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNumChildren; 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 86372146433322588c1116ee06c27ac758ad09d869cAlan Viverette /* 86472146433322588c1116ee06c27ac758ad09d869cAlan Viverette * @deprecated Use {@link #getChild} instead. 86572146433322588c1116ee06c27ac758ad09d869cAlan Viverette */ 86683b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final Drawable[] getChildren() { 867f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // Create all futures for backwards compatibility. 868f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 869f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawables; 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 87372146433322588c1116ee06c27ac758ad09d869cAlan Viverette public final Drawable getChild(int index) { 874f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable result = mDrawables[index]; 875f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (result != null) { 876f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return result; 877f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 878f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 879f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // Prepare future drawable if necessary. 880f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (mDrawableFutures != null) { 881f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int keyIndex = mDrawableFutures.indexOfKey(index); 882f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (keyIndex >= 0) { 8831259f616c26f89dd5000745d7c364fae41b23682Alan Viverette final ConstantState cs = mDrawableFutures.valueAt(keyIndex); 8841259f616c26f89dd5000745d7c364fae41b23682Alan Viverette final Drawable prepared = prepareDrawable(cs.newDrawable(mSourceRes)); 885f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawables[index] = prepared; 886f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawableFutures.removeAt(keyIndex); 88706ff2af68aa1041eeb26778e994e0fe196bf8b1eAlan Viverette if (mDrawableFutures.size() == 0) { 88806ff2af68aa1041eeb26778e994e0fe196bf8b1eAlan Viverette mDrawableFutures = null; 88906ff2af68aa1041eeb26778e994e0fe196bf8b1eAlan Viverette } 890f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return prepared; 891f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 892f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 893f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 894f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return null; 895f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 896f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 897a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette final boolean setLayoutDirection(int layoutDirection, int currentIndex) { 898a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette boolean changed = false; 899a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 900f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // No need to call createAllFutures, since future drawables will 901f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // change layout direction when they are prepared. 902f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 903f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable[] drawables = mDrawables; 904f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette for (int i = 0; i < N; i++) { 905f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (drawables[i] != null) { 906a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette final boolean childChanged = drawables[i].setLayoutDirection(layoutDirection); 907a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (i == currentIndex) { 908a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette changed = childChanged; 909a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 910f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 911f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 912f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 913f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mLayoutDirection = layoutDirection; 914a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 915a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return changed; 91672146433322588c1116ee06c27ac758ad09d869cAlan Viverette } 91772146433322588c1116ee06c27ac758ad09d869cAlan Viverette 918f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette /** 919f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette * Updates the source density based on the resources used to inflate 920f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette * density-dependent values. 921f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette * 922f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette * @param res the resources used to inflate density-dependent values 923f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette */ 924f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette final void updateDensity(Resources res) { 9252d3ca47ef83c097e3a1aaa66f2d119be0e93e677Alan Viverette if (res != null) { 926f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mSourceRes = res; 927f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette 9282d3ca47ef83c097e3a1aaa66f2d119be0e93e677Alan Viverette // The density may have changed since the last update (if any). Any 9292d3ca47ef83c097e3a1aaa66f2d119be0e93e677Alan Viverette // dimension-type attributes will need their default values scaled. 9302d3ca47ef83c097e3a1aaa66f2d119be0e93e677Alan Viverette final int targetDensity = Drawable.resolveDensity(res, mDensity); 9312d3ca47ef83c097e3a1aaa66f2d119be0e93e677Alan Viverette final int sourceDensity = mDensity; 9322d3ca47ef83c097e3a1aaa66f2d119be0e93e677Alan Viverette mDensity = targetDensity; 933f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette 9342d3ca47ef83c097e3a1aaa66f2d119be0e93e677Alan Viverette if (sourceDensity != targetDensity) { 9352d3ca47ef83c097e3a1aaa66f2d119be0e93e677Alan Viverette mCheckedConstantSize = false; 9362d3ca47ef83c097e3a1aaa66f2d119be0e93e677Alan Viverette mCheckedPadding = false; 9372d3ca47ef83c097e3a1aaa66f2d119be0e93e677Alan Viverette } 938f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette } 939f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette } 940f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette 94152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final void applyTheme(Theme theme) { 94217cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette if (theme != null) { 94317cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette createAllFutures(); 94417cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette 94517cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette final int N = mNumChildren; 94617cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette final Drawable[] drawables = mDrawables; 94717cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette for (int i = 0; i < N; i++) { 94817cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette if (drawables[i] != null && drawables[i].canApplyTheme()) { 94917cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette drawables[i].applyTheme(theme); 950e0f95f39c5a669a48ee3ebb8dc45bf2d7ee940f1Alan Viverette 951e0f95f39c5a669a48ee3ebb8dc45bf2d7ee940f1Alan Viverette // Update cached mask of child changing configurations. 952e0f95f39c5a669a48ee3ebb8dc45bf2d7ee940f1Alan Viverette mChildrenChangingConfigurations |= drawables[i].getChangingConfigurations(); 95317cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette } 95452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 955f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette 956f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette updateDensity(theme.getResources()); 95752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 95852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 95952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 96052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette @Override 96152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public boolean canApplyTheme() { 96252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final int N = mNumChildren; 96352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final Drawable[] drawables = mDrawables; 96452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette for (int i = 0; i < N; i++) { 965b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette final Drawable d = drawables[i]; 96652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (d != null) { 96752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (d.canApplyTheme()) { 96852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return true; 96952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 97052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } else { 9711259f616c26f89dd5000745d7c364fae41b23682Alan Viverette final ConstantState future = mDrawableFutures.get(i); 97252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (future != null && future.canApplyTheme()) { 97352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return true; 97452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 97552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 97652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 97752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 97852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return false; 97952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 98052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 9818dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette private void mutate() { 982f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // No need to call createAllFutures, since future drawables will 983f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // mutate when they are prepared. 984f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 98572146433322588c1116ee06c27ac758ad09d869cAlan Viverette final Drawable[] drawables = mDrawables; 98672146433322588c1116ee06c27ac758ad09d869cAlan Viverette for (int i = 0; i < N; i++) { 987f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (drawables[i] != null) { 988f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette drawables[i].mutate(); 989f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 99072146433322588c1116ee06c27ac758ad09d869cAlan Viverette } 991f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 992f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mMutated = true; 99372146433322588c1116ee06c27ac758ad09d869cAlan Viverette } 99472146433322588c1116ee06c27ac758ad09d869cAlan Viverette 995727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette final void clearMutated() { 996727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette final int N = mNumChildren; 997727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette final Drawable[] drawables = mDrawables; 998727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette for (int i = 0; i < N; i++) { 999727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette if (drawables[i] != null) { 1000727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette drawables[i].clearMutated(); 1001727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette } 1002727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette } 1003727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette 1004727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette mMutated = false; 1005727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette } 1006727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette 1007f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette /** 1008f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * A boolean value indicating whether to use the maximum padding value 1009f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * of all frames in the set (false), or to use the padding value of the 1010f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * frame being shown (true). Default value is false. 1011f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette */ 101283b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final void setVariablePadding(boolean variable) { 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVariablePadding = variable; 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 101683b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final Rect getConstantPadding() { 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mVariablePadding) { 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1020f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1021f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette if ((mConstantPadding != null) || mCheckedPadding) { 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantPadding; 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1025f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 1026f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 10275140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy Rect r = null; 102883b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy final Rect t = new Rect(); 1029f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 103083b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy final Drawable[] drawables = mDrawables; 103183b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy for (int i = 0; i < N; i++) { 103283b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy if (drawables[i].getPadding(t)) { 10335140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy if (r == null) r = new Rect(0, 0, 0, 0); 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.left > r.left) r.left = t.left; 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.top > r.top) r.top = t.top; 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.right > r.right) r.right = t.right; 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.bottom > r.bottom) r.bottom = t.bottom; 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1040f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1041f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mCheckedPadding = true; 10425140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy return (mConstantPadding = r); 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 104583b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final void setConstantSize(boolean constant) { 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantSize = constant; 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 104983b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final boolean isConstantSize() { 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantSize; 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 105383b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getConstantWidth() { 1054f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette if (!mCheckedConstantSize) { 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeConstantSize(); 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantWidth; 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 106183b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getConstantHeight() { 1062f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette if (!mCheckedConstantSize) { 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeConstantSize(); 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantHeight; 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 106983b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getConstantMinimumWidth() { 1070f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette if (!mCheckedConstantSize) { 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeConstantSize(); 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantMinimumWidth; 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 107783b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getConstantMinimumHeight() { 1078f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette if (!mCheckedConstantSize) { 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeConstantSize(); 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantMinimumHeight; 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 108578aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne protected void computeConstantSize() { 1086f1f5f6fcaa768c5b88e9a56f18cbd6ecf72755a8Alan Viverette mCheckedConstantSize = true; 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1088f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 1089f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1090f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 109183b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy final Drawable[] drawables = mDrawables; 109278aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne mConstantWidth = mConstantHeight = -1; 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantMinimumWidth = mConstantMinimumHeight = 0; 109483b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy for (int i = 0; i < N; i++) { 1095f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable dr = drawables[i]; 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int s = dr.getIntrinsicWidth(); 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s > mConstantWidth) mConstantWidth = s; 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = dr.getIntrinsicHeight(); 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s > mConstantHeight) mConstantHeight = s; 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = dr.getMinimumWidth(); 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s > mConstantMinimumWidth) mConstantMinimumWidth = s; 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = dr.getMinimumHeight(); 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s > mConstantMinimumHeight) mConstantMinimumHeight = s; 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1107079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public final void setEnterFadeDuration(int duration) { 1108079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterFadeDuration = duration; 1109079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 1110079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 1111079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public final int getEnterFadeDuration() { 1112079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn return mEnterFadeDuration; 1113079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 1114079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 1115079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public final void setExitFadeDuration(int duration) { 1116079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitFadeDuration = duration; 1117079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 1118079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 1119079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public final int getExitFadeDuration() { 1120079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn return mExitFadeDuration; 1121079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 1122079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 112383b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getOpacity() { 1124f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (mCheckedOpacity) { 1125f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return mOpacity; 1126f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 1127f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1128f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 1129f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1130f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedOpacity = true; 1131f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1132f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 113383b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy final Drawable[] drawables = mDrawables; 1134f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int op = (N > 0) ? drawables[0].getOpacity() : PixelFormat.TRANSPARENT; 113583b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy for (int i = 1; i < N; i++) { 113683b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy op = Drawable.resolveOpacity(op, drawables[i].getOpacity()); 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1138f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpacity = op; 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return op; 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 114283b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean isStateful() { 1144f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (mCheckedStateful) { 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStateful; 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1147f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1148f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 1149f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1150f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedStateful = true; 1151f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1152f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 1153f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable[] drawables = mDrawables; 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 1155f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (drawables[i].isStateful()) { 1156f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mStateful = true; 1157f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return true; 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1160f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1161f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mStateful = false; 1162f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return false; 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 116583b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public void growArray(int oldSize, int newSize) { 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable[] newDrawables = new Drawable[newSize]; 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(mDrawables, 0, newDrawables, 0, oldSize); 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawables = newDrawables; 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized boolean canConstantState() { 1172f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (mCheckedConstantState) { 1173f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return mCanConstantState; 1174f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 1175f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1176f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 1177f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1178f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedConstantState = true; 1179f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1180f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 1181f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable[] drawables = mDrawables; 1182f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette for (int i = 0; i < N; i++) { 1183f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (drawables[i].getConstantState() == null) { 1184f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCanConstantState = false; 1185f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return false; 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCanConstantState = true; 1190f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return true; 1191f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 1192f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1193dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck /** @hide */ 1194dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck @Override 1195dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck public int addAtlasableBitmaps(Collection<Bitmap> atlasList) { 1196dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck final int N = mNumChildren; 1197dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck int pixelCount = 0; 1198dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck for (int i = 0; i < N; i++) { 1199dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck final ConstantState state = getChild(i).getConstantState(); 1200dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck if (state != null) { 1201dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck pixelCount += state.addAtlasableBitmaps(atlasList); 1202dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck } 1203dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck } 1204dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck return pixelCount; 1205dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck } 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1208f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette protected void setConstantState(DrawableContainerState state) { 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawableContainerState = state; 1210ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette 1211ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette // The locally cached drawables may have changed. 1212ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette if (mCurIndex >= 0) { 1213ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette mCurrDrawable = state.getChild(mCurIndex); 1214419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette if (mCurrDrawable != null) { 1215419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette initializeDrawableForDisplay(mCurrDrawable); 1216419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette } 1217ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette } 1218419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette 1219419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette // Clear out the last drawable. We don't have enough information to 1220419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette // propagate local state from the past. 1221419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette mLastIndex = -1; 1222419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette mLastDrawable = null; 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12246d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette 12256d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette /** 12266d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette * Callback that blocks drawable invalidation. 12276d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette */ 12286d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette private static class BlockInvalidateCallback implements Drawable.Callback { 12296d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette private Drawable.Callback mCallback; 12306d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette 12316d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette public BlockInvalidateCallback wrap(Drawable.Callback callback) { 12326d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette mCallback = callback; 12336d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette return this; 12346d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette } 12356d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette 12366d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette public Drawable.Callback unwrap() { 12376d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette final Drawable.Callback callback = mCallback; 12386d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette mCallback = null; 12396d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette return callback; 12406d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette } 12416d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette 12426d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette @Override 12436d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette public void invalidateDrawable(@NonNull Drawable who) { 12446d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette // Ignore invalidation. 12456d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette } 12466d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette 12476d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette @Override 12486d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette public void scheduleDrawable(@NonNull Drawable who, @NonNull Runnable what, long when) { 12496d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette if (mCallback != null) { 12506d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette mCallback.scheduleDrawable(who, what, when); 12516d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette } 12526d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette } 12536d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette 12546d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette @Override 12556d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette public void unscheduleDrawable(@NonNull Drawable who, @NonNull Runnable what) { 12566d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette if (mCallback != null) { 12576d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette mCallback.unscheduleDrawable(who, what); 12586d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette } 12596d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette } 12606d823891bbfc043f2a8ba6b5d6e6baa84cf750f6Alan Viverette } 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1262