# Panic Button A simple Android app (Compose / Material3) that sends a panic alert to an ntfy-compatible endpoint. This repository includes a small accessible UI, a separated network sender (`AlertSender`), and unit tests for the sender logic. --- ## Ringkasan fitur - Large, high-contrast circular panic button with accessibility labels - Separated network logic in `AlertSender` using OkHttp (asynchronous) - `processResponseCode` helper for easy unit testing - Unit tests covering the response code logic - `INTERNET` permission declared in `AndroidManifest.xml` --- ## Struktur penting - `app/src/main/java/id/ac/ubharajaya/panicbutton/MainActivity.kt` — activity entry point - `app/src/main/java/id/ac/ubharajaya/panicbutton/ui/theme/Theme.kt` — UI + theme + `MyApp` composable - `app/src/main/java/id/ac/ubharajaya/panicbutton/data/AlertSender.kt` — OkHttp-based alert sender (async) - `app/src/test/java/id/ac/ubharajaya/panicbutton/data/AlertSenderTest.kt` — unit tests - Gradle version catalog: `gradle/libs.versions.toml` --- ## Persyaratan - JDK 11 - Android Studio (direkomendasikan) atau Gradle wrapper - Android SDK (compileSdk 36) sesuai konfigurasi module --- ## Cara membangun dan menjalankan Rekomendasi: buka proyek ini di Android Studio lalu klik Run (atau pilih device/emulator). Dari command line (Windows `cmd.exe`) di root proyek: ```cmd cd /d E:\androidProject\Panic-Button # build debug APK .\gradlew.bat :app:assembleDebug # atau build + jalankan unit tests .\gradlew.bat :app:testDebugUnitTest ``` Jika ingin membersihkan dan memaksa rebuild: ```cmd .\gradlew.bat clean :app:assembleDebug --rerun-tasks ``` --- ## Menjalankan unit tests Unit tests yang ada fokus pada helper `processResponseCode`. Dari root project: ```cmd # run all unit tests in app module .\gradlew.bat :app:testDebugUnitTest # run specific test class (Gradle yang lebih baru): .\gradlew.bat :app:testDebugUnitTest --tests "id.ac.ubharajaya.panicbutton.data.AlertSenderTest" # fallback: run single test by name .\gradlew.bat :app:testDebugUnitTest -Dtest.single=AlertSenderTest ``` Report HTML dihasilkan di: ``` app/build/reports/tests/testDebugUnitTest/index.html ``` --- ## Catatan implementasi penting - `AlertSender`: - Endpoint disimpan di `AlertSender.ENDPOINT` (mutable) sehingga mudah untuk testing atau mengalihkan ke server lain. - Asynchronous HTTP dilakukan dengan OkHttp `OkHttpClient` dan `enqueue`. - `processResponseCode(code, onResult)` mengekstrak logic sukses/gagal sehingga bisa diuji lokal tanpa jaringan. - UI & theme: - `PanicButtonTheme` menggunakan Material3 color scheme yang menonjolkan `PanicRed` untuk tombol. - `MyApp` menampilkan tombol bundar besar, indicator loading, dan pesan status. - Permissions: `AndroidManifest.xml` menyertakan ``. --- ## Troubleshooting - Jika Gradle tidak mengenali `--tests`, jalankan `.\gradlew.bat --version` untuk memeriksa versi Gradle wrapper; gunakan `:app:testDebugUnitTest` dan `-Dtest.single` jika perlu. - Jika OkHttp class tidak ditemukan, lakukan Gradle sync di Android Studio atau jalankan `.\gradlew.bat --refresh-dependencies`. - Untuk masalah jaringan saat mengirim alert, periksa: - Endpoint `AlertSender.ENDPOINT` benar - Perangkat/emulator punya koneksi internet - Server ntfy menerima pesan tanpa autentikasi atau memerlukan header tambahan --- ## Next steps / ide peningkatan - Tambah integration tests yang menggunakan `MockWebServer` (butuh dependency dan Gradle sync) - Tambah retry/backoff dan rate-limiting pada `AlertSender` - Tambah telemetry/logging dan optional authentication for endpoint - Improve accessibility further (haptics, TalkBack announcements) --- ## Author - Name: Rakha Adi Saaputro - NPM: 202310715083