diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/amount/AmountScreen.kt b/app/src/main/java/com/mob/utsmyanmar/ui/amount/AmountScreen.kt index ddb7084..99d5b99 100644 --- a/app/src/main/java/com/mob/utsmyanmar/ui/amount/AmountScreen.kt +++ b/app/src/main/java/com/mob/utsmyanmar/ui/amount/AmountScreen.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Backspace import androidx.compose.material.icons.rounded.KeyboardArrowLeft import androidx.compose.material3.* import androidx.compose.runtime.* @@ -28,152 +29,170 @@ fun AmountScreen( val displayAmount = amount.ifEmpty { "0" } - Column( + Box( modifier = Modifier .fillMaxSize() .background(Color.IvoryBeige) - .padding(horizontal = 20.dp) .navigationBarsPadding() .statusBarsPadding() ) { - Box( + Column( modifier = Modifier - .fillMaxWidth() - .height(56.dp), - contentAlignment = Alignment.Center + .fillMaxSize() + .padding(horizontal = 20.dp) ) { - IconButton( - onClick = onBackClick, - modifier = Modifier.align(Alignment.CenterStart) + Box( + modifier = Modifier + .fillMaxWidth() + .height(56.dp), + contentAlignment = Alignment.Center ) { - Icon( - imageVector = Icons.Rounded.KeyboardArrowLeft, - contentDescription = "Back", - tint = Color.LegacyRed - ) - } - - Text( - text = "Amount", - color = Color.LegacyRed, - fontSize = 14.sp, - fontWeight = FontWeight.Bold - ) - } - - Spacer(modifier = Modifier.height(36.dp)) - - Text( - text = "Enter Amount", - color = Color.Gray, - fontSize = 11.sp, - modifier = Modifier.align(Alignment.CenterHorizontally) - ) - - Spacer(modifier = Modifier.height(8.dp)) - - Row( - modifier = Modifier.align(Alignment.CenterHorizontally), - verticalAlignment = Alignment.Bottom - ) { - Text( - text = "MMK", - color = Color.LegacyRed, - fontSize = 13.sp, - fontWeight = FontWeight.Medium, - modifier = Modifier.padding(end = 10.dp, bottom = 6.dp) - ) - - Text( - text = formatAmount(displayAmount), - color = Color.LegacyRed, - fontSize = 32.sp, - fontWeight = FontWeight.Bold - ) - } - - Spacer(modifier = Modifier.height(12.dp)) - - Text( - text = "Enter the amount to charge", - color = Color.Gray, - fontSize = 11.sp, - modifier = Modifier.align(Alignment.CenterHorizontally) - ) - - Spacer(modifier = Modifier.height(28.dp)) - - AmountKeypad( - onNumberClick = { value -> - if (amount.length < 9) { - amount += value + IconButton( + onClick = onBackClick, + modifier = Modifier.align(Alignment.CenterStart) + ) { + Icon( + imageVector = Icons.Rounded.KeyboardArrowLeft, + contentDescription = "Back", + tint = Color.LegacyRed + ) } - }, - onDeleteClick = { - amount = amount.dropLast(1) - } - ) - Spacer(modifier = Modifier.weight(1f)) - - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.spacedBy(12.dp) - ) { - Button( - onClick = { }, - modifier = Modifier - .weight(1f) - .height(56.dp), - shape = RoundedCornerShape(8.dp), - colors = ButtonDefaults.buttonColors( - containerColor = Color.White, - contentColor = Color.LegacyRed + Text( + text = "Amount", + color = Color.LegacyRed, + fontSize = 14.sp, + fontWeight = FontWeight.Bold ) - ) { - Text("Cancel") } - Button( - onClick = { - if (amount.isNotEmpty()) { - onChargeClick(amount) - } - }, - modifier = Modifier - .weight(1f) - .height(56.dp), - enabled = amount.isNotEmpty(), - shape = RoundedCornerShape(8.dp), - colors = ButtonDefaults.buttonColors( - containerColor = Color.LegacyRed, - contentColor = Color.White, - disabledContainerColor = Color.LegacyRed.copy(alpha = 0.5f), - disabledContentColor = Color.White - ) + Spacer(modifier = Modifier.height(36.dp)) + + Text( + text = "Enter Amount", + color = Color.Gray, + fontSize = 11.sp, + modifier = Modifier.align(Alignment.CenterHorizontally) + ) + + Spacer(modifier = Modifier.height(8.dp)) + + Row( + modifier = Modifier.align(Alignment.CenterHorizontally), + verticalAlignment = Alignment.Bottom ) { Text( - text = "Next", - fontSize = 14.sp, - fontWeight = FontWeight.Medium + text = "MMK", + color = Color.LegacyRed, + fontSize = 13.sp, + fontWeight = FontWeight.Medium, + modifier = Modifier.padding(end = 10.dp, bottom = 6.dp) + ) + + Text( + text = formatAmount(displayAmount), + color = Color.LegacyRed, + fontSize = 32.sp, + fontWeight = FontWeight.Bold ) } + + Spacer(modifier = Modifier.height(12.dp)) + + Text( + text = "Enter the amount to charge", + color = Color.Gray, + fontSize = 11.sp, + modifier = Modifier.align(Alignment.CenterHorizontally) + ) + + Spacer(modifier = Modifier.height(28.dp)) + + AmountKeypad( + onNumberClick = { value -> + amount = appendAmountValue(amount, value) + } + ) + + Spacer(modifier = Modifier.weight(1f)) + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + Button( + onClick = { }, + modifier = Modifier + .weight(1f) + .height(56.dp), + shape = RoundedCornerShape(8.dp), + colors = ButtonDefaults.buttonColors( + containerColor = Color.White, + contentColor = Color.LegacyRed + ) + ) { + Text("Cancel") + } + + Button( + onClick = { + if (amount.isNotEmpty()) { + onChargeClick(amount) + } + }, + modifier = Modifier + .weight(1f) + .height(56.dp), + enabled = amount.isNotEmpty(), + shape = RoundedCornerShape(8.dp), + colors = ButtonDefaults.buttonColors( + containerColor = Color.LegacyRed, + contentColor = Color.White, + disabledContainerColor = Color.LegacyRed.copy(alpha = 0.5f), + disabledContentColor = Color.White + ) + ) { + Text( + text = "Next", + fontSize = 14.sp, + fontWeight = FontWeight.Medium + ) + } + } + + Spacer(modifier = Modifier.height(18.dp)) } - Spacer(modifier = Modifier.height(18.dp)) + Card( + modifier = Modifier + .align(Alignment.TopEnd)//? + .padding(top = 110.dp, end = 20.dp) + .clickable(enabled = amount.isNotEmpty()) { + amount = amount.dropLast(1) + }, + shape = RoundedCornerShape(18.dp), + colors = CardDefaults.cardColors(containerColor = Color.White), + elevation = CardDefaults.cardElevation(defaultElevation = 6.dp) + ) { + Icon( + imageVector = Icons.Rounded.Backspace, + contentDescription = "Delete", + tint = if (amount.isNotEmpty()) Color.LegacyRed else Color.Gray, + modifier = Modifier.padding(horizontal = 14.dp, vertical = 12.dp) + ) + } } } @Composable private fun AmountKeypad( - onNumberClick: (String) -> Unit, - onDeleteClick: () -> Unit + onNumberClick: (String) -> Unit ) { val keys = listOf( listOf("1", "2", "3"), listOf("4", "5", "6"), listOf("7", "8", "9"), - listOf("", "0", "00") + listOf(".", "0", "00") ) Column( @@ -186,19 +205,11 @@ private fun AmountKeypad( horizontalArrangement = Arrangement.spacedBy(6.dp) ) { row.forEach { key -> - if (key.isEmpty()) { - Box( - modifier = Modifier - .weight(1f) - .height(66.dp) - ) - } else { - KeypadButton( - text = key, - modifier = Modifier.weight(1f), - onClick = { onNumberClick(key) } - ) - } + KeypadButton( + text = key, + modifier = Modifier.weight(1f), + onClick = { onNumberClick(key) } + ) } } } @@ -237,12 +248,50 @@ private fun KeypadButton( } private fun formatAmount(value: String): String { - val number = value.toLongOrNull() ?: 0L - return "%,d".format(number) + val normalized = value.ifEmpty { "0" } + val wholePart = normalized.substringBefore(".").ifEmpty { "0" } + val groupedWholePart = "%,d".format(wholePart.toLongOrNull() ?: 0L) + + if (!normalized.contains(".")) { + return groupedWholePart + } + + val decimalPart = normalized.substringAfter(".", "") + return if (normalized.endsWith(".")) { + "$groupedWholePart." + } else { + "$groupedWholePart.$decimalPart" + } +} + +private fun appendAmountValue(current: String, value: String): String { + if (value == ".") { + if (current.contains(".")) return current + return if (current.isEmpty()) "0." else "$current." + } + + val decimalIndex = current.indexOf('.') + return if (decimalIndex >= 0) { + val decimalPart = current.substring(decimalIndex + 1) + val remainingDecimalDigits = 2 - decimalPart.length + if (remainingDecimalDigits <= 0) { + current + } else { + current + value.take(remainingDecimalDigits) + } + } else { + val wholeDigitsCount = current.filter(Char::isDigit).length + val remainingWholeDigits = 9 - wholeDigitsCount + if (remainingWholeDigits <= 0) { + current + } else { + current + value.take(remainingWholeDigits) + } + } } @P2Preview @Composable fun PreviewAmountScreen() { AmountScreen { } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardScreen2.kt b/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardScreen2.kt index 1c16ed8..3543c04 100644 --- a/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardScreen2.kt +++ b/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardScreen2.kt @@ -61,10 +61,8 @@ fun DashboardScreen2( private fun AdvertisingArea() { Card( modifier = Modifier.fillMaxWidth(), - shape = RoundedCornerShape(0.dp), colors = CardDefaults.cardColors(containerColor = Color.White), - elevation = CardDefaults.cardElevation(8.dp) ) { Row( modifier = Modifier.height(170.dp) ) {