Tugas Week 13 - PPB G - 5025221040
Tugas 10: Membuat Aplikasi Dessert Clicker
Nama : Genta Putra PrayogaNRP : 5025221040Kelas : G
Link Github: raymrichigat/ppb-g-tugas10
Membangun Aplikasi Dessert Clicker dengan Jetpack Compose: Analisis Kode dan Implementasi
Pendahuluan
Aplikasi Dessert Clicker adalah sebuah game sederhana berbasis Android yang dibangun menggunakan Jetpack Compose. Aplikasi ini mendemonstrasikan konsep-konsep penting dalam pengembangan Android modern, termasuk state management, lifecycle methods, dan modern UI toolkit. Dalam artikel ini, kita akan menganalisis struktur kode, fitur-fitur utama, dan implementasi teknis dari aplikasi tersebut.
Overview Aplikasi
Dessert Clicker adalah aplikasi game kliker sederhana di mana pengguna dapat:
- Mengklik gambar dessert untuk mendapatkan poin
- Mengumpulkan revenue dari setiap klik
- Membuka dessert baru seiring bertambahnya penjualan
- Membagikan pencapaian melalui fitur sharing
Arsitektur dan Struktur Kode
1. MainActivity - Entry Point Aplikasi
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge()
super.onCreate(savedInstanceState)
Log.d(TAG, "onCreate Called")
setContent {
DessertClickerTheme {
Surface(
modifier = Modifier
.fillMaxSize()
.statusBarsPadding(),
) {
DessertClickerApp(desserts = Datasource.dessertList)
}
}
}
}
}
MainActivity menggunakan ComponentActivity
sebagai base class dan mengimplementasikan semua lifecycle methods dengan logging untuk debugging. Fitur-fitur utama:
- Edge-to-Edge Design: Menggunakan
enableEdgeToEdge()
untuk tampilan modern - Jetpack Compose Integration: Menggunakan
setContent
untuk mengatur UI - Lifecycle Logging: Setiap lifecycle method memiliki log untuk monitoring
2. State Management dengan Compose
Aplikasi ini menggunakan pendekatan state management yang efektif:
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)
}
Keunggulan implementasi state:
- Persistent State: Menggunakan
rememberSaveable
untuk menjaga state saat configuration change - Reactive UI: State changes otomatis memicu recomposition
- Type Safety: Kotlin's type system memastikan keamanan data
3. Logika Bisnis - Algoritma Dessert
Fungsi determineDessertToShow
mengimplementasikan logika progresif game:
fun determineDessertToShow(
desserts: List<Dessert>,
dessertsSold: Int
): Dessert {
var dessertToShow = desserts.first()
for (dessert in desserts) {
if (dessertsSold >= dessert.startProductionAmount) {
dessertToShow = dessert
} else {
break
}
}
return dessertToShow
}
Fitur algoritma:
- Progressive Unlocking: Dessert baru terbuka berdasarkan jumlah penjualan
- Optimized Search: Loop berhenti saat kondisi tidak terpenuhi
- Scalable Design: Mudah menambah dessert baru
4. Fitur Sharing
Implementasi sharing menggunakan Android Intent system:
private fun shareSoldDessertsInformation(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()
}
}
Keunggulan implementasi sharing:
- Universal Compatibility: Menggunakan ACTION_SEND standard
- Error Handling: Try-catch untuk menangani app tidak tersedia
- User Feedback: Toast message untuk notifikasi error
Komponen UI dengan Jetpack Compose
1. App Bar Component
@Composable
private fun DessertClickerAppBar(
onShareButtonClicked: () -> Unit,
modifier: Modifier = Modifier
) {
Row(
modifier = modifier,
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = stringResource(R.string.app_name),
color = MaterialTheme.colorScheme.onPrimary,
style = MaterialTheme.typography.titleLarge,
)
IconButton(onClick = onShareButtonClicked) {
Icon(
imageVector = Icons.Filled.Share,
contentDescription = stringResource(R.string.share),
tint = MaterialTheme.colorScheme.onPrimary
)
}
}
}
2. Main Screen Layout
Screen utama menggunakan Scaffold
untuk layout standar Material Design:
Scaffold(
topBar = {
DessertClickerAppBar(
onShareButtonClicked = {
shareSoldDessertsInformation(
intentContext = intentContext,
dessertsSold = dessertsSold,
revenue = revenue
)
}
)
}
) { contentPadding ->
DessertClickerScreen(
revenue = revenue,
dessertsSold = dessertsSold,
dessertImageId = currentDessertImageId,
onDessertClicked = { /* Click handler */ },
modifier = Modifier.padding(contentPadding)
)
}
3. Game Interface
Interface game menggunakan kombinasi Box
, Column
, dan Image
:
Box(modifier = modifier) {
Image(
painter = painterResource(R.drawable.bakery_back),
contentDescription = null,
contentScale = ContentScale.Crop
)
Column {
Box(modifier = Modifier.weight(1f).fillMaxWidth()) {
Image(
painter = painterResource(dessertImageId),
contentDescription = null,
modifier = Modifier
.align(Alignment.Center)
.clickable { onDessertClicked() }
)
}
TransactionInfo(
revenue = revenue,
dessertsSold = dessertsSold
)
}
}
Best Practices yang Diterapkan
1. Separation of Concerns
- UI logic terpisah dari business logic
- State management terpusat
- Reusable components
2. Modern Android Development
- Jetpack Compose untuk UI
- Material Design 3 theming
- Edge-to-edge design
3. Error Handling
- Try-catch untuk Intent operations
- Graceful degradation untuk fitur sharing
- User feedback melalui Toast
4. Performance Optimization
rememberSaveable
untuk efficient state management- Lazy evaluation dalam algoritma dessert
- Optimized recomposition
5. Accessibility
- Content descriptions untuk images
- Semantic UI structure
- Proper color contrast with Material theming
Keunggulan Implementasi
✅ Strengths
- Modern Architecture: Menggunakan Jetpack Compose dan modern Android practices
- Clean Code: Kode terstruktur dengan baik dan mudah dibaca
- State Management: Implementasi state yang robust dan persistent
- User Experience: Interface yang responsif dan intuitif
- Scalability: Mudah untuk menambah fitur baru
⚠️ Areas for Improvement
- Data Persistence: Belum ada penyimpanan permanent ke database
- Game Balance: Algoritma progression bisa lebih kompleks
- Animations: Bisa ditambahkan animasi untuk interaksi
- Sound Effects: Audio feedback untuk klik
- Settings: Opsi kustomisasi untuk user
Kesimpulan
Aplikasi Dessert Clicker mendemonstrasikan implementasi yang solid dari konsep-konsep penting dalam pengembangan Android modern. Dengan menggunakan Jetpack Compose, aplikasi ini menunjukkan bagaimana membangun UI yang reaktif dan performant.
State management yang efektif, arsitektur yang bersih, dan implementasi fitur sharing yang robust membuat aplikasi ini menjadi contoh yang baik untuk dipelajari oleh developer Android.
Kode ini cocok untuk:
- Pembelajaran: Memahami Jetpack Compose dan state management
- Prototype: Base untuk game kliker yang lebih kompleks
- Tutorial: Demonstrasi best practices Android development
Teknologi yang Digunakan
- Kotlin: Primary programming language
- Jetpack Compose: Modern UI toolkit
- Material Design 3: Design system
- Android Architecture Components: Lifecycle, State management
- Android Intent System: Sharing functionality
Komentar
Posting Komentar