Timer Zurba
unknown
plain_text
a year ago
7.3 kB
20
Indexable
package com.example.timerapp
import android.app.AlertDialog
import android.media.MediaPlayer
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.compose.BackHandler
import androidx.compose.animation.animateColorAsState
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
TimerApp()
}
}
}
@Composable
fun TimerApp() {
val scope = rememberCoroutineScope()
var timer1 by remember { mutableStateOf(0) }
var timer2 by remember { mutableStateOf(0) }
var iterations1 by remember { mutableStateOf(1) }
var iterations2 by remember { mutableStateOf(1) }
var isPerson1Active by remember { mutableStateOf(true) }
var isRunning by remember { mutableStateOf(false) }
var isButtonDisabled by remember { mutableStateOf(false) }
val highlightColor1 by animateColorAsState(if (isPerson1Active) Color.White else Color.Transparent)
val highlightColor2 by animateColorAsState(if (!isPerson1Active) Color.White else Color.Transparent)
val mediaPlayer1 = remember { MediaPlayer() } // Placeholder for person 1 sound
val mediaPlayer2 = remember { MediaPlayer() } // Placeholder for person 2 sound
// Function to start timers
fun startTimer1() {
scope.launch {
while (timer1 > 0 && isRunning) {
delay(1000)
timer1--
}
if (timer1 == 0) {
mediaPlayer1.start() // Play sound for person 1
isPerson1Active = true
}
}
}
fun startTimer2() {
scope.launch {
while (timer2 > 0 && isRunning) {
delay(1000)
timer2--
}
if (timer2 == 0) {
mediaPlayer2.start() // Play sound for person 2
isPerson1Active = false
}
}
}
fun onPlusPressed(isPerson1: Boolean) {
if (isButtonDisabled) return
isButtonDisabled = true
scope.launch {
delay(10000) // Disable buttons for 10 seconds
isButtonDisabled = false
}
if (isPerson1) {
timer1 += 20
iterations1++
isPerson1Active = false
startTimer1()
} else {
timer2 += 20
iterations2++
isPerson1Active = true
startTimer2()
}
}
fun onMinusPressed(isPerson1: Boolean) {
if (isButtonDisabled) return
isButtonDisabled = true
scope.launch {
delay(10000) // Disable buttons for 10 seconds
isButtonDisabled = false
}
if (isPerson1) {
if (timer1 > 20) {
timer1 -= 20
iterations1 = maxOf(1, iterations1 - 1)
}
} else {
if (timer2 > 20) {
timer2 -= 20
iterations2 = maxOf(1, iterations2 - 1)
}
}
}
fun formatTime(seconds: Int): String {
val minutes = seconds / 60
val remainingSeconds = seconds % 60
return String.format("%02d:%02d", minutes, remainingSeconds)
}
Scaffold(
topBar = {
TopAppBar(title = { Text("Workout Timer") })
}
) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
// Person 1
Box(
modifier = Modifier
.border(BorderStroke(4.dp, highlightColor1), shape = CircleShape)
.padding(8.dp)
) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
Image(
painter = painterResource(id = R.drawable.person_placeholder),
contentDescription = "Person 1",
modifier = Modifier.size(100.dp)
)
Text("Person 1")
Text("Time: ${formatTime(timer1)}")
Text("Iterations: $iterations1")
Row {
Button(
onClick = { onPlusPressed(true) },
enabled = !isButtonDisabled
) { Text("+") }
Spacer(modifier = Modifier.width(8.dp))
Button(
onClick = { onMinusPressed(true) },
enabled = !isButtonDisabled
) { Text("-") }
}
}
}
Spacer(modifier = Modifier.height(20.dp))
// Person 2
Box(
modifier = Modifier
.border(BorderStroke(4.dp, highlightColor2), shape = CircleShape)
.padding(8.dp)
) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
Image(
painter = painterResource(id = R.drawable.person_placeholder),
contentDescription = "Person 2",
modifier = Modifier.size(100.dp)
)
Text("Person 2")
Text("Time: ${formatTime(timer2)}")
Text("Iterations: $iterations2")
Row {
Button(
onClick = { onPlusPressed(false) },
enabled = !isButtonDisabled
) { Text("+") }
Spacer(modifier = Modifier.width(8.dp))
Button(
onClick = { onMinusPressed(false) },
enabled = !isButtonDisabled
) { Text("-") }
}
}
}
Spacer(modifier = Modifier.height(40.dp))
Button(onClick = {
isRunning = !isRunning
}) {
Text(if (isRunning) "Pause" else "Start")
}
}
}
// Handle back press
BackHandler {
AlertDialog.Builder(it)
.setTitle("Exit App")
.setMessage("Are you sure you want to exit?")
.setPositiveButton("Yes") { _, _ -> (it as ComponentActivity).finish() }
.setNegativeButton("No", null)
.show()
}
}
Editor is loading...
Leave a Comment