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