mirror of
https://github.com/Pinball3D/Rabbit-R1.git
synced 2025-01-09 13:43:22 +00:00
1819 lines
72 KiB
Java
1819 lines
72 KiB
Java
package com.google.android.material.slider;
|
|
|
|
import android.animation.Animator;
|
|
import android.animation.AnimatorListenerAdapter;
|
|
import android.animation.TimeInterpolator;
|
|
import android.animation.ValueAnimator;
|
|
import android.content.Context;
|
|
import android.content.res.ColorStateList;
|
|
import android.content.res.Resources;
|
|
import android.content.res.TypedArray;
|
|
import android.graphics.Canvas;
|
|
import android.graphics.Paint;
|
|
import android.graphics.PorterDuff;
|
|
import android.graphics.PorterDuffXfermode;
|
|
import android.graphics.Rect;
|
|
import android.graphics.drawable.Drawable;
|
|
import android.graphics.drawable.RippleDrawable;
|
|
import android.os.Bundle;
|
|
import android.os.Parcel;
|
|
import android.os.Parcelable;
|
|
import android.util.AttributeSet;
|
|
import android.util.Log;
|
|
import android.view.KeyEvent;
|
|
import android.view.MotionEvent;
|
|
import android.view.View;
|
|
import android.view.ViewConfiguration;
|
|
import android.view.ViewGroup;
|
|
import android.view.ViewParent;
|
|
import android.view.accessibility.AccessibilityManager;
|
|
import android.widget.SeekBar;
|
|
import androidx.appcompat.content.res.AppCompatResources;
|
|
import androidx.core.graphics.drawable.DrawableCompat;
|
|
import androidx.core.math.MathUtils;
|
|
import androidx.core.view.ViewCompat;
|
|
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
|
|
import androidx.customview.widget.ExploreByTouchHelper;
|
|
import com.google.android.material.R;
|
|
import com.google.android.material.animation.AnimationUtils;
|
|
import com.google.android.material.drawable.DrawableUtils;
|
|
import com.google.android.material.internal.DescendantOffsetUtils;
|
|
import com.google.android.material.internal.ThemeEnforcement;
|
|
import com.google.android.material.internal.ViewOverlayImpl;
|
|
import com.google.android.material.internal.ViewUtils;
|
|
import com.google.android.material.motion.MotionUtils;
|
|
import com.google.android.material.resources.MaterialResources;
|
|
import com.google.android.material.shape.MaterialShapeDrawable;
|
|
import com.google.android.material.shape.ShapeAppearanceModel;
|
|
import com.google.android.material.slider.BaseOnChangeListener;
|
|
import com.google.android.material.slider.BaseOnSliderTouchListener;
|
|
import com.google.android.material.slider.BaseSlider;
|
|
import com.google.android.material.theme.overlay.MaterialThemeOverlay;
|
|
import com.google.android.material.tooltip.TooltipDrawable;
|
|
import java.math.BigDecimal;
|
|
import java.math.MathContext;
|
|
import java.util.ArrayList;
|
|
import java.util.Collections;
|
|
import java.util.Iterator;
|
|
import java.util.List;
|
|
import java.util.Locale;
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
/* loaded from: classes2.dex */
|
|
public abstract class BaseSlider<S extends BaseSlider<S, L, T>, L extends BaseOnChangeListener<S>, T extends BaseOnSliderTouchListener<S>> extends View {
|
|
private static final int DEFAULT_LABEL_ANIMATION_ENTER_DURATION = 83;
|
|
private static final int DEFAULT_LABEL_ANIMATION_EXIT_DURATION = 117;
|
|
private static final String EXCEPTION_ILLEGAL_DISCRETE_VALUE = "Value(%s) must be equal to valueFrom(%s) plus a multiple of stepSize(%s) when using stepSize(%s)";
|
|
private static final String EXCEPTION_ILLEGAL_MIN_SEPARATION = "minSeparation(%s) must be greater or equal to 0";
|
|
private static final String EXCEPTION_ILLEGAL_MIN_SEPARATION_STEP_SIZE = "minSeparation(%s) must be greater or equal and a multiple of stepSize(%s) when using stepSize(%s)";
|
|
private static final String EXCEPTION_ILLEGAL_MIN_SEPARATION_STEP_SIZE_UNIT = "minSeparation(%s) cannot be set as a dimension when using stepSize(%s)";
|
|
private static final String EXCEPTION_ILLEGAL_STEP_SIZE = "The stepSize(%s) must be 0, or a factor of the valueFrom(%s)-valueTo(%s) range";
|
|
private static final String EXCEPTION_ILLEGAL_VALUE = "Slider value(%s) must be greater or equal to valueFrom(%s), and lower or equal to valueTo(%s)";
|
|
private static final String EXCEPTION_ILLEGAL_VALUE_FROM = "valueFrom(%s) must be smaller than valueTo(%s)";
|
|
private static final String EXCEPTION_ILLEGAL_VALUE_TO = "valueTo(%s) must be greater than valueFrom(%s)";
|
|
private static final int HALO_ALPHA = 63;
|
|
private static final int MIN_TOUCH_TARGET_DP = 48;
|
|
private static final String TAG = "BaseSlider";
|
|
private static final double THRESHOLD = 1.0E-4d;
|
|
private static final int TIMEOUT_SEND_ACCESSIBILITY_EVENT = 200;
|
|
static final int UNIT_PX = 0;
|
|
static final int UNIT_VALUE = 1;
|
|
private static final String WARNING_FLOATING_POINT_ERROR = "Floating point value used for %s(%s). Using floats can have rounding errors which may result in incorrect values. Instead, consider using integers with a custom LabelFormatter to display the value correctly.";
|
|
private BaseSlider<S, L, T>.AccessibilityEventSender accessibilityEventSender;
|
|
private final AccessibilityHelper accessibilityHelper;
|
|
private final AccessibilityManager accessibilityManager;
|
|
private int activeThumbIdx;
|
|
private final Paint activeTicksPaint;
|
|
private final Paint activeTrackPaint;
|
|
private final List<L> changeListeners;
|
|
private Drawable customThumbDrawable;
|
|
private List<Drawable> customThumbDrawablesForValues;
|
|
private final MaterialShapeDrawable defaultThumbDrawable;
|
|
private int defaultThumbRadius;
|
|
private int defaultTickActiveRadius;
|
|
private int defaultTickInactiveRadius;
|
|
private int defaultTrackHeight;
|
|
private boolean dirtyConfig;
|
|
private int focusedThumbIdx;
|
|
private boolean forceDrawCompatHalo;
|
|
private LabelFormatter formatter;
|
|
private ColorStateList haloColor;
|
|
private final Paint haloPaint;
|
|
private int haloRadius;
|
|
private final Paint inactiveTicksPaint;
|
|
private final Paint inactiveTrackPaint;
|
|
private boolean isLongPress;
|
|
private int labelBehavior;
|
|
private int labelPadding;
|
|
private int labelStyle;
|
|
private final List<TooltipDrawable> labels;
|
|
private boolean labelsAreAnimatedIn;
|
|
private ValueAnimator labelsInAnimator;
|
|
private ValueAnimator labelsOutAnimator;
|
|
private MotionEvent lastEvent;
|
|
private int minTouchTargetSize;
|
|
private int minTrackSidePadding;
|
|
private int minWidgetHeight;
|
|
private final int scaledTouchSlop;
|
|
private int separationUnit;
|
|
private float stepSize;
|
|
private boolean thumbIsPressed;
|
|
private final Paint thumbPaint;
|
|
private int thumbRadius;
|
|
private int tickActiveRadius;
|
|
private ColorStateList tickColorActive;
|
|
private ColorStateList tickColorInactive;
|
|
private int tickInactiveRadius;
|
|
private boolean tickVisible;
|
|
private float[] ticksCoordinates;
|
|
private float touchDownX;
|
|
private final List<T> touchListeners;
|
|
private float touchPosition;
|
|
private ColorStateList trackColorActive;
|
|
private ColorStateList trackColorInactive;
|
|
private int trackHeight;
|
|
private int trackSidePadding;
|
|
private int trackWidth;
|
|
private float valueFrom;
|
|
private float valueTo;
|
|
private ArrayList<Float> values;
|
|
private int widgetHeight;
|
|
static final int DEF_STYLE_RES = R.style.Widget_MaterialComponents_Slider;
|
|
private static final int LABEL_ANIMATION_ENTER_DURATION_ATTR = R.attr.motionDurationMedium4;
|
|
private static final int LABEL_ANIMATION_EXIT_DURATION_ATTR = R.attr.motionDurationShort3;
|
|
private static final int LABEL_ANIMATION_ENTER_EASING_ATTR = R.attr.motionEasingEmphasizedInterpolator;
|
|
private static final int LABEL_ANIMATION_EXIT_EASING_ATTR = R.attr.motionEasingEmphasizedAccelerateInterpolator;
|
|
|
|
private float calculateStepIncrement() {
|
|
float f = this.stepSize;
|
|
if (f == 0.0f) {
|
|
return 1.0f;
|
|
}
|
|
return f;
|
|
}
|
|
|
|
private float dimenToValue(float f) {
|
|
if (f == 0.0f) {
|
|
return 0.0f;
|
|
}
|
|
float f2 = (f - this.trackSidePadding) / this.trackWidth;
|
|
float f3 = this.valueFrom;
|
|
return (f2 * (f3 - this.valueTo)) + f3;
|
|
}
|
|
|
|
private boolean shouldAlwaysShowLabel() {
|
|
return this.labelBehavior == 3;
|
|
}
|
|
|
|
void forceDrawCompatHalo(boolean z) {
|
|
this.forceDrawCompatHalo = z;
|
|
}
|
|
|
|
public int getActiveThumbIndex() {
|
|
return this.activeThumbIdx;
|
|
}
|
|
|
|
public int getFocusedThumbIndex() {
|
|
return this.focusedThumbIdx;
|
|
}
|
|
|
|
public int getHaloRadius() {
|
|
return this.haloRadius;
|
|
}
|
|
|
|
public ColorStateList getHaloTintList() {
|
|
return this.haloColor;
|
|
}
|
|
|
|
public int getLabelBehavior() {
|
|
return this.labelBehavior;
|
|
}
|
|
|
|
protected float getMinSeparation() {
|
|
return 0.0f;
|
|
}
|
|
|
|
public float getStepSize() {
|
|
return this.stepSize;
|
|
}
|
|
|
|
public int getThumbRadius() {
|
|
return this.thumbRadius;
|
|
}
|
|
|
|
public int getTickActiveRadius() {
|
|
return this.tickActiveRadius;
|
|
}
|
|
|
|
public ColorStateList getTickActiveTintList() {
|
|
return this.tickColorActive;
|
|
}
|
|
|
|
public int getTickInactiveRadius() {
|
|
return this.tickInactiveRadius;
|
|
}
|
|
|
|
public ColorStateList getTickInactiveTintList() {
|
|
return this.tickColorInactive;
|
|
}
|
|
|
|
public ColorStateList getTrackActiveTintList() {
|
|
return this.trackColorActive;
|
|
}
|
|
|
|
public int getTrackHeight() {
|
|
return this.trackHeight;
|
|
}
|
|
|
|
public ColorStateList getTrackInactiveTintList() {
|
|
return this.trackColorInactive;
|
|
}
|
|
|
|
public int getTrackSidePadding() {
|
|
return this.trackSidePadding;
|
|
}
|
|
|
|
public int getTrackWidth() {
|
|
return this.trackWidth;
|
|
}
|
|
|
|
public float getValueFrom() {
|
|
return this.valueFrom;
|
|
}
|
|
|
|
public float getValueTo() {
|
|
return this.valueTo;
|
|
}
|
|
|
|
public boolean hasLabelFormatter() {
|
|
return this.formatter != null;
|
|
}
|
|
|
|
public boolean isTickVisible() {
|
|
return this.tickVisible;
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
public void setActiveThumbIndex(int i) {
|
|
this.activeThumbIdx = i;
|
|
}
|
|
|
|
public void setLabelFormatter(LabelFormatter labelFormatter) {
|
|
this.formatter = labelFormatter;
|
|
}
|
|
|
|
public BaseSlider(Context context) {
|
|
this(context, null);
|
|
}
|
|
|
|
public BaseSlider(Context context, AttributeSet attributeSet) {
|
|
this(context, attributeSet, R.attr.sliderStyle);
|
|
}
|
|
|
|
public BaseSlider(Context context, AttributeSet attributeSet, int i) {
|
|
super(MaterialThemeOverlay.wrap(context, attributeSet, i, DEF_STYLE_RES), attributeSet, i);
|
|
this.labels = new ArrayList();
|
|
this.changeListeners = new ArrayList();
|
|
this.touchListeners = new ArrayList();
|
|
this.labelsAreAnimatedIn = false;
|
|
this.thumbIsPressed = false;
|
|
this.values = new ArrayList<>();
|
|
this.activeThumbIdx = -1;
|
|
this.focusedThumbIdx = -1;
|
|
this.stepSize = 0.0f;
|
|
this.tickVisible = true;
|
|
this.isLongPress = false;
|
|
MaterialShapeDrawable materialShapeDrawable = new MaterialShapeDrawable();
|
|
this.defaultThumbDrawable = materialShapeDrawable;
|
|
this.customThumbDrawablesForValues = Collections.emptyList();
|
|
this.separationUnit = 0;
|
|
Context context2 = getContext();
|
|
Paint paint = new Paint();
|
|
this.inactiveTrackPaint = paint;
|
|
paint.setStyle(Paint.Style.STROKE);
|
|
paint.setStrokeCap(Paint.Cap.ROUND);
|
|
Paint paint2 = new Paint();
|
|
this.activeTrackPaint = paint2;
|
|
paint2.setStyle(Paint.Style.STROKE);
|
|
paint2.setStrokeCap(Paint.Cap.ROUND);
|
|
Paint paint3 = new Paint(1);
|
|
this.thumbPaint = paint3;
|
|
paint3.setStyle(Paint.Style.FILL);
|
|
paint3.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
|
|
Paint paint4 = new Paint(1);
|
|
this.haloPaint = paint4;
|
|
paint4.setStyle(Paint.Style.FILL);
|
|
Paint paint5 = new Paint();
|
|
this.inactiveTicksPaint = paint5;
|
|
paint5.setStyle(Paint.Style.STROKE);
|
|
paint5.setStrokeCap(Paint.Cap.ROUND);
|
|
Paint paint6 = new Paint();
|
|
this.activeTicksPaint = paint6;
|
|
paint6.setStyle(Paint.Style.STROKE);
|
|
paint6.setStrokeCap(Paint.Cap.ROUND);
|
|
loadResources(context2.getResources());
|
|
processAttributes(context2, attributeSet, i);
|
|
setFocusable(true);
|
|
setClickable(true);
|
|
materialShapeDrawable.setShadowCompatibilityMode(2);
|
|
this.scaledTouchSlop = ViewConfiguration.get(context2).getScaledTouchSlop();
|
|
AccessibilityHelper accessibilityHelper = new AccessibilityHelper(this);
|
|
this.accessibilityHelper = accessibilityHelper;
|
|
ViewCompat.setAccessibilityDelegate(this, accessibilityHelper);
|
|
this.accessibilityManager = (AccessibilityManager) getContext().getSystemService("accessibility");
|
|
}
|
|
|
|
private void loadResources(Resources resources) {
|
|
this.minWidgetHeight = resources.getDimensionPixelSize(R.dimen.mtrl_slider_widget_height);
|
|
int dimensionPixelOffset = resources.getDimensionPixelOffset(R.dimen.mtrl_slider_track_side_padding);
|
|
this.minTrackSidePadding = dimensionPixelOffset;
|
|
this.trackSidePadding = dimensionPixelOffset;
|
|
this.defaultThumbRadius = resources.getDimensionPixelSize(R.dimen.mtrl_slider_thumb_radius);
|
|
this.defaultTrackHeight = resources.getDimensionPixelSize(R.dimen.mtrl_slider_track_height);
|
|
this.defaultTickActiveRadius = resources.getDimensionPixelSize(R.dimen.mtrl_slider_tick_radius);
|
|
this.defaultTickInactiveRadius = resources.getDimensionPixelSize(R.dimen.mtrl_slider_tick_radius);
|
|
this.labelPadding = resources.getDimensionPixelSize(R.dimen.mtrl_slider_label_padding);
|
|
}
|
|
|
|
private void processAttributes(Context context, AttributeSet attributeSet, int i) {
|
|
TypedArray obtainStyledAttributes = ThemeEnforcement.obtainStyledAttributes(context, attributeSet, R.styleable.Slider, i, DEF_STYLE_RES, new int[0]);
|
|
this.labelStyle = obtainStyledAttributes.getResourceId(R.styleable.Slider_labelStyle, R.style.Widget_MaterialComponents_Tooltip);
|
|
this.valueFrom = obtainStyledAttributes.getFloat(R.styleable.Slider_android_valueFrom, 0.0f);
|
|
this.valueTo = obtainStyledAttributes.getFloat(R.styleable.Slider_android_valueTo, 1.0f);
|
|
setValues(Float.valueOf(this.valueFrom));
|
|
this.stepSize = obtainStyledAttributes.getFloat(R.styleable.Slider_android_stepSize, 0.0f);
|
|
this.minTouchTargetSize = (int) Math.ceil(obtainStyledAttributes.getDimension(R.styleable.Slider_minTouchTargetSize, (float) Math.ceil(ViewUtils.dpToPx(getContext(), 48))));
|
|
boolean hasValue = obtainStyledAttributes.hasValue(R.styleable.Slider_trackColor);
|
|
int i2 = hasValue ? R.styleable.Slider_trackColor : R.styleable.Slider_trackColorInactive;
|
|
int i3 = hasValue ? R.styleable.Slider_trackColor : R.styleable.Slider_trackColorActive;
|
|
ColorStateList colorStateList = MaterialResources.getColorStateList(context, obtainStyledAttributes, i2);
|
|
if (colorStateList == null) {
|
|
colorStateList = AppCompatResources.getColorStateList(context, R.color.material_slider_inactive_track_color);
|
|
}
|
|
setTrackInactiveTintList(colorStateList);
|
|
ColorStateList colorStateList2 = MaterialResources.getColorStateList(context, obtainStyledAttributes, i3);
|
|
if (colorStateList2 == null) {
|
|
colorStateList2 = AppCompatResources.getColorStateList(context, R.color.material_slider_active_track_color);
|
|
}
|
|
setTrackActiveTintList(colorStateList2);
|
|
this.defaultThumbDrawable.setFillColor(MaterialResources.getColorStateList(context, obtainStyledAttributes, R.styleable.Slider_thumbColor));
|
|
if (obtainStyledAttributes.hasValue(R.styleable.Slider_thumbStrokeColor)) {
|
|
setThumbStrokeColor(MaterialResources.getColorStateList(context, obtainStyledAttributes, R.styleable.Slider_thumbStrokeColor));
|
|
}
|
|
setThumbStrokeWidth(obtainStyledAttributes.getDimension(R.styleable.Slider_thumbStrokeWidth, 0.0f));
|
|
ColorStateList colorStateList3 = MaterialResources.getColorStateList(context, obtainStyledAttributes, R.styleable.Slider_haloColor);
|
|
if (colorStateList3 == null) {
|
|
colorStateList3 = AppCompatResources.getColorStateList(context, R.color.material_slider_halo_color);
|
|
}
|
|
setHaloTintList(colorStateList3);
|
|
this.tickVisible = obtainStyledAttributes.getBoolean(R.styleable.Slider_tickVisible, true);
|
|
boolean hasValue2 = obtainStyledAttributes.hasValue(R.styleable.Slider_tickColor);
|
|
int i4 = hasValue2 ? R.styleable.Slider_tickColor : R.styleable.Slider_tickColorInactive;
|
|
int i5 = hasValue2 ? R.styleable.Slider_tickColor : R.styleable.Slider_tickColorActive;
|
|
ColorStateList colorStateList4 = MaterialResources.getColorStateList(context, obtainStyledAttributes, i4);
|
|
if (colorStateList4 == null) {
|
|
colorStateList4 = AppCompatResources.getColorStateList(context, R.color.material_slider_inactive_tick_marks_color);
|
|
}
|
|
setTickInactiveTintList(colorStateList4);
|
|
ColorStateList colorStateList5 = MaterialResources.getColorStateList(context, obtainStyledAttributes, i5);
|
|
if (colorStateList5 == null) {
|
|
colorStateList5 = AppCompatResources.getColorStateList(context, R.color.material_slider_active_tick_marks_color);
|
|
}
|
|
setTickActiveTintList(colorStateList5);
|
|
setThumbRadius(obtainStyledAttributes.getDimensionPixelSize(R.styleable.Slider_thumbRadius, 0));
|
|
setHaloRadius(obtainStyledAttributes.getDimensionPixelSize(R.styleable.Slider_haloRadius, 0));
|
|
setThumbElevation(obtainStyledAttributes.getDimension(R.styleable.Slider_thumbElevation, 0.0f));
|
|
setTrackHeight(obtainStyledAttributes.getDimensionPixelSize(R.styleable.Slider_trackHeight, 0));
|
|
setTickActiveRadius(obtainStyledAttributes.getDimensionPixelSize(R.styleable.Slider_tickRadiusActive, 0));
|
|
setTickInactiveRadius(obtainStyledAttributes.getDimensionPixelSize(R.styleable.Slider_tickRadiusInactive, 0));
|
|
setLabelBehavior(obtainStyledAttributes.getInt(R.styleable.Slider_labelBehavior, 0));
|
|
if (!obtainStyledAttributes.getBoolean(R.styleable.Slider_android_enabled, true)) {
|
|
setEnabled(false);
|
|
}
|
|
obtainStyledAttributes.recycle();
|
|
}
|
|
|
|
private boolean maybeIncreaseTrackSidePadding() {
|
|
int max = this.minTrackSidePadding + Math.max(Math.max(Math.max(this.thumbRadius - this.defaultThumbRadius, 0), Math.max((this.trackHeight - this.defaultTrackHeight) / 2, 0)), Math.max(Math.max(this.tickActiveRadius - this.defaultTickActiveRadius, 0), Math.max(this.tickInactiveRadius - this.defaultTickInactiveRadius, 0)));
|
|
if (this.trackSidePadding == max) {
|
|
return false;
|
|
}
|
|
this.trackSidePadding = max;
|
|
if (!ViewCompat.isLaidOut(this)) {
|
|
return true;
|
|
}
|
|
updateTrackWidth(getWidth());
|
|
return true;
|
|
}
|
|
|
|
private void validateValueFrom() {
|
|
if (this.valueFrom >= this.valueTo) {
|
|
throw new IllegalStateException(String.format(EXCEPTION_ILLEGAL_VALUE_FROM, Float.valueOf(this.valueFrom), Float.valueOf(this.valueTo)));
|
|
}
|
|
}
|
|
|
|
private void validateValueTo() {
|
|
if (this.valueTo <= this.valueFrom) {
|
|
throw new IllegalStateException(String.format(EXCEPTION_ILLEGAL_VALUE_TO, Float.valueOf(this.valueTo), Float.valueOf(this.valueFrom)));
|
|
}
|
|
}
|
|
|
|
private boolean valueLandsOnTick(float f) {
|
|
return isMultipleOfStepSize(f - this.valueFrom);
|
|
}
|
|
|
|
private boolean isMultipleOfStepSize(float f) {
|
|
double doubleValue = new BigDecimal(Float.toString(f)).divide(new BigDecimal(Float.toString(this.stepSize)), MathContext.DECIMAL64).doubleValue();
|
|
return Math.abs(((double) Math.round(doubleValue)) - doubleValue) < THRESHOLD;
|
|
}
|
|
|
|
private void validateStepSize() {
|
|
if (this.stepSize > 0.0f && !valueLandsOnTick(this.valueTo)) {
|
|
throw new IllegalStateException(String.format(EXCEPTION_ILLEGAL_STEP_SIZE, Float.valueOf(this.stepSize), Float.valueOf(this.valueFrom), Float.valueOf(this.valueTo)));
|
|
}
|
|
}
|
|
|
|
private void validateValues() {
|
|
Iterator<Float> it = this.values.iterator();
|
|
while (it.hasNext()) {
|
|
Float next = it.next();
|
|
if (next.floatValue() < this.valueFrom || next.floatValue() > this.valueTo) {
|
|
throw new IllegalStateException(String.format(EXCEPTION_ILLEGAL_VALUE, next, Float.valueOf(this.valueFrom), Float.valueOf(this.valueTo)));
|
|
}
|
|
if (this.stepSize > 0.0f && !valueLandsOnTick(next.floatValue())) {
|
|
throw new IllegalStateException(String.format(EXCEPTION_ILLEGAL_DISCRETE_VALUE, next, Float.valueOf(this.valueFrom), Float.valueOf(this.stepSize), Float.valueOf(this.stepSize)));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void validateMinSeparation() {
|
|
float minSeparation = getMinSeparation();
|
|
if (minSeparation < 0.0f) {
|
|
throw new IllegalStateException(String.format(EXCEPTION_ILLEGAL_MIN_SEPARATION, Float.valueOf(minSeparation)));
|
|
}
|
|
float f = this.stepSize;
|
|
if (f <= 0.0f || minSeparation <= 0.0f) {
|
|
return;
|
|
}
|
|
if (this.separationUnit != 1) {
|
|
throw new IllegalStateException(String.format(EXCEPTION_ILLEGAL_MIN_SEPARATION_STEP_SIZE_UNIT, Float.valueOf(minSeparation), Float.valueOf(this.stepSize)));
|
|
}
|
|
if (minSeparation < f || !isMultipleOfStepSize(minSeparation)) {
|
|
throw new IllegalStateException(String.format(EXCEPTION_ILLEGAL_MIN_SEPARATION_STEP_SIZE, Float.valueOf(minSeparation), Float.valueOf(this.stepSize), Float.valueOf(this.stepSize)));
|
|
}
|
|
}
|
|
|
|
private void warnAboutFloatingPointError() {
|
|
float f = this.stepSize;
|
|
if (f == 0.0f) {
|
|
return;
|
|
}
|
|
if (((int) f) != f) {
|
|
Log.w(TAG, String.format(WARNING_FLOATING_POINT_ERROR, "stepSize", Float.valueOf(f)));
|
|
}
|
|
float f2 = this.valueFrom;
|
|
if (((int) f2) != f2) {
|
|
Log.w(TAG, String.format(WARNING_FLOATING_POINT_ERROR, "valueFrom", Float.valueOf(f2)));
|
|
}
|
|
float f3 = this.valueTo;
|
|
if (((int) f3) != f3) {
|
|
Log.w(TAG, String.format(WARNING_FLOATING_POINT_ERROR, "valueTo", Float.valueOf(f3)));
|
|
}
|
|
}
|
|
|
|
private void validateConfigurationIfDirty() {
|
|
if (this.dirtyConfig) {
|
|
validateValueFrom();
|
|
validateValueTo();
|
|
validateStepSize();
|
|
validateValues();
|
|
validateMinSeparation();
|
|
warnAboutFloatingPointError();
|
|
this.dirtyConfig = false;
|
|
}
|
|
}
|
|
|
|
public void setValueFrom(float f) {
|
|
this.valueFrom = f;
|
|
this.dirtyConfig = true;
|
|
postInvalidate();
|
|
}
|
|
|
|
public void setValueTo(float f) {
|
|
this.valueTo = f;
|
|
this.dirtyConfig = true;
|
|
postInvalidate();
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
public List<Float> getValues() {
|
|
return new ArrayList(this.values);
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
public void setValues(Float... fArr) {
|
|
ArrayList<Float> arrayList = new ArrayList<>();
|
|
Collections.addAll(arrayList, fArr);
|
|
setValuesInternal(arrayList);
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
public void setValues(List<Float> list) {
|
|
setValuesInternal(new ArrayList<>(list));
|
|
}
|
|
|
|
private void setValuesInternal(ArrayList<Float> arrayList) {
|
|
if (arrayList.isEmpty()) {
|
|
throw new IllegalArgumentException("At least one value must be set");
|
|
}
|
|
Collections.sort(arrayList);
|
|
if (this.values.size() == arrayList.size() && this.values.equals(arrayList)) {
|
|
return;
|
|
}
|
|
this.values = arrayList;
|
|
this.dirtyConfig = true;
|
|
this.focusedThumbIdx = 0;
|
|
updateHaloHotspot();
|
|
createLabelPool();
|
|
dispatchOnChangedProgrammatically();
|
|
postInvalidate();
|
|
}
|
|
|
|
private void createLabelPool() {
|
|
if (this.labels.size() > this.values.size()) {
|
|
List<TooltipDrawable> subList = this.labels.subList(this.values.size(), this.labels.size());
|
|
for (TooltipDrawable tooltipDrawable : subList) {
|
|
if (ViewCompat.isAttachedToWindow(this)) {
|
|
detachLabelFromContentView(tooltipDrawable);
|
|
}
|
|
}
|
|
subList.clear();
|
|
}
|
|
while (true) {
|
|
if (this.labels.size() >= this.values.size()) {
|
|
break;
|
|
}
|
|
TooltipDrawable createFromAttributes = TooltipDrawable.createFromAttributes(getContext(), null, 0, this.labelStyle);
|
|
this.labels.add(createFromAttributes);
|
|
if (ViewCompat.isAttachedToWindow(this)) {
|
|
attachLabelToContentView(createFromAttributes);
|
|
}
|
|
}
|
|
int i = this.labels.size() != 1 ? 1 : 0;
|
|
Iterator<TooltipDrawable> it = this.labels.iterator();
|
|
while (it.hasNext()) {
|
|
it.next().setStrokeWidth(i);
|
|
}
|
|
}
|
|
|
|
public void setStepSize(float f) {
|
|
if (f < 0.0f) {
|
|
throw new IllegalArgumentException(String.format(EXCEPTION_ILLEGAL_STEP_SIZE, Float.valueOf(f), Float.valueOf(this.valueFrom), Float.valueOf(this.valueTo)));
|
|
}
|
|
if (this.stepSize != f) {
|
|
this.stepSize = f;
|
|
this.dirtyConfig = true;
|
|
postInvalidate();
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
public void setCustomThumbDrawable(int i) {
|
|
setCustomThumbDrawable(getResources().getDrawable(i));
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
public void setCustomThumbDrawable(Drawable drawable) {
|
|
this.customThumbDrawable = initializeCustomThumbDrawable(drawable);
|
|
this.customThumbDrawablesForValues.clear();
|
|
postInvalidate();
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
public void setCustomThumbDrawablesForValues(int... iArr) {
|
|
Drawable[] drawableArr = new Drawable[iArr.length];
|
|
for (int i = 0; i < iArr.length; i++) {
|
|
drawableArr[i] = getResources().getDrawable(iArr[i]);
|
|
}
|
|
setCustomThumbDrawablesForValues(drawableArr);
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
public void setCustomThumbDrawablesForValues(Drawable... drawableArr) {
|
|
this.customThumbDrawable = null;
|
|
this.customThumbDrawablesForValues = new ArrayList();
|
|
for (Drawable drawable : drawableArr) {
|
|
this.customThumbDrawablesForValues.add(initializeCustomThumbDrawable(drawable));
|
|
}
|
|
postInvalidate();
|
|
}
|
|
|
|
private Drawable initializeCustomThumbDrawable(Drawable drawable) {
|
|
Drawable newDrawable = drawable.mutate().getConstantState().newDrawable();
|
|
adjustCustomThumbDrawableBounds(newDrawable);
|
|
return newDrawable;
|
|
}
|
|
|
|
private void adjustCustomThumbDrawableBounds(Drawable drawable) {
|
|
int i = this.thumbRadius * 2;
|
|
int intrinsicWidth = drawable.getIntrinsicWidth();
|
|
int intrinsicHeight = drawable.getIntrinsicHeight();
|
|
if (intrinsicWidth == -1 && intrinsicHeight == -1) {
|
|
drawable.setBounds(0, 0, i, i);
|
|
} else {
|
|
float max = i / Math.max(intrinsicWidth, intrinsicHeight);
|
|
drawable.setBounds(0, 0, (int) (intrinsicWidth * max), (int) (intrinsicHeight * max));
|
|
}
|
|
}
|
|
|
|
public void setFocusedThumbIndex(int i) {
|
|
if (i < 0 || i >= this.values.size()) {
|
|
throw new IllegalArgumentException("index out of range");
|
|
}
|
|
this.focusedThumbIdx = i;
|
|
this.accessibilityHelper.requestKeyboardFocusForVirtualView(i);
|
|
postInvalidate();
|
|
}
|
|
|
|
public void addOnChangeListener(L l) {
|
|
this.changeListeners.add(l);
|
|
}
|
|
|
|
public void removeOnChangeListener(L l) {
|
|
this.changeListeners.remove(l);
|
|
}
|
|
|
|
public void clearOnChangeListeners() {
|
|
this.changeListeners.clear();
|
|
}
|
|
|
|
public void addOnSliderTouchListener(T t) {
|
|
this.touchListeners.add(t);
|
|
}
|
|
|
|
public void removeOnSliderTouchListener(T t) {
|
|
this.touchListeners.remove(t);
|
|
}
|
|
|
|
public void clearOnSliderTouchListeners() {
|
|
this.touchListeners.clear();
|
|
}
|
|
|
|
public float getThumbElevation() {
|
|
return this.defaultThumbDrawable.getElevation();
|
|
}
|
|
|
|
public void setThumbElevation(float f) {
|
|
this.defaultThumbDrawable.setElevation(f);
|
|
}
|
|
|
|
public void setThumbElevationResource(int i) {
|
|
setThumbElevation(getResources().getDimension(i));
|
|
}
|
|
|
|
public void setThumbRadius(int i) {
|
|
if (i == this.thumbRadius) {
|
|
return;
|
|
}
|
|
this.thumbRadius = i;
|
|
this.defaultThumbDrawable.setShapeAppearanceModel(ShapeAppearanceModel.builder().setAllCorners(0, this.thumbRadius).build());
|
|
MaterialShapeDrawable materialShapeDrawable = this.defaultThumbDrawable;
|
|
int i2 = this.thumbRadius;
|
|
materialShapeDrawable.setBounds(0, 0, i2 * 2, i2 * 2);
|
|
Drawable drawable = this.customThumbDrawable;
|
|
if (drawable != null) {
|
|
adjustCustomThumbDrawableBounds(drawable);
|
|
}
|
|
Iterator<Drawable> it = this.customThumbDrawablesForValues.iterator();
|
|
while (it.hasNext()) {
|
|
adjustCustomThumbDrawableBounds(it.next());
|
|
}
|
|
updateWidgetLayout();
|
|
}
|
|
|
|
public void setThumbRadiusResource(int i) {
|
|
setThumbRadius(getResources().getDimensionPixelSize(i));
|
|
}
|
|
|
|
public void setThumbStrokeColor(ColorStateList colorStateList) {
|
|
this.defaultThumbDrawable.setStrokeColor(colorStateList);
|
|
postInvalidate();
|
|
}
|
|
|
|
public void setThumbStrokeColorResource(int i) {
|
|
if (i != 0) {
|
|
setThumbStrokeColor(AppCompatResources.getColorStateList(getContext(), i));
|
|
}
|
|
}
|
|
|
|
public ColorStateList getThumbStrokeColor() {
|
|
return this.defaultThumbDrawable.getStrokeColor();
|
|
}
|
|
|
|
public void setThumbStrokeWidth(float f) {
|
|
this.defaultThumbDrawable.setStrokeWidth(f);
|
|
postInvalidate();
|
|
}
|
|
|
|
public void setThumbStrokeWidthResource(int i) {
|
|
if (i != 0) {
|
|
setThumbStrokeWidth(getResources().getDimension(i));
|
|
}
|
|
}
|
|
|
|
public float getThumbStrokeWidth() {
|
|
return this.defaultThumbDrawable.getStrokeWidth();
|
|
}
|
|
|
|
public void setHaloRadius(int i) {
|
|
if (i == this.haloRadius) {
|
|
return;
|
|
}
|
|
this.haloRadius = i;
|
|
Drawable background = getBackground();
|
|
if (!shouldDrawCompatHalo() && (background instanceof RippleDrawable)) {
|
|
DrawableUtils.setRippleDrawableRadius((RippleDrawable) background, this.haloRadius);
|
|
} else {
|
|
postInvalidate();
|
|
}
|
|
}
|
|
|
|
public void setHaloRadiusResource(int i) {
|
|
setHaloRadius(getResources().getDimensionPixelSize(i));
|
|
}
|
|
|
|
public void setLabelBehavior(int i) {
|
|
if (this.labelBehavior != i) {
|
|
this.labelBehavior = i;
|
|
requestLayout();
|
|
}
|
|
}
|
|
|
|
public void setTrackHeight(int i) {
|
|
if (this.trackHeight != i) {
|
|
this.trackHeight = i;
|
|
invalidateTrack();
|
|
updateWidgetLayout();
|
|
}
|
|
}
|
|
|
|
public void setTickActiveRadius(int i) {
|
|
if (this.tickActiveRadius != i) {
|
|
this.tickActiveRadius = i;
|
|
this.activeTicksPaint.setStrokeWidth(i * 2);
|
|
updateWidgetLayout();
|
|
}
|
|
}
|
|
|
|
public void setTickInactiveRadius(int i) {
|
|
if (this.tickInactiveRadius != i) {
|
|
this.tickInactiveRadius = i;
|
|
this.inactiveTicksPaint.setStrokeWidth(i * 2);
|
|
updateWidgetLayout();
|
|
}
|
|
}
|
|
|
|
private void updateWidgetLayout() {
|
|
boolean maybeIncreaseWidgetHeight = maybeIncreaseWidgetHeight();
|
|
boolean maybeIncreaseTrackSidePadding = maybeIncreaseTrackSidePadding();
|
|
if (maybeIncreaseWidgetHeight) {
|
|
requestLayout();
|
|
} else if (maybeIncreaseTrackSidePadding) {
|
|
postInvalidate();
|
|
}
|
|
}
|
|
|
|
private boolean maybeIncreaseWidgetHeight() {
|
|
int max = Math.max(this.minWidgetHeight, Math.max(this.trackHeight + getPaddingTop() + getPaddingBottom(), (this.thumbRadius * 2) + getPaddingTop() + getPaddingBottom()));
|
|
if (max == this.widgetHeight) {
|
|
return false;
|
|
}
|
|
this.widgetHeight = max;
|
|
return true;
|
|
}
|
|
|
|
public void setHaloTintList(ColorStateList colorStateList) {
|
|
if (colorStateList.equals(this.haloColor)) {
|
|
return;
|
|
}
|
|
this.haloColor = colorStateList;
|
|
Drawable background = getBackground();
|
|
if (!shouldDrawCompatHalo() && (background instanceof RippleDrawable)) {
|
|
((RippleDrawable) background).setColor(colorStateList);
|
|
return;
|
|
}
|
|
this.haloPaint.setColor(getColorForState(colorStateList));
|
|
this.haloPaint.setAlpha(63);
|
|
invalidate();
|
|
}
|
|
|
|
public ColorStateList getThumbTintList() {
|
|
return this.defaultThumbDrawable.getFillColor();
|
|
}
|
|
|
|
public void setThumbTintList(ColorStateList colorStateList) {
|
|
if (colorStateList.equals(this.defaultThumbDrawable.getFillColor())) {
|
|
return;
|
|
}
|
|
this.defaultThumbDrawable.setFillColor(colorStateList);
|
|
invalidate();
|
|
}
|
|
|
|
public ColorStateList getTickTintList() {
|
|
if (this.tickColorInactive.equals(this.tickColorActive)) {
|
|
return this.tickColorActive;
|
|
}
|
|
throw new IllegalStateException("The inactive and active ticks are different colors. Use the getTickColorInactive() and getTickColorActive() methods instead.");
|
|
}
|
|
|
|
public void setTickTintList(ColorStateList colorStateList) {
|
|
setTickInactiveTintList(colorStateList);
|
|
setTickActiveTintList(colorStateList);
|
|
}
|
|
|
|
public void setTickActiveTintList(ColorStateList colorStateList) {
|
|
if (colorStateList.equals(this.tickColorActive)) {
|
|
return;
|
|
}
|
|
this.tickColorActive = colorStateList;
|
|
this.activeTicksPaint.setColor(getColorForState(colorStateList));
|
|
invalidate();
|
|
}
|
|
|
|
public void setTickInactiveTintList(ColorStateList colorStateList) {
|
|
if (colorStateList.equals(this.tickColorInactive)) {
|
|
return;
|
|
}
|
|
this.tickColorInactive = colorStateList;
|
|
this.inactiveTicksPaint.setColor(getColorForState(colorStateList));
|
|
invalidate();
|
|
}
|
|
|
|
public void setTickVisible(boolean z) {
|
|
if (this.tickVisible != z) {
|
|
this.tickVisible = z;
|
|
postInvalidate();
|
|
}
|
|
}
|
|
|
|
public ColorStateList getTrackTintList() {
|
|
if (this.trackColorInactive.equals(this.trackColorActive)) {
|
|
return this.trackColorActive;
|
|
}
|
|
throw new IllegalStateException("The inactive and active parts of the track are different colors. Use the getInactiveTrackColor() and getActiveTrackColor() methods instead.");
|
|
}
|
|
|
|
public void setTrackTintList(ColorStateList colorStateList) {
|
|
setTrackInactiveTintList(colorStateList);
|
|
setTrackActiveTintList(colorStateList);
|
|
}
|
|
|
|
public void setTrackActiveTintList(ColorStateList colorStateList) {
|
|
if (colorStateList.equals(this.trackColorActive)) {
|
|
return;
|
|
}
|
|
this.trackColorActive = colorStateList;
|
|
this.activeTrackPaint.setColor(getColorForState(colorStateList));
|
|
invalidate();
|
|
}
|
|
|
|
public void setTrackInactiveTintList(ColorStateList colorStateList) {
|
|
if (colorStateList.equals(this.trackColorInactive)) {
|
|
return;
|
|
}
|
|
this.trackColorInactive = colorStateList;
|
|
this.inactiveTrackPaint.setColor(getColorForState(colorStateList));
|
|
invalidate();
|
|
}
|
|
|
|
@Override // android.view.View
|
|
protected void onVisibilityChanged(View view, int i) {
|
|
ViewOverlayImpl contentViewOverlay;
|
|
super.onVisibilityChanged(view, i);
|
|
if (i == 0 || (contentViewOverlay = ViewUtils.getContentViewOverlay(this)) == null) {
|
|
return;
|
|
}
|
|
Iterator<TooltipDrawable> it = this.labels.iterator();
|
|
while (it.hasNext()) {
|
|
contentViewOverlay.remove(it.next());
|
|
}
|
|
}
|
|
|
|
@Override // android.view.View
|
|
public void setEnabled(boolean z) {
|
|
super.setEnabled(z);
|
|
setLayerType(z ? 0 : 2, null);
|
|
}
|
|
|
|
@Override // android.view.View
|
|
protected void onAttachedToWindow() {
|
|
super.onAttachedToWindow();
|
|
Iterator<TooltipDrawable> it = this.labels.iterator();
|
|
while (it.hasNext()) {
|
|
attachLabelToContentView(it.next());
|
|
}
|
|
}
|
|
|
|
private void attachLabelToContentView(TooltipDrawable tooltipDrawable) {
|
|
tooltipDrawable.setRelativeToView(ViewUtils.getContentView(this));
|
|
}
|
|
|
|
@Override // android.view.View
|
|
protected void onDetachedFromWindow() {
|
|
BaseSlider<S, L, T>.AccessibilityEventSender accessibilityEventSender = this.accessibilityEventSender;
|
|
if (accessibilityEventSender != null) {
|
|
removeCallbacks(accessibilityEventSender);
|
|
}
|
|
this.labelsAreAnimatedIn = false;
|
|
Iterator<TooltipDrawable> it = this.labels.iterator();
|
|
while (it.hasNext()) {
|
|
detachLabelFromContentView(it.next());
|
|
}
|
|
super.onDetachedFromWindow();
|
|
}
|
|
|
|
private void detachLabelFromContentView(TooltipDrawable tooltipDrawable) {
|
|
ViewOverlayImpl contentViewOverlay = ViewUtils.getContentViewOverlay(this);
|
|
if (contentViewOverlay != null) {
|
|
contentViewOverlay.remove(tooltipDrawable);
|
|
tooltipDrawable.detachView(ViewUtils.getContentView(this));
|
|
}
|
|
}
|
|
|
|
@Override // android.view.View
|
|
protected void onMeasure(int i, int i2) {
|
|
super.onMeasure(i, View.MeasureSpec.makeMeasureSpec(this.widgetHeight + ((this.labelBehavior == 1 || shouldAlwaysShowLabel()) ? this.labels.get(0).getIntrinsicHeight() : 0), 1073741824));
|
|
}
|
|
|
|
@Override // android.view.View
|
|
protected void onSizeChanged(int i, int i2, int i3, int i4) {
|
|
updateTrackWidth(i);
|
|
updateHaloHotspot();
|
|
}
|
|
|
|
private void maybeCalculateTicksCoordinates() {
|
|
if (this.stepSize <= 0.0f) {
|
|
return;
|
|
}
|
|
validateConfigurationIfDirty();
|
|
int min = Math.min((int) (((this.valueTo - this.valueFrom) / this.stepSize) + 1.0f), (this.trackWidth / (this.trackHeight * 2)) + 1);
|
|
float[] fArr = this.ticksCoordinates;
|
|
if (fArr == null || fArr.length != min * 2) {
|
|
this.ticksCoordinates = new float[min * 2];
|
|
}
|
|
float f = this.trackWidth / (min - 1);
|
|
for (int i = 0; i < min * 2; i += 2) {
|
|
float[] fArr2 = this.ticksCoordinates;
|
|
fArr2[i] = this.trackSidePadding + ((i / 2.0f) * f);
|
|
fArr2[i + 1] = calculateTrackCenter();
|
|
}
|
|
}
|
|
|
|
private void updateTrackWidth(int i) {
|
|
this.trackWidth = Math.max(i - (this.trackSidePadding * 2), 0);
|
|
maybeCalculateTicksCoordinates();
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public void updateHaloHotspot() {
|
|
if (shouldDrawCompatHalo() || getMeasuredWidth() <= 0) {
|
|
return;
|
|
}
|
|
Drawable background = getBackground();
|
|
if (background instanceof RippleDrawable) {
|
|
int normalizeValue = (int) ((normalizeValue(this.values.get(this.focusedThumbIdx).floatValue()) * this.trackWidth) + this.trackSidePadding);
|
|
int calculateTrackCenter = calculateTrackCenter();
|
|
int i = this.haloRadius;
|
|
DrawableCompat.setHotspotBounds(background, normalizeValue - i, calculateTrackCenter - i, normalizeValue + i, calculateTrackCenter + i);
|
|
}
|
|
}
|
|
|
|
private int calculateTrackCenter() {
|
|
return (this.widgetHeight / 2) + ((this.labelBehavior == 1 || shouldAlwaysShowLabel()) ? this.labels.get(0).getIntrinsicHeight() : 0);
|
|
}
|
|
|
|
@Override // android.view.View
|
|
protected void onDraw(Canvas canvas) {
|
|
if (this.dirtyConfig) {
|
|
validateConfigurationIfDirty();
|
|
maybeCalculateTicksCoordinates();
|
|
}
|
|
super.onDraw(canvas);
|
|
int calculateTrackCenter = calculateTrackCenter();
|
|
drawInactiveTrack(canvas, this.trackWidth, calculateTrackCenter);
|
|
if (((Float) Collections.max(getValues())).floatValue() > this.valueFrom) {
|
|
drawActiveTrack(canvas, this.trackWidth, calculateTrackCenter);
|
|
}
|
|
maybeDrawTicks(canvas);
|
|
if ((this.thumbIsPressed || isFocused()) && isEnabled()) {
|
|
maybeDrawCompatHalo(canvas, this.trackWidth, calculateTrackCenter);
|
|
}
|
|
if ((this.activeThumbIdx != -1 || shouldAlwaysShowLabel()) && isEnabled()) {
|
|
ensureLabelsAdded();
|
|
} else {
|
|
ensureLabelsRemoved();
|
|
}
|
|
drawThumbs(canvas, this.trackWidth, calculateTrackCenter);
|
|
}
|
|
|
|
private float[] getActiveRange() {
|
|
float floatValue = ((Float) Collections.max(getValues())).floatValue();
|
|
float floatValue2 = ((Float) Collections.min(getValues())).floatValue();
|
|
if (this.values.size() == 1) {
|
|
floatValue2 = this.valueFrom;
|
|
}
|
|
float normalizeValue = normalizeValue(floatValue2);
|
|
float normalizeValue2 = normalizeValue(floatValue);
|
|
return isRtl() ? new float[]{normalizeValue2, normalizeValue} : new float[]{normalizeValue, normalizeValue2};
|
|
}
|
|
|
|
private void drawInactiveTrack(Canvas canvas, int i, int i2) {
|
|
float[] activeRange = getActiveRange();
|
|
float f = i;
|
|
float f2 = this.trackSidePadding + (activeRange[1] * f);
|
|
if (f2 < r1 + i) {
|
|
float f3 = i2;
|
|
canvas.drawLine(f2, f3, r1 + i, f3, this.inactiveTrackPaint);
|
|
}
|
|
int i3 = this.trackSidePadding;
|
|
float f4 = i3 + (activeRange[0] * f);
|
|
if (f4 > i3) {
|
|
float f5 = i2;
|
|
canvas.drawLine(i3, f5, f4, f5, this.inactiveTrackPaint);
|
|
}
|
|
}
|
|
|
|
private float normalizeValue(float f) {
|
|
float f2 = this.valueFrom;
|
|
float f3 = (f - f2) / (this.valueTo - f2);
|
|
return isRtl() ? 1.0f - f3 : f3;
|
|
}
|
|
|
|
private void drawActiveTrack(Canvas canvas, int i, int i2) {
|
|
float[] activeRange = getActiveRange();
|
|
int i3 = this.trackSidePadding;
|
|
float f = i;
|
|
float f2 = i2;
|
|
canvas.drawLine(i3 + (activeRange[0] * f), f2, i3 + (activeRange[1] * f), f2, this.activeTrackPaint);
|
|
}
|
|
|
|
private void maybeDrawTicks(Canvas canvas) {
|
|
if (!this.tickVisible || this.stepSize <= 0.0f) {
|
|
return;
|
|
}
|
|
float[] activeRange = getActiveRange();
|
|
int pivotIndex = pivotIndex(this.ticksCoordinates, activeRange[0]);
|
|
int pivotIndex2 = pivotIndex(this.ticksCoordinates, activeRange[1]);
|
|
int i = pivotIndex * 2;
|
|
canvas.drawPoints(this.ticksCoordinates, 0, i, this.inactiveTicksPaint);
|
|
int i2 = pivotIndex2 * 2;
|
|
canvas.drawPoints(this.ticksCoordinates, i, i2 - i, this.activeTicksPaint);
|
|
float[] fArr = this.ticksCoordinates;
|
|
canvas.drawPoints(fArr, i2, fArr.length - i2, this.inactiveTicksPaint);
|
|
}
|
|
|
|
private void drawThumbs(Canvas canvas, int i, int i2) {
|
|
for (int i3 = 0; i3 < this.values.size(); i3++) {
|
|
float floatValue = this.values.get(i3).floatValue();
|
|
Drawable drawable = this.customThumbDrawable;
|
|
if (drawable != null) {
|
|
drawThumbDrawable(canvas, i, i2, floatValue, drawable);
|
|
} else if (i3 < this.customThumbDrawablesForValues.size()) {
|
|
drawThumbDrawable(canvas, i, i2, floatValue, this.customThumbDrawablesForValues.get(i3));
|
|
} else {
|
|
if (!isEnabled()) {
|
|
canvas.drawCircle(this.trackSidePadding + (normalizeValue(floatValue) * i), i2, this.thumbRadius, this.thumbPaint);
|
|
}
|
|
drawThumbDrawable(canvas, i, i2, floatValue, this.defaultThumbDrawable);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void drawThumbDrawable(Canvas canvas, int i, int i2, float f, Drawable drawable) {
|
|
canvas.save();
|
|
canvas.translate((this.trackSidePadding + ((int) (normalizeValue(f) * i))) - (drawable.getBounds().width() / 2.0f), i2 - (drawable.getBounds().height() / 2.0f));
|
|
drawable.draw(canvas);
|
|
canvas.restore();
|
|
}
|
|
|
|
private void maybeDrawCompatHalo(Canvas canvas, int i, int i2) {
|
|
if (shouldDrawCompatHalo()) {
|
|
canvas.drawCircle((int) (this.trackSidePadding + (normalizeValue(this.values.get(this.focusedThumbIdx).floatValue()) * i)), i2, this.haloRadius, this.haloPaint);
|
|
}
|
|
}
|
|
|
|
private boolean shouldDrawCompatHalo() {
|
|
return this.forceDrawCompatHalo || !(getBackground() instanceof RippleDrawable);
|
|
}
|
|
|
|
/* JADX WARN: Code restructure failed: missing block: B:11:0x0033, code lost:
|
|
|
|
if (r2 != 3) goto L47;
|
|
*/
|
|
@Override // android.view.View
|
|
/*
|
|
Code decompiled incorrectly, please refer to instructions dump.
|
|
To view partially-correct add '--show-bad-code' argument
|
|
*/
|
|
public boolean onTouchEvent(android.view.MotionEvent r6) {
|
|
/*
|
|
Method dump skipped, instructions count: 248
|
|
To view this dump add '--comments-level debug' option
|
|
*/
|
|
throw new UnsupportedOperationException("Method not decompiled: com.google.android.material.slider.BaseSlider.onTouchEvent(android.view.MotionEvent):boolean");
|
|
}
|
|
|
|
private static int pivotIndex(float[] fArr, float f) {
|
|
return Math.round(f * ((fArr.length / 2) - 1));
|
|
}
|
|
|
|
private double snapPosition(float f) {
|
|
float f2 = this.stepSize;
|
|
if (f2 <= 0.0f) {
|
|
return f;
|
|
}
|
|
return Math.round(f * r2) / ((int) ((this.valueTo - this.valueFrom) / f2));
|
|
}
|
|
|
|
protected boolean pickActiveThumb() {
|
|
if (this.activeThumbIdx != -1) {
|
|
return true;
|
|
}
|
|
float valueOfTouchPositionAbsolute = getValueOfTouchPositionAbsolute();
|
|
float valueToX = valueToX(valueOfTouchPositionAbsolute);
|
|
this.activeThumbIdx = 0;
|
|
float abs = Math.abs(this.values.get(0).floatValue() - valueOfTouchPositionAbsolute);
|
|
for (int i = 1; i < this.values.size(); i++) {
|
|
float abs2 = Math.abs(this.values.get(i).floatValue() - valueOfTouchPositionAbsolute);
|
|
float valueToX2 = valueToX(this.values.get(i).floatValue());
|
|
if (Float.compare(abs2, abs) > 1) {
|
|
break;
|
|
}
|
|
boolean z = !isRtl() ? valueToX2 - valueToX >= 0.0f : valueToX2 - valueToX <= 0.0f;
|
|
if (Float.compare(abs2, abs) < 0) {
|
|
this.activeThumbIdx = i;
|
|
} else {
|
|
if (Float.compare(abs2, abs) != 0) {
|
|
continue;
|
|
} else {
|
|
if (Math.abs(valueToX2 - valueToX) < this.scaledTouchSlop) {
|
|
this.activeThumbIdx = -1;
|
|
return false;
|
|
}
|
|
if (z) {
|
|
this.activeThumbIdx = i;
|
|
}
|
|
}
|
|
}
|
|
abs = abs2;
|
|
}
|
|
return this.activeThumbIdx != -1;
|
|
}
|
|
|
|
private float getValueOfTouchPositionAbsolute() {
|
|
float f = this.touchPosition;
|
|
if (isRtl()) {
|
|
f = 1.0f - f;
|
|
}
|
|
float f2 = this.valueTo;
|
|
float f3 = this.valueFrom;
|
|
return (f * (f2 - f3)) + f3;
|
|
}
|
|
|
|
private boolean snapTouchPosition() {
|
|
return snapActiveThumbToValue(getValueOfTouchPosition());
|
|
}
|
|
|
|
private boolean snapActiveThumbToValue(float f) {
|
|
return snapThumbToValue(this.activeThumbIdx, f);
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public boolean snapThumbToValue(int i, float f) {
|
|
this.focusedThumbIdx = i;
|
|
if (Math.abs(f - this.values.get(i).floatValue()) < THRESHOLD) {
|
|
return false;
|
|
}
|
|
this.values.set(i, Float.valueOf(getClampedValue(i, f)));
|
|
dispatchOnChangedFromUser(i);
|
|
return true;
|
|
}
|
|
|
|
private float getClampedValue(int i, float f) {
|
|
float minSeparation = getMinSeparation();
|
|
if (this.separationUnit == 0) {
|
|
minSeparation = dimenToValue(minSeparation);
|
|
}
|
|
if (isRtl()) {
|
|
minSeparation = -minSeparation;
|
|
}
|
|
int i2 = i + 1;
|
|
int i3 = i - 1;
|
|
return MathUtils.clamp(f, i3 < 0 ? this.valueFrom : this.values.get(i3).floatValue() + minSeparation, i2 >= this.values.size() ? this.valueTo : this.values.get(i2).floatValue() - minSeparation);
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
public void setSeparationUnit(int i) {
|
|
this.separationUnit = i;
|
|
this.dirtyConfig = true;
|
|
postInvalidate();
|
|
}
|
|
|
|
private float getValueOfTouchPosition() {
|
|
double snapPosition = snapPosition(this.touchPosition);
|
|
if (isRtl()) {
|
|
snapPosition = 1.0d - snapPosition;
|
|
}
|
|
float f = this.valueTo;
|
|
return (float) ((snapPosition * (f - r4)) + this.valueFrom);
|
|
}
|
|
|
|
private float valueToX(float f) {
|
|
return (normalizeValue(f) * this.trackWidth) + this.trackSidePadding;
|
|
}
|
|
|
|
private static float getAnimatorCurrentValueOrDefault(ValueAnimator valueAnimator, float f) {
|
|
if (valueAnimator == null || !valueAnimator.isRunning()) {
|
|
return f;
|
|
}
|
|
float floatValue = ((Float) valueAnimator.getAnimatedValue()).floatValue();
|
|
valueAnimator.cancel();
|
|
return floatValue;
|
|
}
|
|
|
|
private ValueAnimator createLabelAnimator(boolean z) {
|
|
int resolveThemeDuration;
|
|
TimeInterpolator resolveThemeInterpolator;
|
|
ValueAnimator ofFloat = ValueAnimator.ofFloat(getAnimatorCurrentValueOrDefault(z ? this.labelsOutAnimator : this.labelsInAnimator, z ? 0.0f : 1.0f), z ? 1.0f : 0.0f);
|
|
if (z) {
|
|
resolveThemeDuration = MotionUtils.resolveThemeDuration(getContext(), LABEL_ANIMATION_ENTER_DURATION_ATTR, DEFAULT_LABEL_ANIMATION_ENTER_DURATION);
|
|
resolveThemeInterpolator = MotionUtils.resolveThemeInterpolator(getContext(), LABEL_ANIMATION_ENTER_EASING_ATTR, AnimationUtils.DECELERATE_INTERPOLATOR);
|
|
} else {
|
|
resolveThemeDuration = MotionUtils.resolveThemeDuration(getContext(), LABEL_ANIMATION_EXIT_DURATION_ATTR, DEFAULT_LABEL_ANIMATION_EXIT_DURATION);
|
|
resolveThemeInterpolator = MotionUtils.resolveThemeInterpolator(getContext(), LABEL_ANIMATION_EXIT_EASING_ATTR, AnimationUtils.FAST_OUT_LINEAR_IN_INTERPOLATOR);
|
|
}
|
|
ofFloat.setDuration(resolveThemeDuration);
|
|
ofFloat.setInterpolator(resolveThemeInterpolator);
|
|
ofFloat.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { // from class: com.google.android.material.slider.BaseSlider.1
|
|
@Override // android.animation.ValueAnimator.AnimatorUpdateListener
|
|
public void onAnimationUpdate(ValueAnimator valueAnimator) {
|
|
float floatValue = ((Float) valueAnimator.getAnimatedValue()).floatValue();
|
|
Iterator it = BaseSlider.this.labels.iterator();
|
|
while (it.hasNext()) {
|
|
((TooltipDrawable) it.next()).setRevealFraction(floatValue);
|
|
}
|
|
ViewCompat.postInvalidateOnAnimation(BaseSlider.this);
|
|
}
|
|
});
|
|
return ofFloat;
|
|
}
|
|
|
|
private void ensureLabelsRemoved() {
|
|
if (this.labelsAreAnimatedIn) {
|
|
this.labelsAreAnimatedIn = false;
|
|
ValueAnimator createLabelAnimator = createLabelAnimator(false);
|
|
this.labelsOutAnimator = createLabelAnimator;
|
|
this.labelsInAnimator = null;
|
|
createLabelAnimator.addListener(new AnimatorListenerAdapter() { // from class: com.google.android.material.slider.BaseSlider.2
|
|
@Override // android.animation.AnimatorListenerAdapter, android.animation.Animator.AnimatorListener
|
|
public void onAnimationEnd(Animator animator) {
|
|
super.onAnimationEnd(animator);
|
|
ViewOverlayImpl contentViewOverlay = ViewUtils.getContentViewOverlay(BaseSlider.this);
|
|
Iterator it = BaseSlider.this.labels.iterator();
|
|
while (it.hasNext()) {
|
|
contentViewOverlay.remove((TooltipDrawable) it.next());
|
|
}
|
|
}
|
|
});
|
|
this.labelsOutAnimator.start();
|
|
}
|
|
}
|
|
|
|
private void ensureLabelsAdded() {
|
|
if (this.labelBehavior == 2) {
|
|
return;
|
|
}
|
|
if (!this.labelsAreAnimatedIn) {
|
|
this.labelsAreAnimatedIn = true;
|
|
ValueAnimator createLabelAnimator = createLabelAnimator(true);
|
|
this.labelsInAnimator = createLabelAnimator;
|
|
this.labelsOutAnimator = null;
|
|
createLabelAnimator.start();
|
|
}
|
|
Iterator<TooltipDrawable> it = this.labels.iterator();
|
|
for (int i = 0; i < this.values.size() && it.hasNext(); i++) {
|
|
if (i != this.focusedThumbIdx) {
|
|
setValueForLabel(it.next(), this.values.get(i).floatValue());
|
|
}
|
|
}
|
|
if (!it.hasNext()) {
|
|
throw new IllegalStateException(String.format("Not enough labels(%d) to display all the values(%d)", Integer.valueOf(this.labels.size()), Integer.valueOf(this.values.size())));
|
|
}
|
|
setValueForLabel(it.next(), this.values.get(this.focusedThumbIdx).floatValue());
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public String formatValue(float f) {
|
|
if (hasLabelFormatter()) {
|
|
return this.formatter.getFormattedValue(f);
|
|
}
|
|
return String.format(((float) ((int) f)) == f ? "%.0f" : "%.2f", Float.valueOf(f));
|
|
}
|
|
|
|
private void setValueForLabel(TooltipDrawable tooltipDrawable, float f) {
|
|
tooltipDrawable.setText(formatValue(f));
|
|
int normalizeValue = (this.trackSidePadding + ((int) (normalizeValue(f) * this.trackWidth))) - (tooltipDrawable.getIntrinsicWidth() / 2);
|
|
int calculateTrackCenter = calculateTrackCenter() - (this.labelPadding + this.thumbRadius);
|
|
tooltipDrawable.setBounds(normalizeValue, calculateTrackCenter - tooltipDrawable.getIntrinsicHeight(), tooltipDrawable.getIntrinsicWidth() + normalizeValue, calculateTrackCenter);
|
|
Rect rect = new Rect(tooltipDrawable.getBounds());
|
|
DescendantOffsetUtils.offsetDescendantRect(ViewUtils.getContentView(this), this, rect);
|
|
tooltipDrawable.setBounds(rect);
|
|
ViewUtils.getContentViewOverlay(this).add(tooltipDrawable);
|
|
}
|
|
|
|
private void invalidateTrack() {
|
|
this.inactiveTrackPaint.setStrokeWidth(this.trackHeight);
|
|
this.activeTrackPaint.setStrokeWidth(this.trackHeight);
|
|
}
|
|
|
|
private boolean isInVerticalScrollingContainer() {
|
|
for (ViewParent parent = getParent(); parent instanceof ViewGroup; parent = parent.getParent()) {
|
|
ViewGroup viewGroup = (ViewGroup) parent;
|
|
if ((viewGroup.canScrollVertically(1) || viewGroup.canScrollVertically(-1)) && viewGroup.shouldDelayChildPressedState()) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private static boolean isMouseEvent(MotionEvent motionEvent) {
|
|
return motionEvent.getToolType(0) == 3;
|
|
}
|
|
|
|
private boolean isPotentialVerticalScroll(MotionEvent motionEvent) {
|
|
return !isMouseEvent(motionEvent) && isInVerticalScrollingContainer();
|
|
}
|
|
|
|
private void dispatchOnChangedProgrammatically() {
|
|
for (L l : this.changeListeners) {
|
|
Iterator<Float> it = this.values.iterator();
|
|
while (it.hasNext()) {
|
|
l.onValueChange(this, it.next().floatValue(), false);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void dispatchOnChangedFromUser(int i) {
|
|
Iterator<L> it = this.changeListeners.iterator();
|
|
while (it.hasNext()) {
|
|
it.next().onValueChange(this, this.values.get(i).floatValue(), true);
|
|
}
|
|
AccessibilityManager accessibilityManager = this.accessibilityManager;
|
|
if (accessibilityManager == null || !accessibilityManager.isEnabled()) {
|
|
return;
|
|
}
|
|
scheduleAccessibilityEventSender(i);
|
|
}
|
|
|
|
private void onStartTrackingTouch() {
|
|
Iterator<T> it = this.touchListeners.iterator();
|
|
while (it.hasNext()) {
|
|
it.next().onStartTrackingTouch(this);
|
|
}
|
|
}
|
|
|
|
private void onStopTrackingTouch() {
|
|
Iterator<T> it = this.touchListeners.iterator();
|
|
while (it.hasNext()) {
|
|
it.next().onStopTrackingTouch(this);
|
|
}
|
|
}
|
|
|
|
@Override // android.view.View
|
|
protected void drawableStateChanged() {
|
|
super.drawableStateChanged();
|
|
this.inactiveTrackPaint.setColor(getColorForState(this.trackColorInactive));
|
|
this.activeTrackPaint.setColor(getColorForState(this.trackColorActive));
|
|
this.inactiveTicksPaint.setColor(getColorForState(this.tickColorInactive));
|
|
this.activeTicksPaint.setColor(getColorForState(this.tickColorActive));
|
|
for (TooltipDrawable tooltipDrawable : this.labels) {
|
|
if (tooltipDrawable.isStateful()) {
|
|
tooltipDrawable.setState(getDrawableState());
|
|
}
|
|
}
|
|
if (this.defaultThumbDrawable.isStateful()) {
|
|
this.defaultThumbDrawable.setState(getDrawableState());
|
|
}
|
|
this.haloPaint.setColor(getColorForState(this.haloColor));
|
|
this.haloPaint.setAlpha(63);
|
|
}
|
|
|
|
private int getColorForState(ColorStateList colorStateList) {
|
|
return colorStateList.getColorForState(getDrawableState(), colorStateList.getDefaultColor());
|
|
}
|
|
|
|
@Override // android.view.View, android.view.KeyEvent.Callback
|
|
public boolean onKeyDown(int i, KeyEvent keyEvent) {
|
|
if (!isEnabled()) {
|
|
return super.onKeyDown(i, keyEvent);
|
|
}
|
|
if (this.values.size() == 1) {
|
|
this.activeThumbIdx = 0;
|
|
}
|
|
if (this.activeThumbIdx == -1) {
|
|
Boolean onKeyDownNoActiveThumb = onKeyDownNoActiveThumb(i, keyEvent);
|
|
return onKeyDownNoActiveThumb != null ? onKeyDownNoActiveThumb.booleanValue() : super.onKeyDown(i, keyEvent);
|
|
}
|
|
this.isLongPress |= keyEvent.isLongPress();
|
|
Float calculateIncrementForKey = calculateIncrementForKey(i);
|
|
if (calculateIncrementForKey != null) {
|
|
if (snapActiveThumbToValue(this.values.get(this.activeThumbIdx).floatValue() + calculateIncrementForKey.floatValue())) {
|
|
updateHaloHotspot();
|
|
postInvalidate();
|
|
}
|
|
return true;
|
|
}
|
|
if (i != 23) {
|
|
if (i == 61) {
|
|
if (keyEvent.hasNoModifiers()) {
|
|
return moveFocus(1);
|
|
}
|
|
if (keyEvent.isShiftPressed()) {
|
|
return moveFocus(-1);
|
|
}
|
|
return false;
|
|
}
|
|
if (i != 66) {
|
|
return super.onKeyDown(i, keyEvent);
|
|
}
|
|
}
|
|
this.activeThumbIdx = -1;
|
|
postInvalidate();
|
|
return true;
|
|
}
|
|
|
|
private Boolean onKeyDownNoActiveThumb(int i, KeyEvent keyEvent) {
|
|
if (i == 61) {
|
|
if (keyEvent.hasNoModifiers()) {
|
|
return Boolean.valueOf(moveFocus(1));
|
|
}
|
|
if (keyEvent.isShiftPressed()) {
|
|
return Boolean.valueOf(moveFocus(-1));
|
|
}
|
|
return false;
|
|
}
|
|
if (i != 66) {
|
|
if (i != 81) {
|
|
if (i == 69) {
|
|
moveFocus(-1);
|
|
return true;
|
|
}
|
|
if (i != 70) {
|
|
switch (i) {
|
|
case 21:
|
|
moveFocusInAbsoluteDirection(-1);
|
|
return true;
|
|
case 22:
|
|
moveFocusInAbsoluteDirection(1);
|
|
return true;
|
|
case 23:
|
|
break;
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
moveFocus(1);
|
|
return true;
|
|
}
|
|
this.activeThumbIdx = this.focusedThumbIdx;
|
|
postInvalidate();
|
|
return true;
|
|
}
|
|
|
|
@Override // android.view.View, android.view.KeyEvent.Callback
|
|
public boolean onKeyUp(int i, KeyEvent keyEvent) {
|
|
this.isLongPress = false;
|
|
return super.onKeyUp(i, keyEvent);
|
|
}
|
|
|
|
final boolean isRtl() {
|
|
return ViewCompat.getLayoutDirection(this) == 1;
|
|
}
|
|
|
|
private boolean moveFocus(int i) {
|
|
int i2 = this.focusedThumbIdx;
|
|
int clamp = (int) MathUtils.clamp(i2 + i, 0L, this.values.size() - 1);
|
|
this.focusedThumbIdx = clamp;
|
|
if (clamp == i2) {
|
|
return false;
|
|
}
|
|
if (this.activeThumbIdx != -1) {
|
|
this.activeThumbIdx = clamp;
|
|
}
|
|
updateHaloHotspot();
|
|
postInvalidate();
|
|
return true;
|
|
}
|
|
|
|
private boolean moveFocusInAbsoluteDirection(int i) {
|
|
if (isRtl()) {
|
|
i = i == Integer.MIN_VALUE ? Integer.MAX_VALUE : -i;
|
|
}
|
|
return moveFocus(i);
|
|
}
|
|
|
|
private Float calculateIncrementForKey(int i) {
|
|
float calculateStepIncrement = this.isLongPress ? calculateStepIncrement(20) : calculateStepIncrement();
|
|
if (i == 21) {
|
|
if (!isRtl()) {
|
|
calculateStepIncrement = -calculateStepIncrement;
|
|
}
|
|
return Float.valueOf(calculateStepIncrement);
|
|
}
|
|
if (i == 22) {
|
|
if (isRtl()) {
|
|
calculateStepIncrement = -calculateStepIncrement;
|
|
}
|
|
return Float.valueOf(calculateStepIncrement);
|
|
}
|
|
if (i == 69) {
|
|
return Float.valueOf(-calculateStepIncrement);
|
|
}
|
|
if (i == 70 || i == 81) {
|
|
return Float.valueOf(calculateStepIncrement);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public float calculateStepIncrement(int i) {
|
|
float calculateStepIncrement = calculateStepIncrement();
|
|
return (this.valueTo - this.valueFrom) / calculateStepIncrement <= i ? calculateStepIncrement : Math.round(r1 / r2) * calculateStepIncrement;
|
|
}
|
|
|
|
@Override // android.view.View
|
|
protected void onFocusChanged(boolean z, int i, Rect rect) {
|
|
super.onFocusChanged(z, i, rect);
|
|
if (!z) {
|
|
this.activeThumbIdx = -1;
|
|
this.accessibilityHelper.clearKeyboardFocusForVirtualView(this.focusedThumbIdx);
|
|
} else {
|
|
focusThumbOnFocusGained(i);
|
|
this.accessibilityHelper.requestKeyboardFocusForVirtualView(this.focusedThumbIdx);
|
|
}
|
|
}
|
|
|
|
private void focusThumbOnFocusGained(int i) {
|
|
if (i == 1) {
|
|
moveFocus(Integer.MAX_VALUE);
|
|
return;
|
|
}
|
|
if (i == 2) {
|
|
moveFocus(Integer.MIN_VALUE);
|
|
} else if (i == 17) {
|
|
moveFocusInAbsoluteDirection(Integer.MAX_VALUE);
|
|
} else {
|
|
if (i != 66) {
|
|
return;
|
|
}
|
|
moveFocusInAbsoluteDirection(Integer.MIN_VALUE);
|
|
}
|
|
}
|
|
|
|
final int getAccessibilityFocusedVirtualViewId() {
|
|
return this.accessibilityHelper.getAccessibilityFocusedVirtualViewId();
|
|
}
|
|
|
|
@Override // android.view.View
|
|
public CharSequence getAccessibilityClassName() {
|
|
return SeekBar.class.getName();
|
|
}
|
|
|
|
@Override // android.view.View
|
|
public boolean dispatchHoverEvent(MotionEvent motionEvent) {
|
|
return this.accessibilityHelper.dispatchHoverEvent(motionEvent) || super.dispatchHoverEvent(motionEvent);
|
|
}
|
|
|
|
@Override // android.view.View
|
|
public boolean dispatchKeyEvent(KeyEvent keyEvent) {
|
|
return super.dispatchKeyEvent(keyEvent);
|
|
}
|
|
|
|
private void scheduleAccessibilityEventSender(int i) {
|
|
BaseSlider<S, L, T>.AccessibilityEventSender accessibilityEventSender = this.accessibilityEventSender;
|
|
if (accessibilityEventSender == null) {
|
|
this.accessibilityEventSender = new AccessibilityEventSender();
|
|
} else {
|
|
removeCallbacks(accessibilityEventSender);
|
|
}
|
|
this.accessibilityEventSender.setVirtualViewId(i);
|
|
postDelayed(this.accessibilityEventSender, 200L);
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
/* loaded from: classes2.dex */
|
|
public class AccessibilityEventSender implements Runnable {
|
|
int virtualViewId;
|
|
|
|
void setVirtualViewId(int i) {
|
|
this.virtualViewId = i;
|
|
}
|
|
|
|
private AccessibilityEventSender() {
|
|
this.virtualViewId = -1;
|
|
}
|
|
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
BaseSlider.this.accessibilityHelper.sendEventForVirtualView(this.virtualViewId, 4);
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
@Override // android.view.View
|
|
public Parcelable onSaveInstanceState() {
|
|
SliderState sliderState = new SliderState(super.onSaveInstanceState());
|
|
sliderState.valueFrom = this.valueFrom;
|
|
sliderState.valueTo = this.valueTo;
|
|
sliderState.values = new ArrayList<>(this.values);
|
|
sliderState.stepSize = this.stepSize;
|
|
sliderState.hasFocus = hasFocus();
|
|
return sliderState;
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
@Override // android.view.View
|
|
public void onRestoreInstanceState(Parcelable parcelable) {
|
|
SliderState sliderState = (SliderState) parcelable;
|
|
super.onRestoreInstanceState(sliderState.getSuperState());
|
|
this.valueFrom = sliderState.valueFrom;
|
|
this.valueTo = sliderState.valueTo;
|
|
setValuesInternal(sliderState.values);
|
|
this.stepSize = sliderState.stepSize;
|
|
if (sliderState.hasFocus) {
|
|
requestFocus();
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
/* loaded from: classes2.dex */
|
|
public static class SliderState extends View.BaseSavedState {
|
|
public static final Parcelable.Creator<SliderState> CREATOR = new Parcelable.Creator<SliderState>() { // from class: com.google.android.material.slider.BaseSlider.SliderState.1
|
|
/* JADX WARN: Can't rename method to resolve collision */
|
|
@Override // android.os.Parcelable.Creator
|
|
public SliderState createFromParcel(Parcel parcel) {
|
|
return new SliderState(parcel);
|
|
}
|
|
|
|
/* JADX WARN: Can't rename method to resolve collision */
|
|
@Override // android.os.Parcelable.Creator
|
|
public SliderState[] newArray(int i) {
|
|
return new SliderState[i];
|
|
}
|
|
};
|
|
boolean hasFocus;
|
|
float stepSize;
|
|
float valueFrom;
|
|
float valueTo;
|
|
ArrayList<Float> values;
|
|
|
|
SliderState(Parcelable parcelable) {
|
|
super(parcelable);
|
|
}
|
|
|
|
private SliderState(Parcel parcel) {
|
|
super(parcel);
|
|
this.valueFrom = parcel.readFloat();
|
|
this.valueTo = parcel.readFloat();
|
|
ArrayList<Float> arrayList = new ArrayList<>();
|
|
this.values = arrayList;
|
|
parcel.readList(arrayList, Float.class.getClassLoader());
|
|
this.stepSize = parcel.readFloat();
|
|
this.hasFocus = parcel.createBooleanArray()[0];
|
|
}
|
|
|
|
@Override // android.view.View.BaseSavedState, android.view.AbsSavedState, android.os.Parcelable
|
|
public void writeToParcel(Parcel parcel, int i) {
|
|
super.writeToParcel(parcel, i);
|
|
parcel.writeFloat(this.valueFrom);
|
|
parcel.writeFloat(this.valueTo);
|
|
parcel.writeList(this.values);
|
|
parcel.writeFloat(this.stepSize);
|
|
parcel.writeBooleanArray(new boolean[]{this.hasFocus});
|
|
}
|
|
}
|
|
|
|
void updateBoundsForVirtualViewId(int i, Rect rect) {
|
|
int normalizeValue = this.trackSidePadding + ((int) (normalizeValue(getValues().get(i).floatValue()) * this.trackWidth));
|
|
int calculateTrackCenter = calculateTrackCenter();
|
|
int i2 = this.thumbRadius;
|
|
int i3 = this.minTouchTargetSize;
|
|
if (i2 <= i3) {
|
|
i2 = i3;
|
|
}
|
|
int i4 = i2 / 2;
|
|
rect.set(normalizeValue - i4, calculateTrackCenter - i4, normalizeValue + i4, calculateTrackCenter + i4);
|
|
}
|
|
|
|
/* loaded from: classes2.dex */
|
|
private static class AccessibilityHelper extends ExploreByTouchHelper {
|
|
private final BaseSlider<?, ?, ?> slider;
|
|
final Rect virtualViewBounds;
|
|
|
|
AccessibilityHelper(BaseSlider<?, ?, ?> baseSlider) {
|
|
super(baseSlider);
|
|
this.virtualViewBounds = new Rect();
|
|
this.slider = baseSlider;
|
|
}
|
|
|
|
@Override // androidx.customview.widget.ExploreByTouchHelper
|
|
protected int getVirtualViewAt(float f, float f2) {
|
|
for (int i = 0; i < this.slider.getValues().size(); i++) {
|
|
this.slider.updateBoundsForVirtualViewId(i, this.virtualViewBounds);
|
|
if (this.virtualViewBounds.contains((int) f, (int) f2)) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
@Override // androidx.customview.widget.ExploreByTouchHelper
|
|
protected void getVisibleVirtualViews(List<Integer> list) {
|
|
for (int i = 0; i < this.slider.getValues().size(); i++) {
|
|
list.add(Integer.valueOf(i));
|
|
}
|
|
}
|
|
|
|
@Override // androidx.customview.widget.ExploreByTouchHelper
|
|
protected void onPopulateNodeForVirtualView(int i, AccessibilityNodeInfoCompat accessibilityNodeInfoCompat) {
|
|
accessibilityNodeInfoCompat.addAction(AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SET_PROGRESS);
|
|
List<Float> values = this.slider.getValues();
|
|
float floatValue = values.get(i).floatValue();
|
|
float valueFrom = this.slider.getValueFrom();
|
|
float valueTo = this.slider.getValueTo();
|
|
if (this.slider.isEnabled()) {
|
|
if (floatValue > valueFrom) {
|
|
accessibilityNodeInfoCompat.addAction(8192);
|
|
}
|
|
if (floatValue < valueTo) {
|
|
accessibilityNodeInfoCompat.addAction(4096);
|
|
}
|
|
}
|
|
accessibilityNodeInfoCompat.setRangeInfo(AccessibilityNodeInfoCompat.RangeInfoCompat.obtain(1, valueFrom, valueTo, floatValue));
|
|
accessibilityNodeInfoCompat.setClassName(SeekBar.class.getName());
|
|
StringBuilder sb = new StringBuilder();
|
|
if (this.slider.getContentDescription() != null) {
|
|
sb.append(this.slider.getContentDescription()).append(",");
|
|
}
|
|
String formatValue = this.slider.formatValue(floatValue);
|
|
String string = this.slider.getContext().getString(R.string.material_slider_value);
|
|
if (values.size() > 1) {
|
|
string = startOrEndDescription(i);
|
|
}
|
|
sb.append(String.format(Locale.US, "%s, %s", string, formatValue));
|
|
accessibilityNodeInfoCompat.setContentDescription(sb.toString());
|
|
this.slider.updateBoundsForVirtualViewId(i, this.virtualViewBounds);
|
|
accessibilityNodeInfoCompat.setBoundsInParent(this.virtualViewBounds);
|
|
}
|
|
|
|
private String startOrEndDescription(int i) {
|
|
if (i == this.slider.getValues().size() - 1) {
|
|
return this.slider.getContext().getString(R.string.material_slider_range_end);
|
|
}
|
|
return i == 0 ? this.slider.getContext().getString(R.string.material_slider_range_start) : "";
|
|
}
|
|
|
|
@Override // androidx.customview.widget.ExploreByTouchHelper
|
|
protected boolean onPerformActionForVirtualView(int i, int i2, Bundle bundle) {
|
|
if (!this.slider.isEnabled()) {
|
|
return false;
|
|
}
|
|
if (i2 == 4096 || i2 == 8192) {
|
|
float calculateStepIncrement = this.slider.calculateStepIncrement(20);
|
|
if (i2 == 8192) {
|
|
calculateStepIncrement = -calculateStepIncrement;
|
|
}
|
|
if (this.slider.isRtl()) {
|
|
calculateStepIncrement = -calculateStepIncrement;
|
|
}
|
|
if (!this.slider.snapThumbToValue(i, MathUtils.clamp(this.slider.getValues().get(i).floatValue() + calculateStepIncrement, this.slider.getValueFrom(), this.slider.getValueTo()))) {
|
|
return false;
|
|
}
|
|
this.slider.updateHaloHotspot();
|
|
this.slider.postInvalidate();
|
|
invalidateVirtualView(i);
|
|
return true;
|
|
}
|
|
if (i2 == 16908349 && bundle != null && bundle.containsKey(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_PROGRESS_VALUE)) {
|
|
if (this.slider.snapThumbToValue(i, bundle.getFloat(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_PROGRESS_VALUE))) {
|
|
this.slider.updateHaloHotspot();
|
|
this.slider.postInvalidate();
|
|
invalidateVirtualView(i);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
}
|