Real-Time Bluetooth LE Proximity Tracker & Tactical Radar
Study Case: Mobile Engineer Take-Home Challenge
PulseBLE adalah aplikasi Android modern untuk mendeteksi sinyal periklanan (advertising packets) perangkat Bluetooth Low Energy (BLE) di sekitar secara real-time, memantau stabilitas kekuatan sinyal (RSSI), dan melacak kedekatan target menggunakan visualisasi radar konsentris taktis (Tactical Concentric Radar View).
- Tangkapan Layar Aplikasi
- Fitur Utama
- Desain Sistem & Dokumentasi Tambahan
- Arsitektur & Pola Desain
- Model Matematika & Pemetaan Jarak PRD
- Struktur Proyek
- Teknologi & Versi Library
- Instruksi Setup & Menjalankan Aplikasi
- Hardware & E2E Validation
- Asumsi Teknis & Batasan (Known Issues)
- Build Artifact & GitHub Releases
Berikut adalah antarmuka visual PulseBLE v1.0.6 yang diuji langsung pada perangkat keras fisik Xiaomi POCO (Android 16 / SDK 37):
1. Splash Screen (v1.0.6) |
2. Dashboard Scanner | 3. Tactical Radar Canvas |
|---|---|---|
![]() |
![]() |
![]() |
| Radar Logo & Dynamic Version | Live BLE Scan & 44dp Pill Search | 360Β° Sweep & Real-Time Sparkline |
| 4. Riwayat Perangkat (Room DB) | 5. Dialog Konsisten M3 |
|---|---|
![]() |
![]() |
| Penyimpanan SQLite & Track Again 36dp | Material 3 AlertDialog & DarkSurface |
-
Real-Time Scanning: Mendeteksi sinyal beacon BLE aktif dengan native
BluetoothLeScannermenggunakan coroutinecallbackFlow. - Informasi Lengkap: Menampilkan Nama Perangkat, MAC Address/UUID, RSSI mentah (raw dBm), estimasi jarak (meter), dan meteran sinyal 4-bar visual.
- Kontrol Manual: Tombol Mulai Scan dan Hentikan Scan yang responsif langsung pada Top App Bar dengan indikator dinamis (SCANNING / STANDBY).
-
Filter & Pengurutan Cerdas (PRD 2.2):
- Otomatis mengurutkan daftar berdasarkan sinyal terkuat (RSSI tertinggi descending).
- Kolom pencarian instan berdesain Full-Pill Compact (44dp) berdasarkan Nama Perangkat atau MAC Address.
- Tombol slider filter melingkar simetris (44dp circular) untuk mengatur ambang batas sinyal minimum (Minimum RSSI Threshold Filter, misal
$\ge -80\text{ dBm}$ ).
- Snap Scroll Bar: Search bar dan tombol filter otomatis tersembunyi halus saat scroll ke bawah (scroll down) dan muncul kembali saat scroll ke atas (scroll up) guna memaksimalkan ruang pandang daftar perangkat.
-
Stabilitas Posisi Scroll & Re-ordering Halus (v1.0.6): Posisi scroll tetap stabil (smart scroll anchoring) saat data BLE terus diperbarui. Saat berada di paling atas (top), list terkunci di indeks 0 offset 0 sehingga item baru/terkuat tertata ke bawah secara alami tanpa ada item tersembunyi di atas layar. Saat pengguna membaca di bagian tengah/bawah (middle/bottom), item yang sedang dilihat tetap terkunci posisinya dan tidak meloncat saat ranking RSSI berganti. Dilengkapi animasi re-order
Modifier.animateItem()yang mulus.
- Concentric Radar Canvas: Visualisasi radar taktis dengan 5 lingkaran jarak konsentris (<1m, 1-3m, 3-10m, 10-20m, >20m), animasi sapuan berkas radar berputar (sweeping beam), dan penanda target (blip marker) dengan efek denyut aura (pulsating aura).
- Indikator Kategori Sinyal Dinamis: Badge visual yang berubah warna dan teks secara dinamis sesuai kategori zona kedekatan PRD tanpa outline/background kaku untuk estetika modern minimalis.
- Real-Time RSSI Sparkline Graph: Grafik riwayat tren kekuatan sinyal 25 paket terakhir untuk memantau apakah perangkat sedang mendekat atau menjauh.
- Metrik Kestabilan Koneksi: Pemantauan frekuensi penerimaan paket (Update Rate dalam Hz) dan tingkat fluktuasi sinyal (Signal Jitter).
- Haptic Proximity Ping: Getaran taktil adaptif yang berdenyut lebih rapat dan intens saat target mendekat (<1 meter atau 1-3 meter).
- Ubah Nama Kustom: Dialog modal ganti nama perangkat (Custom Alias) yang tersimpan persisten ke basis data lokal.
- Penyimpanan Lokal Persisten: Menggunakan database SQLite lokal (Room Database) untuk menyimpan riwayat seluruh perangkat yang pernah terdeteksi agar tidak hilang saat aplikasi ditutup.
- Waktu Relatif: Menampilkan waktu penemuan dalam format ramah pengguna ("Baru saja", "3 menit lalu", "Kemarin").
- Aksi Track Again (Icon-Only): Tombol melingkar 36dp beraksen Electric Blue untuk langsung membuka Radar View dan melanjutkan pelacakan perangkat.
- Pencarian Riwayat: Dilengkapi search bar full-pill 44dp dengan animasi snap scroll.
- Manajemen Riwayat: Opsi hapus item individual dan dialog konfirmasi Hapus Semua Riwayat yang konsisten dengan desain sistem aplikasi.
- Interactive Tactical Splash Screen: Transisi pembuka dengan radar canvas 360Β°, efek gelombang konsentris, logo radar taktis, pill status beacon, dan indikator versi dinamis.
- Non-Looping Navigation: Navigasi bottom bar berakar pada Scanner (
popUpTo(NavScreen.Scanner)). Berpindah tab berulang kali tidak menumpuk backstack, dan menekan tombol Back saat berada di Scanner langsung menutup aplikasi (finish to launcher). - Konsistensi Modal Dialog: Dialog ganti nama perangkat (
RenameDeviceDialog) dan dialog hapus seluruh riwayat (ClearHistoryDialog) menggunakan arsitektur Material 3AlertDialogstandar, tombol aksiTextButton("Batal" & "Simpan"/"Hapus Semua"), dan kontainerDarkSurfaceyang seragam.
- Prioritas Alur Izin & Bluetooth:
- Jika izin belum diberikan (
!hasPermissions), banner "Izin Diperlukan" dengan tombol "Berikan Izin" muncul pertama untuk meminta izin runtime Android. - Setelah izin disetujui, jika Bluetooth mati (
!isBluetoothEnabled), banner otomatis berganti ke "Bluetooth Nonaktif" dengan tombol "Nyalakan". - Mencegah terjadinya
SecurityExceptionpada Android 12+ (API 31+) akibat pemanggilan intent Bluetooth sebelum izinBLUETOOTH_CONNECTdisetujui.
- Jika izin belum diberikan (
- Bluetooth State Monitor: Menggunakan
BroadcastReceiveruntuk memantau sakelar Bluetooth fisik secara real-time. - Lifecycle-Aware Scanning (PRD 4.3): Terintegrasi dengan
DefaultLifecycleObserver. Pemindaian otomatis di-Pause saat aplikasi masuk ke latar belakang (background /onStop) guna menghemat baterai, dan otomatis di-Resume saat aplikasi dibuka kembali (foreground /onResume).
Untuk dokumentasi arsitektur dan sistem visual yang mendalam, silakan merujuk pada dokumen khusus berikut:
- π DESIGN.md: Dokumentasi lengkap sistem desain Tactical Dark Minimalist, token warna 6-zona PRD, tipografi, komponen borderless, micro-motion, dan Haptic Proximity Engine.
- π§ GEMINI.md: Playbook konfigurasi menyeluruh, detail lingkungan Android 17 (SDK 37), toolchain Gradle 9.1.0, arsitektur Clean/MVVM, dan catatan evolusi dari v1.0.0 hingga v1.0.6.
Aplikasi dibangun menggunakan prinsip Clean Architecture dan MVVM (Model-View-ViewModel) dengan pemisahan dependensi secara ketat:
βββββββββββββββββββββββββββββββββββββββββββ
β PRESENTATION LAYER β
β Jetpack Compose UI β’ ViewModels β
β (ScannerScreen, RadarScreen, History) β
ββββββββββββββββββββββ¬βββββββββββββββββββββ
β (StateFlow)
βΌ
βββββββββββββββββββββββββββββββββββββββββββ
β DOMAIN LAYER β
β Use Cases β’ Models β’ Repository β
β (StartScan, StopScan, TrackDevice) β
ββββββββββββββββββββββ¬βββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββ
β DATA LAYER β
β BleDeviceRepositoryImpl β
β ββββββββββββββββββββ βββββββββββββββββ β
β β Native & Mock β β Room Database β β
β β BLE Scanner Flow β β (DeviceDao) β β
β ββββββββββββββββββββ βββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββ
- Clean Architecture: Memisahkan logika bisnis (Domain) dari detail implementasi Android (BLE hardware, Room SQLite, dan Compose UI). Mempermudah pembuatan Unit Tests tanpa ketergantungan pada Android OS mocks.
- High-Throughput StateFlow Buffer: Paket periklanan BLE di dunia nyata dapat masuk puluhan kali per detik (high burst rate). Menulis setiap paket langsung ke SQLite Room akan menyebabkan I/O churn dan penurunan frame rate (jank). Repository menggunakan in-memory cache StateFlow untuk UI 60fps, dikombinasikan dengan debounced background flusher (2 detik) ke Room DB.
- Dependency Injection dengan Dagger Hilt: Standar resmi Google Android yang menjamin loose coupling, mempermudah mock injection saat pengujian, dan mengelola lifecycle dependensi secara otomatis.
Kekuatan sinyal BLE berbanding terbalik secara logaritmik terhadap jarak fisik. Estimasi jarak dihitung menggunakan formula propagasi radio:
-
$\text{TxPower}$ : Kekuatan sinyal acuan pada jarak 1 meter (default terkalibrasi:$-59\text{ dBm}$ ). -
$\text{RSSI}$ : Nilai kekuatan sinyal yang diterima perangkat (dBm). -
$n$ : Eksponen rugi jalur lingkungan (path loss exponent, default ruangan indoor:$2.0$ ).
Sinyal radio BLE di dunia nyata sangat rentan terhadap multipath fading, pantulan dinding, dan interferensi frekuensi 2.4 GHz, yang menghasilkan fluktuasi noise
Untuk menjaga agar jarum radar dan grafik sparkline tidak berkedip-kedip secara agresif (jitter), kami menerapkan filter penghalus frekuensi rendah:
Dengan faktor bobot
Estimasi jarak dikelompokkan secara ketat mengikuti tabel spesifikasi PRD:
| Nilai RSSI (dBm) | Kategori Sinyal | Perkiraan Jarak (Meter) | Aksen Visual |
|---|---|---|---|
| Sangat Kuat (Sangat Dekat) | Emerald Green (#10B981) |
||
| Kuat (Dekat) | Spring Green (#22C55E) |
||
| Cukup / Baik | Amber Gold (#F59E0B) |
||
| Lemah | Orange (#F97316) |
||
| Sangat Lemah / Putus-putus |
|
Rose Red (#EF4444) |
|
| Sinyal Hilang (Lost) | Terputus / Di luar jangkauan | Muted Slate (#94A3B8) |
com.anantyan.pulseble/
βββ core/
β βββ DistanceCalculator.kt # Log-distance path loss, EMA filter, & PRD mapping
βββ data/
β βββ ble/
β β βββ BleScanResult.kt # Raw scan packet model
β β βββ BleScannerDataSource.kt # Data source interface
β β βββ NativeBleScannerDataSource.kt # BluetoothLeScanner + callbackFlow
β βββ mock/
β β βββ MockBleScannerDataSource.kt # Realistic beacon generator for emulator
β βββ local/
β β βββ PulseBleDatabase.kt # Room Database
β β βββ dao/DeviceDao.kt # Room DAO (CRUD & flow queries)
β β βββ entity/DeviceEntity.kt # Room entity
β β βββ mapper/DeviceMapper.kt # Domain <-> Entity mapper
β βββ repository/
β βββ BleDeviceRepositoryImpl.kt # StateFlow cache + debounced Room persistence
βββ di/
β βββ BleModule.kt # Hilt binding for repository
β βββ DatabaseModule.kt # Hilt provider for Room DB & DAO
βββ domain/
β βββ model/
β β βββ BleDevice.kt # Rich domain model with RSSI history
β β βββ ProximityZone.kt # 6 PRD Proximity Zones enum
β βββ repository/
β β βββ BleDeviceRepository.kt # Repository contract
β βββ usecase/
β βββ ScanUseCases.kt # Domain Use Cases
βββ presentation/
βββ MainActivity.kt # Lifecycle observer, permissions, & bluetooth receivers
βββ components/
β βββ BleDeviceCard.kt # Tactical card with signal bars
β βββ ConcentricRadarCanvas.kt # Sweeping radar canvas & blip pulse
β βββ HapticProximityEngine.kt # Tactile proximity vibration
β βββ RenameDeviceDialog.kt # Consistent M3 device rename dialog
β βββ RssiSparklineChart.kt # Real-time RSSI stability sparkline
β βββ SignalBadge.kt # Dynamic PRD zone badge
β βββ StatusBanner.kt # Bluetooth & permission recovery banner
βββ navigation/
β βββ NavScreen.kt # Routes & bottom nav items
β βββ PulseNavHost.kt # Anti-looping single-top Jetpack Navigation
βββ splash/
β βββ SplashScreen.kt # Interactive radar splash screen & version display
βββ scanner/
β βββ ScannerScreen.kt # Dashboard Scanner UI with pill search & circular filter
β βββ ScannerUiState.kt # MVI/MVVM UI state
β βββ ScannerViewModel.kt # Search, RSSI slider filter, & sorting logic
βββ radar/
β βββ RadarScreen.kt # Detail Pelacakan (Radar View) UI
β βββ RadarUiState.kt # Radar UI state
β βββ RadarViewModel.kt # Target tracking, Hz rate, & stability logic
βββ history/
β βββ HistoryScreen.kt # History Log UI with 36dp track action & pill search
β βββ HistoryUiState.kt # History UI state
β βββ HistoryViewModel.kt # Room history query & clear logic
βββ theme/
βββ Color.kt # Tactical dark & PRD signal colors
βββ Theme.kt # Material 3 Edge-to-Edge Theme
βββ Type.kt # Typography tokens
| Library / Komponen | Versi | Peran & Alasan Pemilihan |
|---|---|---|
| Android Application | compileSdk = 37targetSdk = 37minSdk = 24 |
Mendukung Android modern (Android 14β17 / SDK 37) hingga kompatibilitas minimum Android 7.0 Nougat. |
| App Version | versionCode = 6versionName = "1.0.6" |
Versi aplikasi stabil dengan integrasi BuildConfig dinamis. |
| Android Gradle Plugin (AGP) | 9.0.1 |
Sistem build mutakhir Android Studio. |
| Gradle Wrapper | 9.1.0 |
Build orchestration berbasis declarative performance. |
| Kotlin | 2.3.20 |
Bahasa pemrograman utama dengan dukungan Coroutines & Flows kelas satu. |
| KSP (Kotlin Symbol Processing) | 2.3.12 |
Pengganti modern apt/kapt untuk kompilasi Room & Hilt hingga 2x lebih cepat. |
| Jetpack Compose BOM | 2024.12.01 |
Bill of Materials resmi Google untuk konsistensi seluruh modul UI Compose. |
| Compose Material 3 | BOM 2024.12.01 |
Desain antarmuka modern dengan token warna dinamis dan dark mode taktis. |
| Jetpack Navigation Compose | 2.8.9 |
Manajemen navigasi deklaratif antar layar dengan parameter transfer tipe aman. |
| Dagger Hilt | 2.60.1 |
Dependency Injection standar industri dengan integrasi lifecycle Jetpack. |
| Hilt Navigation Compose | 1.2.0 |
Integrasi scoping ViewModel otomatis terhadap Navigation BackStackEntry. |
| Room Database | 2.7.2 |
Abstraksi SQLite tipe aman resmi Google untuk persistence lokal riwayat perangkat. |
| AndroidX Core KTX | 1.15.0 |
Ekstensi Kotlin idiomatik untuk fungsionalitas inti platform Android. |
| AndroidX Lifecycle & ViewModels | 2.8.7 |
Manajemen state reaktif StateFlow dan siklus hidup DefaultLifecycleObserver. |
| AndroidX Activity Compose | 1.10.1 |
Integrasi enableEdgeToEdge() dan BackHandler responsif. |
| Kotlinx Coroutines & Flow | 1.10.2 |
Pengelolaan background threading reaktif untuk streaming data BLE tanpa blocking UI thread. |
| Turbine & JUnit4 | 1.2.1 / 4.13.2 |
Pengujian reaktif untuk state flow dan unit test matematika. |
- Android Studio: Ladybug / Meerkat (atau versi terbaru).
- JDK: Java 17 atau 21.
- Android SDK:
compileSdk = 37,targetSdk = 37,minSdk = 24,buildTools = 37.0.0.
- Clone Repository:
git clone https://github.com/anantyan/PulseBLE.git cd PulseBLE - Buka di Android Studio:
Buka direktori proyek
PulseBLEdi Android Studio dan biarkan Gradle menyelesaikan sync dependencies. - Jalankan Unit Tests:
Seluruh unit test matematika (
./gradlew testDebugUnitTest
DistanceCalculatorTest), mapper (DeviceMapperTest), repository (BleDeviceRepositoryTest), dan viewmodel (ScannerViewModelTest) akan dieksekusi secara otomatis. - Build Debug APK:
File APK siap diuji akan dihasilkan pada:
./gradlew assembleDebug
app/build/outputs/apk/debug/app-debug.apk. - Jalankan di Perangkat:
Pilih target perangkat (HP Android fisik atau Emulator) lalu klik tombol Run (
Shift + F10).
Aplikasi telah divalidasi penuh secara end-to-end langsung pada perangkat keras fisik Xiaomi POCO (Android 16 / API 36) via wireless ADB debugging:
| Test Case | Deskripsi Pengujian | Hasil Pengujian |
|---|---|---|
| TC-1 Runtime Permissions | Permintaan izin BLE Scan & Connect (Android 12β16) secara bertahap sebelum aktivasi hardware Bluetooth. | LULUS |
| TC-2 BLE Discovery | Pemindaian periklanan real-time dari puluhan perangkat fisik (TWS, smartwatch, laptop), pengurutan RSSI descending, search bar pill 44dp, dan filter slider. | LULUS |
| TC-3 Detail & Signal Gauge | Akurasi kalkulasi jarak log-distance path loss, EMA smoothing, dan pergantian nama alias kustom perangkat. | LULUS |
| TC-4 Tactical Radar Canvas | Animasi sweep radar 360Β°, penanda blip berdenyut, sparkline riwayat RSSI, dan haptic proximity ping. | LULUS |
| TC-5 Room Database Persistence | Penyimpanan lokal SQLite, query pencarian riwayat, aksi track-again 36dp, hapus riwayat individual, dan hapus seluruh riwayat dengan dialog konsisten. | LULUS |
| TC-6 Lifecycle & Battery Safety | Penghentian pemindaian otomatis di latar belakang (onStop) untuk menghemat baterai (zero background drain), pemulihan otomatis saat resume, dan anti backstack looping pada tombol Back. |
LULUS |
-
Akurasi RSSI di Lingkungan Fisik:
- Keterbatasan: Sinyal Bluetooth 2.4 GHz dipengaruhi oleh absorpsi tubuh manusia, dinding beton, dan interferensi Wi-Fi. Oleh karena itu, estimasi jarak berbasis RSSI merupakan pendekatan (approximation), bukan posisi absolut berbasis Ultra-Wideband (UWB).
-
Solusi: Kami menerapkan EMA Low-Pass Filter (
$\alpha = 0.35$ ) dan mengelompokkannya ke dalam 6 zona rentang diskrit sesuai PRD untuk memberikan pembacaan yang stabil dan bermakna bagi pengguna.
-
Prioritas Izin Android 12+ vs Android Lawas:
-
Keterbatasan: Pada Android 12+ (API 31+), menyalakan Bluetooth atau memindai tanpa izin
BLUETOOTH_CONNECTdanBLUETOOTH_SCANakan melemparSecurityException. - Solusi: Banner status mengutamakan tombol "Berikan Izin" terlebih dahulu, baru kemudian mengarahkan pengguna ke tombol "Nyalakan Bluetooth".
-
Keterbatasan: Pada Android 12+ (API 31+), menyalakan Bluetooth atau memindai tanpa izin
-
OS Throttling pada Background Scanning:
- Keterbatasan: Android OS membatasi pemindaian BLE tanpa henti di background untuk mencegah boros baterai.
- Solusi: Mengikuti best-practice Android modern dan poin PRD 4.3, aplikasi mem-pause pemindaian saat aplikasi di-minimize dan menyambungnya kembali secara otomatis saat aplikasi kembali ke layar depan.
Build artifact APK debug versi terbaru telah dikompilasi dan dapat diunduh langsung:
- Versi Rilis:
v1.0.6 - Kode Versi:
versionCode 6,versionName "1.0.6"(SDK 37 Target & Compile) - Unduh APK: GitHub Releases β PulseBLE Latest Debug APK
- Path Lokal:
app/build/outputs/apk/debug/app-debug.apk - Application ID:
com.anantyan.pulseble
Dibuat dengan dedikasi tinggi terhadap kualitas kode, arsitektur bersih, performa tinggi, dan pengalaman pengguna interaktif.




