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
Posting Komentar