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>&lt;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