/** * TipCalculatorApp — Compose state + TextField input + hoisted state. */ import androidx.compose.foundation.layout.* import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import kotlin.math.ceil @Composable fun TipCalculatorApp() { var amountInput by remember { mutableStateOf("") } var percentInput by remember { mutableStateOf("15") } var roundUp by remember { mutableStateOf(false) } val amount = amountInput.toDoubleOrNull() ?: 0.0 val percent = percentInput.toDoubleOrNull() ?: 0.0 val rawTip = amount * percent / 100 val tip = if (roundUp) ceil(rawTip) else rawTip Column(Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(12.dp)) { Text("Tip Calculator", fontSize = 24.sp, fontWeight = FontWeight.Bold) OutlinedTextField( value = amountInput, onValueChange = { amountInput = it }, label = { Text("Bill amount") }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), singleLine = true ) OutlinedTextField( value = percentInput, onValueChange = { percentInput = it }, label = { Text("Tip %") }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), singleLine = true ) Row(verticalAlignment = androidx.compose.ui.Alignment.CenterVertically) { Text("Round up", modifier = Modifier.weight(1f)) Switch(checked = roundUp, onCheckedChange = { roundUp = it }) } Divider() Text("Tip: %.2f".format(tip), fontSize = 22.sp, fontWeight = FontWeight.Bold) Text("Total: %.2f".format(amount + tip), fontSize = 18.sp) } } @Preview(showBackground = true) @Composable fun TipCalculatorPreview() { TipCalculatorApp() }