19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.graphics.drawable;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viveretteimport com.android.internal.R;
20d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParser;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
247e3ede288926bdfb79b1571fed74cad614935821Alan Viveretteimport android.annotation.NonNull;
257e3ede288926bdfb79b1571fed74cad614935821Alan Viveretteimport android.annotation.Nullable;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
2852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viveretteimport android.content.res.Resources.Theme;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.*;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Gravity;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A Drawable that clips another Drawable based on this Drawable's current
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * level value.  You can control how much the child Drawable gets clipped in width
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and height based on the level, as well as a gravity to control where it is
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * placed in its overall container.  Most often used to implement things like
40dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * progress bars, by increasing the drawable's level with {@link
41dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * android.graphics.drawable.Drawable#setLevel(int) setLevel()}.
42dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * <p class="note"><strong>Note:</strong> The drawable is clipped completely and not visible when
43dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * the level is 0 and fully revealed when the level is 10,000.</p>
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
45dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * <p>It can be defined in an XML file with the <code>&lt;clip></code> element.  For more
46dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * information, see the guide to <a
47dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>.</p>
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ClipDrawable_clipOrientation
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ClipDrawable_gravity
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ClipDrawable_drawable
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
53a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverettepublic class ClipDrawable extends DrawableWrapper {
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int HORIZONTAL = 1;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int VERTICAL = 2;
56b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
570b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette    private static final int MAX_LEVEL = 10000;
580b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette
59a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette    private final Rect mTmpRect = new Rect();
60a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette
61a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette    private ClipState mState;
62727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ClipDrawable() {
647e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        this(new ClipState(null, null), null);
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
68a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     * Creates a new clip drawable with the specified gravity and orientation.
69a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     *
70a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     * @param drawable the drawable to clip
71a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     * @param gravity gravity constant (see {@link Gravity} used to position
72a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     *                the clipped drawable within the parent container
73a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     * @param orientation bitwise-or of {@link #HORIZONTAL} and/or
74a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     *                   {@link #VERTICAL}
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ClipDrawable(Drawable drawable, int gravity, int orientation) {
777e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        this(new ClipState(null, null), null);
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
79d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState.mGravity = gravity;
80d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        mState.mOrientation = orientation;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette        setDrawable(drawable);
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
867e3ede288926bdfb79b1571fed74cad614935821Alan Viverette    public void inflate(@NonNull Resources r, @NonNull XmlPullParser parser,
877e3ede288926bdfb79b1571fed74cad614935821Alan Viverette            @NonNull AttributeSet attrs, @Nullable Theme theme)
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
897e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        final TypedArray a = obtainAttributes(r, theme, attrs, R.styleable.ClipDrawable);
907e3ede288926bdfb79b1571fed74cad614935821Alan Viverette
917e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        // Inflation will advance the XmlPullParser and AttributeSet.
9252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        super.inflate(r, parser, attrs, theme);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
94d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        updateStateFromTypedArray(a);
95d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        verifyRequiredAttributes(a);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
97d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette    }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
99a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette    @Override
1007e3ede288926bdfb79b1571fed74cad614935821Alan Viverette    public void applyTheme(@NonNull Theme t) {
1017e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        super.applyTheme(t);
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
103d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        final ClipState state = mState;
104a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette        if (state == null) {
10517cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette            return;
10617cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette        }
10717cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette
108a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette        if (state.mThemeAttrs != null) {
109a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette            final TypedArray a = t.resolveAttributes(state.mThemeAttrs, R.styleable.ClipDrawable);
110a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette            try {
111a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette                updateStateFromTypedArray(a);
112a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette                verifyRequiredAttributes(a);
113a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette            } catch (XmlPullParserException e) {
114c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette                rethrowAsRuntimeException(e);
115a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette            } finally {
116a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette                a.recycle();
117a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette            }
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1197e3ede288926bdfb79b1571fed74cad614935821Alan Viverette    }
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1217e3ede288926bdfb79b1571fed74cad614935821Alan Viverette    private void verifyRequiredAttributes(@NonNull TypedArray a) throws XmlPullParserException {
1227e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        // If we're not waiting on a theme, verify required attributes.
1237e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        if (getDrawable() == null && (mState.mThemeAttrs == null
1247e3ede288926bdfb79b1571fed74cad614935821Alan Viverette                || mState.mThemeAttrs[R.styleable.ClipDrawable_drawable] == 0)) {
1257e3ede288926bdfb79b1571fed74cad614935821Alan Viverette            throw new XmlPullParserException(a.getPositionDescription()
1267e3ede288926bdfb79b1571fed74cad614935821Alan Viverette                    + ": <clip> tag requires a 'drawable' attribute or "
1277e3ede288926bdfb79b1571fed74cad614935821Alan Viverette                    + "child tag defining a drawable");
1287e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        }
1297e3ede288926bdfb79b1571fed74cad614935821Alan Viverette    }
1307e3ede288926bdfb79b1571fed74cad614935821Alan Viverette
1317e3ede288926bdfb79b1571fed74cad614935821Alan Viverette    private void updateStateFromTypedArray(@NonNull TypedArray a) {
1327e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        final ClipState state = mState;
1337e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        if (state == null) {
1347e3ede288926bdfb79b1571fed74cad614935821Alan Viverette            return;
1357e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        }
1367e3ede288926bdfb79b1571fed74cad614935821Alan Viverette
1377e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        // Account for any configuration changes.
1387e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        state.mChangingConfigurations |= a.getChangingConfigurations();
1397e3ede288926bdfb79b1571fed74cad614935821Alan Viverette
1407e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        // Extract the theme attributes, if any.
1417e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        state.mThemeAttrs = a.extractThemeAttrs();
1427e3ede288926bdfb79b1571fed74cad614935821Alan Viverette
1437e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        state.mOrientation = a.getInt(
1447e3ede288926bdfb79b1571fed74cad614935821Alan Viverette                R.styleable.ClipDrawable_clipOrientation, state.mOrientation);
1457e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        state.mGravity = a.getInt(
1467e3ede288926bdfb79b1571fed74cad614935821Alan Viverette                R.styleable.ClipDrawable_gravity, state.mGravity);
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1500b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette    protected boolean onLevelChange(int level) {
151a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette        super.onLevelChange(level);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidateSelf();
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
157b63b93dee7744f00280ea998ef24d0a1d57d3934Alan Viverette    public int getOpacity() {
158b63b93dee7744f00280ea998ef24d0a1d57d3934Alan Viverette        final Drawable dr = getDrawable();
159b63b93dee7744f00280ea998ef24d0a1d57d3934Alan Viverette        final int opacity = dr.getOpacity();
1600b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette        if (opacity == PixelFormat.TRANSPARENT || dr.getLevel() == 0) {
161b63b93dee7744f00280ea998ef24d0a1d57d3934Alan Viverette            return PixelFormat.TRANSPARENT;
162b63b93dee7744f00280ea998ef24d0a1d57d3934Alan Viverette        }
163b63b93dee7744f00280ea998ef24d0a1d57d3934Alan Viverette
1640b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette        final int level = getLevel();
1650b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette        if (level >= MAX_LEVEL) {
166b63b93dee7744f00280ea998ef24d0a1d57d3934Alan Viverette            return dr.getOpacity();
167b63b93dee7744f00280ea998ef24d0a1d57d3934Alan Viverette        }
168b63b93dee7744f00280ea998ef24d0a1d57d3934Alan Viverette
169b63b93dee7744f00280ea998ef24d0a1d57d3934Alan Viverette        // Some portion of non-transparent drawable is showing.
170b63b93dee7744f00280ea998ef24d0a1d57d3934Alan Viverette        return PixelFormat.TRANSLUCENT;
171b63b93dee7744f00280ea998ef24d0a1d57d3934Alan Viverette    }
172b63b93dee7744f00280ea998ef24d0a1d57d3934Alan Viverette
173b63b93dee7744f00280ea998ef24d0a1d57d3934Alan Viverette    @Override
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void draw(Canvas canvas) {
175a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette        final Drawable dr = getDrawable();
1760b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette        if (dr.getLevel() == 0) {
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Rect r = mTmpRect;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Rect bounds = getBounds();
1820b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette        final int level = getLevel();
183a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int w = bounds.width();
1850b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette        final int iw = 0; //mState.mDrawable.getIntrinsicWidth();
186d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        if ((mState.mOrientation & HORIZONTAL) != 0) {
1870b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette            w -= (w - iw) * (MAX_LEVEL - level) / MAX_LEVEL;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
189a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int h = bounds.height();
1910b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette        final int ih = 0; //mState.mDrawable.getIntrinsicHeight();
192d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        if ((mState.mOrientation & VERTICAL) != 0) {
1930b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette            h -= (h - ih) * (MAX_LEVEL - level) / MAX_LEVEL;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
195a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette
196b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio        final int layoutDirection = getLayoutDirection();
197d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        Gravity.apply(mState.mGravity, w, h, bounds, r, layoutDirection);
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (w > 0 && h > 0) {
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            canvas.save();
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            canvas.clipRect(r);
202a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette            dr.draw(canvas);
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            canvas.restore();
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2077e3ede288926bdfb79b1571fed74cad614935821Alan Viverette    @Override
2087e3ede288926bdfb79b1571fed74cad614935821Alan Viverette    DrawableWrapperState mutateConstantState() {
2097e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        mState = new ClipState(mState, null);
2107e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        return mState;
2117e3ede288926bdfb79b1571fed74cad614935821Alan Viverette    }
2127e3ede288926bdfb79b1571fed74cad614935821Alan Viverette
213a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette    static final class ClipState extends DrawableWrapper.DrawableWrapperState {
2147e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        private int[] mThemeAttrs;
2157e3ede288926bdfb79b1571fed74cad614935821Alan Viverette
216d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        int mOrientation = HORIZONTAL;
217d21fd9d1ccd2b525f9c004a6cd9ba19a645701abAlan Viverette        int mGravity = Gravity.LEFT;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2197e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        ClipState(ClipState orig, Resources res) {
2207e3ede288926bdfb79b1571fed74cad614935821Alan Viverette            super(orig, res);
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (orig != null) {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOrientation = orig.mOrientation;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mGravity = orig.mGravity;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
229c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        public Drawable newDrawable(Resources res) {
230c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn            return new ClipDrawable(this, res);
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
234c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn    private ClipDrawable(ClipState state, Resources res) {
235a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette        super(state, res);
236a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette
237a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette        mState = state;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
241