DrawableContainer.java revision 419aa7ad14926a30220aa3b71d045855ea54040a
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.graphics.drawable;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1958945975b256739fdfe78435d7846d1e2fd29da1Chris Craikimport android.annotation.NonNull;
20b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.content.res.ColorStateList;
21c2974809373697147cbe5754835cc871fb93aef1Dianne Hackbornimport android.content.res.Resources;
2252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viveretteimport android.content.res.Resources.Theme;
23dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reckimport android.graphics.Bitmap;
2478aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Canvas;
2578aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.ColorFilter;
26bbd51f1e360b22eece1d74bd65c7e6a0b59dee59Philip Milneimport android.graphics.Insets;
2758945975b256739fdfe78435d7846d1e2fd29da1Chris Craikimport android.graphics.Outline;
2878aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.PixelFormat;
2978aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Rect;
30b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.PorterDuff.Mode;
31079e23575024e103358c982152afb7a720ae1a8aDianne Hackbornimport android.os.SystemClock;
32600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglioimport android.util.LayoutDirection;
33f390f770ee570f1f4def41b165cb9492e381be40Alan Viveretteimport android.util.SparseArray;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reckimport java.util.Collection;
36dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck
3778aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne/**
3878aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * A helper class that contains several {@link Drawable}s and selects which one to use.
3978aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne *
4078aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * You can subclass it to create your own DrawableContainers or directly use one its child classes.
4178aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne */
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class DrawableContainer extends Drawable implements Drawable.Callback {
43079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    private static final boolean DEBUG = false;
44079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    private static final String TAG = "DrawableContainer";
45211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed
46211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed    /**
47211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed     * To be proper, we should have a getter for dither (and alpha, etc.)
48211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed     * so that proxy classes like this can save/restore their delegates'
49211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed     * values, but we don't have getters. Since we do have setters
50211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed     * (e.g. setDither), which this proxy forwards on, we have to have some
51211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed     * default/initial setting.
52211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed     *
53211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed     * The initial setting for dither is now true, since it almost always seems
54211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed     * to improve the quality at negligible cost.
55211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed     */
56211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed    private static final boolean DEFAULT_DITHER = true;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private DrawableContainerState mDrawableContainerState;
587068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette    private Rect mHotspotBounds;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Drawable mCurrDrawable;
60ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette    private Drawable mLastDrawable;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mAlpha = 0xFF;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette    /** Whether setAlpha() has been called at least once. */
64729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette    private boolean mHasAlpha;
65729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mCurIndex = -1;
67ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette    private int mLastIndex = -1;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mMutated;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    // Animations.
71079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    private Runnable mAnimationRunnable;
72079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    private long mEnterAnimationEnd;
73079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    private long mExitAnimationEnd;
74079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // overrides from Drawable
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void draw(Canvas canvas) {
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mCurrDrawable != null) {
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrDrawable.draw(canvas);
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
82079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        if (mLastDrawable != null) {
83079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            mLastDrawable.draw(canvas);
84079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        }
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getChangingConfigurations() {
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return super.getChangingConfigurations()
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                | mDrawableContainerState.mChangingConfigurations
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                | mDrawableContainerState.mChildrenChangingConfigurations;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
93f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
94600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio    private boolean needsMirroring() {
95600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio        return isAutoMirrored() && getLayoutDirection() == LayoutDirection.RTL;
96600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio    }
97600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean getPadding(Rect padding) {
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Rect r = mDrawableContainerState.getConstantPadding();
101f7a93ef3847258157d144dfefaa5757128cc807dFabrice Di Meglio        boolean result;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (r != null) {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            padding.set(r);
104f7a93ef3847258157d144dfefaa5757128cc807dFabrice Di Meglio            result = (r.left | r.top | r.bottom | r.right) != 0;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
106600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio            if (mCurrDrawable != null) {
107600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio                result = mCurrDrawable.getPadding(padding);
108600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio            } else {
109600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio                result = super.getPadding(padding);
110600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio            }
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
112600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio        if (needsMirroring()) {
113600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio            final int left = padding.left;
114600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio            final int right = padding.right;
115600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio            padding.left = right;
116600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio            padding.right = left;
117600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio        }
118600d7dd1c6d9d1ff81b71085eff2a6be50d6f36cFabrice Di Meglio        return result;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1211557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne    /**
1221557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne     * @hide
1231557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne     */
1241557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne    @Override
1257b7578184567f4e4f0740ce935cc192765410ccaPhilip Milne    public Insets getOpticalInsets() {
1268de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette        if (mCurrDrawable != null) {
1278de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette            return mCurrDrawable.getOpticalInsets();
1288de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette        }
1298de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette        return Insets.NONE;
1301557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne    }
1311557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13331ba192dd201df2cad96a8c503f730130ab0d80fChris Craik    public void getOutline(@NonNull Outline outline) {
13458945975b256739fdfe78435d7846d1e2fd29da1Chris Craik        if (mCurrDrawable != null) {
13531ba192dd201df2cad96a8c503f730130ab0d80fChris Craik            mCurrDrawable.getOutline(outline);
13658945975b256739fdfe78435d7846d1e2fd29da1Chris Craik        }
13758945975b256739fdfe78435d7846d1e2fd29da1Chris Craik    }
13858945975b256739fdfe78435d7846d1e2fd29da1Chris Craik
13958945975b256739fdfe78435d7846d1e2fd29da1Chris Craik    @Override
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAlpha(int alpha) {
14134bd56b546bce47422a430d9d7806dc3cb4254bfAlan Viverette        if (!mHasAlpha || mAlpha != alpha) {
14234bd56b546bce47422a430d9d7806dc3cb4254bfAlan Viverette            mHasAlpha = true;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAlpha = alpha;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCurrDrawable != null) {
145079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                if (mEnterAnimationEnd == 0) {
1465f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy                    mCurrDrawable.mutate().setAlpha(alpha);
147079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                } else {
148079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                    animate(false);
149079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                }
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
155b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase    public int getAlpha() {
156b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase        return mAlpha;
157b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase    }
158b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase
159b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase    @Override
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setDither(boolean dither) {
161a41581ed4033004c73115113f45b9844e9b0210fRomain Guy        if (mDrawableContainerState.mDither != dither) {
162a41581ed4033004c73115113f45b9844e9b0210fRomain Guy            mDrawableContainerState.mDither = dither;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCurrDrawable != null) {
1645f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy                mCurrDrawable.mutate().setDither(mDrawableContainerState.mDither);
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setColorFilter(ColorFilter cf) {
171b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        mDrawableContainerState.mHasColorFilter = (cf != null);
172729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette
173d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette        if (mDrawableContainerState.mColorFilter != cf) {
174d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette            mDrawableContainerState.mColorFilter = cf;
175729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCurrDrawable != null) {
1775f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy                mCurrDrawable.mutate().setColorFilter(cf);
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
181f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
182b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    @Override
183a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    public void setTintList(ColorStateList tint) {
184bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette        mDrawableContainerState.mHasTintList = true;
185b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
186bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette        if (mDrawableContainerState.mTintList != tint) {
187bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette            mDrawableContainerState.mTintList = tint;
188a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette
189a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette            if (mCurrDrawable != null) {
190a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette                mCurrDrawable.mutate().setTintList(tint);
191a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette            }
192a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette        }
193a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    }
194a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette
195a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    @Override
196a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    public void setTintMode(Mode tintMode) {
197bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette        mDrawableContainerState.mHasTintMode = true;
198a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette
199a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette        if (mDrawableContainerState.mTintMode != tintMode) {
200b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette            mDrawableContainerState.mTintMode = tintMode;
201b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
202b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette            if (mCurrDrawable != null) {
203a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette                mCurrDrawable.mutate().setTintMode(tintMode);
204b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette            }
205b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        }
206b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    }
207b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
208079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    /**
209079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn     * Change the global fade duration when a new drawable is entering
210079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn     * the scene.
211079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn     * @param ms The amount of time to fade in milliseconds.
212079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn     */
213079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    public void setEnterFadeDuration(int ms) {
214079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        mDrawableContainerState.mEnterFadeDuration = ms;
215079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    }
216f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
217079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    /**
218079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn     * Change the global fade duration when a new drawable is leaving
219079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn     * the scene.
220079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn     * @param ms The amount of time to fade in milliseconds.
221079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn     */
222079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    public void setExitFadeDuration(int ms) {
223079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        mDrawableContainerState.mExitFadeDuration = ms;
224079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    }
225f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onBoundsChange(Rect bounds) {
228079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        if (mLastDrawable != null) {
229079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            mLastDrawable.setBounds(bounds);
230079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        }
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mCurrDrawable != null) {
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrDrawable.setBounds(bounds);
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
235f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isStateful() {
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDrawableContainerState.isStateful();
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
240f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2423f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio    public void setAutoMirrored(boolean mirrored) {
243729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette        if (mDrawableContainerState.mAutoMirrored != mirrored) {
244729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette            mDrawableContainerState.mAutoMirrored = mirrored;
245729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette            if (mCurrDrawable != null) {
246729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette                mCurrDrawable.mutate().setAutoMirrored(mDrawableContainerState.mAutoMirrored);
247729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette            }
2483f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio        }
2493f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio    }
2503f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio
2513f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio    @Override
2523f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio    public boolean isAutoMirrored() {
2533f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio        return mDrawableContainerState.mAutoMirrored;
2543f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio    }
2553f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio
2563f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio    @Override
257079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    public void jumpToCurrentState() {
258079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        boolean changed = false;
259079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        if (mLastDrawable != null) {
260079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            mLastDrawable.jumpToCurrentState();
261079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            mLastDrawable = null;
262ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette            mLastIndex = -1;
263079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            changed = true;
264079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        }
265079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        if (mCurrDrawable != null) {
266079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            mCurrDrawable.jumpToCurrentState();
267729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette            if (mHasAlpha) {
268729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette                mCurrDrawable.mutate().setAlpha(mAlpha);
269729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette            }
270079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        }
271079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        if (mExitAnimationEnd != 0) {
272079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            mExitAnimationEnd = 0;
273079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            changed = true;
274079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        }
275079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        if (mEnterAnimationEnd != 0) {
276079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            mEnterAnimationEnd = 0;
277079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            changed = true;
278079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        }
279079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        if (changed) {
280079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            invalidateSelf();
281079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        }
282079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    }
283079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn
284079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    @Override
285c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette    public void setHotspot(float x, float y) {
286307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette        if (mCurrDrawable != null) {
287c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette            mCurrDrawable.setHotspot(x, y);
288307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette        }
289307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette    }
290307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette
291307ad09228ebf70f1b456f5f00540c0126277850Alan Viverette    @Override
29253a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette    public void setHotspotBounds(int left, int top, int right, int bottom) {
2937068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette        if (mHotspotBounds == null) {
2947068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette            mHotspotBounds = new Rect(left, top, bottom, right);
2957068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette        } else {
2967068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette            mHotspotBounds.set(left, top, bottom, right);
2977068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette        }
2987068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette
29953a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette        if (mCurrDrawable != null) {
30053a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette            mCurrDrawable.setHotspotBounds(left, top, right, bottom);
30153a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette        }
30253a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette    }
30353a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette
3047068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette    /** @hide */
3057068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette    @Override
3067068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette    public void getHotspotBounds(Rect outRect) {
3077068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette        if (mHotspotBounds != null) {
3087068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette            outRect.set(mHotspotBounds);
3097068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette        } else {
3107068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette            super.getHotspotBounds(outRect);
3117068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette        }
3127068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette    }
3137068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette
31453a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette    @Override
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean onStateChange(int[] state) {
316079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        if (mLastDrawable != null) {
317079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            return mLastDrawable.setState(state);
318079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        }
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mCurrDrawable != null) {
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrDrawable.setState(state);
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean onLevelChange(int level) {
327079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        if (mLastDrawable != null) {
328079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            return mLastDrawable.setLevel(level);
329079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        }
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mCurrDrawable != null) {
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrDrawable.setLevel(level);
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getIntrinsicWidth() {
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDrawableContainerState.isConstantSize()) {
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mDrawableContainerState.getConstantWidth();
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCurrDrawable != null ? mCurrDrawable.getIntrinsicWidth() : -1;
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getIntrinsicHeight() {
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDrawableContainerState.isConstantSize()) {
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mDrawableContainerState.getConstantHeight();
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCurrDrawable != null ? mCurrDrawable.getIntrinsicHeight() : -1;
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
351f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getMinimumWidth() {
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDrawableContainerState.isConstantSize()) {
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mDrawableContainerState.getConstantMinimumWidth();
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCurrDrawable != null ? mCurrDrawable.getMinimumWidth() : 0;
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getMinimumHeight() {
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDrawableContainerState.isConstantSize()) {
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mDrawableContainerState.getConstantMinimumHeight();
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCurrDrawable != null ? mCurrDrawable.getMinimumHeight() : 0;
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36872146433322588c1116ee06c27ac758ad09d869cAlan Viverette    @Override
369079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    public void invalidateDrawable(Drawable who) {
370f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        if (who == mCurrDrawable && getCallback() != null) {
371f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy            getCallback().invalidateDrawable(this);
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37572146433322588c1116ee06c27ac758ad09d869cAlan Viverette    @Override
376079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    public void scheduleDrawable(Drawable who, Runnable what, long when) {
377f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        if (who == mCurrDrawable && getCallback() != null) {
378f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy            getCallback().scheduleDrawable(this, what, when);
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38272146433322588c1116ee06c27ac758ad09d869cAlan Viverette    @Override
383079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    public void unscheduleDrawable(Drawable who, Runnable what) {
384f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        if (who == mCurrDrawable && getCallback() != null) {
385f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy            getCallback().unscheduleDrawable(this, what);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean setVisible(boolean visible, boolean restart) {
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean changed = super.setVisible(visible, restart);
392079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        if (mLastDrawable != null) {
393079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            mLastDrawable.setVisible(visible, restart);
394079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        }
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mCurrDrawable != null) {
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrDrawable.setVisible(visible, restart);
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return changed;
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getOpacity() {
40383b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy        return mCurrDrawable == null || !mCurrDrawable.isVisible() ? PixelFormat.TRANSPARENT :
40483b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy                mDrawableContainerState.getOpacity();
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4075e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette    /** @hide */
4085e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette    public void setCurrentIndex(int index) {
4095e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette        selectDrawable(index);
4105e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette    }
4115e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette
4125e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette    /** @hide */
4135e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette    public int getCurrentIndex() {
4145e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette        return mCurIndex;
4155e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette    }
4165e92c95d847a68178cf6099c801f82dcb7e4fa47Alan Viverette
41778aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne    public boolean selectDrawable(int idx) {
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (idx == mCurIndex) {
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
421079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn
422079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        final long now = SystemClock.uptimeMillis();
423079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn
424079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        if (DEBUG) android.util.Log.i(TAG, toString() + " from " + mCurIndex + " to " + idx
425079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                + ": exit=" + mDrawableContainerState.mExitFadeDuration
426079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                + " enter=" + mDrawableContainerState.mEnterFadeDuration);
427079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn
428079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        if (mDrawableContainerState.mExitFadeDuration > 0) {
429079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            if (mLastDrawable != null) {
430079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                mLastDrawable.setVisible(false, false);
431079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            }
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCurrDrawable != null) {
433079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                mLastDrawable = mCurrDrawable;
434ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette                mLastIndex = mCurIndex;
435079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                mExitAnimationEnd = now + mDrawableContainerState.mExitFadeDuration;
436079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            } else {
437079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                mLastDrawable = null;
438ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette                mLastIndex = -1;
439079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                mExitAnimationEnd = 0;
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
441079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        } else if (mCurrDrawable != null) {
442079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            mCurrDrawable.setVisible(false, false);
443079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        }
444079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn
445079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        if (idx >= 0 && idx < mDrawableContainerState.mNumChildren) {
446f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            final Drawable d = mDrawableContainerState.getChild(idx);
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrDrawable = d;
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurIndex = idx;
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (d != null) {
450079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                if (mDrawableContainerState.mEnterFadeDuration > 0) {
451079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                    mEnterAnimationEnd = now + mDrawableContainerState.mEnterFadeDuration;
4527068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette                }
453419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette                initializeDrawableForDisplay(d);
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrDrawable = null;
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurIndex = -1;
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
459079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn
460079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        if (mEnterAnimationEnd != 0 || mExitAnimationEnd != 0) {
461079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            if (mAnimationRunnable == null) {
462079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                mAnimationRunnable = new Runnable() {
463079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                    @Override public void run() {
464079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                        animate(true);
465079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                        invalidateSelf();
466079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                    }
467079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                };
468079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            } else {
469079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                unscheduleSelf(mAnimationRunnable);
470079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            }
471079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            // Compute first frame and schedule next animation.
472079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            animate(true);
473079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        }
474079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidateSelf();
476079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
479f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
480419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette    /**
481419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette     * Initializes a drawable for display in this container.
482419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette     *
483419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette     * @param d The drawable to initialize.
484419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette     */
485419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette    private void initializeDrawableForDisplay(Drawable d) {
486419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette        d.mutate();
487419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette
488419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette        if (mDrawableContainerState.mEnterFadeDuration <= 0 && mHasAlpha) {
489419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette            d.setAlpha(mAlpha);
490419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette        }
491419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette
492419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette        if (mDrawableContainerState.mHasColorFilter) {
493419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette            // Color filter always overrides tint.
494419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette            d.setColorFilter(mDrawableContainerState.mColorFilter);
495419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette        } else {
496419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette            if (mDrawableContainerState.mHasTintList) {
497419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette                d.setTintList(mDrawableContainerState.mTintList);
498419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette            }
499419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette            if (mDrawableContainerState.mHasTintMode) {
500419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette                d.setTintMode(mDrawableContainerState.mTintMode);
501419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette            }
502419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette        }
503419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette
504419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette        d.setVisible(isVisible(), true);
505419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette        d.setDither(mDrawableContainerState.mDither);
506419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette        d.setState(getState());
507419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette        d.setLevel(getLevel());
508419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette        d.setBounds(getBounds());
509419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette        d.setLayoutDirection(getLayoutDirection());
510419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette        d.setAutoMirrored(mDrawableContainerState.mAutoMirrored);
511419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette
512419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette        final Rect hotspotBounds = mHotspotBounds;
513419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette        if (hotspotBounds != null) {
514419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette            d.setHotspotBounds(hotspotBounds.left, hotspotBounds.top,
515419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette                    hotspotBounds.right, hotspotBounds.bottom);
516419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette        }
517419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette    }
518419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette
519079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    void animate(boolean schedule) {
520729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette        mHasAlpha = true;
521729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette
522079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        final long now = SystemClock.uptimeMillis();
523079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        boolean animating = false;
524079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        if (mCurrDrawable != null) {
525079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            if (mEnterAnimationEnd != 0) {
526079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                if (mEnterAnimationEnd <= now) {
5275f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy                    mCurrDrawable.mutate().setAlpha(mAlpha);
528079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                    mEnterAnimationEnd = 0;
529079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                } else {
530079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                    int animAlpha = (int)((mEnterAnimationEnd-now)*255)
531079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                            / mDrawableContainerState.mEnterFadeDuration;
532079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                    if (DEBUG) android.util.Log.i(TAG, toString() + " cur alpha " + animAlpha);
5335f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy                    mCurrDrawable.mutate().setAlpha(((255-animAlpha)*mAlpha)/255);
534079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                    animating = true;
535079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                }
536079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            }
537079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        } else {
538079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            mEnterAnimationEnd = 0;
539079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        }
540079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        if (mLastDrawable != null) {
541079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            if (mExitAnimationEnd != 0) {
542079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                if (mExitAnimationEnd <= now) {
543079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                    mLastDrawable.setVisible(false, false);
544079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                    mLastDrawable = null;
545ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette                    mLastIndex = -1;
546079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                    mExitAnimationEnd = 0;
547079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                } else {
548079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                    int animAlpha = (int)((mExitAnimationEnd-now)*255)
549079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                            / mDrawableContainerState.mExitFadeDuration;
550079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                    if (DEBUG) android.util.Log.i(TAG, toString() + " last alpha " + animAlpha);
5515f49c3023a512efbef8bc9515d310c7a72be4af2Romain Guy                    mLastDrawable.mutate().setAlpha((animAlpha*mAlpha)/255);
552079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                    animating = true;
553079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                }
554079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            }
555079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        } else {
556079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            mExitAnimationEnd = 0;
557079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        }
558079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn
559079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        if (schedule && animating) {
5608dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette            scheduleSelf(mAnimationRunnable, now + 1000 / 60);
561079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        }
562079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    }
563079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable getCurrent() {
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCurrDrawable;
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
57052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    public void applyTheme(Theme theme) {
57152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        mDrawableContainerState.applyTheme(theme);
57252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    }
57352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
57452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    @Override
57552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    public boolean canApplyTheme() {
57652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        return mDrawableContainerState.canApplyTheme();
57752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    }
57852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
57952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    @Override
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ConstantState getConstantState() {
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDrawableContainerState.canConstantState()) {
5826efd2bad954e0e5bd74916a32f036a0f149dcd4dChristopher Lais            mDrawableContainerState.mChangingConfigurations = getChangingConfigurations();
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mDrawableContainerState;
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable mutate() {
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mMutated && super.mutate() == this) {
5915ed8f27858dbdf85203068eca46eef0a65f3344eAlan Viverette            final DrawableContainerState clone = cloneConstantState();
5925ed8f27858dbdf85203068eca46eef0a65f3344eAlan Viverette            clone.mutate();
5935ed8f27858dbdf85203068eca46eef0a65f3344eAlan Viverette            setConstantState(clone);
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMutated = true;
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return this;
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59978aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne    /**
6008dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette     * Returns a shallow copy of the container's constant state to be used as
6018dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette     * the base state for {@link #mutate()}.
6028dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette     *
6038dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette     * @return a shallow copy of the constant state
6048dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette     */
6058dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette    DrawableContainerState cloneConstantState() {
6068dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette        return mDrawableContainerState;
6078dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette    }
6088dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette
6098dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette    /**
610727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     * @hide
611727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     */
612727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette    public void clearMutated() {
613727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette        super.clearMutated();
614727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette        mDrawableContainerState.clearMutated();
615727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette        mMutated = false;
616727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette    }
617727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette
618727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette    /**
61978aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne     * A ConstantState that can contain several {@link Drawable}s.
62078aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne     *
62178aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne     * This class was made public to enable testing, and its visibility may change in a future
62278aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne     * release.
62378aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne     */
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract static class DrawableContainerState extends ConstantState {
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final DrawableContainer mOwner;
626f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        final Resources mRes;
627f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
628f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        SparseArray<ConstantStateFuture> mDrawableFutures;
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
630f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        int mChangingConfigurations;
631f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        int mChildrenChangingConfigurations;
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
633f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        Drawable[] mDrawables;
634f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        int mNumChildren;
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
636d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        boolean mVariablePadding = false;
637f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        boolean mPaddingChecked;
638f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        Rect mConstantPadding;
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
640d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        boolean mConstantSize = false;
641f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        boolean mComputedConstantSize;
642f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        int mConstantWidth;
643f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        int mConstantHeight;
644f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        int mConstantMinimumWidth;
645f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        int mConstantMinimumHeight;
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
647f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        boolean mCheckedOpacity;
648f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        int mOpacity;
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
650f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        boolean mCheckedStateful;
651f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        boolean mStateful;
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
653f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        boolean mCheckedConstantState;
654f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        boolean mCanConstantState;
6555140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy
656f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        boolean mDither = DEFAULT_DITHER;
657f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
658f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        boolean mMutated;
659f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        int mLayoutDirection;
660f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
661d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        int mEnterFadeDuration = 0;
662d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        int mExitFadeDuration = 0;
663079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn
6643f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio        boolean mAutoMirrored;
6653f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio
666d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette        ColorFilter mColorFilter;
667729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette        boolean mHasColorFilter;
668d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette
669bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette        ColorStateList mTintList;
670b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        Mode mTintMode;
671bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette        boolean mHasTintList;
672bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette        boolean mHasTintMode;
673b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
674c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        DrawableContainerState(DrawableContainerState orig, DrawableContainer owner,
675c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn                Resources res) {
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mOwner = owner;
677f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            mRes = res;
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (orig != null) {
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mChangingConfigurations = orig.mChangingConfigurations;
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mChildrenChangingConfigurations = orig.mChildrenChangingConfigurations;
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
683f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                mCheckedConstantState = true;
684f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                mCanConstantState = true;
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mVariablePadding = orig.mVariablePadding;
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mConstantSize = orig.mConstantSize;
688a41581ed4033004c73115113f45b9844e9b0210fRomain Guy                mDither = orig.mDither;
689f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                mMutated = orig.mMutated;
690f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                mLayoutDirection = orig.mLayoutDirection;
691079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                mEnterFadeDuration = orig.mEnterFadeDuration;
692079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn                mExitFadeDuration = orig.mExitFadeDuration;
6933f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio                mAutoMirrored = orig.mAutoMirrored;
694d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette                mColorFilter = orig.mColorFilter;
695729427d451bc4d4d268335b8dc1ff6404bc1c91eAlan Viverette                mHasColorFilter = orig.mHasColorFilter;
696bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette                mTintList = orig.mTintList;
697b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette                mTintMode = orig.mTintMode;
698bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette                mHasTintList = orig.mHasTintList;
699bddb843e793a279db99888dd78b4f74a362cbb8bAlan Viverette                mHasTintMode = orig.mHasTintMode;
700079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn
701f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                // Cloning the following values may require creating futures.
702f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                mConstantPadding = orig.getConstantPadding();
703f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                mPaddingChecked = true;
704f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
705f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                mConstantWidth = orig.getConstantWidth();
706f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                mConstantHeight = orig.getConstantHeight();
707f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                mConstantMinimumWidth = orig.getConstantMinimumWidth();
708f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                mConstantMinimumHeight = orig.getConstantMinimumHeight();
709f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                mComputedConstantSize = true;
710f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
711f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                mOpacity = orig.getOpacity();
712f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                mCheckedOpacity = true;
713f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
714f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                mStateful = orig.isStateful();
715f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                mCheckedStateful = true;
716f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
717f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                // Postpone cloning children and futures until we're absolutely
718f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                // sure that we're done computing values for the original state.
719f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                final Drawable[] origDr = orig.mDrawables;
720f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                mDrawables = new Drawable[origDr.length];
721f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                mNumChildren = orig.mNumChildren;
722f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
723f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                final SparseArray<ConstantStateFuture> origDf = orig.mDrawableFutures;
724f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                if (origDf != null) {
725f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                    mDrawableFutures = origDf.clone();
726f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                } else {
727f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                    mDrawableFutures = new SparseArray<ConstantStateFuture>(mNumChildren);
728f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                }
729f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
73062b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette                // Create futures for drawables with constant states. If a
73162b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette                // drawable doesn't have a constant state, then we can't clone
73262b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette                // it and we'll have to reference the original.
733f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                final int N = mNumChildren;
734f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                for (int i = 0; i < N; i++) {
735f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                    if (origDr[i] != null) {
73662b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette                        if (origDr[i].getConstantState() != null) {
73762b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette                            mDrawableFutures.put(i, new ConstantStateFuture(origDr[i]));
73862b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette                        } else {
73962b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette                            mDrawables[i] = origDr[i];
74062b780e85ff2fcefd4324c3bfbf49b14963cf58bAlan Viverette                        }
741f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                    }
742f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                }
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDrawables = new Drawable[10];
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mNumChildren = 0;
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
748f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getChangingConfigurations() {
751dc25d25333d3fac96dccfb9bd31d2474d6bc2d78Fabrice Di Meglio            return mChangingConfigurations | mChildrenChangingConfigurations;
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final int addChild(Drawable dr) {
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int pos = mNumChildren;
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (pos >= mDrawables.length) {
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                growArray(pos, pos+10);
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dr.setVisible(false, true);
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dr.setCallback(mOwner);
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDrawables[pos] = dr;
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mNumChildren++;
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mChildrenChangingConfigurations |= dr.getChangingConfigurations();
767f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            mCheckedStateful = false;
768f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            mCheckedOpacity = false;
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mConstantPadding = null;
7715140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy            mPaddingChecked = false;
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mComputedConstantSize = false;
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return pos;
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77772146433322588c1116ee06c27ac758ad09d869cAlan Viverette        final int getCapacity() {
77872146433322588c1116ee06c27ac758ad09d869cAlan Viverette            return mDrawables.length;
77972146433322588c1116ee06c27ac758ad09d869cAlan Viverette        }
78072146433322588c1116ee06c27ac758ad09d869cAlan Viverette
781f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        private final void createAllFutures() {
782f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            if (mDrawableFutures != null) {
783f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                final int futureCount = mDrawableFutures.size();
784f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                for (int keyIndex = 0; keyIndex < futureCount; keyIndex++) {
785f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                    final int index = mDrawableFutures.keyAt(keyIndex);
786f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                    mDrawables[index] = mDrawableFutures.valueAt(keyIndex).get(this);
787f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                }
788f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
789f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                mDrawableFutures = null;
790f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            }
791f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        }
792f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
79383b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy        public final int getChildCount() {
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mNumChildren;
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
79772146433322588c1116ee06c27ac758ad09d869cAlan Viverette        /*
79872146433322588c1116ee06c27ac758ad09d869cAlan Viverette         * @deprecated Use {@link #getChild} instead.
79972146433322588c1116ee06c27ac758ad09d869cAlan Viverette         */
80083b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy        public final Drawable[] getChildren() {
801f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            // Create all futures for backwards compatibility.
802f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            createAllFutures();
803f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mDrawables;
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80772146433322588c1116ee06c27ac758ad09d869cAlan Viverette        public final Drawable getChild(int index) {
808f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            final Drawable result = mDrawables[index];
809f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            if (result != null) {
810f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                return result;
811f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            }
812f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
813f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            // Prepare future drawable if necessary.
814f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            if (mDrawableFutures != null) {
815f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                final int keyIndex = mDrawableFutures.indexOfKey(index);
816f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                if (keyIndex >= 0) {
817f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                    final Drawable prepared = mDrawableFutures.valueAt(keyIndex).get(this);
818f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                    mDrawables[index] = prepared;
819f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                    mDrawableFutures.removeAt(keyIndex);
820f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                    return prepared;
821f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                }
822f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            }
823f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
824f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            return null;
825f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        }
826f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
827f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        final void setLayoutDirection(int layoutDirection) {
828f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            // No need to call createAllFutures, since future drawables will
829f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            // change layout direction when they are prepared.
830f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            final int N = mNumChildren;
831f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            final Drawable[] drawables = mDrawables;
832f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            for (int i = 0; i < N; i++) {
833f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                if (drawables[i] != null) {
834f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                    drawables[i].setLayoutDirection(layoutDirection);
835f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                }
836f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            }
837f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
838f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            mLayoutDirection = layoutDirection;
83972146433322588c1116ee06c27ac758ad09d869cAlan Viverette        }
84072146433322588c1116ee06c27ac758ad09d869cAlan Viverette
84152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        final void applyTheme(Theme theme) {
84217cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette            if (theme != null) {
84317cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette                createAllFutures();
84417cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette
84517cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette                final int N = mNumChildren;
84617cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette                final Drawable[] drawables = mDrawables;
84717cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette                for (int i = 0; i < N; i++) {
84817cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette                    if (drawables[i] != null && drawables[i].canApplyTheme()) {
84917cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette                        drawables[i].applyTheme(theme);
85017cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette                    }
85152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette                }
85252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            }
85352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        }
85452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
85552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        @Override
85652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        public boolean canApplyTheme() {
85752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            final int N = mNumChildren;
85852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            final Drawable[] drawables = mDrawables;
85952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            for (int i = 0; i < N; i++) {
860b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette                final Drawable d = drawables[i];
86152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette                if (d != null) {
86252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette                    if (d.canApplyTheme()) {
86352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette                        return true;
86452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette                    }
86552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette                } else {
86652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette                    final ConstantStateFuture future = mDrawableFutures.get(i);
86752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette                    if (future != null && future.canApplyTheme()) {
86852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette                        return true;
86952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette                    }
87052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette                }
87152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            }
87252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
87352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            return false;
87452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        }
87552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
8768dcd533786df8d824f1e040230ee9e7e5b083998Alan Viverette        private void mutate() {
877f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            // No need to call createAllFutures, since future drawables will
878f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            // mutate when they are prepared.
879f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            final int N = mNumChildren;
88072146433322588c1116ee06c27ac758ad09d869cAlan Viverette            final Drawable[] drawables = mDrawables;
88172146433322588c1116ee06c27ac758ad09d869cAlan Viverette            for (int i = 0; i < N; i++) {
882f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                if (drawables[i] != null) {
883f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                    drawables[i].mutate();
884f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                }
88572146433322588c1116ee06c27ac758ad09d869cAlan Viverette            }
886f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
887f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            mMutated = true;
88872146433322588c1116ee06c27ac758ad09d869cAlan Viverette        }
88972146433322588c1116ee06c27ac758ad09d869cAlan Viverette
890727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette        final void clearMutated() {
891727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette            final int N = mNumChildren;
892727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette            final Drawable[] drawables = mDrawables;
893727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette            for (int i = 0; i < N; i++) {
894727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette                if (drawables[i] != null) {
895727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette                    drawables[i].clearMutated();
896727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette                }
897727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette            }
898727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette
899727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette            mMutated = false;
900727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette        }
901727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette
902f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        /**
903f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette         * A boolean value indicating whether to use the maximum padding value
904f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette         * of all frames in the set (false), or to use the padding value of the
905f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette         * frame being shown (true). Default value is false.
906f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette         */
90783b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy        public final void setVariablePadding(boolean variable) {
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mVariablePadding = variable;
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91183b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy        public final Rect getConstantPadding() {
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mVariablePadding) {
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
915f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
916f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            if ((mConstantPadding != null) || mPaddingChecked) {
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mConstantPadding;
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
920f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            createAllFutures();
921f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
9225140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy            Rect r = null;
92383b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy            final Rect t = new Rect();
924f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            final int N = mNumChildren;
92583b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy            final Drawable[] drawables = mDrawables;
92683b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy            for (int i = 0; i < N; i++) {
92783b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy                if (drawables[i].getPadding(t)) {
9285140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy                    if (r == null) r = new Rect(0, 0, 0, 0);
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t.left > r.left) r.left = t.left;
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t.top > r.top) r.top = t.top;
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t.right > r.right) r.right = t.right;
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t.bottom > r.bottom) r.bottom = t.bottom;
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
935f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
9365140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy            mPaddingChecked = true;
9375140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy            return (mConstantPadding = r);
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
94083b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy        public final void setConstantSize(boolean constant) {
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mConstantSize = constant;
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
94483b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy        public final boolean isConstantSize() {
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mConstantSize;
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
94883b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy        public final int getConstantWidth() {
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mComputedConstantSize) {
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                computeConstantSize();
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mConstantWidth;
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
95683b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy        public final int getConstantHeight() {
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mComputedConstantSize) {
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                computeConstantSize();
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mConstantHeight;
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
96483b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy        public final int getConstantMinimumWidth() {
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mComputedConstantSize) {
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                computeConstantSize();
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mConstantMinimumWidth;
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
97283b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy        public final int getConstantMinimumHeight() {
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mComputedConstantSize) {
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                computeConstantSize();
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mConstantMinimumHeight;
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
98078aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne        protected void computeConstantSize() {
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mComputedConstantSize = true;
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
983f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            createAllFutures();
984f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
985f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            final int N = mNumChildren;
98683b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy            final Drawable[] drawables = mDrawables;
98778aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne            mConstantWidth = mConstantHeight = -1;
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mConstantMinimumWidth = mConstantMinimumHeight = 0;
98983b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy            for (int i = 0; i < N; i++) {
990f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                final Drawable dr = drawables[i];
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int s = dr.getIntrinsicWidth();
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (s > mConstantWidth) mConstantWidth = s;
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                s = dr.getIntrinsicHeight();
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (s > mConstantHeight) mConstantHeight = s;
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                s = dr.getMinimumWidth();
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (s > mConstantMinimumWidth) mConstantMinimumWidth = s;
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                s = dr.getMinimumHeight();
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (s > mConstantMinimumHeight) mConstantMinimumHeight = s;
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1002079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        public final void setEnterFadeDuration(int duration) {
1003079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            mEnterFadeDuration = duration;
1004079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        }
1005079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn
1006079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        public final int getEnterFadeDuration() {
1007079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            return mEnterFadeDuration;
1008079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        }
1009079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn
1010079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        public final void setExitFadeDuration(int duration) {
1011079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            mExitFadeDuration = duration;
1012079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        }
1013079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn
1014079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        public final int getExitFadeDuration() {
1015079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn            return mExitFadeDuration;
1016079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn        }
1017079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn
101883b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy        public final int getOpacity() {
1019f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            if (mCheckedOpacity) {
1020f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                return mOpacity;
1021f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            }
1022f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
1023f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            createAllFutures();
1024f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
1025f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            mCheckedOpacity = true;
1026f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
1027f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            final int N = mNumChildren;
102883b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy            final Drawable[] drawables = mDrawables;
1029f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            int op = (N > 0) ? drawables[0].getOpacity() : PixelFormat.TRANSPARENT;
103083b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy            for (int i = 1; i < N; i++) {
103183b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy                op = Drawable.resolveOpacity(op, drawables[i].getOpacity());
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1033f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mOpacity = op;
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return op;
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
103783b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final boolean isStateful() {
1039f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            if (mCheckedStateful) {
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mStateful;
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1042f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
1043f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            createAllFutures();
1044f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
1045f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            mCheckedStateful = true;
1046f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
1047f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            final int N = mNumChildren;
1048f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            final Drawable[] drawables = mDrawables;
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < N; i++) {
1050f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                if (drawables[i].isStateful()) {
1051f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                    mStateful = true;
1052f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                    return true;
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1055f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
1056f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            mStateful = false;
1057f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            return false;
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
106083b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy        public void growArray(int oldSize, int newSize) {
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Drawable[] newDrawables = new Drawable[newSize];
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.arraycopy(mDrawables, 0, newDrawables, 0, oldSize);
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDrawables = newDrawables;
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public synchronized boolean canConstantState() {
1067f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            if (mCheckedConstantState) {
1068f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                return mCanConstantState;
1069f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            }
1070f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
1071f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            createAllFutures();
1072f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
1073f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            mCheckedConstantState = true;
1074f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
1075f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            final int N = mNumChildren;
1076f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            final Drawable[] drawables = mDrawables;
1077f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            for (int i = 0; i < N; i++) {
1078f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                if (drawables[i].getConstantState() == null) {
1079f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                    mCanConstantState = false;
1080f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                    return false;
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1084f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            mCanConstantState = true;
1085f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            return true;
1086f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        }
1087f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
1088dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck        /** @hide */
1089dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck        @Override
1090dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck        public int addAtlasableBitmaps(Collection<Bitmap> atlasList) {
1091dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck            final int N = mNumChildren;
1092dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck            int pixelCount = 0;
1093dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck            for (int i = 0; i < N; i++) {
1094dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck                final ConstantState state = getChild(i).getConstantState();
1095dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck                if (state != null) {
1096dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck                    pixelCount += state.addAtlasableBitmaps(atlasList);
1097dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck                }
1098dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck            }
1099dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck            return pixelCount;
1100dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck        }
1101dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck
1102f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        /**
1103f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette         * Class capable of cloning a Drawable from another Drawable's
1104f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette         * ConstantState.
1105f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette         */
1106f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette        private static class ConstantStateFuture {
1107f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            private final ConstantState mConstantState;
1108f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
1109f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            private ConstantStateFuture(Drawable source) {
1110f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                mConstantState = source.getConstantState();
1111f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            }
1112f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
1113f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            /**
1114f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette             * Obtains and prepares the Drawable represented by this future.
1115f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette             *
1116f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette             * @param state the container into which this future will be placed
1117f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette             * @return a prepared Drawable
1118f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette             */
1119f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            public Drawable get(DrawableContainerState state) {
112052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette                final Drawable result;
112152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette                if (state.mRes == null) {
112252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette                    result = mConstantState.newDrawable();
112352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette                } else {
112417cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette                    result = mConstantState.newDrawable(state.mRes);
112552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette                }
1126f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                result.setLayoutDirection(state.mLayoutDirection);
1127f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                result.setCallback(state.mOwner);
1128f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
1129f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                if (state.mMutated) {
1130f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                    result.mutate();
1131f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                }
1132f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette
1133f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette                return result;
1134f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette            }
113552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
113652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            /**
113752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette             * Whether the constant state wrapped by this future can apply a
113852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette             * theme.
113952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette             */
114052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            public boolean canApplyTheme() {
114152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette                return mConstantState.canApplyTheme();
114252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            }
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1146f390f770ee570f1f4def41b165cb9492e381be40Alan Viverette    protected void setConstantState(DrawableContainerState state) {
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDrawableContainerState = state;
1148ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette
1149ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette        // The locally cached drawables may have changed.
1150ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette        if (mCurIndex >= 0) {
1151ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette            mCurrDrawable = state.getChild(mCurIndex);
1152419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette            if (mCurrDrawable != null) {
1153419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette                initializeDrawableForDisplay(mCurrDrawable);
1154419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette            }
1155ebc9f2e773c3ebb4d4af3025fc6770844cc8fdefAlan Viverette        }
1156419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette
1157419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette        // Clear out the last drawable. We don't have enough information to
1158419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette        // propagate local state from the past.
1159419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette        mLastIndex = -1;
1160419aa7ad14926a30220aa3b71d045855ea54040aAlan Viverette        mLastDrawable = null;
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1163