Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/PojavLauncher
Path: blob/v3_openjdk/app_pojavlauncher/src/main/java/com/kdt/CustomSeekbar.java
2129 views
1
package com.kdt;
2
3
import android.annotation.SuppressLint;
4
import android.content.Context;
5
import android.content.res.TypedArray;
6
import android.os.Build;
7
import android.util.AttributeSet;
8
import android.widget.SeekBar;
9
10
import androidx.annotation.Nullable;
11
12
import net.kdt.pojavlaunch.R;
13
14
/**
15
* Seekbar with ability to handle ranges and increments
16
*/
17
@SuppressLint("AppCompatCustomView")
18
public class CustomSeekbar extends SeekBar {
19
private int mMin = 0;
20
private int mIncrement = 1;
21
private SeekBar.OnSeekBarChangeListener mListener;
22
23
private final OnSeekBarChangeListener mInternalListener = new OnSeekBarChangeListener() {
24
/** When using increments, this flag is used to prevent double calls to the listener */
25
private boolean internalChanges = false;
26
/** Store the previous progress to prevent double calls with increments */
27
private int previousProgress = 0;
28
@Override
29
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
30
if (internalChanges) return;
31
internalChanges = true;
32
33
progress += mMin;
34
progress = applyIncrement(progress);
35
36
if (progress != previousProgress) {
37
if (mListener != null) {
38
previousProgress = progress;
39
mListener.onProgressChanged(seekBar, progress, fromUser);
40
}
41
}
42
43
// Forces the thumb to snap to the increment
44
setProgress(progress);
45
internalChanges = false;
46
}
47
48
@Override
49
public void onStartTrackingTouch(SeekBar seekBar) {
50
if (internalChanges) return;
51
52
if (mListener != null) {
53
mListener.onStartTrackingTouch(seekBar);
54
}
55
}
56
57
@Override
58
public void onStopTrackingTouch(SeekBar seekBar) {
59
if (internalChanges) return;
60
internalChanges = true;
61
62
setProgress(seekBar.getProgress());
63
64
if (mListener != null) {
65
mListener.onStopTrackingTouch(seekBar);
66
}
67
internalChanges = false;
68
}
69
};
70
71
public CustomSeekbar(Context context) {
72
super(context);
73
setup(null);
74
}
75
76
public CustomSeekbar(Context context, AttributeSet attrs) {
77
super(context, attrs);
78
setup(attrs);
79
}
80
81
public CustomSeekbar(Context context, AttributeSet attrs, int defStyleAttr) {
82
super(context, attrs, defStyleAttr);
83
setup(attrs);
84
}
85
86
public void setIncrement(int increment) {
87
mIncrement = increment;
88
}
89
90
public void setRange(int min, int max) {
91
mMin = min;
92
setMax(max - min);
93
}
94
95
@Override
96
public synchronized void setProgress(int progress) {
97
super.setProgress(applyIncrement(progress - mMin));
98
}
99
100
@Override
101
public void setProgress(int progress, boolean animate) {
102
super.setProgress(applyIncrement(progress - mMin), animate);
103
}
104
105
@Override
106
public synchronized int getProgress() {
107
return applyIncrement(super.getProgress() + mMin);
108
}
109
110
@Override
111
public synchronized void setMin(int min) {
112
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
113
super.setMin(0);
114
}
115
mMin = min;
116
//todo perform something to update the progress ?
117
}
118
119
120
121
/**
122
* Wrapper to allow for a listener to be set around the internal listener
123
*/
124
@Override
125
public void setOnSeekBarChangeListener(OnSeekBarChangeListener l) {
126
mListener = l;
127
}
128
129
public void setup(@Nullable AttributeSet attrs) {
130
try (TypedArray attributes = getContext().obtainStyledAttributes(attrs, R.styleable.CustomSeekbar)) {
131
setIncrement(attributes.getInt(R.styleable.CustomSeekbar_seekBarIncrement, 1));
132
int min = attributes.getInt(R.styleable.CustomSeekbar_android_min, 0);
133
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
134
super.setMin(0);
135
}
136
setRange(min, super.getMax());
137
}
138
139
// Due to issues with negative progress when setting up the seekbar
140
// We need to set a random progress to force the refresh of the thumb
141
if(super.getProgress() == 0) {
142
super.setProgress(super.getProgress() + 1);
143
post(() -> {
144
super.setProgress(super.getProgress() - 1);
145
post(() -> super.setOnSeekBarChangeListener(mInternalListener));
146
});
147
} else {
148
super.setOnSeekBarChangeListener(mInternalListener);
149
}
150
}
151
152
/**
153
* Apply increment to the progress
154
* @param progress Progress to apply increment to
155
* @return Progress with increment applied
156
*/
157
private int applyIncrement(int progress) {
158
if (mIncrement < 1) return progress;
159
160
progress = progress / mIncrement;
161
progress = progress * mIncrement;
162
return progress;
163
}
164
}
165
166