Skip to content

Commit

Permalink
[Slider] Fix support for thumb separation options in BaseSlider
Browse files Browse the repository at this point in the history
  • Loading branch information
pubiqq committed Mar 25, 2024
1 parent 94e365f commit 2f1c594
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 76 deletions.
32 changes: 25 additions & 7 deletions lib/java/com/google/android/material/slider/BaseSlider.java
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,8 @@ abstract class BaseSlider<
@NonNull private List<Drawable> customThumbDrawablesForValues = Collections.emptyList();

private float touchPosition;

private float minSeparation = 0f;
@SeparationUnit private int separationUnit = UNIT_PX;

@NonNull
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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;
Expand All @@ -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);

Expand Down Expand Up @@ -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;
}
Expand All @@ -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();
}
Expand All @@ -3149,6 +3161,8 @@ static class SliderState extends BaseSavedState {
float valueTo;
ArrayList<Float> values;
float stepSize;
float minSeparation;
@SeparationUnit int separationUnit;
boolean hasFocus;

public static final Creator<SliderState> CREATOR =
Expand Down Expand Up @@ -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];
}

Expand All @@ -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);
Expand Down
73 changes: 4 additions & 69 deletions lib/java/com/google/android/material/slider/RangeSlider.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,6 @@
*/
public class RangeSlider extends BaseSlider<RangeSlider, OnChangeListener, OnSliderTouchListener> {

private float minSeparation;
private int separationUnit;

public RangeSlider(@NonNull Context context) {
this(context, null);
}
Expand All @@ -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();
}

Expand Down Expand Up @@ -178,7 +175,7 @@ private static List<Float> convertToFloat(TypedArray values) {
*/
@Override
public float getMinSeparation() {
return minSeparation;
return super.getMinSeparation();
}

/**
Expand All @@ -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);
}

/**
Expand All @@ -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<RangeSliderState> CREATOR =
new Parcelable.Creator<RangeSliderState>() {
@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);
}
}

0 comments on commit 2f1c594

Please sign in to comment.