Currency Converter - 5025211024

Nama : Widian Sasi Disertasiani

NRP : 5025211024

Kelas : PPB D 

Materi : Membuat aplikasi Currency converter


Gambaran: 


Link Youtube: Demo

Github : Code

Berikut adalah codenya:

package com.example.currencyconverter

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.interaction.collectIsPressedAsState
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowDropDown
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.example.currencyconverter.ui.theme.CurrencyConverterTheme

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
CurrencyConverterTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = Color.White
) {
SimpleCurrencyConverter()
}
}
}
}
}

@Composable
fun SimpleCurrencyConverter() {
var amount by remember { mutableStateOf("") }
var fromCurrency by remember { mutableStateOf("USD") }
var toCurrency by remember { mutableStateOf("Indonesia (IDR)") }
var fromExpanded by remember { mutableStateOf(false) }
var toExpanded by remember { mutableStateOf(false) }
var showResult by remember { mutableStateOf(false) }

val currencyMap = mapOf(
"USD" to "USD",
"Indonesia (IDR)" to "IDR",
"Algeria (DZD)" to "DZD",
"Brazil (BRL)" to "BRL",
"Japan (JPY)" to "JPY",
"Europe (EUR)" to "EUR"
)

val exchangeRates = mapOf(
Pair("USD", "IDR") to 16800.0,
Pair("USD", "DZD") to 134.4,
Pair("USD", "BRL") to 5.12,
Pair("USD", "JPY") to 151.0,
Pair("USD", "EUR") to 0.91
)

var converted by remember { mutableStateOf(0.0) }

Column(
modifier = Modifier
.fillMaxSize()
.padding(24.dp),
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End) {
Text("Contact", color = Color(0xFF00C8A0))
}

Text("Currency", fontSize = 28.sp, color = Color(0xFF005BFF))
Text("Converter", fontSize = 28.sp, color = Color(0xFF005BFF))

// From Dropdown
Text("From")
DropdownSelector(
selected = fromCurrency,
options = currencyMap.keys.toList(),
expanded = fromExpanded,
onExpandedChange = { fromExpanded = it },
onSelect = { fromCurrency = it }
)

// To Dropdown
Text("To")
DropdownSelector(
selected = toCurrency,
options = currencyMap.keys.toList(),
expanded = toExpanded,
onExpandedChange = { toExpanded = it },
onSelect = { toCurrency = it }
)

OutlinedTextField(
value = amount,
onValueChange = { amount = it },
label = { Text("Amount in ${currencyMap[fromCurrency]}") },
keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Number),
modifier = Modifier.fillMaxWidth()
)

val buttonInteractionSource = remember { MutableInteractionSource() }
val buttonPressed by buttonInteractionSource.collectIsPressedAsState()

Button(
onClick = {
val rate = exchangeRates[Pair(fromCurrency, currencyMap[toCurrency])] ?: 1.0
converted = amount.toDoubleOrNull()?.times(rate) ?: 0.0
showResult = true
},
modifier = Modifier
.fillMaxWidth()
.height(50.dp),
colors = ButtonDefaults.buttonColors(
containerColor = if (buttonPressed) Color(0xFF009e82) else Color(0xFF00C8A0)
),
interactionSource = buttonInteractionSource
) {
Text("Convert", color = Color.White)
}

AnimatedVisibility(visible = showResult, enter = fadeIn(), exit = fadeOut()) {
Column {
Text("Result", fontSize = 16.sp)
Text(
text = "%.2f %s".format(converted, currencyMap[toCurrency] ?: ""),
fontSize = 18.sp
)
}
}
}
}

@Composable
fun DropdownSelector(
selected: String,
options: List<String>,
expanded: Boolean,
onExpandedChange: (Boolean) -> Unit,
onSelect: (String) -> Unit
) {
val interactionSource = remember { MutableInteractionSource() }
val isPressed by interactionSource.collectIsPressedAsState()

Box {
OutlinedTextField(
value = selected,
onValueChange = {},
readOnly = true,
modifier = Modifier
.fillMaxWidth()
.background(if (isPressed) Color(0xFFF0F0F0) else Color.Transparent),
trailingIcon = {
Icon(Icons.Default.ArrowDropDown, contentDescription = null)
},
interactionSource = interactionSource
)

DropdownMenu(
expanded = expanded,
onDismissRequest = { onExpandedChange(false) }
) {
options.forEach {
DropdownMenuItem(
text = { Text(it) },
onClick = {
onSelect(it)
onExpandedChange(false)
}
)
}
}

Spacer(
modifier = Modifier
.matchParentSize()
.clickable { onExpandedChange(true) }
)
}
}

Komentar

Postingan populer dari blog ini

Tugas 2 - PPB D

Tugas 5 - Simple Calculator