package com.example.currencyconverter
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import java.text.NumberFormat
import java.util.Locale
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
CurrencyConverterTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
CurrencyConverterApp()
}
}
}
}
}
@Composable
fun CurrencyConverterTheme(content: @Composable () -> Unit) {
MaterialTheme(
colorScheme = darkColorScheme(),
content = content
)
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun CurrencyConverterApp() {
val exchangeRates = remember {
mapOf(
"USD" to 1.0,
"IDR" to 16450.75,
"EUR" to 0.93,
"JPY" to 159.80,
"SGD" to 1.35,
"MYR" to 4.71,
"SAR" to 3.75
)
}
val currencies = remember { exchangeRates.keys.toList() }
var amount by remember { mutableStateOf("") }
var fromCurrency by remember { mutableStateOf("USD") }
var toCurrency by remember { mutableStateOf("IDR") }
var convertedAmount by remember { mutableStateOf<Double?>(null) }
var fromExpanded by remember { mutableStateOf(false) }
var toExpanded by remember { mutableStateOf(false) }
fun convert() {
val amountValue = amount.toDoubleOrNull()
if (amountValue != null) {
val fromRate = exchangeRates[fromCurrency] ?: 1.0
val toRate = exchangeRates[toCurrency] ?: 1.0
convertedAmount = (amountValue / fromRate) * toRate
} else {
convertedAmount = null
}
}
LaunchedEffect(amount, fromCurrency, toCurrency) {
convert()
}
Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Text(
text = "Konverter Mata Uang",
style = MaterialTheme.typography.headlineMedium,
modifier = Modifier.padding(bottom = 24.dp)
)
OutlinedTextField(
value = amount,
onValueChange = {
if (it.matches(Regex("^\\d*\\.?\\d*\$"))) {
amount = it
}
},
label = { Text("Jumlah") },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
modifier = Modifier.fillMaxWidth()
)
Spacer(modifier = Modifier.height(16.dp))
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpfaceAround,
verticalAlignment = Alignment.CenterVertically
) {
Box(modifier = Modifier.weight(1f)) {
ExposedDropdownMenuBox(
expanded = fromExpanded,
onExpandedChange = { fromExpanded = !fromExpanded }
) {
OutlinedTextField(
value = fromCurrency,
onValueChange = {},
readOnly = true,
label = { Text("Dari") },
trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = fromExpanded) },
modifier = Modifier.menuAnchor()
)
ExposedDropdownMenu(
expanded = fromExpanded,
onDismissRequest = { fromExpanded = false }
) {
currencies.forEach { currency ->
DropdownMenuItem(
text = { Text(currency) },
onClick = {
fromCurrency = currency
fromExpanded = false
}
)
}
}
}
}
Spacer(modifier = Modifier.width(16.dp))
Box(modifier = Modifier.weight(1f)) {
ExposedDropdownMenuBox(
expanded = toExpanded,
onExpandedChange = { toExpanded = !toExpanded }
) {
OutlinedTextField(
value = toCurrency,
onValueChange = {},
readOnly = true,
label = { Text("Ke") },
trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = toExpanded) },
modifier = Modifier.menuAnchor()
)
ExposedDropdownMenu(
expanded = toExpanded,
onDismissRequest = { toExpanded = false }
) {
currencies.forEach { currency ->
DropdownMenuItem(
text = { Text(currency) },
onClick = {
toCurrency = currency
toExpanded = false
}
)
}
}
}
}
}
Spacer(modifier = Modifier.height(32.dp))
if (convertedAmount != null) {
val formattedResult = NumberFormat.getNumberInstance(Locale.getDefault()).apply {
maximumFractionDigits = 2
}.format(convertedAmount)
Text(
text = "Hasil Konversi:",
style = MaterialTheme.typography.titleMedium
)
Spacer(modifier = Modifier.height(8.dp))
Text(
text = "$formattedResult $toCurrency",
style = MaterialTheme.typography.headlineLarge,
textAlign = TextAlign.Center,
color = MaterialTheme.colorScheme.primary
)
} else if (amount.isNotEmpty()) {
Text(
text = "Masukkan jumlah yang valid",
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.error
)
}
}
}
@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
CurrencyConverterTheme {
CurrencyConverterApp()
}
}
Komentar
Posting Komentar