Kelompok 1

This commit is contained in:
202310715297 RAIHAN ARIQ MUZAKKI 2025-11-13 15:48:41 +07:00
parent 48d1205ba8
commit 55a06a5312

View File

@ -1,33 +1,18 @@
package id.ac.ubharajaya.panicbutton package com.example.panicbutton
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState import androidx.compose.material3.Button
import androidx.compose.foundation.text.BasicTextField import androidx.compose.material3.Text
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.*
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier 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.input.TextFieldValue
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.RequestBody import okhttp3.RequestBody
import java.util.concurrent.locks.Condition
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
@ -42,162 +27,55 @@ class MainActivity : ComponentActivity() {
@Composable @Composable
fun MyApp() { fun MyApp() {
val focusManager = LocalFocusManager.current // State untuk menampilkan hasil request
var message by remember { mutableStateOf("Klik tombol untuk mengirim notifikasi") } var message by remember { mutableStateOf("Klik tombol untuk mengirim notifikasi") }
var selectedConditions by remember { mutableStateOf(mutableSetOf<String>()) }
var additionalNotes by remember { mutableStateOf(TextFieldValue("")) }
// Agar bisa Scroll
val scrollState = rememberScrollState()
val context = LocalContext.current
// UI
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
.verticalScroll(scrollState)
.padding(16.dp), .padding(16.dp),
verticalArrangement = Arrangement.Top, verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.Start horizontalAlignment = Alignment.CenterHorizontally
) { ) {
Text( Text(text = message, Modifier.padding(bottom = 16.dp))
text = "Terjadi Kondisi Darurat", Button(onClick = {
fontSize = 20.sp, // Kirim HTTP request saat tombol ditekan
color = Color.Red, sendNotification { response ->
modifier = Modifier.padding(bottom = 16.dp) message = response
)
listOf(
"Kebakaran", "Banjir", "Tsunami", "Gunung Meletus",
"Gempa Bumi", "Huru hara", "Binatang Buas",
"Radiasi Nuklir", "Biohazard"
).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)
)
} }
} }) {
Text(text = "Kirim Alert")
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)
)
Spacer(modifier = Modifier.height(16.dp))
Button(
onClick = {
val notes = additionalNotes.text
val conditions = selectedConditions.joinToString(", ")
val report = "Kondisi: $conditions\nCatatan: $notes"
sendNotification(conditions, report) { response ->
message = response
}
},
colors = ButtonDefaults.buttonColors(containerColor = Color.Red)
) {
Text(text = "Kirim Laporan", color = Color.White)
}
Spacer(modifier = Modifier.height(16.dp))
Text(
text = "“JANGAN PANIK! SEGERA EVAKUASI\nDIRI ANDA KE TITIK KUMPUL”",
color = Color.Red,
fontSize = 15.sp
)
Spacer(modifier = Modifier.height(16.dp))
Text(text = message, Modifier.padding(top = 16.dp))
Button(
onClick = {
val intent = Intent(context, JalurEvakuasiActivity::class.java)
context.startActivity(intent)
},
colors = ButtonDefaults.buttonColors(containerColor = Color.Green)
) {
Text(text = "Lihat Jalur Evakuasi", color = Color.White)
} }
} }
} }
// Fungsi untuk mengirimkan HTTP request // Fungsi untuk mengirimkan HTTP request
fun sendNotification(condition: String, report: String, onResult: (String) -> Unit) { fun sendNotification(onResult: (String) -> Unit) {
val client = OkHttpClient() val client = OkHttpClient()
val url = "https://ntfy.ubharajaya.ac.id/panic-button" val url = "https://ntfy.ubharajaya.ac.id/panic-button" // Ganti <your-topic> dengan topik Anda
// Mapping kondisi → emoji/tag
val tagMapping = mapOf(
"Kebakaran" to "fire",
"Banjir" to "ocean",
"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"
)
// Bersihkan kondisi: trim + filter
val selectedList = condition
.split(",")
.map { it.trim() }
.filter { it.isNotEmpty() }
// Format ulang kondisi
val cleanConditionText = selectedList.joinToString(", ")
// Ambil emoji untuk masing-masing kondisi
val emojiTags = selectedList.mapNotNull { tagMapping[it] }
// Tambahkan default tag: alert + warning
val finalTags = listOf("Alert", "Warning") + emojiTags
val finalReport = "Kondisi: $cleanConditionText\nCatatan: ${report.substringAfter("Catatan:")}"
val requestBody = RequestBody.create( val requestBody = RequestBody.create(
"text/plain".toMediaType(), "text/plain".toMediaType(), // Mengirim plain text
finalReport "Notifikasi dari Kelompok 1 (Raihan, Dendi, Fazri)!" // Pesan yang akan tampil
) )
val request = Request.Builder() val request = Request.Builder()
.url(url) .url(url)
.addHeader("Title", "Alert") .addHeader("Title", "Radioactive")
.addHeader("Priority", "urgent") .addHeader("Priority", "urgent")
.addHeader("Tags", finalTags.joinToString(",")) .addHeader("Tags", "alert warning,rotating_light")
.post(requestBody) .post(requestBody)
.build() .build()
// Eksekusi request di thread terpisah
Thread { Thread {
try { try {
val response = client.newCall(request).execute() val response = client.newCall(request).execute()