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><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