From 2f1c5944b466362a96a0337cbbc86be876babd5a Mon Sep 17 00:00:00 2001 From: pubiqq Date: Tue, 26 Mar 2024 00:58:25 +0300 Subject: [PATCH] [Slider] Fix support for thumb separation options in BaseSlider --- .../android/material/slider/BaseSlider.java | 32 ++++++-- .../android/material/slider/RangeSlider.java | 73 +------------------ 2 files changed, 29 insertions(+), 76 deletions(-) diff --git a/lib/java/com/google/android/material/slider/BaseSlider.java b/lib/java/com/google/android/material/slider/BaseSlider.java index 9619ea0046d..795b07f76b9 100644 --- a/lib/java/com/google/android/material/slider/BaseSlider.java +++ b/lib/java/com/google/android/material/slider/BaseSlider.java @@ -344,6 +344,8 @@ abstract class BaseSlider< @NonNull private List customThumbDrawablesForValues = Collections.emptyList(); private float touchPosition; + + private float minSeparation = 0f; @SeparationUnit private int separationUnit = UNIT_PX; @NonNull @@ -628,7 +630,6 @@ private void validateValues() { } private void validateMinSeparation() { - final float minSeparation = getMinSeparation(); if (minSeparation < 0) { throw new IllegalStateException( String.format(EXCEPTION_ILLEGAL_MIN_SEPARATION, minSeparation)); @@ -2526,7 +2527,7 @@ private boolean snapThumbToValue(int idx, float value) { /** Thumbs cannot cross each other, clamp the value to a bound or the value next to it. */ private float getClampedValue(int idx, float value) { - float minSeparation = getMinSeparation(); + float minSeparation = this.minSeparation; minSeparation = separationUnit == UNIT_PX ? dimenToValue(minSeparation) : minSeparation; if (isRtl()) { minSeparation = -minSeparation; @@ -2544,16 +2545,22 @@ private float dimenToValue(float dimen) { return ((dimen - trackSidePadding) / trackWidth) * (valueFrom - valueTo) + valueFrom; } - protected void setSeparationUnit(int separationUnit) { + protected float getMinSeparation() { + return minSeparation; + } + + protected float getSeparationUnit() { + return separationUnit; + } + + protected void setMinSeparation(float minSeparation, @SeparationUnit int separationUnit) { + this.minSeparation = minSeparation; this.separationUnit = separationUnit; + dirtyConfig = true; postInvalidate(); } - protected float getMinSeparation() { - return 0; - } - private float getValueOfTouchPosition() { double position = snapPosition(touchPosition); @@ -3125,6 +3132,8 @@ protected Parcelable onSaveInstanceState() { sliderState.valueTo = valueTo; sliderState.values = new ArrayList<>(values); sliderState.stepSize = stepSize; + sliderState.minSeparation = minSeparation; + sliderState.separationUnit = separationUnit; sliderState.hasFocus = hasFocus(); return sliderState; } @@ -3138,6 +3147,9 @@ protected void onRestoreInstanceState(Parcelable state) { valueTo = sliderState.valueTo; setValuesInternal(sliderState.values); stepSize = sliderState.stepSize; + minSeparation = sliderState.minSeparation; + separationUnit = sliderState.separationUnit; + if (sliderState.hasFocus) { requestFocus(); } @@ -3149,6 +3161,8 @@ static class SliderState extends BaseSavedState { float valueTo; ArrayList values; float stepSize; + float minSeparation; + @SeparationUnit int separationUnit; boolean hasFocus; public static final Creator CREATOR = @@ -3178,6 +3192,8 @@ private SliderState(@NonNull Parcel source) { values = new ArrayList<>(); source.readList(values, Float.class.getClassLoader()); stepSize = source.readFloat(); + minSeparation = source.readFloat(); + separationUnit = source.readInt(); hasFocus = source.createBooleanArray()[0]; } @@ -3188,6 +3204,8 @@ public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeFloat(valueTo); dest.writeList(values); dest.writeFloat(stepSize); + dest.writeFloat(minSeparation); + dest.writeInt(separationUnit); boolean[] booleans = new boolean[1]; booleans[0] = hasFocus; dest.writeBooleanArray(booleans); diff --git a/lib/java/com/google/android/material/slider/RangeSlider.java b/lib/java/com/google/android/material/slider/RangeSlider.java index 1eca4c8271c..4253bfba10d 100644 --- a/lib/java/com/google/android/material/slider/RangeSlider.java +++ b/lib/java/com/google/android/material/slider/RangeSlider.java @@ -57,9 +57,6 @@ */ public class RangeSlider extends BaseSlider { - private float minSeparation; - private int separationUnit; - public RangeSlider(@NonNull Context context) { this(context, null); } @@ -79,7 +76,7 @@ public RangeSlider(@NonNull Context context, @Nullable AttributeSet attrs, int d setValues(convertToFloat(values)); } - minSeparation = a.getDimension(R.styleable.RangeSlider_minSeparation, 0); + setMinSeparation(a.getDimension(R.styleable.RangeSlider_minSeparation, 0)); a.recycle(); } @@ -178,7 +175,7 @@ private static List convertToFloat(TypedArray values) { */ @Override public float getMinSeparation() { - return minSeparation; + return super.getMinSeparation(); } /** @@ -190,9 +187,7 @@ public float getMinSeparation() { * {@link #setMinSeparationValue(float)} instead. */ public void setMinSeparation(@Dimension float minSeparation) { - this.minSeparation = minSeparation; - separationUnit = UNIT_PX; - setSeparationUnit(separationUnit); + super.setMinSeparation(minSeparation, UNIT_PX); } /** @@ -204,66 +199,6 @@ public void setMinSeparation(@Dimension float minSeparation) { * @attr ref com.google.android.material.R.styleable#RangeSlider_minSeparation */ public void setMinSeparationValue(float minSeparation) { - this.minSeparation = minSeparation; - separationUnit = UNIT_VALUE; - setSeparationUnit(separationUnit); - } - - @Override - @NonNull - public Parcelable onSaveInstanceState() { - Parcelable superState = super.onSaveInstanceState(); - - RangeSliderState sliderState = new RangeSliderState(superState); - sliderState.minSeparation = this.minSeparation; - sliderState.separationUnit = this.separationUnit; - - return sliderState; - } - - @Override - protected void onRestoreInstanceState(@Nullable Parcelable state) { - RangeSliderState savedState = (RangeSliderState) state; - super.onRestoreInstanceState(savedState.getSuperState()); - - this.minSeparation = savedState.minSeparation; - this.separationUnit = savedState.separationUnit; - setSeparationUnit(separationUnit); - } - - static class RangeSliderState extends AbsSavedState { - - private float minSeparation; - private int separationUnit; - - RangeSliderState(Parcelable superState) { - super(superState); - } - - private RangeSliderState(Parcel in) { - super((Parcelable) in.readParcelable(RangeSliderState.class.getClassLoader())); - minSeparation = in.readFloat(); - separationUnit = in.readInt(); - } - - @Override - public void writeToParcel(Parcel out, int flags) { - super.writeToParcel(out, flags); - out.writeFloat(minSeparation); - out.writeInt(separationUnit); - } - - public static final Parcelable.Creator CREATOR = - new Parcelable.Creator() { - @Override - public RangeSliderState createFromParcel(Parcel in) { - return new RangeSliderState(in); - } - - @Override - public RangeSliderState[] newArray(int size) { - return new RangeSliderState[size]; - } - }; + super.setMinSeparation(minSeparation, UNIT_VALUE); } }