Tugas 7 Desert Click

Nama : Heru Dwi Kurniawan

Kelas: PPB B

NRP : 5025211055 

Tugas Membuat Aplikasi Dessert Click

- Membuat Aplikasi Clicker Kue:

   Aplikasi Clicker Kue adalah sebuah aplikasi sederhana yang memungkinkan pengguna untuk memperoleh kue dengan mengetuk gambar kue yang muncul di layar. Dengan setiap ketukan, informasi tentang jumlah kue yang telah diperoleh dan total pemasukan dari penjualan kue akan diperbarui.

- Penambahan Fungsionalitas Log Sederhana:

   - Langkah ini melibatkan peningkatan kemampuan logging pada aplikasi menggunakan logcat. Ini membantu dalam memantau jalannya kode dan mencatat peristiwa yang terjadi selama proses pengembangan.

   - Untuk mencapai ini, konstanta TAG digunakan untuk membedakan log, dan pesan logging sederhana seperti "onCreate Dipanggil" dimasukkan ke dalam metode `onCreate()` pada aktivitas utama.


- Implementasi Metode Siklus Hidup `onStart()`:

   - Metode siklus hidup `onStart()` digunakan untuk mengelola aktivitas saat aplikasi mulai terlihat oleh pengguna. Di sini, pesan logging "onStart Dipanggil" ditambahkan ke dalam metode `onStart()` untuk mencatat awalnya aktivitas tersebut.


- Manajemen Logging Lainnya:

   - Metode siklus hidup lainnya seperti `onResume`, `onRestart`, `onPause`, `onStop`, dan `onDestroy` juga ditinjau, dan pesan logging yang sesuai dimasukkan ke dalam masing-masing metode. Ini membantu dalam melacak interaksi aplikasi dengan pengguna dan perubahan statusnya.


- Pemahaman Kasus Penggunaan Siklus Hidup:

   - Langkah ini mencakup pemahaman tentang bagaimana metode siklus hidup berperan dalam skenario tertentu, termasuk pembukaan dan penutupan aktivitas serta navigasi antara aplikasi.

   - Melalui logcat, pengembang dapat mengamati urutan panggilan metode siklus hidup dan memahami perilaku aplikasi dalam situasi yang berbeda.


- Penanganan Perubahan Konfigurasi:

   - Perubahan konfigurasi seperti rotasi layar atau perubahan bahasa dapat memengaruhi tampilan dan data dalam aplikasi.

   - Pemahaman tentang bagaimana aplikasi menangani perubahan konfigurasi dan bagaimana data dipertahankan atau dipulihkan setelah perubahan tersebut penting untuk diperhatikan.


- Implementasi Siklus Hidup pada Komponen:

   - Dalam pengembangan dengan Jetpack Compose, pemahaman tentang bagaimana siklus hidup memengaruhi komposisi elemen UI sangatlah penting.

   - Dengan menggunakan `rememberSaveable`, aplikasi dapat mengelola pemulihan data secara efektif, terutama saat terjadi perubahan konfigurasi seperti rotasi layar.


package com.example.dessertclicker


import android.content.ActivityNotFoundException

import android.content.Context

import android.content.Intent

import android.os.Bundle

import android.util.Log

import android.widget.Toast

import androidx.activity.ComponentActivity

import androidx.activity.compose.setContent

import androidx.activity.enableEdgeToEdge

import androidx.annotation.DrawableRes

import androidx.compose.foundation.Image

import androidx.compose.foundation.background

import androidx.compose.foundation.clickable

import androidx.compose.foundation.layout.*

import androidx.compose.foundation.layout.fillMaxSize

import androidx.compose.foundation.layout.fillMaxWidth

import androidx.compose.foundation.layout.height

import androidx.compose.foundation.layout.width

import androidx.compose.foundation.layout.padding

import androidx.compose.foundation.layout.calculateEndPadding

import androidx.compose.foundation.layout.calculateStartPadding

import androidx.compose.foundation.layout.statusBarsPadding

import androidx.compose.material3.Scaffold

import androidx.compose.material3.Icon

import androidx.compose.material3.IconButton

import androidx.compose.material3.MaterialTheme

import androidx.compose.material3.Text

import androidx.compose.runtime.Composable

import androidx.compose.runtime.getValue

import androidx.compose.runtime.mutableStateOf

import androidx.compose.runtime.saveable.rememberSaveable

import androidx.compose.runtime.setValue

import androidx.compose.ui.Alignment

import androidx.compose.ui.Modifier

import androidx.compose.ui.layout.ContentScale

import androidx.compose.ui.platform.LocalContext

import androidx.compose.ui.platform.LocalLayoutDirection

import androidx.compose.ui.res.dimensionResource

import androidx.compose.ui.res.painterResource

import androidx.compose.ui.res.stringResource

import androidx.compose.ui.text.style.TextAlign

import androidx.compose.ui.tooling.preview.Preview

