Skip to content

Commit 7ba8bb5

Browse files
committed
[Slider] Fix support for thumb separation options in BaseSlider
1 parent cfef899 commit 7ba8bb5

File tree

2 files changed

+29
-76
lines changed

2 files changed

+29
-76
lines changed

lib/java/com/google/android/material/slider/BaseSlider.java

+25-7
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,8 @@ abstract class BaseSlider<
344344
@NonNull private List<Drawable> customThumbDrawablesForValues = Collections.emptyList();
345345

346346
private float touchPosition;
347+
348+
private float minSeparation = 0f;
347349
@SeparationUnit private int separationUnit = UNIT_PX;
348350

349351
@NonNull
@@ -628,7 +630,6 @@ private void validateValues() {
628630
}
629631

630632
private void validateMinSeparation() {
631-
final float minSeparation = getMinSeparation();
632633
if (minSeparation < 0) {
633634
throw new IllegalStateException(
634635
String.format(EXCEPTION_ILLEGAL_MIN_SEPARATION, minSeparation));
@@ -2532,7 +2533,7 @@ private boolean snapThumbToValue(int idx, float value) {
25322533

25332534
/** Thumbs cannot cross each other, clamp the value to a bound or the value next to it. */
25342535
private float getClampedValue(int idx, float value) {
2535-
float minSeparation = getMinSeparation();
2536+
float minSeparation = this.minSeparation;
25362537
minSeparation = separationUnit == UNIT_PX ? dimenToValue(minSeparation) : minSeparation;
25372538
if (isRtl()) {
25382539
minSeparation = -minSeparation;
@@ -2550,16 +2551,22 @@ private float dimenToValue(float dimen) {
25502551
return ((dimen - trackSidePadding) / trackWidth) * (valueFrom - valueTo) + valueFrom;
25512552
}
25522553

2553-
protected void setSeparationUnit(int separationUnit) {
2554+
protected float getMinSeparation() {
2555+
return minSeparation;
2556+
}
2557+
2558+
protected float getSeparationUnit() {
2559+
return separationUnit;
2560+
}
2561+
2562+
protected void setMinSeparation(float minSeparation, @SeparationUnit int separationUnit) {
2563+
this.minSeparation = minSeparation;
25542564
this.separationUnit = separationUnit;
2565+
25552566
dirtyConfig = true;
25562567
postInvalidate();
25572568
}
25582569

2559-
protected float getMinSeparation() {
2560-
return 0;
2561-
}
2562-
25632570
private float getValueOfTouchPosition() {
25642571
double position = snapPosition(touchPosition);
25652572

@@ -3131,6 +3138,8 @@ protected Parcelable onSaveInstanceState() {
31313138
sliderState.valueTo = valueTo;
31323139
sliderState.values = new ArrayList<>(values);
31333140
sliderState.stepSize = stepSize;
3141+
sliderState.minSeparation = minSeparation;
3142+
sliderState.separationUnit = separationUnit;
31343143
sliderState.hasFocus = hasFocus();
31353144
return sliderState;
31363145
}
@@ -3144,6 +3153,9 @@ protected void onRestoreInstanceState(Parcelable state) {
31443153
valueTo = sliderState.valueTo;
31453154
setValuesInternal(sliderState.values);
31463155
stepSize = sliderState.stepSize;
3156+
minSeparation = sliderState.minSeparation;
3157+
separationUnit = sliderState.separationUnit;
3158+
31473159
if (sliderState.hasFocus) {
31483160
requestFocus();
31493161
}
@@ -3155,6 +3167,8 @@ static class SliderState extends BaseSavedState {
31553167
float valueTo;
31563168
ArrayList<Float> values;
31573169
float stepSize;
3170+
float minSeparation;
3171+
@SeparationUnit int separationUnit;
31583172
boolean hasFocus;
31593173

31603174
public static final Creator<SliderState> CREATOR =
@@ -3184,6 +3198,8 @@ private SliderState(@NonNull Parcel source) {
31843198
values = new ArrayList<>();
31853199
source.readList(values, Float.class.getClassLoader());
31863200
stepSize = source.readFloat();
3201+
minSeparation = source.readFloat();
3202+
separationUnit = source.readInt();
31873203
hasFocus = source.createBooleanArray()[0];
31883204
}
31893205

@@ -3194,6 +3210,8 @@ public void writeToParcel(@NonNull Parcel dest, int flags) {
31943210
dest.writeFloat(valueTo);
31953211
dest.writeList(values);
31963212
dest.writeFloat(stepSize);
3213+
dest.writeFloat(minSeparation);
3214+
dest.writeInt(separationUnit);
31973215
boolean[] booleans = new boolean[1];
31983216
booleans[0] = hasFocus;
31993217
dest.writeBooleanArray(booleans);

lib/java/com/google/android/material/slider/RangeSlider.java

+4-69
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,6 @@
5757
*/
5858
public class RangeSlider extends BaseSlider<RangeSlider, OnChangeListener, OnSliderTouchListener> {
5959

60-
private float minSeparation;
61-
private int separationUnit;
62-
6360
public RangeSlider(@NonNull Context context) {
6461
this(context, null);
6562
}
@@ -79,7 +76,7 @@ public RangeSlider(@NonNull Context context, @Nullable AttributeSet attrs, int d
7976
setValues(convertToFloat(values));
8077
}
8178

82-
minSeparation = a.getDimension(R.styleable.RangeSlider_minSeparation, 0);
79+
setMinSeparation(a.getDimension(R.styleable.RangeSlider_minSeparation, 0));
8380
a.recycle();
8481
}
8582

@@ -178,7 +175,7 @@ private static List<Float> convertToFloat(TypedArray values) {
178175
*/
179176
@Override
180177
public float getMinSeparation() {
181-
return minSeparation;
178+
return super.getMinSeparation();
182179
}
183180

184181
/**
@@ -190,9 +187,7 @@ public float getMinSeparation() {
190187
* {@link #setMinSeparationValue(float)} instead.
191188
*/
192189
public void setMinSeparation(@Dimension float minSeparation) {
193-
this.minSeparation = minSeparation;
194-
separationUnit = UNIT_PX;
195-
setSeparationUnit(separationUnit);
190+
super.setMinSeparation(minSeparation, UNIT_PX);
196191
}
197192

198193
/**
@@ -204,66 +199,6 @@ public void setMinSeparation(@Dimension float minSeparation) {
204199
* @attr ref com.google.android.material.R.styleable#RangeSlider_minSeparation
205200
*/
206201
public void setMinSeparationValue(float minSeparation) {
207-
this.minSeparation = minSeparation;
208-
separationUnit = UNIT_VALUE;
209-
setSeparationUnit(separationUnit);
210-
}
211-
212-
@Override
213-
@NonNull
214-
public Parcelable onSaveInstanceState() {
215-
Parcelable superState = super.onSaveInstanceState();
216-
217-
RangeSliderState sliderState = new RangeSliderState(superState);
218-
sliderState.minSeparation = this.minSeparation;
219-
sliderState.separationUnit = this.separationUnit;
220-
221-
return sliderState;
222-
}
223-
224-
@Override
225-
protected void onRestoreInstanceState(@Nullable Parcelable state) {
226-
RangeSliderState savedState = (RangeSliderState) state;
227-
super.onRestoreInstanceState(savedState.getSuperState());
228-
229-
this.minSeparation = savedState.minSeparation;
230-
this.separationUnit = savedState.separationUnit;
231-
setSeparationUnit(separationUnit);
232-
}
233-
234-
static class RangeSliderState extends AbsSavedState {
235-
236-
private float minSeparation;
237-
private int separationUnit;
238-
239-
RangeSliderState(Parcelable superState) {
240-
super(superState);
241-
}
242-
243-
private RangeSliderState(Parcel in) {
244-
super((Parcelable) in.readParcelable(RangeSliderState.class.getClassLoader()));
245-
minSeparation = in.readFloat();
246-
separationUnit = in.readInt();
247-
}
248-
249-
@Override
250-
public void writeToParcel(Parcel out, int flags) {
251-
super.writeToParcel(out, flags);
252-
out.writeFloat(minSeparation);
253-
out.writeInt(separationUnit);
254-
}
255-
256-
public static final Parcelable.Creator<RangeSliderState> CREATOR =
257-
new Parcelable.Creator<RangeSliderState>() {
258-
@Override
259-
public RangeSliderState createFromParcel(Parcel in) {
260-
return new RangeSliderState(in);
261-
}
262-
263-
@Override
264-
public RangeSliderState[] newArray(int size) {
265-
return new RangeSliderState[size];
266-
}
267-
};
202+
super.setMinSeparation(minSeparation, UNIT_VALUE);
268203
}
269204
}

0 commit comments

Comments
 (0)