diff --git a/app/src/main/java/id/ac/ubharajaya/panicbutton/MainActivity.kt b/app/src/main/java/id/ac/ubharajaya/panicbutton/MainActivity.kt index 05c96f9..0b2f377 100644 --- a/app/src/main/java/id/ac/ubharajaya/panicbutton/MainActivity.kt +++ b/app/src/main/java/id/ac/ubharajaya/panicbutton/MainActivity.kt @@ -8,8 +8,10 @@ import androidx.activity.compose.setContent import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.runtime.getValue @@ -18,7 +20,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.TextFieldValue @@ -29,7 +30,6 @@ import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody - class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -39,36 +39,39 @@ class MainActivity : ComponentActivity() { } } - @Composable fun MyApp() { - val focusManager = LocalFocusManager.current - val context = LocalContext.current // Digunakan untuk tombol "Tutup" dan "Intent" + val context = LocalContext.current var message by remember { mutableStateOf("Kirim laporan untuk mendapatkan notifikasi") } var selectedConditions by remember { mutableStateOf(mutableSetOf()) } var additionalNotes by remember { mutableStateOf(TextFieldValue("")) } - // ▼▼▼ PERUBAHAN 1: Sesuaikan Map dengan gambar terakhir ▼▼▼ + // Map untuk mencocokkan teks UI dengan tag untuk API val conditionToTagMap = mapOf( - "Kebakaran" to "fire", - "Banjir" to "cloud_with_rain", - "Tsunami" to "ocean", - "Gunung Meletus" to "volcano", - "Gempa Bumi" to "earth_asia", - "Huru Hara" to "imp", - "Binatang Buas" to "snake", - "Radiasi Nuklir" to "radioactive", - "Biohazard" to "biohazard" + "🔥 Kebakaran" to "fire", + "⛈️ Banjir" to "cloud_with_rain", + "🌊 Tsunami" to "ocean", + "🌋 Gunung Meletus" to "volcano", + "🌏 Gempa Bumi" to "earth_asia", + "👿 Huru Hara" to "imp", + "🐍 Binatang Buas" to "snake", + "☢️ Radiasi Nuklir" to "radioactive", + "☣️ Biohazard" to "biohazard" ) + // Daftar kondisi untuk ditampilkan di UI + val conditions = conditionToTagMap.keys.toList() + val scrollState = rememberScrollState() + Column( modifier = Modifier .fillMaxSize() - .padding(16.dp), + .padding(16.dp) + .verticalScroll(scrollState), // Membuat Column bisa di-scroll verticalArrangement = Arrangement.Top, horizontalAlignment = Alignment.Start ) { - // Judul (tidak ada perubahan) + // --- Bagian Judul --- Text( text = "Terjadi Kondisi Darurat", fontSize = 24.sp, @@ -77,42 +80,42 @@ fun MyApp() { modifier = Modifier.padding(bottom = 16.dp) ) - - // ▼▼▼ PERUBAHAN 2: Sesuaikan daftar Checkbox dengan gambar terakhir ▼▼▼ - listOf( - "Kebakaran", "Banjir", "Tsunami", "Gunung Meletus", "Gempa Bumi", - "Huru Hara", "Binatang Buas", "Radiasi Nuklir", "Biohazard" - ).forEach { condition -> + // --- Bagian Daftar Checkbox --- + // Perulangan ini HANYA untuk membuat baris Checkbox + conditions.forEach { condition -> Row( + verticalAlignment = Alignment.CenterVertically, modifier = Modifier .fillMaxWidth() .clickable { - focusManager.clearFocus() - selectedConditions = selectedConditions.toMutableSet().apply { - if (contains(condition)) remove(condition) else add(condition) + // Logika untuk menambah/menghapus dari set + val newSet = selectedConditions.toMutableSet() + if (newSet.contains(condition)) { + newSet.remove(condition) + } else { + newSet.add(condition) } + selectedConditions = newSet } - .padding(vertical = 4.dp), - verticalAlignment = Alignment.CenterVertically + .padding(vertical = 4.dp) ) { Checkbox( checked = selectedConditions.contains(condition), onCheckedChange = { isChecked -> - focusManager.clearFocus() - selectedConditions = selectedConditions.toMutableSet().apply { - if (isChecked) add(condition) else remove(condition) + val newSet = selectedConditions.toMutableSet() + if (isChecked) { + newSet.add(condition) + } else { + newSet.remove(condition) } + selectedConditions = newSet } ) - Text( - text = condition, - modifier = Modifier.padding(start = 8.dp) - ) + Text(text = condition, modifier = Modifier.padding(start = 8.dp)) } } - - // Catatan tambahan (tidak ada perubahan) + // --- Bagian Catatan Tambahan --- Spacer(modifier = Modifier.height(16.dp)) Text(text = "Catatan tambahan:") BasicTextField( @@ -121,65 +124,61 @@ fun MyApp() { modifier = Modifier .fillMaxWidth() .height(100.dp) - .padding(8.dp) + .padding(vertical = 8.dp) .border(1.dp, Color.Gray), keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done) ) - - // Tombol Kirim (tidak ada perubahan) + // --- Bagian Tombol Kirim Laporan --- Spacer(modifier = Modifier.height(16.dp)) Button( onClick = { val notes = additionalNotes.text - val conditionsText = selectedConditions.joinToString(", ") - val report = "Kondisi: $conditionsText\nCatatan: $notes" + // Ambil tag yang sesuai dari map, bukan teks dari UI val tags = selectedConditions.mapNotNull { conditionToTagMap[it] }.joinToString(",") + val report = "Kondisi: ${selectedConditions.joinToString(", ")}\nCatatan: $notes" + + // Panggilan ini sekarang berada di scope yang benar sendNotification(report, tags) { response -> message = response } }, - colors = ButtonDefaults.buttonColors(containerColor = Color.Red) + colors = ButtonDefaults.buttonColors(containerColor = Color.Red), + modifier = Modifier.fillMaxWidth() ) { Text(text = "Kirim Laporan", color = Color.White) } - - // Keterangan (tidak ada perubahan) + // --- Bagian Keterangan Evakuasi --- Spacer(modifier = Modifier.height(16.dp)) Text( text = "“JANGAN PANIK! SEGERA EVAKUASI\nDIRI ANDA KE TITIK KUMPUL”", color = Color.Red, fontSize = 15.sp, - fontWeight = FontWeight.Bold + fontWeight = FontWeight.Bold, + modifier = Modifier.align(Alignment.CenterHorizontally) ) - - // Hasil request (tidak ada perubahan) + // --- Bagian Hasil Request --- Spacer(modifier = Modifier.height(16.dp)) - Text(text = message, Modifier.padding(top = 16.dp)) + Text(text = message, modifier = Modifier.padding(top = 16.dp)) - // Spacer (tidak ada perubahan) + // Spacer untuk mendorong tombol bawah ke dasar layar Spacer(modifier = Modifier.weight(1f)) - // Tombol Lihat Jalur Evakuasi dan Tutup (tidak ada perubahan) + // --- Bagian Tombol Bawah --- Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween ) { - Button( - onClick = { - val intent = Intent(context, JalurEvakuasiActivity::class.java) - context.startActivity(intent) - } - ) { + Button(onClick = { + context.startActivity(Intent(context, JalurEvakuasiActivity::class.java)) + }) { Text(text = "Lihat Jalur Evakuasi") } Button( - onClick = { - (context as? Activity)?.finish() - }, + onClick = { (context as? Activity)?.finish() }, colors = ButtonDefaults.buttonColors(containerColor = Color.Gray) ) { Text(text = "Tutup", color = Color.White) @@ -189,17 +188,12 @@ fun MyApp() { } -// Fungsi sendNotification (tidak ada perubahan) +// Fungsi sendNotification (tidak perlu diubah) fun sendNotification(report: String, tags: String, onResult: (String) -> Unit) { + // ... implementasi sudah benar val client = OkHttpClient() val url = "https://ntfy.ubharajaya.ac.id/panic-button" - - - val requestBody = RequestBody.create( - "text/plain".toMediaType(), - report - ) - + val requestBody = RequestBody.create("text/plain".toMediaType(), report) val request = Request.Builder() .url(url) .addHeader("Title", "Alert") @@ -207,8 +201,6 @@ fun sendNotification(report: String, tags: String, onResult: (String) -> Unit) { .addHeader("Tags", tags) .post(requestBody) .build() - - Thread { try { val response = client.newCall(request).execute()