diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2e0d78f..8f81c5d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,7 @@ + + android:theme="@style/Theme.PanicButton" + tools:targetApi="31"> + - + + + + - - \ No newline at end of file + + diff --git a/app/src/main/java/id/ac/ubharajaya/panicbutton/JalurEvakuasiActivity.kt b/app/src/main/java/id/ac/ubharajaya/panicbutton/JalurEvakuasiActivity.kt new file mode 100644 index 0000000..c90d140 --- /dev/null +++ b/app/src/main/java/id/ac/ubharajaya/panicbutton/JalurEvakuasiActivity.kt @@ -0,0 +1,54 @@ +package id.ac.ubharajaya.panicbutton + +import android.app.Activity +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.* +import androidx.compose.material3.Button +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale // <-- TAMBAHKAN IMPORT INI +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp + +class JalurEvakuasiActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + JalurEvakuasiScreen() + } + } +} + +@Composable +fun JalurEvakuasiScreen() { + val context = LocalContext.current + + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Image( + painter = painterResource(id = R.drawable.jalur_evakuasi), + contentDescription = "Denah Jalur Evakuasi", + modifier = Modifier + .fillMaxWidth() + .weight(1f), + contentScale = ContentScale.Fit + ) + Button( + onClick = { + (context as? Activity)?.finish() + }, + modifier = Modifier.padding(vertical = 16.dp) + ) { + Text(text = "TUTUP") + } + } +} 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 ab166f1..2b97f54 100644 --- a/app/src/main/java/id/ac/ubharajaya/panicbutton/MainActivity.kt +++ b/app/src/main/java/id/ac/ubharajaya/panicbutton/MainActivity.kt @@ -1,20 +1,35 @@ package id.ac.ubharajaya.panicbutton +import android.app.Activity +import android.content.Intent // <-- TAMBAHKAN IMPORT INI import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* -import androidx.compose.material3.Button -import androidx.compose.material3.Text +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.* import androidx.compose.runtime.* +import androidx.compose.runtime.getValue +import androidx.compose.runtime.setValue 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 import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody + class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -27,56 +42,175 @@ class MainActivity : ComponentActivity() { @Composable fun MyApp() { - // State untuk menampilkan hasil request - var message by remember { mutableStateOf("Klik tombol untuk mengirim notifikasi") } + val focusManager = LocalFocusManager.current + val context = LocalContext.current // Digunakan untuk tombol "Tutup" dan "Intent" + var message by remember { mutableStateOf("Kirim laporan untuk mendapatkan notifikasi") } + var selectedConditions by remember { mutableStateOf(mutableSetOf()) } + var additionalNotes by remember { mutableStateOf(TextFieldValue("")) } + // PERMINTAAN 2: Buat Map untuk memetakan kondisi ke emoji tags + val conditionToTagMap = mapOf( + "Kebakaran" to "fire", + "Banjir" to "cloud_with_rain", + "Gempa Bumi" to "earth_asia", + "Huru hara/Demonstrasi" to "imp", + "Lainnya" to "grey_question" + ) - // UI Column( modifier = Modifier .fillMaxSize() .padding(16.dp), - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally + verticalArrangement = Arrangement.Top, + horizontalAlignment = Alignment.Start ) { - Text(text = message, Modifier.padding(bottom = 16.dp)) - Button(onClick = { - // Kirim HTTP request saat tombol ditekan - sendNotification { response -> - message = response + // PERMINTAAN 1: Judul diperbesar dan dibuat bold + Text( + text = "Terjadi Kondisi Darurat", + fontSize = 24.sp, // Ukuran font diperbesar + fontWeight = FontWeight.Bold, // Teks dibuat bold + color = Color.Red, + modifier = Modifier.padding(bottom = 16.dp) + ) + + + // Pilihan checkbox (tidak ada perubahan) + listOf("Kebakaran", "Banjir", "Gempa Bumi", "Huru hara/Demonstrasi", "Lainnya").forEach { condition -> + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { + focusManager.clearFocus() + selectedConditions = selectedConditions.toMutableSet().apply { + if (contains(condition)) remove(condition) else add(condition) + } + } + .padding(vertical = 4.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Checkbox( + checked = selectedConditions.contains(condition), + onCheckedChange = { isChecked -> + focusManager.clearFocus() + selectedConditions = selectedConditions.toMutableSet().apply { + if (isChecked) add(condition) else remove(condition) + } + } + ) + Text( + text = condition, + modifier = Modifier.padding(start = 8.dp) + ) + } + } + + + // Catatan tambahan (tidak ada perubahan) + Spacer(modifier = Modifier.height(16.dp)) + Text(text = "Catatan tambahan:") + BasicTextField( + value = additionalNotes, + onValueChange = { additionalNotes = it }, + modifier = Modifier + .fillMaxWidth() + .height(100.dp) + .padding(8.dp) + .border(1.dp, Color.Gray), + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done) + ) + + + // Tombol Kirim + Spacer(modifier = Modifier.height(16.dp)) + Button( + onClick = { + // PERMINTAAN 2: Logika untuk mendapatkan tags dari kondisi yang dipilih + val notes = additionalNotes.text + val conditionsText = selectedConditions.joinToString(", ") + val report = "Kondisi: $conditionsText\nCatatan: $notes" + + // Dapatkan tags dari kondisi yang dipilih menggunakan Map + val tags = selectedConditions.mapNotNull { conditionToTagMap[it] }.joinToString(",") + + // Kirim report dan tags ke fungsi notifikasi + sendNotification(report, tags) { response -> + message = response + } + }, + colors = ButtonDefaults.buttonColors(containerColor = Color.Red) + ) { + Text(text = "Kirim Laporan", color = Color.White) + } + + + // PERMINTAAN 1: Keterangan dibuat bold + 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 // Teks dibuat bold + ) + + + // Hasil request (tidak ada perubahan) + Spacer(modifier = Modifier.height(16.dp)) + Text(text = message, Modifier.padding(top = 16.dp)) + + // Spacer untuk mendorong tombol ke bagian bawah layar + Spacer(modifier = Modifier.weight(1f)) + + // PERMINTAAN 1: Tambahkan tombol Lihat Jalur Evakuasi dan Tutup + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween // Agar tombol merapat ke sisi + ) { + Button( + onClick = { + // ▼▼▼ PERUBAHAN DI SINI ▼▼▼ + // Membuat Intent untuk memulai JalurEvakuasiActivity + val intent = Intent(context, JalurEvakuasiActivity::class.java) + context.startActivity(intent) + // ▲▲▲ AKHIR DARI PERUBAHAN ▲▲▲ + } + ) { + Text(text = "Lihat Jalur Evakuasi") + } + + Button( + onClick = { + // Logika untuk menutup aplikasi + (context as? Activity)?.finish() + }, + colors = ButtonDefaults.buttonColors(containerColor = Color.Gray) + ) { + Text(text = "Tutup", color = Color.White) } - }) { - Text(text = "Kirim Alert") } } } -// Fungsi untuk mengirimkan HTTP request -fun sendNotification(onResult: (String) -> Unit) { +// PERMINTAAN 2: Ubah fungsi `sendNotification` untuk menerima parameter tags +fun sendNotification(report: String, tags: String, onResult: (String) -> Unit) { val client = OkHttpClient() - val url = "https://ntfy.ubharajaya.ac.id/panic-button" // Ganti dengan topik Anda - - + val url = "https://ntfy.ubharajaya.ac.id/panic-button" val requestBody = RequestBody.create( - "text/plain".toMediaType(), // Mengirim plain text - "Notifikasi dari Kelompok 7 (Fadlan Rivaldi 202310715280,Indris Alpasela 202310715200, Haga Dalpinto Ginting 202310715176" // Pesan yang akan tampil + "text/plain".toMediaType(), + report ) - val request = Request.Builder() .url(url) .addHeader("Title", "Alert") .addHeader("Priority", "urgent") - .addHeader("Tags", "alert warning,rotating_light") + .addHeader("Tags", tags) // Gunakan tags dinamis dari parameter .post(requestBody) .build() - - // Eksekusi request di thread terpisah Thread { try { val response = client.newCall(request).execute() diff --git a/app/src/main/res/drawable/jalur_evakuasi.png b/app/src/main/res/drawable/jalur_evakuasi.png new file mode 100644 index 0000000..fd25960 Binary files /dev/null and b/app/src/main/res/drawable/jalur_evakuasi.png differ diff --git a/app/src/main/res/drawable/red_button.png b/app/src/main/res/drawable/red_button.png new file mode 100644 index 0000000..238d1bd Binary files /dev/null and b/app/src/main/res/drawable/red_button.png differ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9e85e96..44458bb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,4 @@ Panic Button - \ No newline at end of file + Kirim Alert +