259 lines
11 KiB
Java
259 lines
11 KiB
Java
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() + ": <item> 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;
|
|
}
|
|
}
|
|
}
|