3.7 KiB
3.7 KiB
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
AlertSenderusing OkHttp (asynchronous) processResponseCodehelper for easy unit testing- Unit tests covering the response code logic
INTERNETpermission declared inAndroidManifest.xml
Struktur penting
app/src/main/java/id/ac/ubharajaya/panicbutton/MainActivity.kt— activity entry pointapp/src/main/java/id/ac/ubharajaya/panicbutton/ui/theme/Theme.kt— UI + theme +MyAppcomposableapp/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:
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:
.\gradlew.bat clean :app:assembleDebug --rerun-tasks
Menjalankan unit tests
Unit tests yang ada fokus pada helper processResponseCode.
Dari root project:
# 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
OkHttpClientdanenqueue. processResponseCode(code, onResult)mengekstrak logic sukses/gagal sehingga bisa diuji lokal tanpa jaringan.
- Endpoint disimpan di
-
UI & theme:
PanicButtonThememenggunakan Material3 color scheme yang menonjolkanPanicReduntuk tombol.MyAppmenampilkan tombol bundar besar, indicator loading, dan pesan status.
-
Permissions:
AndroidManifest.xmlmenyertakan<uses-permission android:name="android.permission.INTERNET" />.
Troubleshooting
- Jika Gradle tidak mengenali
--tests, jalankan.\gradlew.bat --versionuntuk memeriksa versi Gradle wrapper; gunakan:app:testDebugUnitTestdan-Dtest.singlejika 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.ENDPOINTbenar - Perangkat/emulator punya koneksi internet
- Server ntfy menerima pesan tanpa autentikasi atau memerlukan header tambahan
- Endpoint
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: Rakha Adi Saaputro NPM : 202310715083