DrawableContainer.java revision 17cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8b
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.graphics.drawable; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1958945975b256739fdfe78435d7846d1e2fd29da1Chris Craikimport android.annotation.NonNull; 20b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.content.res.ColorStateList; 21c2974809373697147cbe5754835cc871fb93aef1Dianne Hackbornimport android.content.res.Resources; 2252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viveretteimport android.content.res.Resources.Theme; 2378aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Canvas; 2478aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.ColorFilter; 25bbd51f1e360b22eece1d74bd65c7e6a0b59dee59Philip Milneimport android.graphics.Insets; 2658945975b256739fdfe78435d7846d1e2fd29da1Chris Craikimport android.graphics.Outline; 2778aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.PixelFormat; 2878aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Rect; 29b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.PorterDuff.Mode; 30079e23575024e103358c982152afb7a720ae1a8aDianne Hackbornimport android.os.SystemClock; 31600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglioimport android.util.LayoutDirection; 32f390f770ee570f1f4def41b165cb9492e381be40Alan Viveretteimport android.util.SparseArray; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3478aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne/** 3578aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * A helper class that contains several {@link Drawable}s and selects which one to use. 3678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * 3778aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * You can subclass it to create your own DrawableContainers or directly use one its child classes. 3878aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne */ 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class DrawableContainer extends Drawable implements Drawable.Callback { 40079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private static final boolean DEBUG = false; 41079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private static final String TAG = "DrawableContainer"; 42211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed 43211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed /** 44211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * To be proper, we should have a getter for dither (and alpha, etc.) 45211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * so that proxy classes like this can save/restore their delegates' 46211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * values, but we don't have getters. Since we do have setters 47211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * (e.g. setDither), which this proxy forwards on, we have to have some 48211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * default/initial setting. 49211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * 50211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * The initial setting for dither is now true, since it almost always seems 51211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * to improve the quality at negligible cost. 52211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed */ 53211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed private static final boolean DEFAULT_DITHER = true; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private DrawableContainerState mDrawableContainerState; 557068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette private Rect mHotspotBounds; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mCurrDrawable; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mAlpha = 0xFF; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 59729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette /** Whether setAlpha() has been called at least once. */ 60729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette private boolean mHasAlpha; 61729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mCurIndex = -1; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mMutated; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 65079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn // Animations. 66079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private Runnable mAnimationRunnable; 67079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private long mEnterAnimationEnd; 68079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private long mExitAnimationEnd; 69079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private Drawable mLastDrawable; 70079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // overrides from Drawable 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void draw(Canvas canvas) { 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable.draw(canvas); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 79079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.draw(canvas); 80079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getChangingConfigurations() { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.getChangingConfigurations() 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | mDrawableContainerState.mChangingConfigurations 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | mDrawableContainerState.mChildrenChangingConfigurations; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 90600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio private boolean needsMirroring() { 91600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio return isAutoMirrored() && getLayoutDirection() == LayoutDirection.RTL; 92600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio } 93600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getPadding(Rect padding) { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Rect r = mDrawableContainerState.getConstantPadding(); 97f7a93ef3847258157d144dfefaa5757128cc807dFabrice Di Meglio boolean result; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (r != null) { 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project padding.set(r); 100f7a93ef3847258157d144dfefaa5757128cc807dFabrice Di Meglio result = (r.left | r.top | r.bottom | r.right) != 0; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 102600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio if (mCurrDrawable != null) { 103600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio result = mCurrDrawable.getPadding(padding); 104600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio } else { 105600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio result = super.getPadding(padding); 106600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio } 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 108600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio if (needsMirroring()) { 109600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio final int left = padding.left; 110600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio final int right = padding.right; 111600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio padding.left = right; 112600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio padding.right = left; 113600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio } 114600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio return result; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1171557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne /** 1181557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne * @hide 1191557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne */ 1201557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne @Override 1217b7578184567f4e4f0740ce935cc192765410ccaPhilip Milne public Insets getOpticalInsets() { 1228de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette if (mCurrDrawable != null) { 1238de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette return mCurrDrawable.getOpticalInsets(); 1248de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette } 1258de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette return Insets.NONE; 1261557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne } 1271557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12931ba192dd201df2cad96a8c503f730130ab0d80fChris Craik public void getOutline(@NonNull Outline outline) { 13058945975b256739fdfe78435d7846d1e2fd29da1Chris Craik if (mCurrDrawable != null) { 13131ba192dd201df2cad96a8c503f730130ab0d80fChris Craik mCurrDrawable.getOutline(outline); 13258945975b256739fdfe78435d7846d1e2fd29da1Chris Craik } 13358945975b256739fdfe78435d7846d1e2fd29da1Chris Craik } 13458945975b256739fdfe78435d7846d1e2fd29da1Chris Craik 13558945975b256739fdfe78435d7846d1e2fd29da1Chris Craik @Override 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAlpha(int alpha) { 13734bd56b546bce47422a430d9d7806dc3cb4254bfAlan Viverette if (!mHasAlpha || mAlpha != alpha) { 13834bd56b546bce47422a430d9d7806dc3cb4254bfAlan Viverette mHasAlpha = true; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAlpha = alpha; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 141079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd == 0) { 1425f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy mCurrDrawable.mutate().setAlpha(alpha); 143079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 144079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animate(false); 145079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 151b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase public int getAlpha() { 152b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase return mAlpha; 153b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase } 154b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase 155b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase @Override 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDither(boolean dither) { 157a41581ed4033004c73115113f45b9844e9b0210fRomain Guy if (mDrawableContainerState.mDither != dither) { 158a41581ed4033004c73115113f45b9844e9b0210fRomain Guy mDrawableContainerState.mDither = dither; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 1605f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy mCurrDrawable.mutate().setDither(mDrawableContainerState.mDither); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setColorFilter(ColorFilter cf) { 167b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette mDrawableContainerState.mHasColorFilter = (cf != null); 168729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette 169d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette if (mDrawableContainerState.mColorFilter != cf) { 170d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette mDrawableContainerState.mColorFilter = cf; 171729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 1735f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy mCurrDrawable.mutate().setColorFilter(cf); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 177f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 178b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette @Override 179a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette public void setTintList(ColorStateList tint) { 180bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mDrawableContainerState.mHasTintList = true; 181b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 182bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette if (mDrawableContainerState.mTintList != tint) { 183bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mDrawableContainerState.mTintList = tint; 184a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette 185a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette if (mCurrDrawable != null) { 186a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette mCurrDrawable.mutate().setTintList(tint); 187a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette } 188a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette } 189a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette } 190a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette 191a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette @Override 192a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette public void setTintMode(Mode tintMode) { 193bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mDrawableContainerState.mHasTintMode = true; 194a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette 195a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette if (mDrawableContainerState.mTintMode != tintMode) { 196b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette mDrawableContainerState.mTintMode = tintMode; 197b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 198b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette if (mCurrDrawable != null) { 199a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette mCurrDrawable.mutate().setTintMode(tintMode); 200b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette } 201b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette } 202b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette } 203b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 204079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn /** 205079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * Change the global fade duration when a new drawable is entering 206079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * the scene. 207079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * @param ms The amount of time to fade in milliseconds. 208079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn */ 209079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void setEnterFadeDuration(int ms) { 210079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mDrawableContainerState.mEnterFadeDuration = ms; 211079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 212f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 213079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn /** 214079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * Change the global fade duration when a new drawable is leaving 215079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * the scene. 216079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * @param ms The amount of time to fade in milliseconds. 217079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn */ 218079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void setExitFadeDuration(int ms) { 219079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mDrawableContainerState.mExitFadeDuration = ms; 220079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 221f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onBoundsChange(Rect bounds) { 224079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 225079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.setBounds(bounds); 226079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable.setBounds(bounds); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 231f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isStateful() { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.isStateful(); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 236f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2383f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio public void setAutoMirrored(boolean mirrored) { 239729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette if (mDrawableContainerState.mAutoMirrored != mirrored) { 240729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette mDrawableContainerState.mAutoMirrored = mirrored; 241729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette if (mCurrDrawable != null) { 242729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette mCurrDrawable.mutate().setAutoMirrored(mDrawableContainerState.mAutoMirrored); 243729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette } 2443f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio } 2453f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio } 2463f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio 2473f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio @Override 2483f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio public boolean isAutoMirrored() { 2493f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio return mDrawableContainerState.mAutoMirrored; 2503f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio } 2513f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio 2523f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio @Override 253079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void jumpToCurrentState() { 254079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn boolean changed = false; 255079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 256079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.jumpToCurrentState(); 257079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable = null; 258079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn changed = true; 259079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 260079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mCurrDrawable != null) { 261079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mCurrDrawable.jumpToCurrentState(); 262729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette if (mHasAlpha) { 263729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette mCurrDrawable.mutate().setAlpha(mAlpha); 264729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette } 265079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 266079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mExitAnimationEnd != 0) { 267079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = 0; 268079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn changed = true; 269079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 270079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd != 0) { 271079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterAnimationEnd = 0; 272079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn changed = true; 273079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 274079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (changed) { 275079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn invalidateSelf(); 276079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 277079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 278079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 279079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn @Override 280c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette public void setHotspot(float x, float y) { 281307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette if (mCurrDrawable != null) { 282c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette mCurrDrawable.setHotspot(x, y); 283307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette } 284307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette } 285307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette 286307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette @Override 28753a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette public void setHotspotBounds(int left, int top, int right, int bottom) { 2887068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette if (mHotspotBounds == null) { 2897068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette mHotspotBounds = new Rect(left, top, bottom, right); 2907068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } else { 2917068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette mHotspotBounds.set(left, top, bottom, right); 2927068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } 2937068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette 29453a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette if (mCurrDrawable != null) { 29553a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette mCurrDrawable.setHotspotBounds(left, top, right, bottom); 29653a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette } 29753a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette } 29853a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette 2997068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette /** @hide */ 3007068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette @Override 3017068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette public void getHotspotBounds(Rect outRect) { 3027068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette if (mHotspotBounds != null) { 3037068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette outRect.set(mHotspotBounds); 3047068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } else { 3057068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette super.getHotspotBounds(outRect); 3067068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } 3077068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } 3087068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette 30953a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette @Override 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean onStateChange(int[] state) { 311079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 312079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn return mLastDrawable.setState(state); 313079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable.setState(state); 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean onLevelChange(int level) { 322079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 323079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn return mLastDrawable.setLevel(level); 324079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable.setLevel(level); 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIntrinsicWidth() { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.isConstantSize()) { 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.getConstantWidth(); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable != null ? mCurrDrawable.getIntrinsicWidth() : -1; 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIntrinsicHeight() { 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.isConstantSize()) { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.getConstantHeight(); 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable != null ? mCurrDrawable.getIntrinsicHeight() : -1; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 346f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMinimumWidth() { 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.isConstantSize()) { 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.getConstantMinimumWidth(); 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable != null ? mCurrDrawable.getMinimumWidth() : 0; 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMinimumHeight() { 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.isConstantSize()) { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.getConstantMinimumHeight(); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable != null ? mCurrDrawable.getMinimumHeight() : 0; 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36372146433322588c1116ee06c27ac758ad09d869cAlan Viverette @Override 364079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void invalidateDrawable(Drawable who) { 365f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (who == mCurrDrawable && getCallback() != null) { 366f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy getCallback().invalidateDrawable(this); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37072146433322588c1116ee06c27ac758ad09d869cAlan Viverette @Override 371079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void scheduleDrawable(Drawable who, Runnable what, long when) { 372f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (who == mCurrDrawable && getCallback() != null) { 373f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy getCallback().scheduleDrawable(this, what, when); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37772146433322588c1116ee06c27ac758ad09d869cAlan Viverette @Override 378079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void unscheduleDrawable(Drawable who, Runnable what) { 379f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (who == mCurrDrawable && getCallback() != null) { 380f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy getCallback().unscheduleDrawable(this, what); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean setVisible(boolean visible, boolean restart) { 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = super.setVisible(visible, restart); 387079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 388079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.setVisible(visible, restart); 389079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable.setVisible(visible, restart); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return changed; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getOpacity() { 39883b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy return mCurrDrawable == null || !mCurrDrawable.isVisible() ? PixelFormat.TRANSPARENT : 39983b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy mDrawableContainerState.getOpacity(); 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4025e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette /** @hide */ 4035e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette public void setCurrentIndex(int index) { 4045e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette selectDrawable(index); 4055e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette } 4065e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette 4075e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette /** @hide */ 4085e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette public int getCurrentIndex() { 4095e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette return mCurIndex; 4105e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette } 4115e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette 41278aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne public boolean selectDrawable(int idx) { 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (idx == mCurIndex) { 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 416079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 417079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn final long now = SystemClock.uptimeMillis(); 418079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 419079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (DEBUG) android.util.Log.i(TAG, toString() + " from " + mCurIndex + " to " + idx 420079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn + ": exit=" + mDrawableContainerState.mExitFadeDuration 421079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn + " enter=" + mDrawableContainerState.mEnterFadeDuration); 422079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 423079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mDrawableContainerState.mExitFadeDuration > 0) { 424079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 425079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.setVisible(false, false); 426079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 428079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable = mCurrDrawable; 429079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = now + mDrawableContainerState.mExitFadeDuration; 430079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 431079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable = null; 432079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = 0; 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 434079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else if (mCurrDrawable != null) { 435079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mCurrDrawable.setVisible(false, false); 436079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 437079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 438079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (idx >= 0 && idx < mDrawableContainerState.mNumChildren) { 439f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable d = mDrawableContainerState.getChild(idx); 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable = d; 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurIndex = idx; 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 4435f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy d.mutate(); 444079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mDrawableContainerState.mEnterFadeDuration > 0) { 445079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterAnimationEnd = now + mDrawableContainerState.mEnterFadeDuration; 446729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette } else if (mHasAlpha) { 447079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn d.setAlpha(mAlpha); 448079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 449729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette if (mDrawableContainerState.mHasColorFilter) { 450bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette // Color filter always overrides tint. 451729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette d.setColorFilter(mDrawableContainerState.mColorFilter); 452bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette } else { 453bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette if (mDrawableContainerState.mHasTintList) { 454bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette d.setTintList(mDrawableContainerState.mTintList); 455bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette } 456bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette if (mDrawableContainerState.mHasTintMode) { 457bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette d.setTintMode(mDrawableContainerState.mTintMode); 458bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette } 459729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette } 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setVisible(isVisible(), true); 461a41581ed4033004c73115113f45b9844e9b0210fRomain Guy d.setDither(mDrawableContainerState.mDither); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setState(getState()); 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setLevel(getLevel()); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setBounds(getBounds()); 465731ba6649a40529657aa68f93e6febe7d98b4f3bFabrice Di Meglio d.setLayoutDirection(getLayoutDirection()); 4663f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio d.setAutoMirrored(mDrawableContainerState.mAutoMirrored); 4677068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette 4687068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette final Rect hotspotBounds = mHotspotBounds; 4697068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette if (hotspotBounds != null) { 4707068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette d.setHotspotBounds(hotspotBounds.left, hotspotBounds.top, 4717068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette hotspotBounds.right, hotspotBounds.bottom); 4727068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable = null; 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurIndex = -1; 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 478079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 479079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd != 0 || mExitAnimationEnd != 0) { 480079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mAnimationRunnable == null) { 481079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mAnimationRunnable = new Runnable() { 482079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn @Override public void run() { 483079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animate(true); 484079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn invalidateSelf(); 485079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 486079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn }; 487079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 488079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn unscheduleSelf(mAnimationRunnable); 489079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 490079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn // Compute first frame and schedule next animation. 491079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animate(true); 492079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 493079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidateSelf(); 495079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 498f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 499079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn void animate(boolean schedule) { 500729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette mHasAlpha = true; 501729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette 502079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn final long now = SystemClock.uptimeMillis(); 503079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn boolean animating = false; 504079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mCurrDrawable != null) { 505079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd != 0) { 506079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd <= now) { 5075f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy mCurrDrawable.mutate().setAlpha(mAlpha); 508079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterAnimationEnd = 0; 509079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 510079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn int animAlpha = (int)((mEnterAnimationEnd-now)*255) 511079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn / mDrawableContainerState.mEnterFadeDuration; 512079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (DEBUG) android.util.Log.i(TAG, toString() + " cur alpha " + animAlpha); 5135f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy mCurrDrawable.mutate().setAlpha(((255-animAlpha)*mAlpha)/255); 514079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animating = true; 515079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 516079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 517079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 518079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterAnimationEnd = 0; 519079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 520079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 521079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mExitAnimationEnd != 0) { 522079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mExitAnimationEnd <= now) { 523079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.setVisible(false, false); 524079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable = null; 525079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = 0; 526079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 527079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn int animAlpha = (int)((mExitAnimationEnd-now)*255) 528079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn / mDrawableContainerState.mExitFadeDuration; 529079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (DEBUG) android.util.Log.i(TAG, toString() + " last alpha " + animAlpha); 5305f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy mLastDrawable.mutate().setAlpha((animAlpha*mAlpha)/255); 531079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animating = true; 532079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 533079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 534079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 535079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = 0; 536079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 537079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 538079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (schedule && animating) { 539079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn scheduleSelf(mAnimationRunnable, now + 1000/60); 540079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 541079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 542079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getCurrent() { 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable; 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 54952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public void applyTheme(Theme theme) { 55052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette mDrawableContainerState.applyTheme(theme); 55152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 55252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 55352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette @Override 55452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public boolean canApplyTheme() { 55552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return mDrawableContainerState.canApplyTheme(); 55652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 55752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 55852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette @Override 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ConstantState getConstantState() { 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.canConstantState()) { 5616efd2bad954e0e5bd74916a32f036a0f149dcd4dChristopher Lais mDrawableContainerState.mChangingConfigurations = getChangingConfigurations(); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState; 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable mutate() { 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mMutated && super.mutate() == this) { 57072146433322588c1116ee06c27ac758ad09d869cAlan Viverette mDrawableContainerState.mutate(); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMutated = true; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 57678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne /** 577727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette * @hide 578727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette */ 579727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette public void clearMutated() { 580727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette super.clearMutated(); 581727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette mDrawableContainerState.clearMutated(); 582727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette mMutated = false; 583727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette } 584727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette 585727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette /** 58678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * A ConstantState that can contain several {@link Drawable}s. 58778aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * 58878aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * This class was made public to enable testing, and its visibility may change in a future 58978aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * release. 59078aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne */ 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract static class DrawableContainerState extends ConstantState { 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final DrawableContainer mOwner; 593f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Resources mRes; 594f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 595f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette SparseArray<ConstantStateFuture> mDrawableFutures; 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 597f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mChangingConfigurations; 598f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mChildrenChangingConfigurations; 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 600f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette Drawable[] mDrawables; 601f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mNumChildren; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 603f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mVariablePadding; 604f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mPaddingChecked; 605f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette Rect mConstantPadding; 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 607f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mConstantSize; 608f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mComputedConstantSize; 609f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mConstantWidth; 610f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mConstantHeight; 611f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mConstantMinimumWidth; 612f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mConstantMinimumHeight; 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 614f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mCheckedOpacity; 615f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mOpacity; 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 617f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mCheckedStateful; 618f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mStateful; 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 620f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mCheckedConstantState; 621f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mCanConstantState; 6225140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy 623f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mDither = DEFAULT_DITHER; 624f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 625f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette boolean mMutated; 626f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mLayoutDirection; 627f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 628f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mEnterFadeDuration; 629f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int mExitFadeDuration; 630079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 6313f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio boolean mAutoMirrored; 6323f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio 633d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette ColorFilter mColorFilter; 634729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette boolean mHasColorFilter; 635d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette 636bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette ColorStateList mTintList; 637b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette Mode mTintMode; 638bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette boolean mHasTintList; 639bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette boolean mHasTintMode; 640b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 641c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn DrawableContainerState(DrawableContainerState orig, DrawableContainer owner, 642c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn Resources res) { 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOwner = owner; 644f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mRes = res; 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (orig != null) { 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChangingConfigurations = orig.mChangingConfigurations; 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildrenChangingConfigurations = orig.mChildrenChangingConfigurations; 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 650f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedConstantState = true; 651f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCanConstantState = true; 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVariablePadding = orig.mVariablePadding; 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantSize = orig.mConstantSize; 655a41581ed4033004c73115113f45b9844e9b0210fRomain Guy mDither = orig.mDither; 656f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mMutated = orig.mMutated; 657f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mLayoutDirection = orig.mLayoutDirection; 658079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterFadeDuration = orig.mEnterFadeDuration; 659079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitFadeDuration = orig.mExitFadeDuration; 6603f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio mAutoMirrored = orig.mAutoMirrored; 661d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette mColorFilter = orig.mColorFilter; 662729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette mHasColorFilter = orig.mHasColorFilter; 663bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mTintList = orig.mTintList; 664b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette mTintMode = orig.mTintMode; 665bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mHasTintList = orig.mHasTintList; 666bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette mHasTintMode = orig.mHasTintMode; 667079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 668f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // Cloning the following values may require creating futures. 669f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mConstantPadding = orig.getConstantPadding(); 670f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mPaddingChecked = true; 671f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 672f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mConstantWidth = orig.getConstantWidth(); 673f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mConstantHeight = orig.getConstantHeight(); 674f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mConstantMinimumWidth = orig.getConstantMinimumWidth(); 675f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mConstantMinimumHeight = orig.getConstantMinimumHeight(); 676f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mComputedConstantSize = true; 677f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 678f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mOpacity = orig.getOpacity(); 679f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedOpacity = true; 680f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 681f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mStateful = orig.isStateful(); 682f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedStateful = true; 683f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 684f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // Postpone cloning children and futures until we're absolutely 685f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // sure that we're done computing values for the original state. 686f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable[] origDr = orig.mDrawables; 687f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawables = new Drawable[origDr.length]; 688f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mNumChildren = orig.mNumChildren; 689f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 690f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final SparseArray<ConstantStateFuture> origDf = orig.mDrawableFutures; 691f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (origDf != null) { 692f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawableFutures = origDf.clone(); 693f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } else { 694f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawableFutures = new SparseArray<ConstantStateFuture>(mNumChildren); 695f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 696f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 697f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 698f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette for (int i = 0; i < N; i++) { 699f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (origDr[i] != null) { 700f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawableFutures.put(i, new ConstantStateFuture(origDr[i])); 701f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 702f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawables = new Drawable[10]; 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNumChildren = 0; 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 708f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getChangingConfigurations() { 711dc25d25333d3fac96dccfb9bd31d2474d6bc2d78Fabrice Di Meglio return mChangingConfigurations | mChildrenChangingConfigurations; 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int addChild(Drawable dr) { 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int pos = mNumChildren; 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos >= mDrawables.length) { 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project growArray(pos, pos+10); 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dr.setVisible(false, true); 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dr.setCallback(mOwner); 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawables[pos] = dr; 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNumChildren++; 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildrenChangingConfigurations |= dr.getChangingConfigurations(); 727f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedStateful = false; 728f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedOpacity = false; 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantPadding = null; 7315140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy mPaddingChecked = false; 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mComputedConstantSize = false; 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pos; 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 73772146433322588c1116ee06c27ac758ad09d869cAlan Viverette final int getCapacity() { 73872146433322588c1116ee06c27ac758ad09d869cAlan Viverette return mDrawables.length; 73972146433322588c1116ee06c27ac758ad09d869cAlan Viverette } 74072146433322588c1116ee06c27ac758ad09d869cAlan Viverette 741f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette private final void createAllFutures() { 742f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (mDrawableFutures != null) { 743f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int futureCount = mDrawableFutures.size(); 744f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette for (int keyIndex = 0; keyIndex < futureCount; keyIndex++) { 745f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int index = mDrawableFutures.keyAt(keyIndex); 746f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawables[index] = mDrawableFutures.valueAt(keyIndex).get(this); 747f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 748f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 749f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawableFutures = null; 750f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 751f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 752f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 75383b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getChildCount() { 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNumChildren; 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 75772146433322588c1116ee06c27ac758ad09d869cAlan Viverette /* 75872146433322588c1116ee06c27ac758ad09d869cAlan Viverette * @deprecated Use {@link #getChild} instead. 75972146433322588c1116ee06c27ac758ad09d869cAlan Viverette */ 76083b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final Drawable[] getChildren() { 761f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // Create all futures for backwards compatibility. 762f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 763f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawables; 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 76772146433322588c1116ee06c27ac758ad09d869cAlan Viverette public final Drawable getChild(int index) { 768f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable result = mDrawables[index]; 769f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (result != null) { 770f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return result; 771f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 772f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 773f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // Prepare future drawable if necessary. 774f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (mDrawableFutures != null) { 775f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int keyIndex = mDrawableFutures.indexOfKey(index); 776f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (keyIndex >= 0) { 777f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable prepared = mDrawableFutures.valueAt(keyIndex).get(this); 778f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawables[index] = prepared; 779f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mDrawableFutures.removeAt(keyIndex); 780f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return prepared; 781f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 782f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 783f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 784f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return null; 785f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 786f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 787f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final void setLayoutDirection(int layoutDirection) { 788f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // No need to call createAllFutures, since future drawables will 789f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // change layout direction when they are prepared. 790f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 791f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable[] drawables = mDrawables; 792f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette for (int i = 0; i < N; i++) { 793f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (drawables[i] != null) { 794f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette drawables[i].setLayoutDirection(layoutDirection); 795f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 796f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 797f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 798f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mLayoutDirection = layoutDirection; 79972146433322588c1116ee06c27ac758ad09d869cAlan Viverette } 80072146433322588c1116ee06c27ac758ad09d869cAlan Viverette 80152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final void applyTheme(Theme theme) { 80217cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette if (theme != null) { 80317cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette createAllFutures(); 80417cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette 80517cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette final int N = mNumChildren; 80617cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette final Drawable[] drawables = mDrawables; 80717cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette for (int i = 0; i < N; i++) { 80817cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette if (drawables[i] != null && drawables[i].canApplyTheme()) { 80917cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette drawables[i].applyTheme(theme); 81017cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette } 81152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 81252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 81352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 81452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 81552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette @Override 81652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public boolean canApplyTheme() { 81752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final int N = mNumChildren; 81852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final Drawable[] drawables = mDrawables; 81952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette for (int i = 0; i < N; i++) { 820b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette final Drawable d = drawables[i]; 82152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (d != null) { 82252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (d.canApplyTheme()) { 82352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return true; 82452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 82552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } else { 82652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final ConstantStateFuture future = mDrawableFutures.get(i); 82752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (future != null && future.canApplyTheme()) { 82852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return true; 82952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 83052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 83152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 83252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 83352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return false; 83452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 83552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 83672146433322588c1116ee06c27ac758ad09d869cAlan Viverette final void mutate() { 837f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // No need to call createAllFutures, since future drawables will 838f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette // mutate when they are prepared. 839f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 84072146433322588c1116ee06c27ac758ad09d869cAlan Viverette final Drawable[] drawables = mDrawables; 84172146433322588c1116ee06c27ac758ad09d869cAlan Viverette for (int i = 0; i < N; i++) { 842f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (drawables[i] != null) { 843f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette drawables[i].mutate(); 844f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 84572146433322588c1116ee06c27ac758ad09d869cAlan Viverette } 846f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 847f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mMutated = true; 84872146433322588c1116ee06c27ac758ad09d869cAlan Viverette } 84972146433322588c1116ee06c27ac758ad09d869cAlan Viverette 850727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette final void clearMutated() { 851727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette final int N = mNumChildren; 852727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette final Drawable[] drawables = mDrawables; 853727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette for (int i = 0; i < N; i++) { 854727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette if (drawables[i] != null) { 855727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette drawables[i].clearMutated(); 856727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette } 857727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette } 858727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette 859727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette mMutated = false; 860727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette } 861727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette 862f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette /** 863f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * A boolean value indicating whether to use the maximum padding value 864f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * of all frames in the set (false), or to use the padding value of the 865f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * frame being shown (true). Default value is false. 866f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette */ 86783b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final void setVariablePadding(boolean variable) { 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVariablePadding = variable; 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 87183b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final Rect getConstantPadding() { 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mVariablePadding) { 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 875f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 876f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if ((mConstantPadding != null) || mPaddingChecked) { 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantPadding; 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 880f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 881f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 8825140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy Rect r = null; 88383b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy final Rect t = new Rect(); 884f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 88583b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy final Drawable[] drawables = mDrawables; 88683b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy for (int i = 0; i < N; i++) { 88783b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy if (drawables[i].getPadding(t)) { 8885140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy if (r == null) r = new Rect(0, 0, 0, 0); 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.left > r.left) r.left = t.left; 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.top > r.top) r.top = t.top; 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.right > r.right) r.right = t.right; 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.bottom > r.bottom) r.bottom = t.bottom; 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 895f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 8965140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy mPaddingChecked = true; 8975140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy return (mConstantPadding = r); 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 90083b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final void setConstantSize(boolean constant) { 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantSize = constant; 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 90483b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final boolean isConstantSize() { 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantSize; 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 90883b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getConstantWidth() { 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mComputedConstantSize) { 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeConstantSize(); 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantWidth; 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 91683b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getConstantHeight() { 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mComputedConstantSize) { 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeConstantSize(); 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantHeight; 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 92483b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getConstantMinimumWidth() { 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mComputedConstantSize) { 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeConstantSize(); 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantMinimumWidth; 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 93283b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getConstantMinimumHeight() { 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mComputedConstantSize) { 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeConstantSize(); 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantMinimumHeight; 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 94078aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne protected void computeConstantSize() { 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mComputedConstantSize = true; 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 943f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 944f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 945f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 94683b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy final Drawable[] drawables = mDrawables; 94778aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne mConstantWidth = mConstantHeight = -1; 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantMinimumWidth = mConstantMinimumHeight = 0; 94983b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy for (int i = 0; i < N; i++) { 950f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable dr = drawables[i]; 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int s = dr.getIntrinsicWidth(); 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s > mConstantWidth) mConstantWidth = s; 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = dr.getIntrinsicHeight(); 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s > mConstantHeight) mConstantHeight = s; 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = dr.getMinimumWidth(); 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s > mConstantMinimumWidth) mConstantMinimumWidth = s; 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = dr.getMinimumHeight(); 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s > mConstantMinimumHeight) mConstantMinimumHeight = s; 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 962079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public final void setEnterFadeDuration(int duration) { 963079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterFadeDuration = duration; 964079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 965079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 966079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public final int getEnterFadeDuration() { 967079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn return mEnterFadeDuration; 968079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 969079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 970079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public final void setExitFadeDuration(int duration) { 971079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitFadeDuration = duration; 972079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 973079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 974079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public final int getExitFadeDuration() { 975079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn return mExitFadeDuration; 976079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 977079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 97883b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getOpacity() { 979f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (mCheckedOpacity) { 980f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return mOpacity; 981f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 982f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 983f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 984f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 985f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedOpacity = true; 986f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 987f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 98883b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy final Drawable[] drawables = mDrawables; 989f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette int op = (N > 0) ? drawables[0].getOpacity() : PixelFormat.TRANSPARENT; 99083b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy for (int i = 1; i < N; i++) { 99183b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy op = Drawable.resolveOpacity(op, drawables[i].getOpacity()); 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 993f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpacity = op; 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return op; 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 99783b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean isStateful() { 999f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (mCheckedStateful) { 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStateful; 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1002f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1003f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 1004f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1005f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedStateful = true; 1006f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1007f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 1008f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable[] drawables = mDrawables; 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 1010f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (drawables[i].isStateful()) { 1011f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mStateful = true; 1012f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return true; 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1015f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1016f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mStateful = false; 1017f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return false; 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 102083b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public void growArray(int oldSize, int newSize) { 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable[] newDrawables = new Drawable[newSize]; 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(mDrawables, 0, newDrawables, 0, oldSize); 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawables = newDrawables; 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized boolean canConstantState() { 1027f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (mCheckedConstantState) { 1028f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return mCanConstantState; 1029f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 1030f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1031f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette createAllFutures(); 1032f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1033f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCheckedConstantState = true; 1034f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1035f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final int N = mNumChildren; 1036f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette final Drawable[] drawables = mDrawables; 1037f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette for (int i = 0; i < N; i++) { 1038f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (drawables[i].getConstantState() == null) { 1039f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCanConstantState = false; 1040f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return false; 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1044f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mCanConstantState = true; 1045f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return true; 1046f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 1047f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1048f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette /** 1049f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * Class capable of cloning a Drawable from another Drawable's 1050f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * ConstantState. 1051f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette */ 1052f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette private static class ConstantStateFuture { 1053f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette private final ConstantState mConstantState; 1054f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1055f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette private ConstantStateFuture(Drawable source) { 1056f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette mConstantState = source.getConstantState(); 1057f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 1058f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1059f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette /** 1060f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * Obtains and prepares the Drawable represented by this future. 1061f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * 1062f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * @param state the container into which this future will be placed 1063f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette * @return a prepared Drawable 1064f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette */ 1065f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette public Drawable get(DrawableContainerState state) { 106652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final Drawable result; 106752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (state.mRes == null) { 106852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette result = mConstantState.newDrawable(); 106952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } else { 107017cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette result = mConstantState.newDrawable(state.mRes); 107152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 1072f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette result.setLayoutDirection(state.mLayoutDirection); 1073f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette result.setCallback(state.mOwner); 1074f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1075f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette if (state.mMutated) { 1076f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette result.mutate(); 1077f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 1078f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette 1079f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette return result; 1080f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette } 108152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 108252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette /** 108352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * Whether the constant state wrapped by this future can apply a 108452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * theme. 108552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette */ 108652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public boolean canApplyTheme() { 108752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return mConstantState.canApplyTheme(); 108852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1092f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette protected void setConstantState(DrawableContainerState state) { 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawableContainerState = state; 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1096