1a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette/* 2a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * Copyright (C) 2015 The Android Open Source Project 3a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * 4a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * Licensed under the Apache License, Version 2.0 (the "License"); 5a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * you may not use this file except in compliance with the License. 6a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * You may obtain a copy of the License at 7a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * 8a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * http://www.apache.org/licenses/LICENSE-2.0 9a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * 10a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * Unless required by applicable law or agreed to in writing, software 11a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * distributed under the License is distributed on an "AS IS" BASIS, 12a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * See the License for the specific language governing permissions and 14a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * limitations under the License. 15a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette */ 16a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 17a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverettepackage android.graphics.drawable; 18a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 197e3ede288926bdfb79b1571fed74cad614935821Alan Viveretteimport com.android.internal.R; 207e3ede288926bdfb79b1571fed74cad614935821Alan Viverette 21a12962207155305da44b5a1b8fb9acaed358c14cAlan Viveretteimport org.xmlpull.v1.XmlPullParser; 22a12962207155305da44b5a1b8fb9acaed358c14cAlan Viveretteimport org.xmlpull.v1.XmlPullParserException; 23a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 24a12962207155305da44b5a1b8fb9acaed358c14cAlan Viveretteimport android.annotation.NonNull; 25a12962207155305da44b5a1b8fb9acaed358c14cAlan Viveretteimport android.annotation.Nullable; 26ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viveretteimport android.content.pm.ActivityInfo.Config; 27a12962207155305da44b5a1b8fb9acaed358c14cAlan Viveretteimport android.content.res.ColorStateList; 28a12962207155305da44b5a1b8fb9acaed358c14cAlan Viveretteimport android.content.res.Resources; 297e3ede288926bdfb79b1571fed74cad614935821Alan Viveretteimport android.content.res.Resources.Theme; 30a12962207155305da44b5a1b8fb9acaed358c14cAlan Viveretteimport android.content.res.TypedArray; 31a12962207155305da44b5a1b8fb9acaed358c14cAlan Viveretteimport android.graphics.Bitmap; 32a12962207155305da44b5a1b8fb9acaed358c14cAlan Viveretteimport android.graphics.Canvas; 33a12962207155305da44b5a1b8fb9acaed358c14cAlan Viveretteimport android.graphics.ColorFilter; 34a12962207155305da44b5a1b8fb9acaed358c14cAlan Viveretteimport android.graphics.Insets; 35a12962207155305da44b5a1b8fb9acaed358c14cAlan Viveretteimport android.graphics.Outline; 36a12962207155305da44b5a1b8fb9acaed358c14cAlan Viveretteimport android.graphics.PixelFormat; 37a12962207155305da44b5a1b8fb9acaed358c14cAlan Viveretteimport android.graphics.PorterDuff; 38a12962207155305da44b5a1b8fb9acaed358c14cAlan Viveretteimport android.graphics.Rect; 39a12962207155305da44b5a1b8fb9acaed358c14cAlan Viveretteimport android.util.AttributeSet; 407e3ede288926bdfb79b1571fed74cad614935821Alan Viveretteimport android.util.DisplayMetrics; 41a12962207155305da44b5a1b8fb9acaed358c14cAlan Viveretteimport android.view.View; 42a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 43a12962207155305da44b5a1b8fb9acaed358c14cAlan Viveretteimport java.io.IOException; 44a12962207155305da44b5a1b8fb9acaed358c14cAlan Viveretteimport java.util.Collection; 45a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 46a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette/** 47a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * Drawable container with only one child element. 48a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette */ 49a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverettepublic abstract class DrawableWrapper extends Drawable implements Drawable.Callback { 50a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette private DrawableWrapperState mState; 51a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette private Drawable mDrawable; 52a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette private boolean mMutated; 53a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 54a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette DrawableWrapper(DrawableWrapperState state, Resources res) { 55a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mState = state; 56a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 57a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette updateLocalState(res); 58a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 59a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 60a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette /** 61a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * Creates a new wrapper around the specified drawable. 62a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * 63a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * @param dr the drawable to wrap 64a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette */ 65a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public DrawableWrapper(@Nullable Drawable dr) { 66a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mState = null; 67a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mDrawable = dr; 68a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 69a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 70a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette /** 71a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * Initializes local dynamic properties from state. This should be called 72a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * after significant state changes, e.g. from the One True Constructor and 73a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * after inflating or applying a theme. 74a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette */ 75a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette private void updateLocalState(Resources res) { 76a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (mState != null && mState.mDrawableState != null) { 77a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette final Drawable dr = mState.mDrawableState.newDrawable(res); 78a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette setDrawable(dr); 79a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 80a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 81a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 82a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette /** 83a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * Sets the wrapped drawable. 84a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * 85a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * @param dr the wrapped drawable 86a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette */ 87a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public void setDrawable(@Nullable Drawable dr) { 88a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (mDrawable != null) { 89a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mDrawable.setCallback(null); 90a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 91a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 92a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mDrawable = dr; 93a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 94a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (dr != null) { 95a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette dr.setCallback(this); 96a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 97a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette // Only call setters for data that's stored in the base Drawable. 98a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette dr.setVisible(isVisible(), true); 99a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette dr.setState(getState()); 1000b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette dr.setLevel(getLevel()); 101a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette dr.setBounds(getBounds()); 102a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette dr.setLayoutDirection(getLayoutDirection()); 103a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 104a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (mState != null) { 105a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mState.mDrawableState = dr.getConstantState(); 106a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 107a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 108a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 109a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette invalidateSelf(); 110a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 111a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 112a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette /** 113a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * @return the wrapped drawable 114a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette */ 115a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Nullable 116a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public Drawable getDrawable() { 117a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return mDrawable; 118a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 119a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 1207e3ede288926bdfb79b1571fed74cad614935821Alan Viverette @Override 1217e3ede288926bdfb79b1571fed74cad614935821Alan Viverette public void inflate(@NonNull Resources r, @NonNull XmlPullParser parser, 1227e3ede288926bdfb79b1571fed74cad614935821Alan Viverette @NonNull AttributeSet attrs, @Nullable Theme theme) 1237e3ede288926bdfb79b1571fed74cad614935821Alan Viverette throws XmlPullParserException, IOException { 1247e3ede288926bdfb79b1571fed74cad614935821Alan Viverette super.inflate(r, parser, attrs, theme); 1257e3ede288926bdfb79b1571fed74cad614935821Alan Viverette 126a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette final DrawableWrapperState state = mState; 127a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (state == null) { 128a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return; 129a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 130a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 1317e3ede288926bdfb79b1571fed74cad614935821Alan Viverette // The density may have changed since the last update. This will 1327e3ede288926bdfb79b1571fed74cad614935821Alan Viverette // apply scaling to any existing constant state properties. 1337e3ede288926bdfb79b1571fed74cad614935821Alan Viverette final int densityDpi = r.getDisplayMetrics().densityDpi; 1347e3ede288926bdfb79b1571fed74cad614935821Alan Viverette final int targetDensity = densityDpi == 0 ? DisplayMetrics.DENSITY_DEFAULT : densityDpi; 1357e3ede288926bdfb79b1571fed74cad614935821Alan Viverette state.setDensity(targetDensity); 136a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 1377e3ede288926bdfb79b1571fed74cad614935821Alan Viverette final TypedArray a = obtainAttributes(r, theme, attrs, R.styleable.DrawableWrapper); 1387e3ede288926bdfb79b1571fed74cad614935821Alan Viverette updateStateFromTypedArray(a); 1397e3ede288926bdfb79b1571fed74cad614935821Alan Viverette a.recycle(); 140a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 1417e3ede288926bdfb79b1571fed74cad614935821Alan Viverette inflateChildDrawable(r, parser, attrs, theme); 142a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 143a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 144a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 1457e3ede288926bdfb79b1571fed74cad614935821Alan Viverette public void applyTheme(@NonNull Theme t) { 146a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette super.applyTheme(t); 147a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 1487e3ede288926bdfb79b1571fed74cad614935821Alan Viverette // If we load the drawable later as part of updating from the typed 1497e3ede288926bdfb79b1571fed74cad614935821Alan Viverette // array, it will already be themed correctly. So, we can theme the 1507e3ede288926bdfb79b1571fed74cad614935821Alan Viverette // local drawable first. 1517e3ede288926bdfb79b1571fed74cad614935821Alan Viverette if (mDrawable != null && mDrawable.canApplyTheme()) { 1527e3ede288926bdfb79b1571fed74cad614935821Alan Viverette mDrawable.applyTheme(t); 1537e3ede288926bdfb79b1571fed74cad614935821Alan Viverette } 1547e3ede288926bdfb79b1571fed74cad614935821Alan Viverette 155a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette final DrawableWrapperState state = mState; 156a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (state == null) { 157a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return; 158a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 159a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 1607e3ede288926bdfb79b1571fed74cad614935821Alan Viverette final int densityDpi = t.getResources().getDisplayMetrics().densityDpi; 1617e3ede288926bdfb79b1571fed74cad614935821Alan Viverette final int density = densityDpi == 0 ? DisplayMetrics.DENSITY_DEFAULT : densityDpi; 1627e3ede288926bdfb79b1571fed74cad614935821Alan Viverette state.setDensity(density); 1637e3ede288926bdfb79b1571fed74cad614935821Alan Viverette 1647e3ede288926bdfb79b1571fed74cad614935821Alan Viverette if (state.mThemeAttrs != null) { 1657e3ede288926bdfb79b1571fed74cad614935821Alan Viverette final TypedArray a = t.resolveAttributes( 1667e3ede288926bdfb79b1571fed74cad614935821Alan Viverette state.mThemeAttrs, R.styleable.DrawableWrapper); 1677e3ede288926bdfb79b1571fed74cad614935821Alan Viverette updateStateFromTypedArray(a); 1687e3ede288926bdfb79b1571fed74cad614935821Alan Viverette a.recycle(); 1697e3ede288926bdfb79b1571fed74cad614935821Alan Viverette } 1707e3ede288926bdfb79b1571fed74cad614935821Alan Viverette } 1717e3ede288926bdfb79b1571fed74cad614935821Alan Viverette 1727e3ede288926bdfb79b1571fed74cad614935821Alan Viverette /** 1737e3ede288926bdfb79b1571fed74cad614935821Alan Viverette * Updates constant state properties from the provided typed array. 1747e3ede288926bdfb79b1571fed74cad614935821Alan Viverette * <p> 1757e3ede288926bdfb79b1571fed74cad614935821Alan Viverette * Implementing subclasses should call through to the super method first. 1767e3ede288926bdfb79b1571fed74cad614935821Alan Viverette * 1777e3ede288926bdfb79b1571fed74cad614935821Alan Viverette * @param a the typed array rom which properties should be read 1787e3ede288926bdfb79b1571fed74cad614935821Alan Viverette */ 1797e3ede288926bdfb79b1571fed74cad614935821Alan Viverette private void updateStateFromTypedArray(@NonNull TypedArray a) { 1807e3ede288926bdfb79b1571fed74cad614935821Alan Viverette final DrawableWrapperState state = mState; 1817e3ede288926bdfb79b1571fed74cad614935821Alan Viverette if (state == null) { 1827e3ede288926bdfb79b1571fed74cad614935821Alan Viverette return; 1837e3ede288926bdfb79b1571fed74cad614935821Alan Viverette } 1847e3ede288926bdfb79b1571fed74cad614935821Alan Viverette 1857e3ede288926bdfb79b1571fed74cad614935821Alan Viverette // Account for any configuration changes. 1867e3ede288926bdfb79b1571fed74cad614935821Alan Viverette state.mChangingConfigurations |= a.getChangingConfigurations(); 1877e3ede288926bdfb79b1571fed74cad614935821Alan Viverette 1887e3ede288926bdfb79b1571fed74cad614935821Alan Viverette // Extract the theme attributes, if any. 1897e3ede288926bdfb79b1571fed74cad614935821Alan Viverette state.mThemeAttrs = a.extractThemeAttrs(); 1907e3ede288926bdfb79b1571fed74cad614935821Alan Viverette 1917e3ede288926bdfb79b1571fed74cad614935821Alan Viverette if (a.hasValueOrEmpty(R.styleable.DrawableWrapper_drawable)) { 1927e3ede288926bdfb79b1571fed74cad614935821Alan Viverette setDrawable(a.getDrawable(R.styleable.DrawableWrapper_drawable)); 193a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 194a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 195a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 196a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 197a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public boolean canApplyTheme() { 198a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return (mState != null && mState.canApplyTheme()) || super.canApplyTheme(); 199a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 200a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 201a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 202f6d87ec193f17e8dad82c9994ba7a58e975d364bAlan Viverette public void invalidateDrawable(@NonNull Drawable who) { 203a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette final Callback callback = getCallback(); 204a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (callback != null) { 205a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette callback.invalidateDrawable(this); 206a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 207a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 208a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 209a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 210f6d87ec193f17e8dad82c9994ba7a58e975d364bAlan Viverette public void scheduleDrawable(@NonNull Drawable who, @NonNull Runnable what, long when) { 211a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette final Callback callback = getCallback(); 212a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (callback != null) { 213a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette callback.scheduleDrawable(this, what, when); 214a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 215a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 216a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 217a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 218f6d87ec193f17e8dad82c9994ba7a58e975d364bAlan Viverette public void unscheduleDrawable(@NonNull Drawable who, @NonNull Runnable what) { 219a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette final Callback callback = getCallback(); 220a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (callback != null) { 221a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette callback.unscheduleDrawable(this, what); 222a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 223a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 224a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 225a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 226a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public void draw(@NonNull Canvas canvas) { 227a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (mDrawable != null) { 228a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mDrawable.draw(canvas); 229a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 230a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 231a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 232a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 233ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette public @Config int getChangingConfigurations() { 234a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return super.getChangingConfigurations() 235b63b93dee7744f00280ea998ef24d0a1d57d3934Alan Viverette | (mState != null ? mState.getChangingConfigurations() : 0) 236b63b93dee7744f00280ea998ef24d0a1d57d3934Alan Viverette | mDrawable.getChangingConfigurations(); 237a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 238a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 239a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 240a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public boolean getPadding(@NonNull Rect padding) { 241a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return mDrawable != null && mDrawable.getPadding(padding); 242a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 243a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 244a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette /** @hide */ 245a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 246a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public Insets getOpticalInsets() { 247a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return mDrawable != null ? mDrawable.getOpticalInsets() : Insets.NONE; 248a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 249a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 250a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 251a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public void setHotspot(float x, float y) { 252a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (mDrawable != null) { 253a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mDrawable.setHotspot(x, y); 254a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 255a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 256a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 257a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 258a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public void setHotspotBounds(int left, int top, int right, int bottom) { 259a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (mDrawable != null) { 260a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mDrawable.setHotspotBounds(left, top, right, bottom); 261a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 262a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 263a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 264a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 265a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public void getHotspotBounds(@NonNull Rect outRect) { 266a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (mDrawable != null) { 267a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mDrawable.getHotspotBounds(outRect); 268a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } else { 269a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette outRect.set(getBounds()); 270a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 271a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 272a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 273a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 274a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public boolean setVisible(boolean visible, boolean restart) { 275a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette final boolean superChanged = super.setVisible(visible, restart); 276a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette final boolean changed = mDrawable != null && mDrawable.setVisible(visible, restart); 277a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return superChanged | changed; 278a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 279a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 280a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 281a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public void setAlpha(int alpha) { 282a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (mDrawable != null) { 283a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mDrawable.setAlpha(alpha); 284a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 285a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 286a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 287a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 288a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public int getAlpha() { 289a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return mDrawable != null ? mDrawable.getAlpha() : 255; 290a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 291a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 292a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 293bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik public void setColorFilter(@Nullable ColorFilter colorFilter) { 294a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (mDrawable != null) { 295bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik mDrawable.setColorFilter(colorFilter); 296a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 297a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 298a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 299a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 300a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public void setTintList(@Nullable ColorStateList tint) { 301a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (mDrawable != null) { 302a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mDrawable.setTintList(tint); 303a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 304a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 305a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 306a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 307a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public void setTintMode(@Nullable PorterDuff.Mode tintMode) { 308a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (mDrawable != null) { 309a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mDrawable.setTintMode(tintMode); 310a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 311a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 312a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 313a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 314dfa4646eca54511a28f2c61e1f4b9c697e05a913Alan Viverette public boolean onLayoutDirectionChanged(@View.ResolvedLayoutDir int layoutDirection) { 315a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return mDrawable != null && mDrawable.setLayoutDirection(layoutDirection); 316a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 317a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 318a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 319a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public int getOpacity() { 320a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return mDrawable != null ? mDrawable.getOpacity() : PixelFormat.TRANSPARENT; 321a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 322a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 323a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 324a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public boolean isStateful() { 325a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return mDrawable != null && mDrawable.isStateful(); 326a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 327a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 328a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 329a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette protected boolean onStateChange(int[] state) { 3301b23240f96bd5318933accf6b212b62f803bee13Alan Viverette if (mDrawable != null && mDrawable.isStateful()) { 331a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette final boolean changed = mDrawable.setState(state); 332a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (changed) { 333a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette onBoundsChange(getBounds()); 334a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 335a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return changed; 336a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 337a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return false; 338a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 339a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 340a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 3410b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette protected boolean onLevelChange(int level) { 342a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return mDrawable != null && mDrawable.setLevel(level); 343a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 344a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 345a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 346a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette protected void onBoundsChange(@NonNull Rect bounds) { 347a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (mDrawable != null) { 348a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mDrawable.setBounds(bounds); 349a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 350a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 351a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 352a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 353a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public int getIntrinsicWidth() { 354a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return mDrawable != null ? mDrawable.getIntrinsicWidth() : -1; 355a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 356a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 357a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 358a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public int getIntrinsicHeight() { 359a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return mDrawable != null ? mDrawable.getIntrinsicHeight() : -1; 360a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 361a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 362a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 363a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public void getOutline(@NonNull Outline outline) { 364a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (mDrawable != null) { 365a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mDrawable.getOutline(outline); 366a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } else { 367a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette super.getOutline(outline); 368a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 369a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 370a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 371a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 372a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Nullable 373a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public ConstantState getConstantState() { 374a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (mState != null && mState.canConstantState()) { 375a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mState.mChangingConfigurations = getChangingConfigurations(); 376a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return mState; 377a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 378a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return null; 379a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 380a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 381a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 382a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @NonNull 383a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public Drawable mutate() { 384a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (!mMutated && super.mutate() == this) { 385a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mState = mutateConstantState(); 386a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (mDrawable != null) { 387a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mDrawable.mutate(); 388a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 389a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (mState != null) { 390a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mState.mDrawableState = mDrawable != null ? mDrawable.getConstantState() : null; 391a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 392a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mMutated = true; 393a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 394a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return this; 395a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 396a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 397a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette /** 398a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * Mutates the constant state and returns the new state. Responsible for 399a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * updating any local copy. 400a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * <p> 401a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * This method should never call the super implementation; it should always 402a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * mutate and return its own constant state. 403a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * 404a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * @return the new state 405a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette */ 406a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette DrawableWrapperState mutateConstantState() { 407a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return mState; 408a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 409a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 410a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette /** 411a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * @hide Only used by the framework for pre-loading resources. 412a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette */ 413a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public void clearMutated() { 414a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette super.clearMutated(); 415a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (mDrawable != null) { 416a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mDrawable.clearMutated(); 417a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 418a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mMutated = false; 419a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 420a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 421a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette /** 422b63b93dee7744f00280ea998ef24d0a1d57d3934Alan Viverette * Called during inflation to inflate the child element. The last valid 423b63b93dee7744f00280ea998ef24d0a1d57d3934Alan Viverette * child element will take precedence over any other child elements or 424b63b93dee7744f00280ea998ef24d0a1d57d3934Alan Viverette * explicit drawable attribute. 425a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette */ 4267e3ede288926bdfb79b1571fed74cad614935821Alan Viverette private void inflateChildDrawable(@NonNull Resources r, @NonNull XmlPullParser parser, 4277e3ede288926bdfb79b1571fed74cad614935821Alan Viverette @NonNull AttributeSet attrs, @Nullable Theme theme) 4287e3ede288926bdfb79b1571fed74cad614935821Alan Viverette throws XmlPullParserException, IOException { 429a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette // Seek to the first child element. 430a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette Drawable dr = null; 431a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette int type; 432a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette final int outerDepth = parser.getDepth(); 433a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 434a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 435a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (type == XmlPullParser.START_TAG) { 436a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette dr = Drawable.createFromXmlInner(r, parser, attrs, theme); 437a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 438a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 439a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 440a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (dr != null) { 441a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette setDrawable(dr); 442a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 443a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 444a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 445a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette abstract static class DrawableWrapperState extends Drawable.ConstantState { 4467e3ede288926bdfb79b1571fed74cad614935821Alan Viverette private int[] mThemeAttrs; 4477e3ede288926bdfb79b1571fed74cad614935821Alan Viverette 448ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette @Config int mChangingConfigurations; 4497e3ede288926bdfb79b1571fed74cad614935821Alan Viverette int mDensity = DisplayMetrics.DENSITY_DEFAULT; 450a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 451a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette Drawable.ConstantState mDrawableState; 452a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 4537e3ede288926bdfb79b1571fed74cad614935821Alan Viverette DrawableWrapperState(@Nullable DrawableWrapperState orig, @Nullable Resources res) { 454a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (orig != null) { 455a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mThemeAttrs = orig.mThemeAttrs; 456a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mChangingConfigurations = orig.mChangingConfigurations; 457a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette mDrawableState = orig.mDrawableState; 458a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 4597e3ede288926bdfb79b1571fed74cad614935821Alan Viverette 4607e3ede288926bdfb79b1571fed74cad614935821Alan Viverette final int density; 4617e3ede288926bdfb79b1571fed74cad614935821Alan Viverette if (res != null) { 4627e3ede288926bdfb79b1571fed74cad614935821Alan Viverette density = res.getDisplayMetrics().densityDpi; 4637e3ede288926bdfb79b1571fed74cad614935821Alan Viverette } else if (orig != null) { 4647e3ede288926bdfb79b1571fed74cad614935821Alan Viverette density = orig.mDensity; 4657e3ede288926bdfb79b1571fed74cad614935821Alan Viverette } else { 4667e3ede288926bdfb79b1571fed74cad614935821Alan Viverette density = 0; 4677e3ede288926bdfb79b1571fed74cad614935821Alan Viverette } 4687e3ede288926bdfb79b1571fed74cad614935821Alan Viverette 4697e3ede288926bdfb79b1571fed74cad614935821Alan Viverette mDensity = density == 0 ? DisplayMetrics.DENSITY_DEFAULT : density; 4707e3ede288926bdfb79b1571fed74cad614935821Alan Viverette } 4717e3ede288926bdfb79b1571fed74cad614935821Alan Viverette 4727e3ede288926bdfb79b1571fed74cad614935821Alan Viverette /** 4737e3ede288926bdfb79b1571fed74cad614935821Alan Viverette * Sets the constant state density. 4747e3ede288926bdfb79b1571fed74cad614935821Alan Viverette * <p> 4757e3ede288926bdfb79b1571fed74cad614935821Alan Viverette * If the density has been previously set, dispatches the change to 4767e3ede288926bdfb79b1571fed74cad614935821Alan Viverette * subclasses so that density-dependent properties may be scaled as 4777e3ede288926bdfb79b1571fed74cad614935821Alan Viverette * necessary. 4787e3ede288926bdfb79b1571fed74cad614935821Alan Viverette * 4797e3ede288926bdfb79b1571fed74cad614935821Alan Viverette * @param targetDensity the new constant state density 4807e3ede288926bdfb79b1571fed74cad614935821Alan Viverette */ 4817e3ede288926bdfb79b1571fed74cad614935821Alan Viverette public final void setDensity(int targetDensity) { 4827e3ede288926bdfb79b1571fed74cad614935821Alan Viverette if (mDensity != targetDensity) { 4837e3ede288926bdfb79b1571fed74cad614935821Alan Viverette final int sourceDensity = mDensity; 4847e3ede288926bdfb79b1571fed74cad614935821Alan Viverette mDensity = targetDensity; 4857e3ede288926bdfb79b1571fed74cad614935821Alan Viverette 4867e3ede288926bdfb79b1571fed74cad614935821Alan Viverette onDensityChanged(sourceDensity, targetDensity); 4877e3ede288926bdfb79b1571fed74cad614935821Alan Viverette } 4887e3ede288926bdfb79b1571fed74cad614935821Alan Viverette } 4897e3ede288926bdfb79b1571fed74cad614935821Alan Viverette 4907e3ede288926bdfb79b1571fed74cad614935821Alan Viverette /** 4917e3ede288926bdfb79b1571fed74cad614935821Alan Viverette * Called when the constant state density changes. 4927e3ede288926bdfb79b1571fed74cad614935821Alan Viverette * <p> 4937e3ede288926bdfb79b1571fed74cad614935821Alan Viverette * Subclasses with density-dependent constant state properties should 4947e3ede288926bdfb79b1571fed74cad614935821Alan Viverette * override this method and scale their properties as necessary. 4957e3ede288926bdfb79b1571fed74cad614935821Alan Viverette * 4967e3ede288926bdfb79b1571fed74cad614935821Alan Viverette * @param sourceDensity the previous constant state density 4977e3ede288926bdfb79b1571fed74cad614935821Alan Viverette * @param targetDensity the new constant state density 4987e3ede288926bdfb79b1571fed74cad614935821Alan Viverette */ 4997e3ede288926bdfb79b1571fed74cad614935821Alan Viverette void onDensityChanged(int sourceDensity, int targetDensity) { 5007e3ede288926bdfb79b1571fed74cad614935821Alan Viverette // Stub method. 501a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 502a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 503a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 504a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public boolean canApplyTheme() { 505a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return mThemeAttrs != null 506a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette || (mDrawableState != null && mDrawableState.canApplyTheme()) 507a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette || super.canApplyTheme(); 508a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 509a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 510a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 511a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public int addAtlasableBitmaps(Collection<Bitmap> atlasList) { 512a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette final Drawable.ConstantState state = mDrawableState; 513a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (state != null) { 514a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return state.addAtlasableBitmaps(atlasList); 515a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 516a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return 0; 517a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 518a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 519a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 520a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public Drawable newDrawable() { 521a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return newDrawable(null); 522a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 523a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 524a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 5257e3ede288926bdfb79b1571fed74cad614935821Alan Viverette public abstract Drawable newDrawable(@Nullable Resources res); 526a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 527a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette @Override 528ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette public @Config int getChangingConfigurations() { 529e922f49b627912c113250bd8506830bb69943025Alan Viverette return mChangingConfigurations 530e922f49b627912c113250bd8506830bb69943025Alan Viverette | (mDrawableState != null ? mDrawableState.getChangingConfigurations() : 0); 531a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 532a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 533a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public boolean canConstantState() { 534a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return mDrawableState != null; 535a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 536a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 537a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette} 538