PPB G - Pertemuan 13
Nama: Moh. rosy haqqy aminy
NRP: 5025211012
Kelas: PPB G
Membuat Dessert clicker app
link github: https://github.com/rosyhaqqy/Tugas_Tugas_PPB/tree/main/dessert_clicker
1. MainActivity.kt
Ini adalah entry point aplikasi.
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge()
super.onCreate(savedInstanceState)
Log.d(TAG, "onCreate Called") // Log saat activity dibuat
setContent {
DessertClickerTheme { // Menerapkan tema
Surface(
modifier = Modifier
.fillMaxSize()
.statusBarsPadding(),
) {
// Memanggil fungsi utama UI
DessertClickerApp(desserts = Datasource.dessertList)
}
}
}
}
// Lifecycle logging untuk debugging
override fun onStart() { ... }
override fun onResume() { ... }
override fun onRestart() { ... }
override fun onPause() { ... }
override fun onStop() { ... }
override fun onDestroy() { ... }
}
2. Fungsi determineDessertToShow
Menentukan gambar dan harga dessert berdasarkan jumlah yang sudah terjual.
fun determineDessertToShow(desserts: List<Dessert>, dessertsSold: Int): Dessert {
var dessertToShow = desserts.first()
for (dessert in desserts) {
if (dessertsSold >= dessert.startProductionAmount) {
dessertToShow = dessert // update jika memenuhi syarat
} else {
break // karena list sudah terurut, cukup sampai sini
}
}
return dessertToShow
}
3. Fungsi shareSoldDessertsInformation
Untuk membagikan data penjualan ke aplikasi lain (misalnya WhatsApp atau Email).
private fun shareSoldDessertsInformation(context: Context, dessertsSold: Int, revenue: Int) {
val sendIntent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, context.getString(R.string.share_text, dessertsSold, revenue))
type = "text/plain"
}
val shareIntent = Intent.createChooser(sendIntent, null)
try {
ContextCompat.startActivity(context, shareIntent, null)
} catch (e: ActivityNotFoundException) {
Toast.makeText(context, context.getString(R.string.sharing_not_available), Toast.LENGTH_LONG).show()
}
}
4. Fungsi DessertClickerApp
Fungsi utama UI aplikasi.
@Composable
fun DessertClickerApp(desserts: List<Dessert>) {
var revenue by rememberSaveable { mutableStateOf(0) } // total uang
var dessertsSold by rememberSaveable { mutableStateOf(0) } // jumlah dessert
var currentDessertPrice by rememberSaveable { mutableStateOf(desserts[0].price) }
var currentDessertImageId by rememberSaveable { mutableStateOf(desserts[0].imageId) }
Scaffold(
topBar = {
DessertClickerAppBar(
onShareButtonClicked = { shareSoldDessertsInformation(LocalContext.current, dessertsSold, revenue) }
)
}
) { padding ->
DessertClickerScreen(
revenue = revenue,
dessertsSold = dessertsSold,
dessertImageId = currentDessertImageId,
onDessertClicked = {
revenue += currentDessertPrice
dessertsSold++
val newDessert = determineDessertToShow(desserts, dessertsSold)
currentDessertPrice = newDessert.price
currentDessertImageId = newDessert.imageId
},
modifier = Modifier.padding(padding)
)
}
}
5. DessertClickerAppBar
Menampilkan nama aplikasi dan tombol share.
@Composable
fun DessertClickerAppBar(onShareButtonClicked: () -> Unit, modifier: Modifier = Modifier) {
Row(
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
modifier = modifier
) {
Text(text = stringResource(R.string.app_name), style = MaterialTheme.typography.titleLarge)
IconButton(onClick = onShareButtonClicked) {
Icon(imageVector = Icons.Filled.Share, contentDescription = stringResource(R.string.share))
}
}
}
6. DessertClickerScreen
Bagian utama yang menampilkan gambar dessert dan info penjualan.
@Composable
fun DessertClickerScreen(
revenue: Int,
dessertsSold: Int,
@DrawableRes dessertImageId: Int,
onDessertClicked: () -> Unit,
modifier: Modifier = Modifier
) {
Box(modifier = modifier) {
Image(painter = painterResource(R.drawable.bakery_back), contentDescription = null)
Column {
Box(modifier = Modifier.weight(1f).fillMaxWidth()) {
Image(
painter = painterResource(dessertImageId),
contentDescription = null,
modifier = Modifier
.width(dimensionResource(R.dimen.image_size))
.height(dimensionResource(R.dimen.image_size))
.align(Alignment.Center)
.clickable { onDessertClicked() }
)
}
TransactionInfo(revenue, dessertsSold)
}
}
}
7. TransactionInfo, RevenueInfo, DessertsSoldInfo
Menampilkan info total pendapatan dan jumlah dessert terjual.
@Composable
fun TransactionInfo(revenue: Int, dessertsSold: Int, modifier: Modifier = Modifier) {
Column(modifier = modifier) {
DessertsSoldInfo(dessertsSold)
RevenueInfo(revenue)
}
}
@Composable
fun DessertsSoldInfo(dessertsSold: Int, modifier: Modifier = Modifier) {
Row(horizontalArrangement = Arrangement.SpaceBetween) {
Text(text = "Desserts sold:")
Text(text = dessertsSold.toString())
}
}
@Composable
fun RevenueInfo(revenue: Int, modifier: Modifier = Modifier) {
Row(horizontalArrangement = Arrangement.SpaceBetween) {
Text(text = "Total revenue:")
Text(text = "$$revenue")
}
}
8. Datasource.kt
Berisi daftar dessert (gambar, harga, dan kapan mulai muncul).
object Datasource {
val dessertList = listOf(
Dessert(R.drawable.cupcake, 5, 0),
Dessert(R.drawable.donut, 10, 5),
Dessert(R.drawable.eclair, 15, 20),
...
Dessert(R.drawable.oreo, 6000, 20000)
)
}
9. model/Dessert.kt
Model data Dessert
.
data class Dessert(
val imageId: Int, // ID gambar dari resource
val price: Int, // harga setiap dessert
val startProductionAmount: Int // muncul saat jumlah penjualan mencukupi
)
Komentar
Posting Komentar