import androidx.compose.ui.unit.sp

import androidx.core.content.ContextCompat

import com.example.dessertclicker.data.Datasource

import com.example.dessertclicker.model.Dessert

import com.example.dessertclicker.ui.theme.DessertClickerTheme


// Tag untuk logging

private const val TAG = "MainActivity"


class MainActivity : ComponentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {

        enableEdgeToEdge()

        super.onCreate(savedInstanceState)

        Log.d(TAG, "onCreate Dipanggil")

        setContent {

            DessertClickerTheme {

                // Wadah permukaan menggunakan warna 'background' dari tema

                Surface(

                    modifier = Modifier

                        .fillMaxSize()

                        .statusBarsPadding(),

                ) {

                    DessertClickerApp(desserts = Datasource.dessertList)

                }

            }

        }

    }


    override fun onStart() {

        super.onStart()

        Log.d(TAG, "onStart Dipanggil")

    }


    override fun onResume() {

        super.onResume()

        Log.d(TAG, "onResume Dipanggil")

    }


    override fun onRestart() {

        super.onRestart()

        Log.d(TAG, "onRestart Dipanggil")

    }


    override fun onPause() {

        super.onPause()

        Log.d(TAG, "onPause Dipanggil")

    }


    override fun onStop() {

        super.onStop()

        Log.d(TAG, "onStop Dipanggil")

    }


    override fun onDestroy() {

        super.onDestroy()

        Log.d(TAG, "onDestroy Dipanggil")

    }

}


// Untuk menentukan makanan penutup mana yang akan ditampilkan.


fun tentukanMakananPenutupYangAkanDitampilkan(

    desserts: List<Dessert>,

    dessertsSold: Int

): Dessert {

    var dessertToShow = desserts.first()

    for (dessert in desserts) {

        if (dessertsSold >= dessert.startProductionAmount) {

            dessertToShow = dessert

        } else {

            break

        }

    }


    return dessertToShow

}


// Untuk membagikan informasi makanan penutup yang terjual menggunakan intent ACTION_SEND


private fun bagikanInformasiMakananPenutupTerjual(intentContext: Context, dessertsSold: Int, revenue: Int) {

    val sendIntent = Intent().apply {

        action = Intent.ACTION_SEND

        putExtra(

            Intent.EXTRA_TEXT,

            intentContext.getString(R.string.share_text, dessertsSold, revenue)

        )

        type = "text/plain"

    }


    val shareIntent = Intent.createChooser(sendIntent, null)


    try {

        ContextCompat.startActivity(intentContext, shareIntent, null)

    } catch (e: ActivityNotFoundException) {

        Toast.makeText(

            intentContext,

            intentContext.getString(R.string.sharing_not_available),

            Toast.LENGTH_LONG

        ).show()

    }

}


@Composable

private fun DessertClickerApp(

    desserts: List<Dessert>

) {


    var revenue by rememberSaveable { mutableStateOf(0) }

    var dessertsSold by rememberSaveable { mutableStateOf(0) }


    val currentDessertIndex by rememberSaveable { mutableStateOf(0) }


    var currentDessertPrice by rememberSaveable {

        mutableStateOf(desserts[currentDessertIndex].price)

    }

    var currentDessertImageId by rememberSaveable {

        mutableStateOf(desserts[currentDessertIndex].imageId)

    }


    Scaffold(

        topBar = {

            val intentContext = LocalContext.current

            val layoutDirection = LocalLayoutDirection.current

            DessertClickerAppBar(

                onShareButtonClicked = {

                    bagikanInformasiMakananPenutupTerjual(

                        intentContext = intentContext,

                        dessertsSold = dessertsSold,

                        revenue = revenue

                    )

                },

                modifier = Modifier

                    .fillMaxWidth()

                    .padding(

                        start = WindowInsets.safeDrawing.asPaddingValues()

                            .calculateStartPadding(layoutDirection),

                        end = WindowInsets.safeDrawing.asPaddingValues()

                            .calculateEndPadding(layoutDirection),

                    )

                    .background(MaterialTheme.colorScheme.primary)

            )

        }

    ) { contentPadding ->

        DessertClickerScreen(

            revenue = revenue,

            dessertsSold = dessertsSold,

            dessertImageId = currentDessertImageId,

            onDessertClicked = {


                // Perbarui pendapatan

                revenue += currentDessertPrice

                dessertsSold++


                // Tampilkan makanan penutup berikutnya

                val dessertToShow = tentukanMakananPenutupYangAkanDitampilkan(desserts, dessertsSold)

                currentDessertImageId = dessertToShow.imageId

                currentDessertPrice = dessertToShow.price

            },

            modifier = Modifier.padding(contentPadding)

        )

    }

}


@Composable

private fun Dess



Hasil




Komentar

Postingan populer dari blog ini

Tugas Apsi 1 ( APSI E )

Tugas 1 - PBB B

Tugas 2