Skip to content

Commit db54846

Browse files
committed
Add number of sets
1 parent 22a8ae6 commit db54846

9 files changed

Lines changed: 124 additions & 16 deletions

File tree

app/src/main/java/dev/randombits/intervaltimer/HiitTimer.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ enum class TimerStatus {
88
REST
99
}
1010

11-
abstract class HiitTimer(private val activeTime: Int, val restTime: Int) {
11+
abstract class HiitTimer(private val activeTime: Int, val restTime: Int, private val maxSets: Int = Int.MAX_VALUE) {
1212
private var set: Int = 0;
1313
private var status: TimerStatus = TimerStatus.PREPARE;
1414
private var timer: CountDownTimer? = null;
@@ -17,6 +17,7 @@ abstract class HiitTimer(private val activeTime: Int, val restTime: Int) {
1717

1818
abstract fun onUpdate(millisRemaining: Long);
1919
abstract fun onStatusChange(status: TimerStatus, set: Int);
20+
abstract fun onComplete();
2021

2122
fun start() {
2223
isRunning = true;
@@ -83,7 +84,12 @@ abstract class HiitTimer(private val activeTime: Int, val restTime: Int) {
8384
override fun onFinish() {
8485
remainingTime = 0;
8586
if (isRunning)
86-
startRest();
87+
if (set >= maxSets) {
88+
stop();
89+
onComplete();
90+
} else {
91+
startRest();
92+
}
8793
else
8894
this.cancel();
8995
}

app/src/main/java/dev/randombits/intervaltimer/MainActivity.kt

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import androidx.appcompat.app.AppCompatActivity
99

1010
class MainActivity : AppCompatActivity() {
1111
private var alarmSound = 0
12+
private var endSound = 0;
1213
private var playingSound = 0;
1314

1415
private val attributes: AudioAttributes = AudioAttributes.Builder()
@@ -28,31 +29,34 @@ class MainActivity : AppCompatActivity() {
2829
val prefs = getSharedPreferences(packageName, MODE_PRIVATE);
2930
val activeTime = prefs.getInt("activeTime", 45);
3031
val restTime = prefs.getInt("restTime", 15);
32+
val sets = prefs.getInt("sets", 0);
3133

3234
if (savedInstanceState == null) {
3335
supportFragmentManager.beginTransaction()
34-
.replace(R.id.mainFrame, SettingsFragment.newInstance(activeTime, restTime))
36+
.replace(R.id.mainFrame, SettingsFragment.newInstance(activeTime, restTime, sets))
3537
.commit();
3638
}
3739

3840
alarmSound = soundPool.load(this, R.raw.threesecbeep, 1);
41+
endSound = soundPool.load(this, R.raw.hit, 1);
3942
}
4043

41-
fun startTimer(activeTime: Int, restTime: Int) {
42-
savePreferences(activeTime, restTime);
44+
fun startTimer(activeTime: Int, restTime: Int, sets: Int) {
45+
savePreferences(activeTime, restTime, sets);
4346
supportFragmentManager.beginTransaction()
44-
.replace(R.id.mainFrame, TimerFragment.newInstance(activeTime, restTime))
47+
.replace(R.id.mainFrame, TimerFragment.newInstance(activeTime, restTime, sets))
4548
.addToBackStack("start").commit()
4649
}
4750

4851
fun backToSettings() {
4952
supportFragmentManager.popBackStack();
5053
}
5154

52-
fun savePreferences(activeTime: Int, restTime: Int) {
55+
fun savePreferences(activeTime: Int, restTime: Int, sets: Int) {
5356
val prefs = getSharedPreferences(packageName, MODE_PRIVATE).edit();
5457
prefs.putInt("activeTime", activeTime);
5558
prefs.putInt("restTime", restTime);
59+
prefs.putInt("sets", sets);
5660
prefs.apply();
5761
}
5862

@@ -71,4 +75,8 @@ class MainActivity : AppCompatActivity() {
7175
playingSound = soundPool.play(alarmSound, 1f, 1f, 1, 0, 1f);
7276
Handler(Looper.getMainLooper()).postDelayed({ playingSound = 0 }, 3000);
7377
}
78+
79+
fun soundEnd() {
80+
soundPool.play(endSound, 1f, 1f, 1, 2, 1f)
81+
}
7482
}

app/src/main/java/dev/randombits/intervaltimer/SettingsFragment.kt

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,16 @@ import androidx.fragment.app.Fragment
1111

1212
private const val ARG_PARAM1 = "active";
1313
private const val ARG_PARAM2 = "rest";
14+
private const val ARG_PARAM3 = "sets";
1415

1516
class SettingsFragment : Fragment() {
1617
private var defaultActiveTime: Int = 45;
1718
private var defaultRestTime: Int = 15;
1819
private var mainActivity: MainActivity? = null;
1920
private var activeInput: EditText? = null;
2021
private var restInput: EditText? = null;
22+
private var setsInput: EditText? = null;
23+
private var defaultSets: Int = 0;
2124

2225
override fun onAttach(context: Context) {
2326
super.onAttach(context);
@@ -30,6 +33,7 @@ class SettingsFragment : Fragment() {
3033
arguments?.let {
3134
defaultActiveTime = it.getInt(ARG_PARAM1);
3235
defaultRestTime = it.getInt(ARG_PARAM2);
36+
defaultSets = it.getInt(ARG_PARAM3, 0);
3337
}
3438
}
3539

@@ -48,6 +52,12 @@ class SettingsFragment : Fragment() {
4852
activeInput!!.setText(defaultActiveTime.toString());
4953
restInput = view.findViewById(R.id.restTime);
5054
restInput!!.setText(defaultRestTime.toString());
55+
setsInput = view.findViewById(R.id.setsCount);
56+
if (defaultSets > 0) {
57+
setsInput!!.setText(defaultSets.toString());
58+
} else {
59+
setsInput!!.setText("");
60+
}
5161

5262
view.findViewById<View>(R.id.activeTime_less).setOnClickListener {
5363
changeActiveValue(activeInput!!, defaultActiveTime, -5);
@@ -65,6 +75,14 @@ class SettingsFragment : Fragment() {
6575
changeRestValue(restInput!!, defaultRestTime, 5);
6676
}
6777

78+
view.findViewById<View>(R.id.sets_less).setOnClickListener {
79+
changeSetsValue(-1);
80+
}
81+
82+
view.findViewById<View>(R.id.sets_more).setOnClickListener {
83+
changeSetsValue(1);
84+
}
85+
6886
view.findViewById<View>(R.id.beginBtn).setOnClickListener { startTimer(); };
6987
}
7088

@@ -82,8 +100,18 @@ class SettingsFragment : Fragment() {
82100
editText.setText(newValue.toString());
83101
}
84102

103+
private fun changeSetsValue(delta: Int) {
104+
val current = setsInput!!.text.toString().toIntOrNull() ?: 0;
105+
val newVal = (current + delta).coerceAtLeast(0);
106+
if (newVal == 0) {
107+
setsInput!!.setText("");
108+
} else {
109+
setsInput!!.setText(newVal.toString());
110+
}
111+
}
112+
85113
override fun onSaveInstanceState(outState: Bundle) {
86-
if (activeInput == null || restInput == null) {
114+
if (activeInput == null || restInput == null || setsInput == null) {
87115
return;
88116
}
89117
outState.putInt(
@@ -96,39 +124,47 @@ class SettingsFragment : Fragment() {
96124
Integer.parseInt(restInput!!.text.toString())
97125
);
98126

127+
outState.putInt(
128+
"settings.sets",
129+
setsInput!!.text.toString().toIntOrNull() ?: 0
130+
);
131+
99132
super.onSaveInstanceState(outState);
100133
}
101134

102135
override fun onDestroy() {
103136
super.onDestroy();
104137

105-
if (activeInput == null || restInput == null) {
138+
if (activeInput == null || restInput == null || setsInput == null) {
106139
return;
107140
}
108141
mainActivity!!.savePreferences(
109142
Integer.parseInt(activeInput!!.text.toString()),
110-
Integer.parseInt(restInput!!.text.toString())
143+
Integer.parseInt(restInput!!.text.toString()),
144+
setsInput!!.text.toString().toIntOrNull() ?: 0
111145
);
112146
}
113147

114148
companion object {
115149
@JvmStatic
116-
fun newInstance(active: Int, rest: Int) =
150+
fun newInstance(active: Int, rest: Int, sets: Int) =
117151
SettingsFragment().apply {
118152
arguments = Bundle().apply {
119153
putInt(ARG_PARAM1, active);
120154
putInt(ARG_PARAM2, rest);
155+
putInt(ARG_PARAM3, sets);
121156
}
122157
};
123158
}
124159

125160
private fun startTimer() {
126161
var activeTime = Integer.parseInt(requireView().findViewById<EditText>(R.id.activeTime).text.toString());
127162
var restTime = Integer.parseInt(requireView().findViewById<EditText>(R.id.restTime).text.toString());
163+
val sets = requireView().findViewById<EditText>(R.id.setsCount).text.toString().toIntOrNull() ?: 0;
128164
if (activeTime < 5)
129165
activeTime = 5;
130166
if (restTime < 0)
131167
restTime = 0;
132-
mainActivity!!.startTimer(activeTime, restTime);
168+
mainActivity!!.startTimer(activeTime, restTime, sets);
133169
}
134170
}

app/src/main/java/dev/randombits/intervaltimer/TimerFragment.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ import androidx.fragment.app.Fragment
1212

1313
private const val ARG_PARAM1 = "active";
1414
private const val ARG_PARAM2 = "rest";
15+
private const val ARG_PARAM3 = "sets";
1516

1617
class TimerFragment : Fragment() {
1718
private var activeTime: Int? = null;
1819
private var restTime: Int? = null;
1920
private var mainActivity: MainActivity? = null;
2021
private var timer: HiitTimer? = null;
22+
private var maxSets: Int = Int.MAX_VALUE;
2123

2224
override fun onAttach(context: Context) {
2325
super.onAttach(context);
@@ -29,6 +31,8 @@ class TimerFragment : Fragment() {
2931
arguments?.let {
3032
activeTime = it.getInt(ARG_PARAM1);
3133
restTime = it.getInt(ARG_PARAM2);
34+
val setsArg = it.getInt(ARG_PARAM3, Int.MAX_VALUE);
35+
maxSets = if (setsArg <= 0) Int.MAX_VALUE else setsArg;
3236
};
3337
}
3438

@@ -55,7 +59,7 @@ class TimerFragment : Fragment() {
5559
val statusTextView: TextView = view.findViewById(R.id.status);
5660
val setCountView: TextView = view.findViewById(R.id.setCount);
5761

58-
timer = object : HiitTimer(activeTime!!, restTime!!) {
62+
timer = object : HiitTimer(activeTime!!, restTime!!, maxSets) {
5963
override fun onUpdate(millisRemaining: Long) {
6064
resultTextView.text = ((millisRemaining + 999) / 1000).toString();
6165

@@ -79,6 +83,11 @@ class TimerFragment : Fragment() {
7983
if (set > 0)
8084
setCountView.text = getString(R.string.setCount, set);
8185
}
86+
87+
override fun onComplete() {
88+
mainActivity!!.backToSettings();
89+
mainActivity!!.soundEnd();
90+
}
8291
};
8392
timer!!.start();
8493

@@ -109,11 +118,12 @@ class TimerFragment : Fragment() {
109118

110119
companion object {
111120
@JvmStatic
112-
fun newInstance(active: Int, rest: Int) =
121+
fun newInstance(active: Int, rest: Int, sets: Int) =
113122
TimerFragment().apply {
114123
arguments = Bundle().apply {
115124
putInt(ARG_PARAM1, active);
116125
putInt(ARG_PARAM2, rest);
126+
putInt(ARG_PARAM3, sets);
117127
}
118128
};
119129
}

app/src/main/res/layout/fragment_settings.xml

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,48 @@
8989
android:src="@drawable/add_24" />
9090
</LinearLayout>
9191

92+
<TextView
93+
android:text="@string/sets_label"
94+
android:layout_width="match_parent"
95+
android:layout_height="wrap_content" android:id="@+id/setsLabel" android:textAlignment="center"
96+
android:textSize="20sp" android:layout_marginTop="20dp" android:fontFamily="monospace"
97+
android:textStyle="bold"/>
98+
<LinearLayout
99+
android:layout_width="200dp"
100+
android:layout_height="wrap_content"
101+
android:orientation="horizontal" android:layout_gravity="center">
102+
103+
<ImageButton
104+
android:id="@+id/sets_less"
105+
android:layout_width="wrap_content"
106+
android:layout_height="wrap_content"
107+
android:background="@android:color/transparent"
108+
android:contentDescription="@string/decrease_sets"
109+
android:padding="16dp"
110+
android:scaleType="fitCenter"
111+
android:src="@drawable/minus" />
112+
113+
<EditText
114+
android:id="@+id/setsCount"
115+
android:layout_width="0sp"
116+
android:layout_height="match_parent"
117+
android:layout_weight="1"
118+
android:textAlignment="center"
119+
android:inputType="number"
120+
android:hint=""
121+
android:text="" android:maxLength="4" android:maxWidth="10dp" android:fontFamily="monospace"/>
122+
123+
<ImageButton
124+
android:id="@+id/sets_more"
125+
android:layout_width="wrap_content"
126+
android:layout_height="wrap_content"
127+
android:background="@android:color/transparent"
128+
android:contentDescription="@string/increase_sets"
129+
android:padding="16dp"
130+
android:scaleType="fitCenter"
131+
android:src="@drawable/add_24" />
132+
</LinearLayout>
133+
92134
<Button
93135
android:id="@+id/beginBtn"
94136
android:layout_marginTop="30dp"

app/src/main/res/raw/hit.wav

203 KB
Binary file not shown.

app/src/main/res/values-es-rES/strings.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,7 @@
1616
<string name="decrease_rest_time">Decrementar Tiempo Descanso</string>
1717
<string name="increase_rest_time">Incrementar Tiempo Descanso</string>
1818
<string name="prepareTime_label">Preparado</string>
19-
</resources>
19+
<string name="sets_label">Repeticións</string>
20+
<string name="decrease_sets">Decrementar Repeticións</string>
21+
<string name="increase_sets">Incrementar Repeticións</string>
22+
</resources>

app/src/main/res/values/strings.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,7 @@
1515
<string name="decrease_rest_time">Decrease Rest Time</string>
1616
<string name="increase_rest_time">Increase Rest Time</string>
1717
<string name="prepareTime_label">Prepare</string>
18+
<string name="sets_label">Sets</string>
19+
<string name="decrease_sets">Decrease Sets</string>
20+
<string name="increase_sets">Increase Sets</string>
1821
</resources>

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Top-level build file where you can add configuration options common to all sub-projects/modules.
22
plugins {
3-
id("com.android.application") version "8.7.3" apply false
3+
id("com.android.application") version "8.11.0" apply false
44
id("org.jetbrains.kotlin.android") version "2.1.20" apply false
55
id("org.jetbrains.kotlin.plugin.compose") version "2.1.20" apply false
66
}

0 commit comments

Comments
 (0)