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
|
||
}
|
||
} |