From b186c70643a27467cc846cd40fc3b5d151ed663e Mon Sep 17 00:00:00 2001 From: RafiFattan23 Date: Thu, 6 Nov 2025 17:25:02 +0700 Subject: [PATCH] pertama --- README.md | 72 +++- app/build.gradle.kts | 2 +- app/src/main/AndroidManifest.xml | 11 +- app/src/main/ic_launcher-playstore.png | Bin 0 -> 49532 bytes .../java/com/example/tiptime/MainActivity.kt | 328 ++++++++++-------- .../com/example/tiptime/SplashActivity.kt | 21 ++ app/src/main/res/drawable/bg_gradient.xml | 19 + app/src/main/res/drawable/bmi.png | Bin 0 -> 48993 bytes app/src/main/res/drawable/foto.jpg | Bin 0 -> 74097 bytes .../res/drawable/ic_launcher_background.xml | 251 ++++---------- .../main/res/drawable/profile_circle_mask.xml | 5 + app/src/main/res/drawable/splash_gradient.xml | 13 + app/src/main/res/layout/activity_splash.xml | 66 ++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 23 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 23 +- app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3918 bytes app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 1404 -> 0 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 11978 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5690 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 2898 -> 0 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2877 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 982 -> 0 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 7287 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3584 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 1772 -> 0 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 5510 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 1900 -> 0 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 17538 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7916 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 3918 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 8350 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 2884 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 30564 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 12384 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 5914 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 11610 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 3844 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 46040 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 17852 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 7778 -> 0 bytes .../java/com/example/tiptime/BmiUnitTest.kt | 63 ++++ 41 files changed, 523 insertions(+), 374 deletions(-) create mode 100644 app/src/main/ic_launcher-playstore.png create mode 100644 app/src/main/java/com/example/tiptime/SplashActivity.kt create mode 100644 app/src/main/res/drawable/bg_gradient.xml create mode 100644 app/src/main/res/drawable/bmi.png create mode 100644 app/src/main/res/drawable/foto.jpg create mode 100644 app/src/main/res/drawable/profile_circle_mask.xml create mode 100644 app/src/main/res/drawable/splash_gradient.xml create mode 100644 app/src/main/res/layout/activity_splash.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/test/java/com/example/tiptime/BmiUnitTest.kt diff --git a/README.md b/README.md index 08d4aa4..3225df6 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,68 @@ -Kalkulator BMI -=============== +# πŸ“± Aplikasi Kalkulator BMI -Silahkan kembangkan aplikasi ini untuk melakukan perhitungan BMI +**Dibuat oleh:** +πŸ‘¨β€πŸ’» **Rafi Fattan Fitriardi** +πŸ†” **NIM: 202310715002** +🏫 **Pemrograman Perangkat Bergerak - F5A5** -Petunjuk lebih detil dapat dibaca di -https://docs.google.com/document/d/1iGiC0Bg3Bdcd2Maq45TYkCDUkZ5Ql51E/edit?rtpof=true +--- + +## πŸ“– 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**. + +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. + +--- + +## βš™οΈ Fitur Utama +- Input berat dan tinggi badan secara interaktif. +- Perhitungan otomatis nilai BMI. +- Tampilan kategori hasil (Kurus, Normal, Gemuk, Obesitas). +- Antarmuka sederhana dan responsif. +- Navigasi antarhalaman menggunakan 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 +``` + +--- + +## 🧠 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. + +--- -Starter dimodifikasi dan terinspirasi dari: -https://developer.android.com/codelabs/basic-android-compose-calculate-tip#0 \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f786714..cf6fcac 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -73,7 +73,7 @@ dependencies { implementation("androidx.compose.ui:ui-tooling-preview") implementation("androidx.core:core-ktx:1.15.0") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.7") - + implementation("androidx.appcompat:appcompat:1.7.1") testImplementation("junit:junit:4.13.2") androidTestImplementation(platform("androidx.compose:compose-bom:2024.12.01")) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e897dec..08036cb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,15 +26,24 @@ android:supportsRtl="true" android:theme="@style/Theme.TipTime" tools:targetApi="33"> + + + + + + android:theme="@style/Theme.AppCompat.Light.NoActionBar"> + diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..9536c302acf81d8dd5386ec614ff8de73df0a910 GIT binary patch literal 49532 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%0DeJ#03@Qmdak>hvd_Lf?_kG$jTU%Nx*>+6H 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 NHBCK@;;Xh1{|6P0bx8mK literal 0 HcmV?d00001 diff --git a/app/src/main/java/com/example/tiptime/MainActivity.kt b/app/src/main/java/com/example/tiptime/MainActivity.kt index d0fdd80..e05f23a 100644 --- a/app/src/main/java/com/example/tiptime/MainActivity.kt +++ b/app/src/main/java/com/example/tiptime/MainActivity.kt @@ -1,18 +1,3 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ package com.example.tiptime import android.os.Bundle @@ -21,31 +6,12 @@ import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.annotation.DrawableRes import androidx.annotation.StringRes -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.safeDrawingPadding -import androidx.compose.foundation.layout.statusBarsPadding -import androidx.compose.foundation.layout.wrapContentWidth +import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Surface -import androidx.compose.material3.Switch -import androidx.compose.material3.Text -import androidx.compose.material3.TextField -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue +import androidx.compose.material3.* +import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource @@ -55,7 +21,10 @@ import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.example.tiptime.ui.theme.TipTimeTheme -import java.text.NumberFormat +import kotlin.math.pow +import kotlin.math.roundToInt +import androidx.compose.foundation.background +import androidx.compose.ui.graphics.Brush class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -63,10 +32,8 @@ class MainActivity : ComponentActivity() { super.onCreate(savedInstanceState) setContent { TipTimeTheme { - Surface( - modifier = Modifier.fillMaxSize(), - ) { - TipTimeLayout() + Surface(modifier = Modifier.fillMaxSize()) { + BmiCalculatorLayout() } } } @@ -74,71 +41,162 @@ class MainActivity : ComponentActivity() { } @Composable -fun TipTimeLayout() { - var amountInput by remember { mutableStateOf("") } - var tipInput by remember { mutableStateOf("") } - var roundUp by remember { mutableStateOf(false) } +fun BmiCalculatorLayout() { + var heightInput by remember { mutableStateOf("") } + var weightInput by remember { mutableStateOf("") } + var errorMessage by remember { mutableStateOf("") } - val BmiHeight = amountInput.toDoubleOrNull() ?: 0.0 - val BmiWeight = tipInput.toDoubleOrNull() ?: 0.0 - val bmi = calculateBMI(BmiHeight, BmiWeight, roundUp) - val category = calculateBMICategory(BmiHeight, BmiWeight, roundUp) + // State untuk hasil BMI + var bmiResult by remember { mutableStateOf(null) } + var bmiCategory by remember { mutableStateOf("") } - Column( + val height = heightInput.toFloatOrNull() ?: 0f + val weight = weightInput.toFloatOrNull() ?: 0f + val isValid = validateInput(height, weight) + + Box( modifier = Modifier - .statusBarsPadding() - .padding(horizontal = 40.dp) + .fillMaxSize() + .background( + Brush.verticalGradient( + colors = listOf( + MaterialTheme.colorScheme.primary.copy(alpha = 0.4f), + MaterialTheme.colorScheme.secondary.copy(alpha = 0.2f) + ) + ) + ) .verticalScroll(rememberScrollState()) - .safeDrawingPadding(), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center + .padding(horizontal = 24.dp, vertical = 32.dp) ) { - Text( - text = stringResource(R.string.calculate_tip), - modifier = Modifier - .padding(bottom = 16.dp, top = 40.dp) - .align(alignment = Alignment.Start) - ) - EditNumberField( - label = R.string.height, - leadingIcon = R.drawable.number, - keyboardOptions = KeyboardOptions.Default.copy( - keyboardType = KeyboardType.Number, - imeAction = ImeAction.Next - ), - value = amountInput, - onValueChanged = { amountInput = it }, - modifier = Modifier.padding(bottom = 32.dp).fillMaxWidth(), - ) - EditNumberField( - label = R.string.weight, - leadingIcon = R.drawable.number, - keyboardOptions = KeyboardOptions.Default.copy( - keyboardType = KeyboardType.Number, - imeAction = ImeAction.Done - ), - value = tipInput, - onValueChanged = { tipInput = it }, - modifier = Modifier.padding(bottom = 32.dp).fillMaxWidth(), - ) - RoundTheTipRow( - roundUp = roundUp, - onRoundUpChanged = { roundUp = it }, - modifier = Modifier.padding(bottom = 32.dp) - ) - Text( - text = stringResource(R.string.bmi_calculation, bmi), - style = MaterialTheme.typography.displaySmall - ) - Text( - text = stringResource(R.string.bmi_category, category), - style = MaterialTheme.typography.displaySmall - ) + Column(horizontalAlignment = Alignment.CenterHorizontally) { - Spacer(modifier = Modifier.height(150.dp)) + Row(verticalAlignment = Alignment.CenterVertically) { + Icon( + painter = painterResource(id = R.drawable.ic_launcher_foreground), + contentDescription = null, + tint = MaterialTheme.colorScheme.primary, + modifier = Modifier.size(48.dp) + ) + Spacer(modifier = Modifier.width(8.dp)) + Text( + text = "Kalkulator BMI", + style = MaterialTheme.typography.headlineMedium.copy( + color = MaterialTheme.colorScheme.primary + ) + ) + } + + Spacer(modifier = Modifier.height(24.dp)) + + Card( + elevation = CardDefaults.cardElevation(defaultElevation = 8.dp), + colors = CardDefaults.cardColors( + containerColor = MaterialTheme.colorScheme.surface.copy(alpha = 0.9f) + ), + modifier = Modifier.fillMaxWidth() + ) { + Column( + modifier = Modifier.padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + EditNumberField( + label = R.string.height, + leadingIcon = R.drawable.number, + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Number, + imeAction = ImeAction.Next + ), + value = heightInput, + onValueChanged = { heightInput = it }, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 12.dp) + ) + + EditNumberField( + label = R.string.weight, + leadingIcon = R.drawable.number, + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Number, + imeAction = ImeAction.Done + ), + value = weightInput, + onValueChanged = { weightInput = it }, + modifier = Modifier.fillMaxWidth() + ) + } + } + + Spacer(modifier = Modifier.height(24.dp)) + + Button( + onClick = { + if (!isValid) { + errorMessage = "Masukkan tinggi (20–250 cm) dan berat (10–250 kg) yang valid!" + bmiResult = null + } else { + errorMessage = "" + bmiResult = calculateBMI(weight, height) + bmiCategory = getBMICategory(bmiResult!!) + } + }, + modifier = Modifier + .fillMaxWidth() + .height(56.dp), + elevation = ButtonDefaults.elevatedButtonElevation(8.dp) + ) { + Text(text = "Hitung BMI", style = MaterialTheme.typography.titleMedium) + } + + if (errorMessage.isNotEmpty()) { + Text( + text = errorMessage, + color = MaterialTheme.colorScheme.error, + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(vertical = 8.dp) + ) + } + + // Tampilkan hasil hanya jika sudah ditekan + bmiResult?.let { bmi -> + val categoryColor = when (bmiCategory) { + "Kurus" -> MaterialTheme.colorScheme.tertiaryContainer + "Normal" -> MaterialTheme.colorScheme.primaryContainer + "Kelebihan Berat" -> MaterialTheme.colorScheme.secondaryContainer + else -> MaterialTheme.colorScheme.errorContainer + } + + Card( + modifier = Modifier + .fillMaxWidth() + .padding(top = 24.dp), + colors = CardDefaults.cardColors(containerColor = categoryColor), + elevation = CardDefaults.cardElevation(defaultElevation = 10.dp) + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.padding(20.dp) + ) { + Text( + text = "BMI Anda: %.2f".format(bmi), + style = MaterialTheme.typography.titleLarge + ) + Text( + text = "Kategori: $bmiCategory", + style = MaterialTheme.typography.bodyLarge + ) + } + } + } + } } } + + +/** + * Fungsi untuk membuat TextField input angka + */ @Composable fun EditNumberField( @StringRes label: Int, @@ -150,65 +208,47 @@ fun EditNumberField( ) { TextField( value = value, - singleLine = true, - leadingIcon = { Icon(painter = painterResource(id = leadingIcon), null) }, - modifier = modifier, onValueChange = onValueChanged, + singleLine = true, + leadingIcon = { Icon(painter = painterResource(id = leadingIcon), contentDescription = null) }, label = { Text(stringResource(label)) }, - keyboardOptions = keyboardOptions + keyboardOptions = keyboardOptions, + modifier = modifier ) } -@Composable -fun RoundTheTipRow( - roundUp: Boolean, - onRoundUpChanged: (Boolean) -> Unit, - modifier: Modifier = Modifier -) { - Row( - modifier = modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically - ) { - Text(text = stringResource(R.string.use_usc)) - Switch( - modifier = Modifier - .fillMaxWidth() - .wrapContentWidth(Alignment.End), - checked = roundUp, - onCheckedChange = onRoundUpChanged - ) +/** + * Menghitung nilai BMI berdasarkan berat (kg) dan tinggi (cm) + * Rumus: BMI = berat / (tinggi/100)^2 + */ +fun calculateBMI(weight: Float, height: Float): Float { + if (height <= 0) return 0f + return weight / (height / 100).pow(2) +} + +/** + * Menentukan kategori BMI + */ +fun getBMICategory(bmi: Float): String { + return when { + bmi < 18.5 -> "Kurus" + bmi < 25 -> "Normal" + bmi < 30 -> "Kelebihan Berat" + else -> "Obesitas" } } /** - * Calculates the BMI - * - * Catatan: tambahkan unit test untuk kalkulasi BMI ini + * Validasi input agar nilai masuk akal */ -private fun calculateBMI(BmiHeight: Double, BmiWeight: Double = 15.0, roundUp: Boolean): String { - var bmi = BmiWeight / 100 * BmiHeight - if (roundUp) { - bmi = kotlin.math.ceil(bmi) - } - return NumberFormat.getNumberInstance().format(bmi) +fun validateInput(height: Float, weight: Float): Boolean { + return height in 20f..250f && weight in 10f..250f } -/** - * Calculates the BMI Category - * - * Catatan: tambahkan unit test untuk kalkulasi BMI ini - */ -private fun calculateBMICategory(BmiHeight: Double, BmiWeight: Double = 15.0, roundUp: Boolean): String { - var bmi = BmiWeight / 100 * BmiHeight - if (roundUp) { - bmi = kotlin.math.ceil(bmi) - } - return NumberFormat.getNumberInstance().format(bmi) -} @Preview(showBackground = true) @Composable -fun TipTimeLayoutPreview() { +fun BmiCalculatorPreview() { TipTimeTheme { - TipTimeLayout() + BmiCalculatorLayout() } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/example/tiptime/SplashActivity.kt b/app/src/main/java/com/example/tiptime/SplashActivity.kt new file mode 100644 index 0000000..b581b87 --- /dev/null +++ b/app/src/main/java/com/example/tiptime/SplashActivity.kt @@ -0,0 +1,21 @@ +package com.example.tiptime + +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.widget.Button + +class SplashActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_splash) + + val btnMulai = findViewById