207 lines
7.8 KiB
Kotlin
207 lines
7.8 KiB
Kotlin
package com.example.timert
|
|
|
|
import android.app.AlertDialog
|
|
import android.content.Intent
|
|
import android.media.MediaPlayer
|
|
import android.os.Bundle
|
|
import android.os.CountDownTimer
|
|
import android.widget.ImageButton
|
|
import android.widget.TextView
|
|
import androidx.activity.enableEdgeToEdge
|
|
import androidx.appcompat.app.AppCompatActivity
|
|
import androidx.constraintlayout.widget.ConstraintLayout
|
|
import androidx.core.view.ViewCompat
|
|
import androidx.core.view.WindowInsetsCompat
|
|
|
|
class timer : AppCompatActivity() {
|
|
private var isPlay = false
|
|
|
|
private lateinit var statusText: TextView
|
|
private lateinit var timerText: TextView
|
|
private lateinit var statusSet: TextView
|
|
private lateinit var statusExercise: TextView
|
|
private var numApproaches = 3
|
|
private var numExercises = 5
|
|
private var restBetweenExercises = 30
|
|
private var restBetweenApproaches = 60
|
|
private var exerciseDuration = 45 // например, 45 секунд упражнение
|
|
private var currentTimer: CountDownTimer? = null
|
|
private var timeLeftInMillis: Long = 0
|
|
|
|
// Объявляем переменные для MediaPlayer
|
|
private var startWorkoutSound: MediaPlayer? = null
|
|
private var workSound: MediaPlayer? = null
|
|
private var startRestSound: MediaPlayer? = null
|
|
private var restSound: MediaPlayer? = null
|
|
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
super.onCreate(savedInstanceState)
|
|
enableEdgeToEdge()
|
|
setContentView(R.layout.activity_timer)
|
|
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
|
|
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
|
|
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
|
|
insets
|
|
}
|
|
statusText = findViewById(R.id.statusText)
|
|
timerText = findViewById(R.id.timerText)
|
|
statusSet = findViewById(R.id.number_set)
|
|
statusExercise = findViewById(R.id.num_exercise)
|
|
numApproaches = intent.getIntExtra("numApproaches", numApproaches)
|
|
numExercises = intent.getIntExtra("numExercises", numExercises)
|
|
restBetweenExercises = intent.getIntExtra("restBetweenExercises", restBetweenExercises)
|
|
restBetweenApproaches = intent.getIntExtra("restBetweenApproaches", restBetweenApproaches)
|
|
exerciseDuration = intent.getIntExtra("exerciseDuration", exerciseDuration)
|
|
|
|
// Инициализируем MediaPlayer
|
|
startWorkoutSound = MediaPlayer.create(this, R.raw.sound1)
|
|
workSound = MediaPlayer.create(this, R.raw.sound1)
|
|
startRestSound = MediaPlayer.create(this, R.raw.sound2)
|
|
restSound = MediaPlayer.create(this, R.raw.sound3)
|
|
|
|
startTraining()
|
|
|
|
val button: ImageButton = findViewById(R.id.stop)
|
|
button.setOnClickListener {
|
|
AlertDialog.Builder(this)
|
|
.setTitle("Сброс таймера")
|
|
.setMessage("Закрыть таймер и перейти на главную страницу?")
|
|
.setPositiveButton("Да") { _, _ ->
|
|
|
|
val intent = Intent(this, MainActivity::class.java)
|
|
startActivity(intent)
|
|
}
|
|
.setNegativeButton("Нет") { dialog, _ ->
|
|
dialog.dismiss()
|
|
}
|
|
.show()
|
|
}
|
|
|
|
|
|
|
|
val pauseButton: ImageButton = findViewById(R.id.play)
|
|
|
|
pauseButton.setOnClickListener {
|
|
if (isPlay) {
|
|
|
|
pauseButton.setImageResource(R.drawable.icon_play)
|
|
// здесь ещё можно возобновить таймер
|
|
} else {
|
|
|
|
pauseButton.setImageResource(R.drawable.icon_pause)
|
|
// здесь можно остановить таймер
|
|
}
|
|
isPlay = !isPlay
|
|
}
|
|
|
|
|
|
|
|
}
|
|
private fun resumeTimer(onFinish: () -> Unit) {
|
|
currentTimer = object : CountDownTimer(timeLeftInMillis, 1000) {
|
|
override fun onTick(millisUntilFinished: Long) {
|
|
timeLeftInMillis = millisUntilFinished
|
|
timerText.text = "${millisUntilFinished / 1000}"
|
|
}
|
|
|
|
override fun onFinish() {
|
|
onFinish()
|
|
}
|
|
}.start()
|
|
}
|
|
|
|
private fun startTraining() {
|
|
var currentApproach = 1
|
|
val rootLayout = findViewById<ConstraintLayout>(R.id.main)
|
|
fun nextApproach() {
|
|
if (currentApproach > numApproaches) {
|
|
statusText.text = "Тренировка завершена!"
|
|
rootLayout.setBackgroundResource(R.drawable.blue_gradient)
|
|
timerText.text = "00:00"
|
|
// Здесь должен быть звук завершения тренировки, если нужно
|
|
return
|
|
}
|
|
statusSet.text = "Подход № $currentApproach"
|
|
var currentExercise = 1
|
|
|
|
fun nextExercise() {
|
|
if (currentExercise > numExercises) {
|
|
statusText.text = "Отдых между подходами"
|
|
rootLayout.setBackgroundResource(R.drawable.green_gradient)
|
|
// Звук перед началом отдыха между подходами
|
|
startRestSound?.start()
|
|
startRest(restBetweenApproaches) {
|
|
currentApproach++
|
|
nextApproach()
|
|
}
|
|
return
|
|
}
|
|
rootLayout.setBackgroundResource(R.drawable.gradient_pink)
|
|
statusText.text = "Работа"
|
|
statusExercise.text = "$currentExercise / $numExercises"
|
|
statusSet.text = "$currentApproach"
|
|
|
|
// Звук перед началом упражнения
|
|
workSound?.start()
|
|
|
|
startTimer(exerciseDuration) {
|
|
statusText.text = "Отдых"
|
|
rootLayout.setBackgroundResource(R.drawable.green_gradient)
|
|
// Звук перед началом отдыха между упражнениями
|
|
restSound?.start()
|
|
startRest(restBetweenExercises) {
|
|
currentExercise++
|
|
nextExercise()
|
|
}
|
|
}
|
|
}
|
|
// Звук перед началом подхода
|
|
startWorkoutSound?.start()
|
|
nextExercise()
|
|
}
|
|
nextApproach()
|
|
}
|
|
|
|
private fun startTimer(seconds: Int, onFinish: () -> Unit) {
|
|
timeLeftInMillis = seconds * 1000L
|
|
object : CountDownTimer(seconds * 1000L, 1000) {
|
|
override fun onTick(millisUntilFinished: Long) {
|
|
timerText.text = "${millisUntilFinished / 1000}"
|
|
}
|
|
|
|
override fun onFinish() {
|
|
onFinish()
|
|
}
|
|
}.start()
|
|
}
|
|
|
|
private fun startRest(seconds: Int, onFinish: () -> Unit) {
|
|
val rootLayout = findViewById<ConstraintLayout>(R.id.main)
|
|
rootLayout.setBackgroundResource(R.drawable.green_gradient)
|
|
object : CountDownTimer(seconds * 1000L, 1000) {
|
|
override fun onTick(millisUntilFinished: Long) {
|
|
timerText.text = "${millisUntilFinished / 1000}"
|
|
statusText.text = "Отдых"
|
|
}
|
|
|
|
override fun onFinish() {
|
|
onFinish()
|
|
}
|
|
}.start()
|
|
}
|
|
override fun onDestroy() {
|
|
super.onDestroy()
|
|
currentTimer?.cancel()
|
|
// Освобождаем ресурсы MediaPlayer
|
|
startWorkoutSound?.release()
|
|
workSound?.release()
|
|
startRestSound?.release()
|
|
restSound?.release()
|
|
|
|
startWorkoutSound = null
|
|
workSound = null
|
|
startRestSound = null
|
|
restSound = null
|
|
}
|
|
} |