mirror of
https://github.com/Pinball3D/Rabbit-R1.git
synced 2025-01-09 13:43:22 +00:00
1599 lines
61 KiB
Java
1599 lines
61 KiB
Java
package com.google.android.material.chip;
|
|
|
|
import android.R;
|
|
import android.content.Context;
|
|
import android.content.res.ColorStateList;
|
|
import android.content.res.TypedArray;
|
|
import android.graphics.Canvas;
|
|
import android.graphics.ColorFilter;
|
|
import android.graphics.Outline;
|
|
import android.graphics.Paint;
|
|
import android.graphics.Path;
|
|
import android.graphics.PointF;
|
|
import android.graphics.PorterDuff;
|
|
import android.graphics.PorterDuffColorFilter;
|
|
import android.graphics.Rect;
|
|
import android.graphics.RectF;
|
|
import android.graphics.drawable.Drawable;
|
|
import android.graphics.drawable.RippleDrawable;
|
|
import android.graphics.drawable.ShapeDrawable;
|
|
import android.graphics.drawable.shapes.OvalShape;
|
|
import android.text.TextUtils;
|
|
import android.util.AttributeSet;
|
|
import androidx.appcompat.content.res.AppCompatResources;
|
|
import androidx.core.graphics.ColorUtils;
|
|
import androidx.core.graphics.drawable.DrawableCompat;
|
|
import androidx.core.graphics.drawable.TintAwareDrawable;
|
|
import androidx.core.internal.view.SupportMenu;
|
|
import androidx.core.text.BidiFormatter;
|
|
import androidx.core.view.ViewCompat;
|
|
import com.google.android.material.animation.MotionSpec;
|
|
import com.google.android.material.canvas.CanvasCompat;
|
|
import com.google.android.material.color.MaterialColors;
|
|
import com.google.android.material.drawable.DrawableUtils;
|
|
import com.google.android.material.internal.TextDrawableHelper;
|
|
import com.google.android.material.internal.ThemeEnforcement;
|
|
import com.google.android.material.internal.ViewUtils;
|
|
import com.google.android.material.resources.MaterialResources;
|
|
import com.google.android.material.resources.TextAppearance;
|
|
import com.google.android.material.ripple.RippleUtils;
|
|
import com.google.android.material.shape.MaterialShapeDrawable;
|
|
import java.lang.ref.WeakReference;
|
|
import java.util.Arrays;
|
|
|
|
/* loaded from: classes2.dex */
|
|
public class ChipDrawable extends MaterialShapeDrawable implements TintAwareDrawable, Drawable.Callback, TextDrawableHelper.TextDrawableDelegate {
|
|
private static final boolean DEBUG = false;
|
|
private static final int MAX_CHIP_ICON_HEIGHT = 24;
|
|
private static final String NAMESPACE_APP = "http://schemas.android.com/apk/res-auto";
|
|
private int alpha;
|
|
private boolean checkable;
|
|
private Drawable checkedIcon;
|
|
private ColorStateList checkedIconTint;
|
|
private boolean checkedIconVisible;
|
|
private ColorStateList chipBackgroundColor;
|
|
private float chipCornerRadius;
|
|
private float chipEndPadding;
|
|
private Drawable chipIcon;
|
|
private float chipIconSize;
|
|
private ColorStateList chipIconTint;
|
|
private boolean chipIconVisible;
|
|
private float chipMinHeight;
|
|
private final Paint chipPaint;
|
|
private float chipStartPadding;
|
|
private ColorStateList chipStrokeColor;
|
|
private float chipStrokeWidth;
|
|
private ColorStateList chipSurfaceColor;
|
|
private Drawable closeIcon;
|
|
private CharSequence closeIconContentDescription;
|
|
private float closeIconEndPadding;
|
|
private Drawable closeIconRipple;
|
|
private float closeIconSize;
|
|
private float closeIconStartPadding;
|
|
private int[] closeIconStateSet;
|
|
private ColorStateList closeIconTint;
|
|
private boolean closeIconVisible;
|
|
private ColorFilter colorFilter;
|
|
private ColorStateList compatRippleColor;
|
|
private final Context context;
|
|
private boolean currentChecked;
|
|
private int currentChipBackgroundColor;
|
|
private int currentChipStrokeColor;
|
|
private int currentChipSurfaceColor;
|
|
private int currentCompatRippleColor;
|
|
private int currentCompositeSurfaceBackgroundColor;
|
|
private int currentTextColor;
|
|
private int currentTint;
|
|
private final Paint debugPaint;
|
|
private WeakReference<Delegate> delegate;
|
|
private final Paint.FontMetrics fontMetrics;
|
|
private boolean hasChipIconTint;
|
|
private MotionSpec hideMotionSpec;
|
|
private float iconEndPadding;
|
|
private float iconStartPadding;
|
|
private boolean isShapeThemingEnabled;
|
|
private int maxWidth;
|
|
private final PointF pointF;
|
|
private final RectF rectF;
|
|
private ColorStateList rippleColor;
|
|
private final Path shapePath;
|
|
private boolean shouldDrawText;
|
|
private MotionSpec showMotionSpec;
|
|
private CharSequence text;
|
|
private final TextDrawableHelper textDrawableHelper;
|
|
private float textEndPadding;
|
|
private float textStartPadding;
|
|
private ColorStateList tint;
|
|
private PorterDuffColorFilter tintFilter;
|
|
private PorterDuff.Mode tintMode;
|
|
private TextUtils.TruncateAt truncateAt;
|
|
private boolean useCompatRipple;
|
|
private static final int[] DEFAULT_STATE = {R.attr.state_enabled};
|
|
private static final ShapeDrawable closeIconRippleMask = new ShapeDrawable(new OvalShape());
|
|
|
|
/* loaded from: classes2.dex */
|
|
public interface Delegate {
|
|
void onChipDrawableSizeChange();
|
|
}
|
|
|
|
private boolean canShowCheckedIcon() {
|
|
return this.checkedIconVisible && this.checkedIcon != null && this.checkable;
|
|
}
|
|
|
|
private ColorFilter getTintColorFilter() {
|
|
ColorFilter colorFilter = this.colorFilter;
|
|
return colorFilter != null ? colorFilter : this.tintFilter;
|
|
}
|
|
|
|
private boolean showsCheckedIcon() {
|
|
return this.checkedIconVisible && this.checkedIcon != null && this.currentChecked;
|
|
}
|
|
|
|
private boolean showsChipIcon() {
|
|
return this.chipIconVisible && this.chipIcon != null;
|
|
}
|
|
|
|
private boolean showsCloseIcon() {
|
|
return this.closeIconVisible && this.closeIcon != null;
|
|
}
|
|
|
|
@Override // com.google.android.material.shape.MaterialShapeDrawable, android.graphics.drawable.Drawable
|
|
public int getAlpha() {
|
|
return this.alpha;
|
|
}
|
|
|
|
public Drawable getCheckedIcon() {
|
|
return this.checkedIcon;
|
|
}
|
|
|
|
public ColorStateList getCheckedIconTint() {
|
|
return this.checkedIconTint;
|
|
}
|
|
|
|
public ColorStateList getChipBackgroundColor() {
|
|
return this.chipBackgroundColor;
|
|
}
|
|
|
|
public float getChipEndPadding() {
|
|
return this.chipEndPadding;
|
|
}
|
|
|
|
public float getChipIconSize() {
|
|
return this.chipIconSize;
|
|
}
|
|
|
|
public ColorStateList getChipIconTint() {
|
|
return this.chipIconTint;
|
|
}
|
|
|
|
public float getChipMinHeight() {
|
|
return this.chipMinHeight;
|
|
}
|
|
|
|
public float getChipStartPadding() {
|
|
return this.chipStartPadding;
|
|
}
|
|
|
|
public ColorStateList getChipStrokeColor() {
|
|
return this.chipStrokeColor;
|
|
}
|
|
|
|
public float getChipStrokeWidth() {
|
|
return this.chipStrokeWidth;
|
|
}
|
|
|
|
public CharSequence getCloseIconContentDescription() {
|
|
return this.closeIconContentDescription;
|
|
}
|
|
|
|
public float getCloseIconEndPadding() {
|
|
return this.closeIconEndPadding;
|
|
}
|
|
|
|
public float getCloseIconSize() {
|
|
return this.closeIconSize;
|
|
}
|
|
|
|
public float getCloseIconStartPadding() {
|
|
return this.closeIconStartPadding;
|
|
}
|
|
|
|
public int[] getCloseIconState() {
|
|
return this.closeIconStateSet;
|
|
}
|
|
|
|
public ColorStateList getCloseIconTint() {
|
|
return this.closeIconTint;
|
|
}
|
|
|
|
@Override // android.graphics.drawable.Drawable
|
|
public ColorFilter getColorFilter() {
|
|
return this.colorFilter;
|
|
}
|
|
|
|
public TextUtils.TruncateAt getEllipsize() {
|
|
return this.truncateAt;
|
|
}
|
|
|
|
public MotionSpec getHideMotionSpec() {
|
|
return this.hideMotionSpec;
|
|
}
|
|
|
|
public float getIconEndPadding() {
|
|
return this.iconEndPadding;
|
|
}
|
|
|
|
public float getIconStartPadding() {
|
|
return this.iconStartPadding;
|
|
}
|
|
|
|
@Override // android.graphics.drawable.Drawable
|
|
public int getIntrinsicHeight() {
|
|
return (int) this.chipMinHeight;
|
|
}
|
|
|
|
public int getMaxWidth() {
|
|
return this.maxWidth;
|
|
}
|
|
|
|
@Override // com.google.android.material.shape.MaterialShapeDrawable, android.graphics.drawable.Drawable
|
|
public int getOpacity() {
|
|
return -3;
|
|
}
|
|
|
|
public ColorStateList getRippleColor() {
|
|
return this.rippleColor;
|
|
}
|
|
|
|
public MotionSpec getShowMotionSpec() {
|
|
return this.showMotionSpec;
|
|
}
|
|
|
|
public CharSequence getText() {
|
|
return this.text;
|
|
}
|
|
|
|
public float getTextEndPadding() {
|
|
return this.textEndPadding;
|
|
}
|
|
|
|
public float getTextStartPadding() {
|
|
return this.textStartPadding;
|
|
}
|
|
|
|
public boolean getUseCompatRipple() {
|
|
return this.useCompatRipple;
|
|
}
|
|
|
|
public boolean isCheckable() {
|
|
return this.checkable;
|
|
}
|
|
|
|
public boolean isCheckedIconVisible() {
|
|
return this.checkedIconVisible;
|
|
}
|
|
|
|
public boolean isChipIconVisible() {
|
|
return this.chipIconVisible;
|
|
}
|
|
|
|
public boolean isCloseIconVisible() {
|
|
return this.closeIconVisible;
|
|
}
|
|
|
|
boolean isShapeThemingEnabled() {
|
|
return this.isShapeThemingEnabled;
|
|
}
|
|
|
|
public void setEllipsize(TextUtils.TruncateAt truncateAt) {
|
|
this.truncateAt = truncateAt;
|
|
}
|
|
|
|
public void setHideMotionSpec(MotionSpec motionSpec) {
|
|
this.hideMotionSpec = motionSpec;
|
|
}
|
|
|
|
public void setMaxWidth(int i) {
|
|
this.maxWidth = i;
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
public void setShouldDrawText(boolean z) {
|
|
this.shouldDrawText = z;
|
|
}
|
|
|
|
public void setShowMotionSpec(MotionSpec motionSpec) {
|
|
this.showMotionSpec = motionSpec;
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
public boolean shouldDrawText() {
|
|
return this.shouldDrawText;
|
|
}
|
|
|
|
public static ChipDrawable createFromAttributes(Context context, AttributeSet attributeSet, int i, int i2) {
|
|
ChipDrawable chipDrawable = new ChipDrawable(context, attributeSet, i, i2);
|
|
chipDrawable.loadFromAttributes(attributeSet, i, i2);
|
|
return chipDrawable;
|
|
}
|
|
|
|
public static ChipDrawable createFromResource(Context context, int i) {
|
|
AttributeSet parseDrawableXml = DrawableUtils.parseDrawableXml(context, i, "chip");
|
|
int styleAttribute = parseDrawableXml.getStyleAttribute();
|
|
if (styleAttribute == 0) {
|
|
styleAttribute = com.google.android.material.R.style.Widget_MaterialComponents_Chip_Entry;
|
|
}
|
|
return createFromAttributes(context, parseDrawableXml, com.google.android.material.R.attr.chipStandaloneStyle, styleAttribute);
|
|
}
|
|
|
|
private ChipDrawable(Context context, AttributeSet attributeSet, int i, int i2) {
|
|
super(context, attributeSet, i, i2);
|
|
this.chipCornerRadius = -1.0f;
|
|
this.chipPaint = new Paint(1);
|
|
this.fontMetrics = new Paint.FontMetrics();
|
|
this.rectF = new RectF();
|
|
this.pointF = new PointF();
|
|
this.shapePath = new Path();
|
|
this.alpha = 255;
|
|
this.tintMode = PorterDuff.Mode.SRC_IN;
|
|
this.delegate = new WeakReference<>(null);
|
|
initializeElevationOverlay(context);
|
|
this.context = context;
|
|
TextDrawableHelper textDrawableHelper = new TextDrawableHelper(this);
|
|
this.textDrawableHelper = textDrawableHelper;
|
|
this.text = "";
|
|
textDrawableHelper.getTextPaint().density = context.getResources().getDisplayMetrics().density;
|
|
this.debugPaint = null;
|
|
int[] iArr = DEFAULT_STATE;
|
|
setState(iArr);
|
|
setCloseIconState(iArr);
|
|
this.shouldDrawText = true;
|
|
if (RippleUtils.USE_FRAMEWORK_RIPPLE) {
|
|
closeIconRippleMask.setTint(-1);
|
|
}
|
|
}
|
|
|
|
private void loadFromAttributes(AttributeSet attributeSet, int i, int i2) {
|
|
TypedArray obtainStyledAttributes = ThemeEnforcement.obtainStyledAttributes(this.context, attributeSet, com.google.android.material.R.styleable.Chip, i, i2, new int[0]);
|
|
this.isShapeThemingEnabled = obtainStyledAttributes.hasValue(com.google.android.material.R.styleable.Chip_shapeAppearance);
|
|
setChipSurfaceColor(MaterialResources.getColorStateList(this.context, obtainStyledAttributes, com.google.android.material.R.styleable.Chip_chipSurfaceColor));
|
|
setChipBackgroundColor(MaterialResources.getColorStateList(this.context, obtainStyledAttributes, com.google.android.material.R.styleable.Chip_chipBackgroundColor));
|
|
setChipMinHeight(obtainStyledAttributes.getDimension(com.google.android.material.R.styleable.Chip_chipMinHeight, 0.0f));
|
|
if (obtainStyledAttributes.hasValue(com.google.android.material.R.styleable.Chip_chipCornerRadius)) {
|
|
setChipCornerRadius(obtainStyledAttributes.getDimension(com.google.android.material.R.styleable.Chip_chipCornerRadius, 0.0f));
|
|
}
|
|
setChipStrokeColor(MaterialResources.getColorStateList(this.context, obtainStyledAttributes, com.google.android.material.R.styleable.Chip_chipStrokeColor));
|
|
setChipStrokeWidth(obtainStyledAttributes.getDimension(com.google.android.material.R.styleable.Chip_chipStrokeWidth, 0.0f));
|
|
setRippleColor(MaterialResources.getColorStateList(this.context, obtainStyledAttributes, com.google.android.material.R.styleable.Chip_rippleColor));
|
|
setText(obtainStyledAttributes.getText(com.google.android.material.R.styleable.Chip_android_text));
|
|
TextAppearance textAppearance = MaterialResources.getTextAppearance(this.context, obtainStyledAttributes, com.google.android.material.R.styleable.Chip_android_textAppearance);
|
|
textAppearance.setTextSize(obtainStyledAttributes.getDimension(com.google.android.material.R.styleable.Chip_android_textSize, textAppearance.getTextSize()));
|
|
setTextAppearance(textAppearance);
|
|
int i3 = obtainStyledAttributes.getInt(com.google.android.material.R.styleable.Chip_android_ellipsize, 0);
|
|
if (i3 == 1) {
|
|
setEllipsize(TextUtils.TruncateAt.START);
|
|
} else if (i3 == 2) {
|
|
setEllipsize(TextUtils.TruncateAt.MIDDLE);
|
|
} else if (i3 == 3) {
|
|
setEllipsize(TextUtils.TruncateAt.END);
|
|
}
|
|
setChipIconVisible(obtainStyledAttributes.getBoolean(com.google.android.material.R.styleable.Chip_chipIconVisible, false));
|
|
if (attributeSet != null && attributeSet.getAttributeValue(NAMESPACE_APP, "chipIconEnabled") != null && attributeSet.getAttributeValue(NAMESPACE_APP, "chipIconVisible") == null) {
|
|
setChipIconVisible(obtainStyledAttributes.getBoolean(com.google.android.material.R.styleable.Chip_chipIconEnabled, false));
|
|
}
|
|
setChipIcon(MaterialResources.getDrawable(this.context, obtainStyledAttributes, com.google.android.material.R.styleable.Chip_chipIcon));
|
|
if (obtainStyledAttributes.hasValue(com.google.android.material.R.styleable.Chip_chipIconTint)) {
|
|
setChipIconTint(MaterialResources.getColorStateList(this.context, obtainStyledAttributes, com.google.android.material.R.styleable.Chip_chipIconTint));
|
|
}
|
|
setChipIconSize(obtainStyledAttributes.getDimension(com.google.android.material.R.styleable.Chip_chipIconSize, -1.0f));
|
|
setCloseIconVisible(obtainStyledAttributes.getBoolean(com.google.android.material.R.styleable.Chip_closeIconVisible, false));
|
|
if (attributeSet != null && attributeSet.getAttributeValue(NAMESPACE_APP, "closeIconEnabled") != null && attributeSet.getAttributeValue(NAMESPACE_APP, "closeIconVisible") == null) {
|
|
setCloseIconVisible(obtainStyledAttributes.getBoolean(com.google.android.material.R.styleable.Chip_closeIconEnabled, false));
|
|
}
|
|
setCloseIcon(MaterialResources.getDrawable(this.context, obtainStyledAttributes, com.google.android.material.R.styleable.Chip_closeIcon));
|
|
setCloseIconTint(MaterialResources.getColorStateList(this.context, obtainStyledAttributes, com.google.android.material.R.styleable.Chip_closeIconTint));
|
|
setCloseIconSize(obtainStyledAttributes.getDimension(com.google.android.material.R.styleable.Chip_closeIconSize, 0.0f));
|
|
setCheckable(obtainStyledAttributes.getBoolean(com.google.android.material.R.styleable.Chip_android_checkable, false));
|
|
setCheckedIconVisible(obtainStyledAttributes.getBoolean(com.google.android.material.R.styleable.Chip_checkedIconVisible, false));
|
|
if (attributeSet != null && attributeSet.getAttributeValue(NAMESPACE_APP, "checkedIconEnabled") != null && attributeSet.getAttributeValue(NAMESPACE_APP, "checkedIconVisible") == null) {
|
|
setCheckedIconVisible(obtainStyledAttributes.getBoolean(com.google.android.material.R.styleable.Chip_checkedIconEnabled, false));
|
|
}
|
|
setCheckedIcon(MaterialResources.getDrawable(this.context, obtainStyledAttributes, com.google.android.material.R.styleable.Chip_checkedIcon));
|
|
if (obtainStyledAttributes.hasValue(com.google.android.material.R.styleable.Chip_checkedIconTint)) {
|
|
setCheckedIconTint(MaterialResources.getColorStateList(this.context, obtainStyledAttributes, com.google.android.material.R.styleable.Chip_checkedIconTint));
|
|
}
|
|
setShowMotionSpec(MotionSpec.createFromAttribute(this.context, obtainStyledAttributes, com.google.android.material.R.styleable.Chip_showMotionSpec));
|
|
setHideMotionSpec(MotionSpec.createFromAttribute(this.context, obtainStyledAttributes, com.google.android.material.R.styleable.Chip_hideMotionSpec));
|
|
setChipStartPadding(obtainStyledAttributes.getDimension(com.google.android.material.R.styleable.Chip_chipStartPadding, 0.0f));
|
|
setIconStartPadding(obtainStyledAttributes.getDimension(com.google.android.material.R.styleable.Chip_iconStartPadding, 0.0f));
|
|
setIconEndPadding(obtainStyledAttributes.getDimension(com.google.android.material.R.styleable.Chip_iconEndPadding, 0.0f));
|
|
setTextStartPadding(obtainStyledAttributes.getDimension(com.google.android.material.R.styleable.Chip_textStartPadding, 0.0f));
|
|
setTextEndPadding(obtainStyledAttributes.getDimension(com.google.android.material.R.styleable.Chip_textEndPadding, 0.0f));
|
|
setCloseIconStartPadding(obtainStyledAttributes.getDimension(com.google.android.material.R.styleable.Chip_closeIconStartPadding, 0.0f));
|
|
setCloseIconEndPadding(obtainStyledAttributes.getDimension(com.google.android.material.R.styleable.Chip_closeIconEndPadding, 0.0f));
|
|
setChipEndPadding(obtainStyledAttributes.getDimension(com.google.android.material.R.styleable.Chip_chipEndPadding, 0.0f));
|
|
setMaxWidth(obtainStyledAttributes.getDimensionPixelSize(com.google.android.material.R.styleable.Chip_android_maxWidth, Integer.MAX_VALUE));
|
|
obtainStyledAttributes.recycle();
|
|
}
|
|
|
|
public void setUseCompatRipple(boolean z) {
|
|
if (this.useCompatRipple != z) {
|
|
this.useCompatRipple = z;
|
|
updateCompatRippleColor();
|
|
onStateChange(getState());
|
|
}
|
|
}
|
|
|
|
public void setDelegate(Delegate delegate) {
|
|
this.delegate = new WeakReference<>(delegate);
|
|
}
|
|
|
|
protected void onSizeChange() {
|
|
Delegate delegate = this.delegate.get();
|
|
if (delegate != null) {
|
|
delegate.onChipDrawableSizeChange();
|
|
}
|
|
}
|
|
|
|
public void getChipTouchBounds(RectF rectF) {
|
|
calculateChipTouchBounds(getBounds(), rectF);
|
|
}
|
|
|
|
public void getCloseIconTouchBounds(RectF rectF) {
|
|
calculateCloseIconTouchBounds(getBounds(), rectF);
|
|
}
|
|
|
|
@Override // android.graphics.drawable.Drawable
|
|
public int getIntrinsicWidth() {
|
|
return Math.min(Math.round(this.chipStartPadding + calculateChipIconWidth() + this.textStartPadding + this.textDrawableHelper.getTextWidth(getText().toString()) + this.textEndPadding + calculateCloseIconWidth() + this.chipEndPadding), this.maxWidth);
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
public float calculateChipIconWidth() {
|
|
if (showsChipIcon() || showsCheckedIcon()) {
|
|
return this.iconStartPadding + getCurrentChipIconWidth() + this.iconEndPadding;
|
|
}
|
|
return 0.0f;
|
|
}
|
|
|
|
private float getCurrentChipIconWidth() {
|
|
Drawable drawable = this.currentChecked ? this.checkedIcon : this.chipIcon;
|
|
float f = this.chipIconSize;
|
|
return (f > 0.0f || drawable == null) ? f : drawable.getIntrinsicWidth();
|
|
}
|
|
|
|
private float getCurrentChipIconHeight() {
|
|
Drawable drawable = this.currentChecked ? this.checkedIcon : this.chipIcon;
|
|
float f = this.chipIconSize;
|
|
if (f > 0.0f || drawable == null) {
|
|
return f;
|
|
}
|
|
float ceil = (float) Math.ceil(ViewUtils.dpToPx(this.context, 24));
|
|
return ((float) drawable.getIntrinsicHeight()) <= ceil ? drawable.getIntrinsicHeight() : ceil;
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
public float calculateCloseIconWidth() {
|
|
if (showsCloseIcon()) {
|
|
return this.closeIconStartPadding + this.closeIconSize + this.closeIconEndPadding;
|
|
}
|
|
return 0.0f;
|
|
}
|
|
|
|
@Override // com.google.android.material.shape.MaterialShapeDrawable, android.graphics.drawable.Drawable
|
|
public void draw(Canvas canvas) {
|
|
Rect bounds = getBounds();
|
|
if (bounds.isEmpty() || getAlpha() == 0) {
|
|
return;
|
|
}
|
|
int saveLayerAlpha = this.alpha < 255 ? CanvasCompat.saveLayerAlpha(canvas, bounds.left, bounds.top, bounds.right, bounds.bottom, this.alpha) : 0;
|
|
drawChipSurface(canvas, bounds);
|
|
drawChipBackground(canvas, bounds);
|
|
if (this.isShapeThemingEnabled) {
|
|
super.draw(canvas);
|
|
}
|
|
drawChipStroke(canvas, bounds);
|
|
drawCompatRipple(canvas, bounds);
|
|
drawChipIcon(canvas, bounds);
|
|
drawCheckedIcon(canvas, bounds);
|
|
if (this.shouldDrawText) {
|
|
drawText(canvas, bounds);
|
|
}
|
|
drawCloseIcon(canvas, bounds);
|
|
drawDebug(canvas, bounds);
|
|
if (this.alpha < 255) {
|
|
canvas.restoreToCount(saveLayerAlpha);
|
|
}
|
|
}
|
|
|
|
private void drawChipSurface(Canvas canvas, Rect rect) {
|
|
if (this.isShapeThemingEnabled) {
|
|
return;
|
|
}
|
|
this.chipPaint.setColor(this.currentChipSurfaceColor);
|
|
this.chipPaint.setStyle(Paint.Style.FILL);
|
|
this.rectF.set(rect);
|
|
canvas.drawRoundRect(this.rectF, getChipCornerRadius(), getChipCornerRadius(), this.chipPaint);
|
|
}
|
|
|
|
private void drawChipBackground(Canvas canvas, Rect rect) {
|
|
if (this.isShapeThemingEnabled) {
|
|
return;
|
|
}
|
|
this.chipPaint.setColor(this.currentChipBackgroundColor);
|
|
this.chipPaint.setStyle(Paint.Style.FILL);
|
|
this.chipPaint.setColorFilter(getTintColorFilter());
|
|
this.rectF.set(rect);
|
|
canvas.drawRoundRect(this.rectF, getChipCornerRadius(), getChipCornerRadius(), this.chipPaint);
|
|
}
|
|
|
|
private void drawChipStroke(Canvas canvas, Rect rect) {
|
|
if (this.chipStrokeWidth <= 0.0f || this.isShapeThemingEnabled) {
|
|
return;
|
|
}
|
|
this.chipPaint.setColor(this.currentChipStrokeColor);
|
|
this.chipPaint.setStyle(Paint.Style.STROKE);
|
|
if (!this.isShapeThemingEnabled) {
|
|
this.chipPaint.setColorFilter(getTintColorFilter());
|
|
}
|
|
this.rectF.set(rect.left + (this.chipStrokeWidth / 2.0f), rect.top + (this.chipStrokeWidth / 2.0f), rect.right - (this.chipStrokeWidth / 2.0f), rect.bottom - (this.chipStrokeWidth / 2.0f));
|
|
float f = this.chipCornerRadius - (this.chipStrokeWidth / 2.0f);
|
|
canvas.drawRoundRect(this.rectF, f, f, this.chipPaint);
|
|
}
|
|
|
|
private void drawCompatRipple(Canvas canvas, Rect rect) {
|
|
this.chipPaint.setColor(this.currentCompatRippleColor);
|
|
this.chipPaint.setStyle(Paint.Style.FILL);
|
|
this.rectF.set(rect);
|
|
if (!this.isShapeThemingEnabled) {
|
|
canvas.drawRoundRect(this.rectF, getChipCornerRadius(), getChipCornerRadius(), this.chipPaint);
|
|
} else {
|
|
calculatePathForSize(new RectF(rect), this.shapePath);
|
|
super.drawShape(canvas, this.chipPaint, this.shapePath, getBoundsAsRectF());
|
|
}
|
|
}
|
|
|
|
private void drawChipIcon(Canvas canvas, Rect rect) {
|
|
if (showsChipIcon()) {
|
|
calculateChipIconBounds(rect, this.rectF);
|
|
float f = this.rectF.left;
|
|
float f2 = this.rectF.top;
|
|
canvas.translate(f, f2);
|
|
this.chipIcon.setBounds(0, 0, (int) this.rectF.width(), (int) this.rectF.height());
|
|
this.chipIcon.draw(canvas);
|
|
canvas.translate(-f, -f2);
|
|
}
|
|
}
|
|
|
|
private void drawCheckedIcon(Canvas canvas, Rect rect) {
|
|
if (showsCheckedIcon()) {
|
|
calculateChipIconBounds(rect, this.rectF);
|
|
float f = this.rectF.left;
|
|
float f2 = this.rectF.top;
|
|
canvas.translate(f, f2);
|
|
this.checkedIcon.setBounds(0, 0, (int) this.rectF.width(), (int) this.rectF.height());
|
|
this.checkedIcon.draw(canvas);
|
|
canvas.translate(-f, -f2);
|
|
}
|
|
}
|
|
|
|
private void drawText(Canvas canvas, Rect rect) {
|
|
if (this.text != null) {
|
|
Paint.Align calculateTextOriginAndAlignment = calculateTextOriginAndAlignment(rect, this.pointF);
|
|
calculateTextBounds(rect, this.rectF);
|
|
if (this.textDrawableHelper.getTextAppearance() != null) {
|
|
this.textDrawableHelper.getTextPaint().drawableState = getState();
|
|
this.textDrawableHelper.updateTextPaintDrawState(this.context);
|
|
}
|
|
this.textDrawableHelper.getTextPaint().setTextAlign(calculateTextOriginAndAlignment);
|
|
int i = 0;
|
|
boolean z = Math.round(this.textDrawableHelper.getTextWidth(getText().toString())) > Math.round(this.rectF.width());
|
|
if (z) {
|
|
i = canvas.save();
|
|
canvas.clipRect(this.rectF);
|
|
}
|
|
CharSequence charSequence = this.text;
|
|
if (z && this.truncateAt != null) {
|
|
charSequence = TextUtils.ellipsize(charSequence, this.textDrawableHelper.getTextPaint(), this.rectF.width(), this.truncateAt);
|
|
}
|
|
CharSequence charSequence2 = charSequence;
|
|
canvas.drawText(charSequence2, 0, charSequence2.length(), this.pointF.x, this.pointF.y, this.textDrawableHelper.getTextPaint());
|
|
if (z) {
|
|
canvas.restoreToCount(i);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void drawCloseIcon(Canvas canvas, Rect rect) {
|
|
if (showsCloseIcon()) {
|
|
calculateCloseIconBounds(rect, this.rectF);
|
|
float f = this.rectF.left;
|
|
float f2 = this.rectF.top;
|
|
canvas.translate(f, f2);
|
|
this.closeIcon.setBounds(0, 0, (int) this.rectF.width(), (int) this.rectF.height());
|
|
if (RippleUtils.USE_FRAMEWORK_RIPPLE) {
|
|
this.closeIconRipple.setBounds(this.closeIcon.getBounds());
|
|
this.closeIconRipple.jumpToCurrentState();
|
|
this.closeIconRipple.draw(canvas);
|
|
} else {
|
|
this.closeIcon.draw(canvas);
|
|
}
|
|
canvas.translate(-f, -f2);
|
|
}
|
|
}
|
|
|
|
private void drawDebug(Canvas canvas, Rect rect) {
|
|
Paint paint = this.debugPaint;
|
|
if (paint != null) {
|
|
paint.setColor(ColorUtils.setAlphaComponent(ViewCompat.MEASURED_STATE_MASK, 127));
|
|
canvas.drawRect(rect, this.debugPaint);
|
|
if (showsChipIcon() || showsCheckedIcon()) {
|
|
calculateChipIconBounds(rect, this.rectF);
|
|
canvas.drawRect(this.rectF, this.debugPaint);
|
|
}
|
|
if (this.text != null) {
|
|
canvas.drawLine(rect.left, rect.exactCenterY(), rect.right, rect.exactCenterY(), this.debugPaint);
|
|
}
|
|
if (showsCloseIcon()) {
|
|
calculateCloseIconBounds(rect, this.rectF);
|
|
canvas.drawRect(this.rectF, this.debugPaint);
|
|
}
|
|
this.debugPaint.setColor(ColorUtils.setAlphaComponent(SupportMenu.CATEGORY_MASK, 127));
|
|
calculateChipTouchBounds(rect, this.rectF);
|
|
canvas.drawRect(this.rectF, this.debugPaint);
|
|
this.debugPaint.setColor(ColorUtils.setAlphaComponent(-16711936, 127));
|
|
calculateCloseIconTouchBounds(rect, this.rectF);
|
|
canvas.drawRect(this.rectF, this.debugPaint);
|
|
}
|
|
}
|
|
|
|
private void calculateChipIconBounds(Rect rect, RectF rectF) {
|
|
rectF.setEmpty();
|
|
if (showsChipIcon() || showsCheckedIcon()) {
|
|
float f = this.chipStartPadding + this.iconStartPadding;
|
|
float currentChipIconWidth = getCurrentChipIconWidth();
|
|
if (DrawableCompat.getLayoutDirection(this) == 0) {
|
|
rectF.left = rect.left + f;
|
|
rectF.right = rectF.left + currentChipIconWidth;
|
|
} else {
|
|
rectF.right = rect.right - f;
|
|
rectF.left = rectF.right - currentChipIconWidth;
|
|
}
|
|
float currentChipIconHeight = getCurrentChipIconHeight();
|
|
rectF.top = rect.exactCenterY() - (currentChipIconHeight / 2.0f);
|
|
rectF.bottom = rectF.top + currentChipIconHeight;
|
|
}
|
|
}
|
|
|
|
Paint.Align calculateTextOriginAndAlignment(Rect rect, PointF pointF) {
|
|
pointF.set(0.0f, 0.0f);
|
|
Paint.Align align = Paint.Align.LEFT;
|
|
if (this.text != null) {
|
|
float calculateChipIconWidth = this.chipStartPadding + calculateChipIconWidth() + this.textStartPadding;
|
|
if (DrawableCompat.getLayoutDirection(this) == 0) {
|
|
pointF.x = rect.left + calculateChipIconWidth;
|
|
align = Paint.Align.LEFT;
|
|
} else {
|
|
pointF.x = rect.right - calculateChipIconWidth;
|
|
align = Paint.Align.RIGHT;
|
|
}
|
|
pointF.y = rect.centerY() - calculateTextCenterFromBaseline();
|
|
}
|
|
return align;
|
|
}
|
|
|
|
private float calculateTextCenterFromBaseline() {
|
|
this.textDrawableHelper.getTextPaint().getFontMetrics(this.fontMetrics);
|
|
return (this.fontMetrics.descent + this.fontMetrics.ascent) / 2.0f;
|
|
}
|
|
|
|
private void calculateTextBounds(Rect rect, RectF rectF) {
|
|
rectF.setEmpty();
|
|
if (this.text != null) {
|
|
float calculateChipIconWidth = this.chipStartPadding + calculateChipIconWidth() + this.textStartPadding;
|
|
float calculateCloseIconWidth = this.chipEndPadding + calculateCloseIconWidth() + this.textEndPadding;
|
|
if (DrawableCompat.getLayoutDirection(this) == 0) {
|
|
rectF.left = rect.left + calculateChipIconWidth;
|
|
rectF.right = rect.right - calculateCloseIconWidth;
|
|
} else {
|
|
rectF.left = rect.left + calculateCloseIconWidth;
|
|
rectF.right = rect.right - calculateChipIconWidth;
|
|
}
|
|
rectF.top = rect.top;
|
|
rectF.bottom = rect.bottom;
|
|
}
|
|
}
|
|
|
|
private void calculateCloseIconBounds(Rect rect, RectF rectF) {
|
|
rectF.setEmpty();
|
|
if (showsCloseIcon()) {
|
|
float f = this.chipEndPadding + this.closeIconEndPadding;
|
|
if (DrawableCompat.getLayoutDirection(this) == 0) {
|
|
rectF.right = rect.right - f;
|
|
rectF.left = rectF.right - this.closeIconSize;
|
|
} else {
|
|
rectF.left = rect.left + f;
|
|
rectF.right = rectF.left + this.closeIconSize;
|
|
}
|
|
rectF.top = rect.exactCenterY() - (this.closeIconSize / 2.0f);
|
|
rectF.bottom = rectF.top + this.closeIconSize;
|
|
}
|
|
}
|
|
|
|
private void calculateChipTouchBounds(Rect rect, RectF rectF) {
|
|
rectF.set(rect);
|
|
if (showsCloseIcon()) {
|
|
float f = this.chipEndPadding + this.closeIconEndPadding + this.closeIconSize + this.closeIconStartPadding + this.textEndPadding;
|
|
if (DrawableCompat.getLayoutDirection(this) == 0) {
|
|
rectF.right = rect.right - f;
|
|
} else {
|
|
rectF.left = rect.left + f;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void calculateCloseIconTouchBounds(Rect rect, RectF rectF) {
|
|
rectF.setEmpty();
|
|
if (showsCloseIcon()) {
|
|
float f = this.chipEndPadding + this.closeIconEndPadding + this.closeIconSize + this.closeIconStartPadding + this.textEndPadding;
|
|
if (DrawableCompat.getLayoutDirection(this) == 0) {
|
|
rectF.right = rect.right;
|
|
rectF.left = rectF.right - f;
|
|
} else {
|
|
rectF.left = rect.left;
|
|
rectF.right = rect.left + f;
|
|
}
|
|
rectF.top = rect.top;
|
|
rectF.bottom = rect.bottom;
|
|
}
|
|
}
|
|
|
|
@Override // com.google.android.material.shape.MaterialShapeDrawable, android.graphics.drawable.Drawable
|
|
public boolean isStateful() {
|
|
return isStateful(this.chipSurfaceColor) || isStateful(this.chipBackgroundColor) || isStateful(this.chipStrokeColor) || (this.useCompatRipple && isStateful(this.compatRippleColor)) || isStateful(this.textDrawableHelper.getTextAppearance()) || canShowCheckedIcon() || isStateful(this.chipIcon) || isStateful(this.checkedIcon) || isStateful(this.tint);
|
|
}
|
|
|
|
public boolean isCloseIconStateful() {
|
|
return isStateful(this.closeIcon);
|
|
}
|
|
|
|
public boolean setCloseIconState(int[] iArr) {
|
|
if (Arrays.equals(this.closeIconStateSet, iArr)) {
|
|
return false;
|
|
}
|
|
this.closeIconStateSet = iArr;
|
|
if (showsCloseIcon()) {
|
|
return onStateChange(getState(), iArr);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
@Override // com.google.android.material.internal.TextDrawableHelper.TextDrawableDelegate
|
|
public void onTextSizeChange() {
|
|
onSizeChange();
|
|
invalidateSelf();
|
|
}
|
|
|
|
@Override // com.google.android.material.shape.MaterialShapeDrawable, android.graphics.drawable.Drawable, com.google.android.material.internal.TextDrawableHelper.TextDrawableDelegate
|
|
public boolean onStateChange(int[] iArr) {
|
|
if (this.isShapeThemingEnabled) {
|
|
super.onStateChange(iArr);
|
|
}
|
|
return onStateChange(iArr, getCloseIconState());
|
|
}
|
|
|
|
private boolean onStateChange(int[] iArr, int[] iArr2) {
|
|
boolean z;
|
|
boolean onStateChange = super.onStateChange(iArr);
|
|
ColorStateList colorStateList = this.chipSurfaceColor;
|
|
int compositeElevationOverlayIfNeeded = compositeElevationOverlayIfNeeded(colorStateList != null ? colorStateList.getColorForState(iArr, this.currentChipSurfaceColor) : 0);
|
|
boolean z2 = true;
|
|
if (this.currentChipSurfaceColor != compositeElevationOverlayIfNeeded) {
|
|
this.currentChipSurfaceColor = compositeElevationOverlayIfNeeded;
|
|
onStateChange = true;
|
|
}
|
|
ColorStateList colorStateList2 = this.chipBackgroundColor;
|
|
int compositeElevationOverlayIfNeeded2 = compositeElevationOverlayIfNeeded(colorStateList2 != null ? colorStateList2.getColorForState(iArr, this.currentChipBackgroundColor) : 0);
|
|
if (this.currentChipBackgroundColor != compositeElevationOverlayIfNeeded2) {
|
|
this.currentChipBackgroundColor = compositeElevationOverlayIfNeeded2;
|
|
onStateChange = true;
|
|
}
|
|
int layer = MaterialColors.layer(compositeElevationOverlayIfNeeded, compositeElevationOverlayIfNeeded2);
|
|
if ((this.currentCompositeSurfaceBackgroundColor != layer) | (getFillColor() == null)) {
|
|
this.currentCompositeSurfaceBackgroundColor = layer;
|
|
setFillColor(ColorStateList.valueOf(layer));
|
|
onStateChange = true;
|
|
}
|
|
ColorStateList colorStateList3 = this.chipStrokeColor;
|
|
int colorForState = colorStateList3 != null ? colorStateList3.getColorForState(iArr, this.currentChipStrokeColor) : 0;
|
|
if (this.currentChipStrokeColor != colorForState) {
|
|
this.currentChipStrokeColor = colorForState;
|
|
onStateChange = true;
|
|
}
|
|
int colorForState2 = (this.compatRippleColor == null || !RippleUtils.shouldDrawRippleCompat(iArr)) ? 0 : this.compatRippleColor.getColorForState(iArr, this.currentCompatRippleColor);
|
|
if (this.currentCompatRippleColor != colorForState2) {
|
|
this.currentCompatRippleColor = colorForState2;
|
|
if (this.useCompatRipple) {
|
|
onStateChange = true;
|
|
}
|
|
}
|
|
int colorForState3 = (this.textDrawableHelper.getTextAppearance() == null || this.textDrawableHelper.getTextAppearance().getTextColor() == null) ? 0 : this.textDrawableHelper.getTextAppearance().getTextColor().getColorForState(iArr, this.currentTextColor);
|
|
if (this.currentTextColor != colorForState3) {
|
|
this.currentTextColor = colorForState3;
|
|
onStateChange = true;
|
|
}
|
|
boolean z3 = hasState(getState(), R.attr.state_checked) && this.checkable;
|
|
if (this.currentChecked == z3 || this.checkedIcon == null) {
|
|
z = false;
|
|
} else {
|
|
float calculateChipIconWidth = calculateChipIconWidth();
|
|
this.currentChecked = z3;
|
|
if (calculateChipIconWidth != calculateChipIconWidth()) {
|
|
onStateChange = true;
|
|
z = true;
|
|
} else {
|
|
z = false;
|
|
onStateChange = true;
|
|
}
|
|
}
|
|
ColorStateList colorStateList4 = this.tint;
|
|
int colorForState4 = colorStateList4 != null ? colorStateList4.getColorForState(iArr, this.currentTint) : 0;
|
|
if (this.currentTint != colorForState4) {
|
|
this.currentTint = colorForState4;
|
|
this.tintFilter = DrawableUtils.updateTintFilter(this, this.tint, this.tintMode);
|
|
} else {
|
|
z2 = onStateChange;
|
|
}
|
|
if (isStateful(this.chipIcon)) {
|
|
z2 |= this.chipIcon.setState(iArr);
|
|
}
|
|
if (isStateful(this.checkedIcon)) {
|
|
z2 |= this.checkedIcon.setState(iArr);
|
|
}
|
|
if (isStateful(this.closeIcon)) {
|
|
int[] iArr3 = new int[iArr.length + iArr2.length];
|
|
System.arraycopy(iArr, 0, iArr3, 0, iArr.length);
|
|
System.arraycopy(iArr2, 0, iArr3, iArr.length, iArr2.length);
|
|
z2 |= this.closeIcon.setState(iArr3);
|
|
}
|
|
if (RippleUtils.USE_FRAMEWORK_RIPPLE && isStateful(this.closeIconRipple)) {
|
|
z2 |= this.closeIconRipple.setState(iArr2);
|
|
}
|
|
if (z2) {
|
|
invalidateSelf();
|
|
}
|
|
if (z) {
|
|
onSizeChange();
|
|
}
|
|
return z2;
|
|
}
|
|
|
|
private static boolean isStateful(ColorStateList colorStateList) {
|
|
return colorStateList != null && colorStateList.isStateful();
|
|
}
|
|
|
|
private static boolean isStateful(Drawable drawable) {
|
|
return drawable != null && drawable.isStateful();
|
|
}
|
|
|
|
private static boolean isStateful(TextAppearance textAppearance) {
|
|
return (textAppearance == null || textAppearance.getTextColor() == null || !textAppearance.getTextColor().isStateful()) ? false : true;
|
|
}
|
|
|
|
@Override // android.graphics.drawable.Drawable
|
|
public boolean onLayoutDirectionChanged(int i) {
|
|
boolean onLayoutDirectionChanged = super.onLayoutDirectionChanged(i);
|
|
if (showsChipIcon()) {
|
|
onLayoutDirectionChanged |= DrawableCompat.setLayoutDirection(this.chipIcon, i);
|
|
}
|
|
if (showsCheckedIcon()) {
|
|
onLayoutDirectionChanged |= DrawableCompat.setLayoutDirection(this.checkedIcon, i);
|
|
}
|
|
if (showsCloseIcon()) {
|
|
onLayoutDirectionChanged |= DrawableCompat.setLayoutDirection(this.closeIcon, i);
|
|
}
|
|
if (!onLayoutDirectionChanged) {
|
|
return true;
|
|
}
|
|
invalidateSelf();
|
|
return true;
|
|
}
|
|
|
|
@Override // android.graphics.drawable.Drawable
|
|
protected boolean onLevelChange(int i) {
|
|
boolean onLevelChange = super.onLevelChange(i);
|
|
if (showsChipIcon()) {
|
|
onLevelChange |= this.chipIcon.setLevel(i);
|
|
}
|
|
if (showsCheckedIcon()) {
|
|
onLevelChange |= this.checkedIcon.setLevel(i);
|
|
}
|
|
if (showsCloseIcon()) {
|
|
onLevelChange |= this.closeIcon.setLevel(i);
|
|
}
|
|
if (onLevelChange) {
|
|
invalidateSelf();
|
|
}
|
|
return onLevelChange;
|
|
}
|
|
|
|
@Override // android.graphics.drawable.Drawable
|
|
public boolean setVisible(boolean z, boolean z2) {
|
|
boolean visible = super.setVisible(z, z2);
|
|
if (showsChipIcon()) {
|
|
visible |= this.chipIcon.setVisible(z, z2);
|
|
}
|
|
if (showsCheckedIcon()) {
|
|
visible |= this.checkedIcon.setVisible(z, z2);
|
|
}
|
|
if (showsCloseIcon()) {
|
|
visible |= this.closeIcon.setVisible(z, z2);
|
|
}
|
|
if (visible) {
|
|
invalidateSelf();
|
|
}
|
|
return visible;
|
|
}
|
|
|
|
@Override // com.google.android.material.shape.MaterialShapeDrawable, android.graphics.drawable.Drawable
|
|
public void setAlpha(int i) {
|
|
if (this.alpha != i) {
|
|
this.alpha = i;
|
|
invalidateSelf();
|
|
}
|
|
}
|
|
|
|
@Override // com.google.android.material.shape.MaterialShapeDrawable, android.graphics.drawable.Drawable
|
|
public void setColorFilter(ColorFilter colorFilter) {
|
|
if (this.colorFilter != colorFilter) {
|
|
this.colorFilter = colorFilter;
|
|
invalidateSelf();
|
|
}
|
|
}
|
|
|
|
@Override // com.google.android.material.shape.MaterialShapeDrawable, android.graphics.drawable.Drawable, androidx.core.graphics.drawable.TintAwareDrawable
|
|
public void setTintList(ColorStateList colorStateList) {
|
|
if (this.tint != colorStateList) {
|
|
this.tint = colorStateList;
|
|
onStateChange(getState());
|
|
}
|
|
}
|
|
|
|
@Override // com.google.android.material.shape.MaterialShapeDrawable, android.graphics.drawable.Drawable, androidx.core.graphics.drawable.TintAwareDrawable
|
|
public void setTintMode(PorterDuff.Mode mode) {
|
|
if (this.tintMode != mode) {
|
|
this.tintMode = mode;
|
|
this.tintFilter = DrawableUtils.updateTintFilter(this, this.tint, mode);
|
|
invalidateSelf();
|
|
}
|
|
}
|
|
|
|
@Override // com.google.android.material.shape.MaterialShapeDrawable, android.graphics.drawable.Drawable
|
|
public void getOutline(Outline outline) {
|
|
if (this.isShapeThemingEnabled) {
|
|
super.getOutline(outline);
|
|
return;
|
|
}
|
|
Rect bounds = getBounds();
|
|
if (!bounds.isEmpty()) {
|
|
outline.setRoundRect(bounds, this.chipCornerRadius);
|
|
} else {
|
|
outline.setRoundRect(0, 0, getIntrinsicWidth(), getIntrinsicHeight(), this.chipCornerRadius);
|
|
}
|
|
outline.setAlpha(getAlpha() / 255.0f);
|
|
}
|
|
|
|
@Override // android.graphics.drawable.Drawable.Callback
|
|
public void invalidateDrawable(Drawable drawable) {
|
|
Drawable.Callback callback = getCallback();
|
|
if (callback != null) {
|
|
callback.invalidateDrawable(this);
|
|
}
|
|
}
|
|
|
|
@Override // android.graphics.drawable.Drawable.Callback
|
|
public void scheduleDrawable(Drawable drawable, Runnable runnable, long j) {
|
|
Drawable.Callback callback = getCallback();
|
|
if (callback != null) {
|
|
callback.scheduleDrawable(this, runnable, j);
|
|
}
|
|
}
|
|
|
|
@Override // android.graphics.drawable.Drawable.Callback
|
|
public void unscheduleDrawable(Drawable drawable, Runnable runnable) {
|
|
Drawable.Callback callback = getCallback();
|
|
if (callback != null) {
|
|
callback.unscheduleDrawable(this, runnable);
|
|
}
|
|
}
|
|
|
|
private void unapplyChildDrawable(Drawable drawable) {
|
|
if (drawable != null) {
|
|
drawable.setCallback(null);
|
|
}
|
|
}
|
|
|
|
private void applyChildDrawable(Drawable drawable) {
|
|
if (drawable == null) {
|
|
return;
|
|
}
|
|
drawable.setCallback(this);
|
|
DrawableCompat.setLayoutDirection(drawable, DrawableCompat.getLayoutDirection(this));
|
|
drawable.setLevel(getLevel());
|
|
drawable.setVisible(isVisible(), false);
|
|
if (drawable == this.closeIcon) {
|
|
if (drawable.isStateful()) {
|
|
drawable.setState(getCloseIconState());
|
|
}
|
|
DrawableCompat.setTintList(drawable, this.closeIconTint);
|
|
return;
|
|
}
|
|
Drawable drawable2 = this.chipIcon;
|
|
if (drawable == drawable2 && this.hasChipIconTint) {
|
|
DrawableCompat.setTintList(drawable2, this.chipIconTint);
|
|
}
|
|
if (drawable.isStateful()) {
|
|
drawable.setState(getState());
|
|
}
|
|
}
|
|
|
|
private void updateCompatRippleColor() {
|
|
this.compatRippleColor = this.useCompatRipple ? RippleUtils.sanitizeRippleDrawableColor(this.rippleColor) : null;
|
|
}
|
|
|
|
private void setChipSurfaceColor(ColorStateList colorStateList) {
|
|
if (this.chipSurfaceColor != colorStateList) {
|
|
this.chipSurfaceColor = colorStateList;
|
|
onStateChange(getState());
|
|
}
|
|
}
|
|
|
|
private static boolean hasState(int[] iArr, int i) {
|
|
if (iArr == null) {
|
|
return false;
|
|
}
|
|
for (int i2 : iArr) {
|
|
if (i2 == i) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public void setTextSize(float f) {
|
|
TextAppearance textAppearance = getTextAppearance();
|
|
if (textAppearance != null) {
|
|
textAppearance.setTextSize(f);
|
|
this.textDrawableHelper.getTextPaint().setTextSize(f);
|
|
onTextSizeChange();
|
|
}
|
|
}
|
|
|
|
public void setTextColor(int i) {
|
|
setTextColor(ColorStateList.valueOf(i));
|
|
}
|
|
|
|
public void setTextColor(ColorStateList colorStateList) {
|
|
TextAppearance textAppearance = getTextAppearance();
|
|
if (textAppearance != null) {
|
|
textAppearance.setTextColor(colorStateList);
|
|
invalidateSelf();
|
|
}
|
|
}
|
|
|
|
public void setChipBackgroundColorResource(int i) {
|
|
setChipBackgroundColor(AppCompatResources.getColorStateList(this.context, i));
|
|
}
|
|
|
|
public void setChipBackgroundColor(ColorStateList colorStateList) {
|
|
if (this.chipBackgroundColor != colorStateList) {
|
|
this.chipBackgroundColor = colorStateList;
|
|
onStateChange(getState());
|
|
}
|
|
}
|
|
|
|
public void setChipMinHeightResource(int i) {
|
|
setChipMinHeight(this.context.getResources().getDimension(i));
|
|
}
|
|
|
|
public void setChipMinHeight(float f) {
|
|
if (this.chipMinHeight != f) {
|
|
this.chipMinHeight = f;
|
|
invalidateSelf();
|
|
onSizeChange();
|
|
}
|
|
}
|
|
|
|
public float getChipCornerRadius() {
|
|
return this.isShapeThemingEnabled ? getTopLeftCornerResolvedSize() : this.chipCornerRadius;
|
|
}
|
|
|
|
@Deprecated
|
|
public void setChipCornerRadiusResource(int i) {
|
|
setChipCornerRadius(this.context.getResources().getDimension(i));
|
|
}
|
|
|
|
@Deprecated
|
|
public void setChipCornerRadius(float f) {
|
|
if (this.chipCornerRadius != f) {
|
|
this.chipCornerRadius = f;
|
|
setShapeAppearanceModel(getShapeAppearanceModel().withCornerSize(f));
|
|
}
|
|
}
|
|
|
|
public void setChipStrokeColorResource(int i) {
|
|
setChipStrokeColor(AppCompatResources.getColorStateList(this.context, i));
|
|
}
|
|
|
|
public void setChipStrokeColor(ColorStateList colorStateList) {
|
|
if (this.chipStrokeColor != colorStateList) {
|
|
this.chipStrokeColor = colorStateList;
|
|
if (this.isShapeThemingEnabled) {
|
|
setStrokeColor(colorStateList);
|
|
}
|
|
onStateChange(getState());
|
|
}
|
|
}
|
|
|
|
public void setChipStrokeWidthResource(int i) {
|
|
setChipStrokeWidth(this.context.getResources().getDimension(i));
|
|
}
|
|
|
|
public void setChipStrokeWidth(float f) {
|
|
if (this.chipStrokeWidth != f) {
|
|
this.chipStrokeWidth = f;
|
|
this.chipPaint.setStrokeWidth(f);
|
|
if (this.isShapeThemingEnabled) {
|
|
super.setStrokeWidth(f);
|
|
}
|
|
invalidateSelf();
|
|
}
|
|
}
|
|
|
|
public void setRippleColorResource(int i) {
|
|
setRippleColor(AppCompatResources.getColorStateList(this.context, i));
|
|
}
|
|
|
|
public void setRippleColor(ColorStateList colorStateList) {
|
|
if (this.rippleColor != colorStateList) {
|
|
this.rippleColor = colorStateList;
|
|
updateCompatRippleColor();
|
|
onStateChange(getState());
|
|
}
|
|
}
|
|
|
|
public void setTextResource(int i) {
|
|
setText(this.context.getResources().getString(i));
|
|
}
|
|
|
|
public void setText(CharSequence charSequence) {
|
|
if (charSequence == null) {
|
|
charSequence = "";
|
|
}
|
|
if (TextUtils.equals(this.text, charSequence)) {
|
|
return;
|
|
}
|
|
this.text = charSequence;
|
|
this.textDrawableHelper.setTextWidthDirty(true);
|
|
invalidateSelf();
|
|
onSizeChange();
|
|
}
|
|
|
|
public TextAppearance getTextAppearance() {
|
|
return this.textDrawableHelper.getTextAppearance();
|
|
}
|
|
|
|
public void setTextAppearanceResource(int i) {
|
|
setTextAppearance(new TextAppearance(this.context, i));
|
|
}
|
|
|
|
public void setTextAppearance(TextAppearance textAppearance) {
|
|
this.textDrawableHelper.setTextAppearance(textAppearance, this.context);
|
|
}
|
|
|
|
@Deprecated
|
|
public boolean isChipIconEnabled() {
|
|
return isChipIconVisible();
|
|
}
|
|
|
|
public void setChipIconVisible(int i) {
|
|
setChipIconVisible(this.context.getResources().getBoolean(i));
|
|
}
|
|
|
|
public void setChipIconVisible(boolean z) {
|
|
if (this.chipIconVisible != z) {
|
|
boolean showsChipIcon = showsChipIcon();
|
|
this.chipIconVisible = z;
|
|
boolean showsChipIcon2 = showsChipIcon();
|
|
if (showsChipIcon != showsChipIcon2) {
|
|
if (showsChipIcon2) {
|
|
applyChildDrawable(this.chipIcon);
|
|
} else {
|
|
unapplyChildDrawable(this.chipIcon);
|
|
}
|
|
invalidateSelf();
|
|
onSizeChange();
|
|
}
|
|
}
|
|
}
|
|
|
|
@Deprecated
|
|
public void setChipIconEnabledResource(int i) {
|
|
setChipIconVisible(i);
|
|
}
|
|
|
|
@Deprecated
|
|
public void setChipIconEnabled(boolean z) {
|
|
setChipIconVisible(z);
|
|
}
|
|
|
|
public Drawable getChipIcon() {
|
|
Drawable drawable = this.chipIcon;
|
|
if (drawable != null) {
|
|
return DrawableCompat.unwrap(drawable);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public void setChipIconResource(int i) {
|
|
setChipIcon(AppCompatResources.getDrawable(this.context, i));
|
|
}
|
|
|
|
public void setChipIcon(Drawable drawable) {
|
|
Drawable chipIcon = getChipIcon();
|
|
if (chipIcon != drawable) {
|
|
float calculateChipIconWidth = calculateChipIconWidth();
|
|
this.chipIcon = drawable != null ? DrawableCompat.wrap(drawable).mutate() : null;
|
|
float calculateChipIconWidth2 = calculateChipIconWidth();
|
|
unapplyChildDrawable(chipIcon);
|
|
if (showsChipIcon()) {
|
|
applyChildDrawable(this.chipIcon);
|
|
}
|
|
invalidateSelf();
|
|
if (calculateChipIconWidth != calculateChipIconWidth2) {
|
|
onSizeChange();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void setChipIconTintResource(int i) {
|
|
setChipIconTint(AppCompatResources.getColorStateList(this.context, i));
|
|
}
|
|
|
|
public void setChipIconTint(ColorStateList colorStateList) {
|
|
this.hasChipIconTint = true;
|
|
if (this.chipIconTint != colorStateList) {
|
|
this.chipIconTint = colorStateList;
|
|
if (showsChipIcon()) {
|
|
DrawableCompat.setTintList(this.chipIcon, colorStateList);
|
|
}
|
|
onStateChange(getState());
|
|
}
|
|
}
|
|
|
|
public void setChipIconSizeResource(int i) {
|
|
setChipIconSize(this.context.getResources().getDimension(i));
|
|
}
|
|
|
|
public void setChipIconSize(float f) {
|
|
if (this.chipIconSize != f) {
|
|
float calculateChipIconWidth = calculateChipIconWidth();
|
|
this.chipIconSize = f;
|
|
float calculateChipIconWidth2 = calculateChipIconWidth();
|
|
invalidateSelf();
|
|
if (calculateChipIconWidth != calculateChipIconWidth2) {
|
|
onSizeChange();
|
|
}
|
|
}
|
|
}
|
|
|
|
@Deprecated
|
|
public boolean isCloseIconEnabled() {
|
|
return isCloseIconVisible();
|
|
}
|
|
|
|
public void setCloseIconVisible(int i) {
|
|
setCloseIconVisible(this.context.getResources().getBoolean(i));
|
|
}
|
|
|
|
public void setCloseIconVisible(boolean z) {
|
|
if (this.closeIconVisible != z) {
|
|
boolean showsCloseIcon = showsCloseIcon();
|
|
this.closeIconVisible = z;
|
|
boolean showsCloseIcon2 = showsCloseIcon();
|
|
if (showsCloseIcon != showsCloseIcon2) {
|
|
if (showsCloseIcon2) {
|
|
applyChildDrawable(this.closeIcon);
|
|
} else {
|
|
unapplyChildDrawable(this.closeIcon);
|
|
}
|
|
invalidateSelf();
|
|
onSizeChange();
|
|
}
|
|
}
|
|
}
|
|
|
|
@Deprecated
|
|
public void setCloseIconEnabledResource(int i) {
|
|
setCloseIconVisible(i);
|
|
}
|
|
|
|
@Deprecated
|
|
public void setCloseIconEnabled(boolean z) {
|
|
setCloseIconVisible(z);
|
|
}
|
|
|
|
public Drawable getCloseIcon() {
|
|
Drawable drawable = this.closeIcon;
|
|
if (drawable != null) {
|
|
return DrawableCompat.unwrap(drawable);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public void setCloseIconResource(int i) {
|
|
setCloseIcon(AppCompatResources.getDrawable(this.context, i));
|
|
}
|
|
|
|
public void setCloseIcon(Drawable drawable) {
|
|
Drawable closeIcon = getCloseIcon();
|
|
if (closeIcon != drawable) {
|
|
float calculateCloseIconWidth = calculateCloseIconWidth();
|
|
this.closeIcon = drawable != null ? DrawableCompat.wrap(drawable).mutate() : null;
|
|
if (RippleUtils.USE_FRAMEWORK_RIPPLE) {
|
|
updateFrameworkCloseIconRipple();
|
|
}
|
|
float calculateCloseIconWidth2 = calculateCloseIconWidth();
|
|
unapplyChildDrawable(closeIcon);
|
|
if (showsCloseIcon()) {
|
|
applyChildDrawable(this.closeIcon);
|
|
}
|
|
invalidateSelf();
|
|
if (calculateCloseIconWidth != calculateCloseIconWidth2) {
|
|
onSizeChange();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void updateFrameworkCloseIconRipple() {
|
|
this.closeIconRipple = new RippleDrawable(RippleUtils.sanitizeRippleDrawableColor(getRippleColor()), this.closeIcon, closeIconRippleMask);
|
|
}
|
|
|
|
public void setCloseIconTintResource(int i) {
|
|
setCloseIconTint(AppCompatResources.getColorStateList(this.context, i));
|
|
}
|
|
|
|
public void setCloseIconTint(ColorStateList colorStateList) {
|
|
if (this.closeIconTint != colorStateList) {
|
|
this.closeIconTint = colorStateList;
|
|
if (showsCloseIcon()) {
|
|
DrawableCompat.setTintList(this.closeIcon, colorStateList);
|
|
}
|
|
onStateChange(getState());
|
|
}
|
|
}
|
|
|
|
public void setCloseIconSizeResource(int i) {
|
|
setCloseIconSize(this.context.getResources().getDimension(i));
|
|
}
|
|
|
|
public void setCloseIconSize(float f) {
|
|
if (this.closeIconSize != f) {
|
|
this.closeIconSize = f;
|
|
invalidateSelf();
|
|
if (showsCloseIcon()) {
|
|
onSizeChange();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void setCloseIconContentDescription(CharSequence charSequence) {
|
|
if (this.closeIconContentDescription != charSequence) {
|
|
this.closeIconContentDescription = BidiFormatter.getInstance().unicodeWrap(charSequence);
|
|
invalidateSelf();
|
|
}
|
|
}
|
|
|
|
public void setCheckableResource(int i) {
|
|
setCheckable(this.context.getResources().getBoolean(i));
|
|
}
|
|
|
|
public void setCheckable(boolean z) {
|
|
if (this.checkable != z) {
|
|
this.checkable = z;
|
|
float calculateChipIconWidth = calculateChipIconWidth();
|
|
if (!z && this.currentChecked) {
|
|
this.currentChecked = false;
|
|
}
|
|
float calculateChipIconWidth2 = calculateChipIconWidth();
|
|
invalidateSelf();
|
|
if (calculateChipIconWidth != calculateChipIconWidth2) {
|
|
onSizeChange();
|
|
}
|
|
}
|
|
}
|
|
|
|
@Deprecated
|
|
public boolean isCheckedIconEnabled() {
|
|
return isCheckedIconVisible();
|
|
}
|
|
|
|
public void setCheckedIconVisible(int i) {
|
|
setCheckedIconVisible(this.context.getResources().getBoolean(i));
|
|
}
|
|
|
|
public void setCheckedIconVisible(boolean z) {
|
|
if (this.checkedIconVisible != z) {
|
|
boolean showsCheckedIcon = showsCheckedIcon();
|
|
this.checkedIconVisible = z;
|
|
boolean showsCheckedIcon2 = showsCheckedIcon();
|
|
if (showsCheckedIcon != showsCheckedIcon2) {
|
|
if (showsCheckedIcon2) {
|
|
applyChildDrawable(this.checkedIcon);
|
|
} else {
|
|
unapplyChildDrawable(this.checkedIcon);
|
|
}
|
|
invalidateSelf();
|
|
onSizeChange();
|
|
}
|
|
}
|
|
}
|
|
|
|
@Deprecated
|
|
public void setCheckedIconEnabledResource(int i) {
|
|
setCheckedIconVisible(this.context.getResources().getBoolean(i));
|
|
}
|
|
|
|
@Deprecated
|
|
public void setCheckedIconEnabled(boolean z) {
|
|
setCheckedIconVisible(z);
|
|
}
|
|
|
|
public void setCheckedIconResource(int i) {
|
|
setCheckedIcon(AppCompatResources.getDrawable(this.context, i));
|
|
}
|
|
|
|
public void setCheckedIcon(Drawable drawable) {
|
|
if (this.checkedIcon != drawable) {
|
|
float calculateChipIconWidth = calculateChipIconWidth();
|
|
this.checkedIcon = drawable;
|
|
float calculateChipIconWidth2 = calculateChipIconWidth();
|
|
unapplyChildDrawable(this.checkedIcon);
|
|
applyChildDrawable(this.checkedIcon);
|
|
invalidateSelf();
|
|
if (calculateChipIconWidth != calculateChipIconWidth2) {
|
|
onSizeChange();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void setCheckedIconTintResource(int i) {
|
|
setCheckedIconTint(AppCompatResources.getColorStateList(this.context, i));
|
|
}
|
|
|
|
public void setCheckedIconTint(ColorStateList colorStateList) {
|
|
if (this.checkedIconTint != colorStateList) {
|
|
this.checkedIconTint = colorStateList;
|
|
if (canShowCheckedIcon()) {
|
|
DrawableCompat.setTintList(this.checkedIcon, colorStateList);
|
|
}
|
|
onStateChange(getState());
|
|
}
|
|
}
|
|
|
|
public void setShowMotionSpecResource(int i) {
|
|
setShowMotionSpec(MotionSpec.createFromResource(this.context, i));
|
|
}
|
|
|
|
public void setHideMotionSpecResource(int i) {
|
|
setHideMotionSpec(MotionSpec.createFromResource(this.context, i));
|
|
}
|
|
|
|
public void setChipStartPaddingResource(int i) {
|
|
setChipStartPadding(this.context.getResources().getDimension(i));
|
|
}
|
|
|
|
public void setChipStartPadding(float f) {
|
|
if (this.chipStartPadding != f) {
|
|
this.chipStartPadding = f;
|
|
invalidateSelf();
|
|
onSizeChange();
|
|
}
|
|
}
|
|
|
|
public void setIconStartPaddingResource(int i) {
|
|
setIconStartPadding(this.context.getResources().getDimension(i));
|
|
}
|
|
|
|
public void setIconStartPadding(float f) {
|
|
if (this.iconStartPadding != f) {
|
|
float calculateChipIconWidth = calculateChipIconWidth();
|
|
this.iconStartPadding = f;
|
|
float calculateChipIconWidth2 = calculateChipIconWidth();
|
|
invalidateSelf();
|
|
if (calculateChipIconWidth != calculateChipIconWidth2) {
|
|
onSizeChange();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void setIconEndPaddingResource(int i) {
|
|
setIconEndPadding(this.context.getResources().getDimension(i));
|
|
}
|
|
|
|
public void setIconEndPadding(float f) {
|
|
if (this.iconEndPadding != f) {
|
|
float calculateChipIconWidth = calculateChipIconWidth();
|
|
this.iconEndPadding = f;
|
|
float calculateChipIconWidth2 = calculateChipIconWidth();
|
|
invalidateSelf();
|
|
if (calculateChipIconWidth != calculateChipIconWidth2) {
|
|
onSizeChange();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void setTextStartPaddingResource(int i) {
|
|
setTextStartPadding(this.context.getResources().getDimension(i));
|
|
}
|
|
|
|
public void setTextStartPadding(float f) {
|
|
if (this.textStartPadding != f) {
|
|
this.textStartPadding = f;
|
|
invalidateSelf();
|
|
onSizeChange();
|
|
}
|
|
}
|
|
|
|
public void setTextEndPaddingResource(int i) {
|
|
setTextEndPadding(this.context.getResources().getDimension(i));
|
|
}
|
|
|
|
public void setTextEndPadding(float f) {
|
|
if (this.textEndPadding != f) {
|
|
this.textEndPadding = f;
|
|
invalidateSelf();
|
|
onSizeChange();
|
|
}
|
|
}
|
|
|
|
public void setCloseIconStartPaddingResource(int i) {
|
|
setCloseIconStartPadding(this.context.getResources().getDimension(i));
|
|
}
|
|
|
|
public void setCloseIconStartPadding(float f) {
|
|
if (this.closeIconStartPadding != f) {
|
|
this.closeIconStartPadding = f;
|
|
invalidateSelf();
|
|
if (showsCloseIcon()) {
|
|
onSizeChange();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void setCloseIconEndPaddingResource(int i) {
|
|
setCloseIconEndPadding(this.context.getResources().getDimension(i));
|
|
}
|
|
|
|
public void setCloseIconEndPadding(float f) {
|
|
if (this.closeIconEndPadding != f) {
|
|
this.closeIconEndPadding = f;
|
|
invalidateSelf();
|
|
if (showsCloseIcon()) {
|
|
onSizeChange();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void setChipEndPaddingResource(int i) {
|
|
setChipEndPadding(this.context.getResources().getDimension(i));
|
|
}
|
|
|
|
public void setChipEndPadding(float f) {
|
|
if (this.chipEndPadding != f) {
|
|
this.chipEndPadding = f;
|
|
invalidateSelf();
|
|
onSizeChange();
|
|
}
|
|
}
|
|
}
|