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 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParser; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24a12962207155305da44b5a1b8fb9acaed358c14cAlan Viveretteimport android.annotation.NonNull; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 2652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viveretteimport android.content.res.Resources.Theme; 27a12962207155305da44b5a1b8fb9acaed358c14cAlan Viveretteimport android.content.res.TypedArray; 280bece71ee24f75967b86de47cae07e6fc04b4b36Alan Viveretteimport android.graphics.Insets; 290bece71ee24f75967b86de47cae07e6fc04b4b36Alan Viveretteimport android.graphics.Outline; 306dfa60f33ca6018959ebff1efde82db7d2aed1e3Alan Viveretteimport android.graphics.PixelFormat; 310bece71ee24f75967b86de47cae07e6fc04b4b36Alan Viveretteimport android.graphics.Rect; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A Drawable that insets another Drawable by a specified distance. 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is used when a View needs a background that is smaller than 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the View's actual bounds. 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 41dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * <p>It can be defined in an XML file with the <code><inset></code> element. For more 42dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * information, see the guide to <a 43dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>.</p> 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#InsetDrawable_visible 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#InsetDrawable_drawable 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#InsetDrawable_insetLeft 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#InsetDrawable_insetRight 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#InsetDrawable_insetTop 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#InsetDrawable_insetBottom 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 52a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverettepublic class InsetDrawable extends DrawableWrapper { 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Rect mTmpRect = new Rect(); 548e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette 55f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette private InsetState mState; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 57f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette /** 58f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette * No-arg constructor used by drawable inflation. 59f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette */ 60f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette InsetDrawable() { 61f74869698abff333daed28aa2f472a1e3183c2edAlan Viverette this(new InsetState(null), null); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 64f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette /** 65f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette * Creates a new inset drawable with the specified inset. 66f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette * 67f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette * @param drawable The drawable to inset. 68f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette * @param inset Inset in pixels around the drawable. 69f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette */ 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InsetDrawable(Drawable drawable, int inset) { 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(drawable, inset, inset, inset, inset); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 74f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette /** 75f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette * Creates a new inset drawable with the specified insets. 76f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette * 77f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette * @param drawable The drawable to inset. 78f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette * @param insetLeft Left inset in pixels. 79f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette * @param insetTop Top inset in pixels. 80f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette * @param insetRight Right inset in pixels. 81f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette * @param insetBottom Bottom inset in pixels. 82f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette */ 83f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette public InsetDrawable(Drawable drawable, int insetLeft, int insetTop,int insetRight, 84f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette int insetBottom) { 85f74869698abff333daed28aa2f472a1e3183c2edAlan Viverette this(new InsetState(null), null); 86b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 87d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette mState.mInsetLeft = insetLeft; 88d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette mState.mInsetTop = insetTop; 89d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette mState.mInsetRight = insetRight; 90d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette mState.mInsetBottom = insetBottom; 91b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 92a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette setDrawable(drawable); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 9552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette @Override 9652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs, Theme theme) 9752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette throws XmlPullParserException, IOException { 98a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette super.inflate(r, parser, attrs, theme); 99014e14b242848eaa86a10562e1c494143a0149aaChet Haase 100a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette final TypedArray a = obtainAttributes(r, theme, attrs, R.styleable.InsetDrawable); 1018e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette updateStateFromTypedArray(a); 102a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette inflateChildDrawable(r, parser, attrs, theme); 103d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette verifyRequiredAttributes(a); 104d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette a.recycle(); 105d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1070bece71ee24f75967b86de47cae07e6fc04b4b36Alan Viverette private void verifyRequiredAttributes(TypedArray a) throws XmlPullParserException { 1080bece71ee24f75967b86de47cae07e6fc04b4b36Alan Viverette // If we're not waiting on a theme, verify required attributes. 109a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (getDrawable() == null && (mState.mThemeAttrs == null 110d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette || mState.mThemeAttrs[R.styleable.InsetDrawable_drawable] == 0)) { 111d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette throw new XmlPullParserException(a.getPositionDescription() 112d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette + ": <inset> tag requires a 'drawable' attribute or " 1130bece71ee24f75967b86de47cae07e6fc04b4b36Alan Viverette + "child tag defining a drawable"); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1158e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette } 1168e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette 117a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 118a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette void updateStateFromTypedArray(TypedArray a) { 119a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette super.updateStateFromTypedArray(a); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 121a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette final InsetState state = mState; 1224afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette final int N = a.getIndexCount(); 1234afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette for (int i = 0; i < N; i++) { 1244afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette final int attr = a.getIndex(i); 1254afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette switch (attr) { 1264afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette case R.styleable.InsetDrawable_drawable: 1274afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette final Drawable dr = a.getDrawable(attr); 1284afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette if (dr != null) { 129bc43ac2094a833623e99c38cd3d0cedfef61260eAlan Viverette setDrawable(dr); 1304afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette } 1314afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette break; 1324afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette case R.styleable.InsetDrawable_inset: 1334afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette final int inset = a.getDimensionPixelOffset(attr, Integer.MIN_VALUE); 1344afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette if (inset != Integer.MIN_VALUE) { 1354afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette state.mInsetLeft = inset; 1364afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette state.mInsetTop = inset; 1374afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette state.mInsetRight = inset; 1384afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette state.mInsetBottom = inset; 1394afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette } 1404afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette break; 1414afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette case R.styleable.InsetDrawable_insetLeft: 1424afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette state.mInsetLeft = a.getDimensionPixelOffset(attr, state.mInsetLeft); 1434afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette break; 1444afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette case R.styleable.InsetDrawable_insetTop: 1454afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette state.mInsetTop = a.getDimensionPixelOffset(attr, state.mInsetTop); 1464afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette break; 1474afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette case R.styleable.InsetDrawable_insetRight: 1484afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette state.mInsetRight = a.getDimensionPixelOffset(attr, state.mInsetRight); 1494afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette break; 1504afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette case R.styleable.InsetDrawable_insetBottom: 1514afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette state.mInsetBottom = a.getDimensionPixelOffset(attr, state.mInsetBottom); 1524afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette break; 1534afbbfd54739e879e28ef3919a4fef82e6c523adAlan Viverette } 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1558e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette } 1568e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette 1578e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette @Override 1588e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette public void applyTheme(Theme t) { 159d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette final InsetState state = mState; 16017cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette if (state == null) { 1618e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette return; 1628e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette } 1638e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette 16417cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette if (state.mThemeAttrs != null) { 16517cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette final TypedArray a = t.resolveAttributes(state.mThemeAttrs, R.styleable.InsetDrawable); 16617cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette try { 16717cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette updateStateFromTypedArray(a); 16817cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette verifyRequiredAttributes(a); 16917cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette } catch (XmlPullParserException e) { 17017cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette throw new RuntimeException(e); 17117cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette } finally { 17217cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette a.recycle(); 17317cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette } 17417cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette } 17517cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette 176a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette // The drawable may have changed as a result of applying the theme, so 177a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette // apply the theme to the wrapped drawable last. 178a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette super.applyTheme(t); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 180b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getPadding(Rect padding) { 183a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette final boolean pad = super.getPadding(padding); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 185d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette padding.left += mState.mInsetLeft; 186d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette padding.right += mState.mInsetRight; 187d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette padding.top += mState.mInsetTop; 188d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette padding.bottom += mState.mInsetBottom; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 190f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette return pad || (mState.mInsetLeft | mState.mInsetRight 191f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette | mState.mInsetTop | mState.mInsetBottom) != 0; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 194c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette /** @hide */ 195c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette @Override 196c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette public Insets getOpticalInsets() { 197c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette final Insets contentInsets = super.getOpticalInsets(); 198d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette return Insets.of(contentInsets.left + mState.mInsetLeft, 199d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette contentInsets.top + mState.mInsetTop, 200d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette contentInsets.right + mState.mInsetRight, 201d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette contentInsets.bottom + mState.mInsetBottom); 202c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette } 203c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette 20487980f9a7383fa4150f9c037ed34c37677f97f97Alan Viverette @Override 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getOpacity() { 2066dfa60f33ca6018959ebff1efde82db7d2aed1e3Alan Viverette final InsetState state = mState; 207a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette final int opacity = getDrawable().getOpacity(); 2086dfa60f33ca6018959ebff1efde82db7d2aed1e3Alan Viverette if (opacity == PixelFormat.OPAQUE && (state.mInsetLeft > 0 || state.mInsetTop > 0 2096dfa60f33ca6018959ebff1efde82db7d2aed1e3Alan Viverette || state.mInsetRight > 0 || state.mInsetBottom > 0)) { 2106dfa60f33ca6018959ebff1efde82db7d2aed1e3Alan Viverette return PixelFormat.TRANSLUCENT; 2116dfa60f33ca6018959ebff1efde82db7d2aed1e3Alan Viverette } 2126dfa60f33ca6018959ebff1efde82db7d2aed1e3Alan Viverette return opacity; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 214b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onBoundsChange(Rect bounds) { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Rect r = mTmpRect; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.set(bounds); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 220d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette r.left += mState.mInsetLeft; 221d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette r.top += mState.mInsetTop; 222d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette r.right -= mState.mInsetRight; 223d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette r.bottom -= mState.mInsetBottom; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 225a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette // Apply inset bounds to the wrapped drawable. 226a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette super.onBoundsChange(r); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIntrinsicWidth() { 231a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return getDrawable().getIntrinsicWidth() + mState.mInsetLeft + mState.mInsetRight; 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIntrinsicHeight() { 236a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return getDrawable().getIntrinsicHeight() + mState.mInsetTop + mState.mInsetBottom; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 24031ba192dd201df2cad96a8c503f730130ab0d80fChris Craik public void getOutline(@NonNull Outline outline) { 241a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette getDrawable().getOutline(outline); 2423e1585e05ddb0fd60033a5603e330b8ab1f69303Chris Craik } 2433e1585e05ddb0fd60033a5603e330b8ab1f69303Chris Craik 2443e1585e05ddb0fd60033a5603e330b8ab1f69303Chris Craik @Override 245a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette DrawableWrapperState mutateConstantState() { 246a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mState = new InsetState(mState); 247a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return mState; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 250a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette static final class InsetState extends DrawableWrapper.DrawableWrapperState { 251d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette int mInsetLeft = 0; 252d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette int mInsetTop = 0; 253d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette int mInsetRight = 0; 254d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette int mInsetBottom = 0; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 256a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette InsetState(InsetState orig) { 257a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette super(orig); 258a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (orig != null) { 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInsetLeft = orig.mInsetLeft; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInsetTop = orig.mInsetTop; 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInsetRight = orig.mInsetRight; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInsetBottom = orig.mInsetBottom; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 268c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn public Drawable newDrawable(Resources res) { 269c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn return new InsetDrawable(this, res); 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 273f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette /** 274f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette * The one constructor to rule them all. This is called by all public 275f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette * constructors to set the state and initialize local properties. 276f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette */ 277c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn private InsetDrawable(InsetState state, Resources res) { 278a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette super(state, res); 279f0f7f8ceb5d1effd34fe2734f6493726bf01dd1cAlan Viverette 280a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mState = state; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 284