Skip to content

[Slider] Fix support for thumb separation options in BaseSlider #4116

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -2532,7 +2533,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 @@ -2550,16 +2551,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 @@ -3131,6 +3138,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 @@ -3144,6 +3153,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 @@ -3155,6 +3167,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 @@ -3184,6 +3198,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 @@ -3194,6 +3210,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);
}
}