19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 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
198e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viveretteimport com.android.internal.R;
208e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette
213e1585e05ddb0fd60033a5603e330b8ab1f69303Chris Craikimport android.annotation.NonNull;
22dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParser;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.content.res.ColorStateList;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
2952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viveretteimport android.content.res.Resources.Theme;
30dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reckimport android.graphics.Bitmap;
310bece71ee24f75967b86de47cae07e6fc04b4b36Alan Viveretteimport android.graphics.Canvas;
320bece71ee24f75967b86de47cae07e6fc04b4b36Alan Viveretteimport android.graphics.ColorFilter;
330bece71ee24f75967b86de47cae07e6fc04b4b36Alan Viveretteimport android.graphics.Insets;
340bece71ee24f75967b86de47cae07e6fc04b4b36Alan Viveretteimport android.graphics.Outline;
356dfa60f33ca6018959ebff1efde82db7d2aed1e3Alan Viveretteimport android.graphics.PixelFormat;
36b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.PorterDuff.Mode;
37dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reckimport android.graphics.drawable.Drawable.ConstantState;
380bece71ee24f75967b86de47cae07e6fc04b4b36Alan Viveretteimport android.graphics.Rect;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
42dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reckimport java.util.Collection;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A Drawable that insets another Drawable by a specified distance.
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is used when a View needs a background that is smaller than
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the View's actual bounds.
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * <p>It can be defined in an XML file with the <code>&lt;inset></code> element. For more
50dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * information, see the guide to <a
51dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>.</p>
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#InsetDrawable_visible
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#InsetDrawable_drawable
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#InsetDrawable_insetLeft
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#InsetDrawable_insetRight
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#InsetDrawable_insetTop
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#InsetDrawable_insetBottom
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
60b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverettepublic class InsetDrawable extends Drawable implements Drawable.Callback {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Rect mTmpRect = new Rect();
628e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette
63d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette    private final InsetState mState;
64d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mMutated;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ InsetDrawable() {
68c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        this(null, null);
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public InsetDrawable(Drawable drawable, int inset) {
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(drawable, inset, inset, inset, inset);
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public InsetDrawable(Drawable drawable, int insetLeft, int insetTop,
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         int insetRight, int insetBottom) {
77c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        this(null, null);
78b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
79d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState.mDrawable = drawable;
80d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState.mInsetLeft = insetLeft;
81d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState.mInsetTop = insetTop;
82d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState.mInsetRight = insetRight;
83d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState.mInsetBottom = insetBottom;
84b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (drawable != null) {
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            drawable.setCallback(this);
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
9052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    @Override
9152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs, Theme theme)
9252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            throws XmlPullParserException, IOException {
9339e33621a725bcdaa21a723866e53c6ea3356169Alan Viverette        final TypedArray a = obtainAttributes(r, theme, attrs, R.styleable.InsetDrawable);
948e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        super.inflateWithAttributes(r, parser, a, R.styleable.InsetDrawable_visible);
95014e14b242848eaa86a10562e1c494143a0149aaChet Haase
96d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        // Reset mDrawable to preserve old multiple-inflate behavior. This is
97d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        // silly, but we have CTS tests that rely on it.
98d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState.mDrawable = null;
99d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette
1008e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        updateStateFromTypedArray(a);
101d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        inflateChildElements(r, parser, attrs, theme);
102d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        verifyRequiredAttributes(a);
103d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        a.recycle();
104d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette    }
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
106d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette    private void inflateChildElements(Resources r, XmlPullParser parser, AttributeSet attrs,
107d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette            Theme theme) throws XmlPullParserException, IOException {
1088e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        // Load inner XML elements.
109d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        if (mState.mDrawable == null) {
1108e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette            int type;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while ((type=parser.next()) == XmlPullParser.TEXT) {
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type != XmlPullParser.START_TAG) {
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new XmlPullParserException(
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        parser.getPositionDescription()
1168e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette                                + ": <inset> tag requires a 'drawable' attribute or "
1178e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette                                + "child tag defining a drawable");
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1198e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette            final Drawable dr = Drawable.createFromXmlInner(r, parser, attrs, theme);
120d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette            mState.mDrawable = dr;
1218e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette            dr.setCallback(this);
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1230bece71ee24f75967b86de47cae07e6fc04b4b36Alan Viverette    }
1240bece71ee24f75967b86de47cae07e6fc04b4b36Alan Viverette
1250bece71ee24f75967b86de47cae07e6fc04b4b36Alan Viverette    private void verifyRequiredAttributes(TypedArray a) throws XmlPullParserException {
1260bece71ee24f75967b86de47cae07e6fc04b4b36Alan Viverette        // If we're not waiting on a theme, verify required attributes.
127d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        if (mState.mDrawable == null && (mState.mThemeAttrs == null
128d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette                || mState.mThemeAttrs[R.styleable.InsetDrawable_drawable] == 0)) {
129d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette            throw new XmlPullParserException(a.getPositionDescription()
130d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette                    + ": <inset> tag requires a 'drawable' attribute or "
1310bece71ee24f75967b86de47cae07e6fc04b4b36Alan Viverette                    + "child tag defining a drawable");
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1338e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette    }
1348e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette
1358e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette    private void updateStateFromTypedArray(TypedArray a) throws XmlPullParserException {
136d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        final InsetState state = mState;
1378e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette
1388e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        // Account for any configuration changes.
1398e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        state.mChangingConfigurations |= a.getChangingConfigurations();
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1418e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        // Extract the theme attributes, if any.
1428e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        state.mThemeAttrs = a.extractThemeAttrs();
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1444afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette        final int N = a.getIndexCount();
1454afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette        for (int i = 0; i < N; i++) {
1464afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette            final int attr = a.getIndex(i);
1474afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette            switch (attr) {
1484afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                case R.styleable.InsetDrawable_drawable:
1494afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                    final Drawable dr = a.getDrawable(attr);
1504afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                    if (dr != null) {
1514afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                        state.mDrawable = dr;
1524afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                        dr.setCallback(this);
1534afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                    }
1544afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                    break;
1554afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                case R.styleable.InsetDrawable_inset:
1564afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                    final int inset = a.getDimensionPixelOffset(attr, Integer.MIN_VALUE);
1574afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                    if (inset != Integer.MIN_VALUE) {
1584afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                        state.mInsetLeft = inset;
1594afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                        state.mInsetTop = inset;
1604afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                        state.mInsetRight = inset;
1614afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                        state.mInsetBottom = inset;
1624afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                    }
1634afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                    break;
1644afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                case R.styleable.InsetDrawable_insetLeft:
1654afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                    state.mInsetLeft = a.getDimensionPixelOffset(attr, state.mInsetLeft);
1664afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                    break;
1674afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                case R.styleable.InsetDrawable_insetTop:
1684afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                    state.mInsetTop = a.getDimensionPixelOffset(attr, state.mInsetTop);
1694afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                    break;
1704afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                case R.styleable.InsetDrawable_insetRight:
1714afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                    state.mInsetRight = a.getDimensionPixelOffset(attr, state.mInsetRight);
1724afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                    break;
1734afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                case R.styleable.InsetDrawable_insetBottom:
1744afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                    state.mInsetBottom = a.getDimensionPixelOffset(attr, state.mInsetBottom);
1754afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette                    break;
1764afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette            }
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1788e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette    }
1798e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette
1808e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette    @Override
1818e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette    public void applyTheme(Theme t) {
1828e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        super.applyTheme(t);
1838e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette
184d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        final InsetState state = mState;
18517cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette        if (state == null) {
1868e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette            return;
1878e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        }
1888e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette
18917cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette        if (state.mThemeAttrs != null) {
19017cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette            final TypedArray a = t.resolveAttributes(state.mThemeAttrs, R.styleable.InsetDrawable);
19117cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette            try {
19217cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette                updateStateFromTypedArray(a);
19317cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette                verifyRequiredAttributes(a);
19417cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette            } catch (XmlPullParserException e) {
19517cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette                throw new RuntimeException(e);
19617cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette            } finally {
19717cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette                a.recycle();
19817cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette            }
19917cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette        }
20017cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette
20117cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette        if (state.mDrawable != null && state.mDrawable.canApplyTheme()) {
20217cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette            state.mDrawable.applyTheme(t);
2038e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        }
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2068e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette    @Override
2078e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette    public boolean canApplyTheme() {
208d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        return (mState != null && mState.canApplyTheme()) || super.canApplyTheme();
2098e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette    }
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
211c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette    @Override
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void invalidateDrawable(Drawable who) {
213f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        final Callback callback = getCallback();
214f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        if (callback != null) {
215f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy            callback.invalidateDrawable(this);
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette    @Override
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void scheduleDrawable(Drawable who, Runnable what, long when) {
221f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        final Callback callback = getCallback();
222f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        if (callback != null) {
223f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy            callback.scheduleDrawable(this, what, when);
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
227c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette    @Override
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unscheduleDrawable(Drawable who, Runnable what) {
229f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        final Callback callback = getCallback();
230f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        if (callback != null) {
231f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy            callback.unscheduleDrawable(this, what);
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void draw(Canvas canvas) {
237d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState.mDrawable.draw(canvas);
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getChangingConfigurations() {
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return super.getChangingConfigurations()
243d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette                | mState.mChangingConfigurations
244d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette                | mState.mDrawable.getChangingConfigurations();
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
246b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean getPadding(Rect padding) {
249d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        boolean pad = mState.mDrawable.getPadding(padding);
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
251d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        padding.left += mState.mInsetLeft;
252d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        padding.right += mState.mInsetRight;
253d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        padding.top += mState.mInsetTop;
254d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        padding.bottom += mState.mInsetBottom;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
256d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        return pad || (mState.mInsetLeft | mState.mInsetRight |
257d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette                mState.mInsetTop | mState.mInsetBottom) != 0;
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
260c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette    /** @hide */
261c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette    @Override
262c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette    public Insets getOpticalInsets() {
263c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette        final Insets contentInsets = super.getOpticalInsets();
264d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        return Insets.of(contentInsets.left + mState.mInsetLeft,
265d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette                contentInsets.top + mState.mInsetTop,
266d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette                contentInsets.right + mState.mInsetRight,
267d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette                contentInsets.bottom + mState.mInsetBottom);
268c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette    }
269c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette
27087980f9a7383fa4150f9c037ed34c37677f97f97Alan Viverette    @Override
271c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette    public void setHotspot(float x, float y) {
272d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState.mDrawable.setHotspot(x, y);
27387980f9a7383fa4150f9c037ed34c37677f97f97Alan Viverette    }
27487980f9a7383fa4150f9c037ed34c37677f97f97Alan Viverette
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
27653a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette    public void setHotspotBounds(int left, int top, int right, int bottom) {
277d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState.mDrawable.setHotspotBounds(left, top, right, bottom);
27853a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette    }
27953a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette
2807068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette    /** @hide */
2817068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette    @Override
2827068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette    public void getHotspotBounds(Rect outRect) {
283d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState.mDrawable.getHotspotBounds(outRect);
2847068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette    }
2857068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette
28653a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette    @Override
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean setVisible(boolean visible, boolean restart) {
288d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState.mDrawable.setVisible(visible, restart);
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return super.setVisible(visible, restart);
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAlpha(int alpha) {
294d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState.mDrawable.setAlpha(alpha);
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
296b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase
297b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase    @Override
298b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase    public int getAlpha() {
299d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        return mState.mDrawable.getAlpha();
300b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase    }
301b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setColorFilter(ColorFilter cf) {
304d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState.mDrawable.setColorFilter(cf);
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
306ee3e1603fdbbe24b0cbf3cb85c456696cf3b7941Jeff Sharkey
307b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    @Override
308a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    public void setTintList(ColorStateList tint) {
309d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState.mDrawable.setTintList(tint);
310a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    }
311a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette
312a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    @Override
313a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    public void setTintMode(Mode tintMode) {
314d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState.mDrawable.setTintMode(tintMode);
315b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    }
316b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
317ee3e1603fdbbe24b0cbf3cb85c456696cf3b7941Jeff Sharkey    /** {@hide} */
318ee3e1603fdbbe24b0cbf3cb85c456696cf3b7941Jeff Sharkey    @Override
319ee3e1603fdbbe24b0cbf3cb85c456696cf3b7941Jeff Sharkey    public void setLayoutDirection(int layoutDirection) {
320d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState.mDrawable.setLayoutDirection(layoutDirection);
321ee3e1603fdbbe24b0cbf3cb85c456696cf3b7941Jeff Sharkey    }
322ee3e1603fdbbe24b0cbf3cb85c456696cf3b7941Jeff Sharkey
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getOpacity() {
3256dfa60f33ca6018959ebff1efde82db7d2aed1e3Alan Viverette        final InsetState state = mState;
3266dfa60f33ca6018959ebff1efde82db7d2aed1e3Alan Viverette        final int opacity = state.mDrawable.getOpacity();
3276dfa60f33ca6018959ebff1efde82db7d2aed1e3Alan Viverette        if (opacity == PixelFormat.OPAQUE && (state.mInsetLeft > 0 || state.mInsetTop > 0
3286dfa60f33ca6018959ebff1efde82db7d2aed1e3Alan Viverette                || state.mInsetRight > 0 || state.mInsetBottom > 0)) {
3296dfa60f33ca6018959ebff1efde82db7d2aed1e3Alan Viverette            return PixelFormat.TRANSLUCENT;
3306dfa60f33ca6018959ebff1efde82db7d2aed1e3Alan Viverette        }
3316dfa60f33ca6018959ebff1efde82db7d2aed1e3Alan Viverette        return opacity;
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
333b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isStateful() {
336d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        return mState.mDrawable.isStateful();
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean onStateChange(int[] state) {
341d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        boolean changed = mState.mDrawable.setState(state);
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onBoundsChange(getBounds());
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return changed;
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
345b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
346b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    @Override
347b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    protected boolean onLevelChange(int level) {
348d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        return mState.mDrawable.setLevel(level);
349b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    }
350b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onBoundsChange(Rect bounds) {
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Rect r = mTmpRect;
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        r.set(bounds);
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
356d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        r.left += mState.mInsetLeft;
357d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        r.top += mState.mInsetTop;
358d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        r.right -= mState.mInsetRight;
359d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        r.bottom -= mState.mInsetBottom;
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
361d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState.mDrawable.setBounds(r.left, r.top, r.right, r.bottom);
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getIntrinsicWidth() {
366d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        return mState.mDrawable.getIntrinsicWidth()
367d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette                + mState.mInsetLeft + mState.mInsetRight;
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getIntrinsicHeight() {
372d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        return mState.mDrawable.getIntrinsicHeight()
373d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette                + mState.mInsetTop + mState.mInsetBottom;
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
37731ba192dd201df2cad96a8c503f730130ab0d80fChris Craik    public void getOutline(@NonNull Outline outline) {
378d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState.mDrawable.getOutline(outline);
3793e1585e05ddb0fd60033a5603e330b8ab1f69303Chris Craik    }
3803e1585e05ddb0fd60033a5603e330b8ab1f69303Chris Craik
3813e1585e05ddb0fd60033a5603e330b8ab1f69303Chris Craik    @Override
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ConstantState getConstantState() {
383d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        if (mState.canConstantState()) {
384d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette            mState.mChangingConfigurations = getChangingConfigurations();
385d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette            return mState;
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable mutate() {
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mMutated && super.mutate() == this) {
393d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette            mState.mDrawable.mutate();
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMutated = true;
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return this;
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39984956d53f1e86b8c000f8994ea9040b71a30e321Romain Guy    /**
400727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     * @hide
401727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     */
402727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette    public void clearMutated() {
403727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette        super.clearMutated();
404d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState.mDrawable.clearMutated();
405727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette        mMutated = false;
406727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette    }
407727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette
408727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette    /**
40984956d53f1e86b8c000f8994ea9040b71a30e321Romain Guy     * Returns the drawable wrapped by this InsetDrawable. May be null.
41084956d53f1e86b8c000f8994ea9040b71a30e321Romain Guy     */
41184956d53f1e86b8c000f8994ea9040b71a30e321Romain Guy    public Drawable getDrawable() {
412d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        return mState.mDrawable;
41384956d53f1e86b8c000f8994ea9040b71a30e321Romain Guy    }
41484956d53f1e86b8c000f8994ea9040b71a30e321Romain Guy
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final static class InsetState extends ConstantState {
4168e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        int[] mThemeAttrs;
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mChangingConfigurations;
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4198e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette        Drawable mDrawable;
4208e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette
421d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        int mInsetLeft = 0;
422d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        int mInsetTop = 0;
423d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        int mInsetRight = 0;
424d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        int mInsetBottom = 0;
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
426d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        private boolean mCheckedConstantState;
427d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        private boolean mCanConstantState;
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        InsetState(InsetState orig, InsetDrawable owner, Resources res) {
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (orig != null) {
4318e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette                mThemeAttrs = orig.mThemeAttrs;
4328e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette                mChangingConfigurations = orig.mChangingConfigurations;
433c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn                if (res != null) {
434c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn                    mDrawable = orig.mDrawable.getConstantState().newDrawable(res);
435c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn                } else {
436c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn                    mDrawable = orig.mDrawable.getConstantState().newDrawable();
437c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn                }
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDrawable.setCallback(owner);
439731ba6649a40529657aa68f93e6febe7d98b4f3bFabrice Di Meglio                mDrawable.setLayoutDirection(orig.mDrawable.getLayoutDirection());
440d7853e576301bf68e96148a0b9e52085bfc7cf95Alan Viverette                mDrawable.setBounds(orig.mDrawable.getBounds());
441d7853e576301bf68e96148a0b9e52085bfc7cf95Alan Viverette                mDrawable.setLevel(orig.mDrawable.getLevel());
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInsetLeft = orig.mInsetLeft;
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInsetTop = orig.mInsetTop;
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInsetRight = orig.mInsetRight;
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInsetBottom = orig.mInsetBottom;
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCheckedConstantState = mCanConstantState = true;
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
451d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        public boolean canApplyTheme() {
452d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette            return mThemeAttrs != null || (mDrawable != null && mDrawable.canApplyTheme())
453d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette                    || super.canApplyTheme();
454d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        }
455d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette
456d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        @Override
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Drawable newDrawable() {
458c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn            return new InsetDrawable(this, null);
459c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        }
460b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
461c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        @Override
462c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        public Drawable newDrawable(Resources res) {
463c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn            return new InsetDrawable(this, res);
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
465b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getChangingConfigurations() {
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mChangingConfigurations;
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean canConstantState() {
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mCheckedConstantState) {
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCanConstantState = mDrawable.getConstantState() != null;
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCheckedConstantState = true;
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCanConstantState;
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
479dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck
480dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck        @Override
481dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck        public int addAtlasableBitmaps(Collection<Bitmap> atlasList) {
482dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck            final ConstantState state = mDrawable.getConstantState();
483dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck            if (state != null) {
484dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck                return state.addAtlasableBitmaps(atlasList);
485dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck            }
486dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck            return 0;
487dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck        }
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
490c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn    private InsetDrawable(InsetState state, Resources res) {
491d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState = new InsetState(state, this, res);
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
495