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