Path: blob/v3_openjdk/app_pojavlauncher/src/main/java/com/kdt/CustomSeekbar.java
2129 views
package com.kdt;12import android.annotation.SuppressLint;3import android.content.Context;4import android.content.res.TypedArray;5import android.os.Build;6import android.util.AttributeSet;7import android.widget.SeekBar;89import androidx.annotation.Nullable;1011import net.kdt.pojavlaunch.R;1213/**14* Seekbar with ability to handle ranges and increments15*/16@SuppressLint("AppCompatCustomView")17public class CustomSeekbar extends SeekBar {18private int mMin = 0;19private int mIncrement = 1;20private SeekBar.OnSeekBarChangeListener mListener;2122private final OnSeekBarChangeListener mInternalListener = new OnSeekBarChangeListener() {23/** When using increments, this flag is used to prevent double calls to the listener */24private boolean internalChanges = false;25/** Store the previous progress to prevent double calls with increments */26private int previousProgress = 0;27@Override28public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {29if (internalChanges) return;30internalChanges = true;3132progress += mMin;33progress = applyIncrement(progress);3435if (progress != previousProgress) {36if (mListener != null) {37previousProgress = progress;38mListener.onProgressChanged(seekBar, progress, fromUser);39}40}4142// Forces the thumb to snap to the increment43setProgress(progress);44internalChanges = false;45}4647@Override48public void onStartTrackingTouch(SeekBar seekBar) {49if (internalChanges) return;5051if (mListener != null) {52mListener.onStartTrackingTouch(seekBar);53}54}5556@Override57public void onStopTrackingTouch(SeekBar seekBar) {58if (internalChanges) return;59internalChanges = true;6061setProgress(seekBar.getProgress());6263if (mListener != null) {64mListener.onStopTrackingTouch(seekBar);65}66internalChanges = false;67}68};6970public CustomSeekbar(Context context) {71super(context);72setup(null);73}7475public CustomSeekbar(Context context, AttributeSet attrs) {76super(context, attrs);77setup(attrs);78}7980public CustomSeekbar(Context context, AttributeSet attrs, int defStyleAttr) {81super(context, attrs, defStyleAttr);82setup(attrs);83}8485public void setIncrement(int increment) {86mIncrement = increment;87}8889public void setRange(int min, int max) {90mMin = min;91setMax(max - min);92}9394@Override95public synchronized void setProgress(int progress) {96super.setProgress(applyIncrement(progress - mMin));97}9899@Override100public void setProgress(int progress, boolean animate) {101super.setProgress(applyIncrement(progress - mMin), animate);102}103104@Override105public synchronized int getProgress() {106return applyIncrement(super.getProgress() + mMin);107}108109@Override110public synchronized void setMin(int min) {111if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {112super.setMin(0);113}114mMin = min;115//todo perform something to update the progress ?116}117118119120/**121* Wrapper to allow for a listener to be set around the internal listener122*/123@Override124public void setOnSeekBarChangeListener(OnSeekBarChangeListener l) {125mListener = l;126}127128public void setup(@Nullable AttributeSet attrs) {129try (TypedArray attributes = getContext().obtainStyledAttributes(attrs, R.styleable.CustomSeekbar)) {130setIncrement(attributes.getInt(R.styleable.CustomSeekbar_seekBarIncrement, 1));131int min = attributes.getInt(R.styleable.CustomSeekbar_android_min, 0);132if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {133super.setMin(0);134}135setRange(min, super.getMax());136}137138// Due to issues with negative progress when setting up the seekbar139// We need to set a random progress to force the refresh of the thumb140if(super.getProgress() == 0) {141super.setProgress(super.getProgress() + 1);142post(() -> {143super.setProgress(super.getProgress() - 1);144post(() -> super.setOnSeekBarChangeListener(mInternalListener));145});146} else {147super.setOnSeekBarChangeListener(mInternalListener);148}149}150151/**152* Apply increment to the progress153* @param progress Progress to apply increment to154* @return Progress with increment applied155*/156private int applyIncrement(int progress) {157if (mIncrement < 1) return progress;158159progress = progress / mIncrement;160progress = progress * mIncrement;161return progress;162}163}164165166