Tugas Week 13 - PPB G - 5025221040

 

Tugas 10: Membuat Aplikasi Dessert Clicker

Nama    : Genta Putra Prayoga
NRP      : 5025221040
Kelas     : G

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

  1. Modern Architecture: Menggunakan Jetpack Compose dan modern Android practices
  2. Clean Code: Kode terstruktur dengan baik dan mudah dibaca
  3. State Management: Implementasi state yang robust dan persistent
  4. User Experience: Interface yang responsif dan intuitif
  5. Scalability: Mudah untuk menambah fitur baru

⚠️ Areas for Improvement

  1. Data Persistence: Belum ada penyimpanan permanent ke database
  2. Game Balance: Algoritma progression bisa lebih kompleks
  3. Animations: Bisa ditambahkan animasi untuk interaksi
  4. Sound Effects: Audio feedback untuk klik
  5. 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

Postingan populer dari blog ini

Tugas 1 - Perkembangan Teknologi Perangkat Bergerak

Tugas Week 6 - PPB G - 5025221040

Tugas Week 15 - PPB G - 5025221040