package androidx.appcompat.graphics.drawable; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.StateSet; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.annotation.RestrictTo; import androidx.appcompat.graphics.drawable.DrawableContainer; import androidx.appcompat.resources.R; import androidx.appcompat.widget.ResourceManagerInternal; import androidx.core.content.res.TypedArrayUtils; import java.io.IOException; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @SuppressLint({"RestrictedAPI"}) @RestrictTo({RestrictTo.Scope.LIBRARY_GROUP_PREFIX}) public class StateListDrawable extends DrawableContainer { private static final boolean DEBUG = false; private static final String TAG = "StateListDrawable"; private boolean mMutated; private StateListState mStateListState; public static class StateListState extends DrawableContainer.DrawableContainerState { public int[][] mStateSets; public StateListState(StateListState stateListState, StateListDrawable stateListDrawable, Resources resources) { super(stateListState, stateListDrawable, resources); if (stateListState != null) { this.mStateSets = stateListState.mStateSets; } else { this.mStateSets = new int[getCapacity()][]; } } public int addStateSet(int[] iArr, Drawable drawable) { int addChild = addChild(drawable); this.mStateSets[addChild] = iArr; return addChild; } @Override // androidx.appcompat.graphics.drawable.DrawableContainer.DrawableContainerState public void growArray(int i, int i2) { super.growArray(i, i2); int[][] iArr = new int[i2][]; System.arraycopy(this.mStateSets, 0, iArr, 0, i); this.mStateSets = iArr; } public int indexOfStateSet(int[] iArr) { int[][] iArr2 = this.mStateSets; int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { if (StateSet.stateSetMatches(iArr2[i], iArr)) { return i; } } return -1; } @Override // androidx.appcompat.graphics.drawable.DrawableContainer.DrawableContainerState public void mutate() { int[][] iArr = this.mStateSets; int[][] iArr2 = new int[iArr.length][]; for (int length = iArr.length - 1; length >= 0; length--) { int[][] iArr3 = this.mStateSets; iArr2[length] = iArr3[length] != null ? (int[]) iArr3[length].clone() : null; } this.mStateSets = iArr2; } @Override // android.graphics.drawable.Drawable.ConstantState @NonNull public Drawable newDrawable() { return new StateListDrawable(this, null); } @Override // android.graphics.drawable.Drawable.ConstantState @NonNull public Drawable newDrawable(Resources resources) { return new StateListDrawable(this, resources); } } public StateListDrawable() { this(null, null); } public StateListDrawable(@Nullable StateListState stateListState) { if (stateListState != null) { setConstantState(stateListState); } } public StateListDrawable(StateListState stateListState, Resources resources) { setConstantState(new StateListState(stateListState, this, resources)); onStateChange(getState()); } private void inflateChildElements(Context context, Resources resources, XmlPullParser xmlPullParser, AttributeSet attributeSet, Resources.Theme theme) throws XmlPullParserException, IOException { int next; StateListState stateListState = this.mStateListState; int depth = xmlPullParser.getDepth() + 1; while (true) { int next2 = xmlPullParser.next(); if (next2 != 1) { int depth2 = xmlPullParser.getDepth(); if (depth2 < depth && next2 == 3) { return; } if (next2 == 2 && depth2 <= depth && xmlPullParser.getName().equals("item")) { TypedArray obtainAttributes = TypedArrayUtils.obtainAttributes(resources, theme, attributeSet, R.styleable.StateListDrawableItem); Drawable drawable = null; int resourceId = obtainAttributes.getResourceId(R.styleable.StateListDrawableItem_android_drawable, -1); if (resourceId > 0) { drawable = ResourceManagerInternal.get().getDrawable(context, resourceId); } obtainAttributes.recycle(); int[] extractStateSet = extractStateSet(attributeSet); if (drawable == null) { do { next = xmlPullParser.next(); } while (next == 4); if (next == 2) { drawable = Drawable.createFromXmlInner(resources, xmlPullParser, attributeSet, theme); } else { throw new XmlPullParserException(xmlPullParser.getPositionDescription() + ": tag requires a 'drawable' attribute or child tag defining a drawable"); } } stateListState.addStateSet(extractStateSet, drawable); } } else { return; } } } private void updateStateFromTypedArray(TypedArray typedArray) { StateListState stateListState = this.mStateListState; stateListState.mChangingConfigurations |= typedArray.getChangingConfigurations(); stateListState.mVariablePadding = typedArray.getBoolean(R.styleable.StateListDrawable_android_variablePadding, stateListState.mVariablePadding); stateListState.mConstantSize = typedArray.getBoolean(R.styleable.StateListDrawable_android_constantSize, stateListState.mConstantSize); stateListState.mEnterFadeDuration = typedArray.getInt(R.styleable.StateListDrawable_android_enterFadeDuration, stateListState.mEnterFadeDuration); stateListState.mExitFadeDuration = typedArray.getInt(R.styleable.StateListDrawable_android_exitFadeDuration, stateListState.mExitFadeDuration); stateListState.mDither = typedArray.getBoolean(R.styleable.StateListDrawable_android_dither, stateListState.mDither); } public void addState(int[] iArr, Drawable drawable) { if (drawable != null) { this.mStateListState.addStateSet(iArr, drawable); onStateChange(getState()); } } @Override // androidx.appcompat.graphics.drawable.DrawableContainer, android.graphics.drawable.Drawable @RequiresApi(21) public void applyTheme(@NonNull Resources.Theme theme) { super.applyTheme(theme); onStateChange(getState()); } @Override // androidx.appcompat.graphics.drawable.DrawableContainer public void clearMutated() { super.clearMutated(); this.mMutated = false; } @Override // androidx.appcompat.graphics.drawable.DrawableContainer public StateListState cloneConstantState() { return new StateListState(this.mStateListState, this, null); } public int[] extractStateSet(AttributeSet attributeSet) { int attributeCount = attributeSet.getAttributeCount(); int[] iArr = new int[attributeCount]; int i = 0; for (int i2 = 0; i2 < attributeCount; i2++) { int attributeNameResource = attributeSet.getAttributeNameResource(i2); if (!(attributeNameResource == 0 || attributeNameResource == 16842960 || attributeNameResource == 16843161)) { int i3 = i + 1; if (!attributeSet.getAttributeBooleanValue(i2, false)) { attributeNameResource = -attributeNameResource; } iArr[i] = attributeNameResource; i = i3; } } return StateSet.trimStateSet(iArr, i); } public int getStateCount() { return this.mStateListState.getChildCount(); } public Drawable getStateDrawable(int i) { return this.mStateListState.getChild(i); } public int getStateDrawableIndex(int[] iArr) { return this.mStateListState.indexOfStateSet(iArr); } public StateListState getStateListState() { return this.mStateListState; } public int[] getStateSet(int i) { return this.mStateListState.mStateSets[i]; } public void inflate(@NonNull Context context, @NonNull Resources resources, @NonNull XmlPullParser xmlPullParser, @NonNull AttributeSet attributeSet, @Nullable Resources.Theme theme) throws XmlPullParserException, IOException { TypedArray obtainAttributes = TypedArrayUtils.obtainAttributes(resources, theme, attributeSet, R.styleable.StateListDrawable); setVisible(obtainAttributes.getBoolean(R.styleable.StateListDrawable_android_visible, true), true); updateStateFromTypedArray(obtainAttributes); updateDensity(resources); obtainAttributes.recycle(); inflateChildElements(context, resources, xmlPullParser, attributeSet, theme); onStateChange(getState()); } @Override // androidx.appcompat.graphics.drawable.DrawableContainer, android.graphics.drawable.Drawable public boolean isStateful() { return true; } @Override // androidx.appcompat.graphics.drawable.DrawableContainer, android.graphics.drawable.Drawable @NonNull public Drawable mutate() { if (!this.mMutated && super.mutate() == this) { this.mStateListState.mutate(); this.mMutated = true; } return this; } @Override // androidx.appcompat.graphics.drawable.DrawableContainer, android.graphics.drawable.Drawable public boolean onStateChange(int[] iArr) { boolean onStateChange = super.onStateChange(iArr); int indexOfStateSet = this.mStateListState.indexOfStateSet(iArr); if (indexOfStateSet < 0) { indexOfStateSet = this.mStateListState.indexOfStateSet(StateSet.WILD_CARD); } return selectDrawable(indexOfStateSet) || onStateChange; } @Override // androidx.appcompat.graphics.drawable.DrawableContainer public void setConstantState(@NonNull DrawableContainer.DrawableContainerState drawableContainerState) { super.setConstantState(drawableContainerState); if (drawableContainerState instanceof StateListState) { this.mStateListState = (StateListState) drawableContainerState; } } }