97 lines
4 KiB
Java
97 lines
4 KiB
Java
package androidx.appcompat.widget;
|
|
|
|
import android.content.Context;
|
|
import android.content.res.ColorStateList;
|
|
import android.content.res.TypedArray;
|
|
import android.graphics.Color;
|
|
import android.util.AttributeSet;
|
|
import android.util.Log;
|
|
import android.util.TypedValue;
|
|
import android.view.View;
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
import androidx.annotation.RestrictTo;
|
|
import androidx.appcompat.R;
|
|
import androidx.core.graphics.ColorUtils;
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY})
|
|
public class ThemeUtils {
|
|
public static final int[] ACTIVATED_STATE_SET = {16843518};
|
|
public static final int[] CHECKED_STATE_SET = {16842912};
|
|
public static final int[] DISABLED_STATE_SET = {-16842910};
|
|
public static final int[] EMPTY_STATE_SET = new int[0];
|
|
public static final int[] FOCUSED_STATE_SET = {16842908};
|
|
public static final int[] NOT_PRESSED_OR_FOCUSED_STATE_SET = {-16842919, -16842908};
|
|
public static final int[] PRESSED_STATE_SET = {16842919};
|
|
public static final int[] SELECTED_STATE_SET = {16842913};
|
|
private static final String TAG = "ThemeUtils";
|
|
private static final int[] TEMP_ARRAY = new int[1];
|
|
private static final ThreadLocal<TypedValue> TL_TYPED_VALUE = new ThreadLocal<>();
|
|
|
|
private ThemeUtils() {
|
|
}
|
|
|
|
public static void checkAppCompatTheme(@NonNull View view, @NonNull Context context) {
|
|
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(R.styleable.AppCompatTheme);
|
|
try {
|
|
if (!obtainStyledAttributes.hasValue(R.styleable.AppCompatTheme_windowActionBar)) {
|
|
Log.e(TAG, "View " + view.getClass() + " is an AppCompat widget that can only be used with a Theme.AppCompat theme (or descendant).");
|
|
}
|
|
} finally {
|
|
obtainStyledAttributes.recycle();
|
|
}
|
|
}
|
|
|
|
@NonNull
|
|
public static ColorStateList createDisabledStateList(int i, int i2) {
|
|
return new ColorStateList(new int[][]{DISABLED_STATE_SET, EMPTY_STATE_SET}, new int[]{i2, i});
|
|
}
|
|
|
|
public static int getDisabledThemeAttrColor(@NonNull Context context, int i) {
|
|
ColorStateList themeAttrColorStateList = getThemeAttrColorStateList(context, i);
|
|
if (themeAttrColorStateList != null && themeAttrColorStateList.isStateful()) {
|
|
return themeAttrColorStateList.getColorForState(DISABLED_STATE_SET, themeAttrColorStateList.getDefaultColor());
|
|
}
|
|
TypedValue typedValue = getTypedValue();
|
|
context.getTheme().resolveAttribute(16842803, typedValue, true);
|
|
return getThemeAttrColor(context, i, typedValue.getFloat());
|
|
}
|
|
|
|
public static int getThemeAttrColor(@NonNull Context context, int i) {
|
|
int[] iArr = TEMP_ARRAY;
|
|
iArr[0] = i;
|
|
TintTypedArray obtainStyledAttributes = TintTypedArray.obtainStyledAttributes(context, (AttributeSet) null, iArr);
|
|
try {
|
|
return obtainStyledAttributes.getColor(0, 0);
|
|
} finally {
|
|
obtainStyledAttributes.recycle();
|
|
}
|
|
}
|
|
|
|
public static int getThemeAttrColor(@NonNull Context context, int i, float f) {
|
|
int themeAttrColor = getThemeAttrColor(context, i);
|
|
return ColorUtils.setAlphaComponent(themeAttrColor, Math.round(((float) Color.alpha(themeAttrColor)) * f));
|
|
}
|
|
|
|
@Nullable
|
|
public static ColorStateList getThemeAttrColorStateList(@NonNull Context context, int i) {
|
|
int[] iArr = TEMP_ARRAY;
|
|
iArr[0] = i;
|
|
TintTypedArray obtainStyledAttributes = TintTypedArray.obtainStyledAttributes(context, (AttributeSet) null, iArr);
|
|
try {
|
|
return obtainStyledAttributes.getColorStateList(0);
|
|
} finally {
|
|
obtainStyledAttributes.recycle();
|
|
}
|
|
}
|
|
|
|
private static TypedValue getTypedValue() {
|
|
ThreadLocal<TypedValue> threadLocal = TL_TYPED_VALUE;
|
|
TypedValue typedValue = threadLocal.get();
|
|
if (typedValue != null) {
|
|
return typedValue;
|
|
}
|
|
TypedValue typedValue2 = new TypedValue();
|
|
threadLocal.set(typedValue2);
|
|
return typedValue2;
|
|
}
|
|
}
|