From 253cc3a6bb79359719f736a27eb71d2bba3d7220 Mon Sep 17 00:00:00 2001 From: RafiFattan23 Date: Fri, 7 Nov 2025 12:59:51 +0700 Subject: [PATCH] revisi terbaru --- README.md | 80 +++++++++---------- .../java/com/example/tiptime/MainActivity.kt | 40 +++++++++- .../com/example/tiptime/SplashActivity.kt | 8 +- app/src/main/res/drawable/circle_bg.xml | 6 ++ app/src/main/res/drawable/splash_gradient.xml | 12 +-- app/src/main/res/layout/activity_splash.xml | 48 ++++++----- app/src/main/res/values/colors.xml | 16 ++++ .../java/com/example/tiptime/BmiUnitTest.kt | 13 ++- 8 files changed, 131 insertions(+), 92 deletions(-) create mode 100644 app/src/main/res/drawable/circle_bg.xml create mode 100644 app/src/main/res/values/colors.xml diff --git a/README.md b/README.md index 5744b33..3ef789f 100644 --- a/README.md +++ b/README.md @@ -2,67 +2,61 @@ **Dibuat oleh:** ๐Ÿ‘จโ€๐Ÿ’ป **Rafi Fattan Fitriardi** -๐Ÿ†” **NPM: 202310715002** -๐Ÿซ **Pemrograman Perangkat Bergerak - F5A5** +๐Ÿ†” **NPM:** 202310715002 +๐Ÿซ **Kelas:** Pemrograman Perangkat Bergerak - F5A5 --- ## ๐Ÿ“– Deskripsi Aplikasi Aplikasi **Kalkulator BMI (Body Mass Index)** ini dibuat sebagai proyek akhir mata kuliah **Pemrograman Perangkat Bergerak**. -Tujuan utama aplikasi ini adalah membantu pengguna menghitung **Indeks Massa Tubuh (BMI)** berdasarkan **berat badan (kg)** dan **tinggi badan (cm)** untuk mengetahui apakah berat badan tergolong **kurang, ideal, berlebih, atau obesitas**. +Tujuannya adalah membantu pengguna menghitung **Indeks Massa Tubuh (BMI)** berdasarkan **berat badan (kg/lbs)** dan **tinggi badan (cm/inci)** agar dapat mengetahui apakah berat badan tergolong **kurang, ideal, berlebih, atau obesitas**. -Aplikasi ini memiliki **dua halaman utama**: -1. **Halaman Biodata Pengembang** โ€“ menampilkan informasi pembuat aplikasi (nama, NIM, kelas, dan foto), serta tombol **โ€œMULAIโ€** untuk berpindah ke laman utama. -2. **Halaman Utama (Kalkulator BMI)** โ€“ tempat pengguna menginput berat dan tinggi badan, menekan tombol **โ€œHitung BMIโ€**, lalu melihat hasil nilai BMI beserta kategori dan saran kesehatannya. +Aplikasi memiliki **dua halaman utama**: + +1. ๐Ÿง‘โ€๐Ÿ’ป **Halaman Biodata Pengembang** + Menampilkan informasi pengembang (nama, NIM, kelas, dan foto), serta tombol **โ€œMULAIโ€** untuk berpindah ke halaman utama. + +2. โš–๏ธ **Halaman Utama (Kalkulator BMI)** + Pengguna dapat menginput berat dan tinggi badan, menekan tombol **โ€œHitung BMIโ€**, dan melihat hasil nilai BMI beserta **kategori serta saran kesehatannya**. --- ## โš™๏ธ Fitur Utama -- Input berat dan tinggi badan secara interaktif (bisa satuan SI atau USC). -- Perhitungan otomatis nilai BMI. -- Tampilan kategori hasil (Kurus, Normal, Gemuk, Obesitas). -- Antarmuka sederhana dan responsif. -- Navigasi antarhalaman menggunakan tombol **MULAI** dari halaman biodata. +- โœ๏ธ Input berat dan tinggi badan secara interaktif (bisa satuan **SI** atau **USC**). +- ๐Ÿงฎ Perhitungan otomatis nilai BMI dengan opsi pembulatan hasil. +- ๐Ÿ“Š Tampilan kategori hasil (Kurus, Normal, Gemuk, Obesitas). +- ๐ŸŽจ Antarmuka sederhana, bersih, dan responsif menggunakan **Jetpack Compose**. +- ๐Ÿ”„ Navigasi antarhalaman dengan tombol **MULAI** dari halaman biodata. --- ## ๐Ÿงฉ Teknologi yang Digunakan -- **Android Studio (Kotlin)** -- **XML Layouts** untuk desain antarmuka -- **Intent** untuk navigasi antar activity -- **Drawable XML** untuk gradasi dan tema warna aplikasi - ---- - -## ๐Ÿ’ก Struktur Proyek -``` -app/ - โ”œโ”€โ”€ java/com/example/bmiapp/ - โ”‚ โ”œโ”€โ”€ SplashActivity.kt // Halaman biodata pengembang - โ”‚ โ”œโ”€โ”€ MainActivity.kt // Halaman utama kalkulator BMI - โ”‚ - โ”œโ”€โ”€ res/ - โ”‚ โ”œโ”€โ”€ layout/ - โ”‚ โ”‚ โ”œโ”€โ”€ activity_splash.xml - โ”‚ โ”‚ โ”œโ”€โ”€ activity_main.xml - โ”‚ โ”œโ”€โ”€ drawable/ - โ”‚ โ”‚ โ”œโ”€โ”€ splash_gradient.xml - โ”‚ โ”œโ”€โ”€ mipmap/ - โ”‚ โ”‚ โ”œโ”€โ”€ ic_launcher.png // Ikon aplikasi - โ”‚ โ”‚ โ”œโ”€โ”€ ic_launcher_round.png - โ”‚ โ”œโ”€โ”€ values/ - โ”‚ โ”œโ”€โ”€ colors.xml - โ”‚ โ”œโ”€โ”€ strings.xml - โ”‚ โ”œโ”€โ”€ themes.xml - โ”‚ - โ””โ”€โ”€ AndroidManifest.xml -``` +- ๐Ÿ’ป **Android Studio (Kotlin)** +- ๐Ÿงฑ **Jetpack Compose** & **XML Layouts** untuk desain antarmuka +- ๐Ÿ”— **Intent** untuk navigasi antar activity +- ๐ŸŽจ **Drawable XML & colors.xml** untuk tema warna dan efek gradasi +- ๐Ÿงช **Unit Test (disarankan)** untuk menguji akurasi perhitungan BMI --- ## ๐Ÿง  Kontribusi & Kredit -Aplikasi ini dikembangkan dengan bantuan **ChatGPT (OpenAI)** dalam pembuatan kode, desain antarmuka, dan penyusunan dokumentasi. -Semua logika, pengujian, dan penyempurnaan dilakukan secara mandiri oleh pengembang. +Aplikasi ini dikembangkan dengan bantuan **ChatGPT (OpenAI)** dalam pembuatan kode, desain antarmuka, dan dokumentasi. +Semua logika perhitungan, pengujian, dan penyempurnaan dilakukan mandiri oleh pengembang. --- +## ๐Ÿ•“ Change Log (Ringkas) +- โœ… **Migrasi kode dasar** dari kalkulator tip ke kalkulator BMI berbasis Kotlin Compose. +- โš™๏ธ **Penambahan mode satuan USC (Inci & Lbs)** dengan validasi tinggi minimal 4 inci. +- ๐Ÿงฎ **Perbaikan rumus perhitungan BMI** agar sesuai standar WHO. +- ๐ŸŽจ **Desain ulang Splash Screen** dengan tombol โ€œMULAIโ€ berwarna hijau dan latar gradasi biru-hijau. +- ๐Ÿš€ **Optimalisasi UX** โ€” hasil BMI hanya muncul setelah tombol **โ€œHitung BMIโ€** ditekan. +- ๐Ÿงฐ **Penambahan file `colors.xml` dan drawable gradient** untuk tema. + +--- + +## ๐Ÿ“œ Lisensi +Proyek ini dibuat untuk tujuan pembelajaran dalam mata kuliah **Pemrograman Perangkat Bergerak** dan tidak untuk tujuan komersial. +Lisensi mengikuti [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). + +--- diff --git a/app/src/main/java/com/example/tiptime/MainActivity.kt b/app/src/main/java/com/example/tiptime/MainActivity.kt index 799ad15..93c3019 100644 --- a/app/src/main/java/com/example/tiptime/MainActivity.kt +++ b/app/src/main/java/com/example/tiptime/MainActivity.kt @@ -45,14 +45,13 @@ fun BmiCalculatorLayout() { var weightInput by remember { mutableStateOf("") } var useMetricSystem by remember { mutableStateOf(true) } // โœ… toggle sistem satuan var errorMessage by remember { mutableStateOf("") } - var showResult by remember { mutableStateOf(false) } // โœ… hasil hanya tampil setelah tombol ditekan + var showResult by remember { mutableStateOf(false) } val height = heightInput.toFloatOrNull() ?: 0f val weight = weightInput.toFloatOrNull() ?: 0f val isValid = validateInput(height, weight, useMetricSystem) - // Konversi tinggi & berat ke sistem metrik (meter & kg) val heightInMeters = if (useMetricSystem) height / 100f else height * 0.0254f val weightInKg = if (useMetricSystem) weight else weight * 0.453592f @@ -176,7 +175,6 @@ fun BmiCalculatorLayout() { ) } - // Pesan error if (errorMessage.isNotEmpty()) { Text( text = errorMessage, @@ -186,7 +184,7 @@ fun BmiCalculatorLayout() { ) } - // Hasil BMI hanya tampil setelah ditekan tombol + // Hasil BMI if (showResult && isValid) { val categoryColor = when (category) { "Kurus" -> MaterialTheme.colorScheme.tertiaryContainer @@ -217,10 +215,34 @@ fun BmiCalculatorLayout() { } } } + + // ๐Ÿ“˜ Panduan Kategori BMI + Spacer(modifier = Modifier.height(24.dp)) + Card( + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceVariant), + elevation = CardDefaults.cardElevation(defaultElevation = 6.dp) + ) { + Column(modifier = Modifier.padding(16.dp)) { + Text( + text = "Panduan Kategori BMI", + style = MaterialTheme.typography.titleMedium, + color = MaterialTheme.colorScheme.primary + ) + Spacer(modifier = Modifier.height(8.dp)) + Divider() + Spacer(modifier = Modifier.height(8.dp)) + Text("โ€ข Kurus : BMI < 18.5") + Text("โ€ข Normal : 18.5 โ‰ค BMI < 25") + Text("โ€ข Kelebihan Berat : 25 โ‰ค BMI < 30") + Text("โ€ข Obesitas : BMI โ‰ฅ 30") + } + } } } } + @Composable fun EditNumberField( @StringRes label: Int, @@ -257,6 +279,16 @@ fun validateInput(height: Float, weight: Float, useMetric: Boolean): Boolean { height >= 4f && height <= 100f && weight in 5f..550f } +fun calculateBMI(weight: Float, height: Float, useMetric: Boolean = true): Float { + if (height <= 0) return 0f + + val heightInMeters = if (useMetric) height / 100f else height * 0.0254f + val weightInKg = if (useMetric) weight else weight * 0.453592f + + return weightInKg / heightInMeters.pow(2) +} + + @Preview(showBackground = true) @Composable fun BmiCalculatorPreview() { diff --git a/app/src/main/java/com/example/tiptime/SplashActivity.kt b/app/src/main/java/com/example/tiptime/SplashActivity.kt index b581b87..de1590a 100644 --- a/app/src/main/java/com/example/tiptime/SplashActivity.kt +++ b/app/src/main/java/com/example/tiptime/SplashActivity.kt @@ -1,9 +1,9 @@ package com.example.tiptime import android.content.Intent -import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Button +import androidx.appcompat.app.AppCompatActivity class SplashActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -11,11 +11,9 @@ class SplashActivity : AppCompatActivity() { setContentView(R.layout.activity_splash) val btnMulai = findViewById