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

Postingan populer dari blog ini

Latihan 1 (PBKK)

PPB G - Pertemuan 1

PPB G - Pertemuan 15