7.7 KiB
7.7 KiB
📱 Aplikasi Absensi Akademik Berbasis Koordinat dan Foto
📋 Daftar Fitur yang Diimplementasikan
✅ Fitur Utama
- 🔐 Login Screen - Interface login untuk mahasiswa dengan input NPM dan Nama
- 📍 Validasi Lokasi (GPS) - Menggunakan Fused Location Provider dari Google Play Services
- Menampilkan koordinat latitude dan longitude
- Validasi radius area (default: 100m dari titik kampus)
- Indikator visual status lokasi (hijau = dalam area, merah = di luar area)
- 📸 Pengambilan Foto Selfie - Integrase dengan kamera perangkat
- Menggunakan Camera Intent
- Validasi foto sebelum submit
- 🕒 Pencatatan Waktu - Otomatis mencatat timestamp saat absensi dikirim
- 📄 Riwayat Kehadiran - History screen dengan daftar absensi
- Menampilkan tanggal, waktu, status (accepted/rejected), koordinat
- Sortir berdasarkan waktu terbaru
- ⚠️ Notifikasi Status - Feedback real-time untuk user
- Success message ketika absensi berhasil
- Error message dengan penjelasan jika ditolak
- 🔄 Integrasi N8n Webhook - Mengirim data ke backend workflow automation
- URL: https://n8n.lab.ubharajaya.ac.id/webhook/23c6993d-1792-48fb-ad1c-ffc78a3e6254
- Data yang dikirim: npm, nama, latitude, longitude, timestamp, foto (base64)
🏗️ Arsitektur Aplikasi
id.ac.ubharajaya.sistemakademik/
├── data/
│ ├── database/
│ │ ├── AppDatabase.kt # Room Database setup
│ │ └── AttendanceDao.kt # Data Access Object
│ ├── model/
│ │ ├── User.kt # User data class
│ │ ├── Attendance.kt # Attendance entity (Room)
│ │ └── LocationConfig.kt # Campus location config
│ ├── preferences/
│ │ └── UserPreferences.kt # DataStore untuk session user
│ └── repository/
│ └── AttendanceRepository.kt # Abstraksi data access & N8n integration
├── domain/
│ └── usecase/
│ └── LocationValidator.kt # Business logic untuk validasi lokasi
├── presentation/
│ ├── screens/
│ │ ├── LoginScreen.kt # Screen login
│ │ ├── AttendanceScreen.kt # Screen utama absensi
│ │ └── HistoryScreen.kt # Screen riwayat kehadiran
│ └── viewmodel/
│ └── AttendanceViewModel.kt # ViewModel untuk state management
├── ui/
│ └── theme/
│ ├── Color.kt
│ ├── Theme.kt
│ └── Type.kt
└── MainActivity.kt # Activity utama dengan Navigation
🔧 Dependencies yang Digunakan
Database & Local Storage
- Room - Local database untuk menyimpan riwayat absensi
- DataStore Preferences - Lightweight key-value storage untuk user session
Navigation
- Navigation Compose - Screen routing dan state management
Location Services
- Google Play Services Location - Fused Location Provider untuk GPS
Async Processing
- Coroutines - Untuk async operations dan threading
🗺️ Flow Aplikasi
1. Login Flow
LoginScreen → Validasi NPM & Nama → Save ke DataStore → Navigate to Attendance
2. Attendance Flow
AttendanceScreen
├─ Request Location Permission → Get GPS coordinates
├─ Validate Location (within 100m radius)
├─ Request Camera Permission → Take selfie photo
├─ Validate all data collected
├─ Send to N8n webhook (async)
├─ Save to local Room database
└─ Show status (success/error)
3. History Flow
HistoryScreen → Load from Room database → Display sorted by timestamp
4. Logout Flow
Logout button → Clear DataStore → Navigate to LoginScreen
📍 Konfigurasi Lokasi
File: data/model/LocationConfig.kt
data class LocationConfig(
val latitude: Double = -6.8961, // Latitude kampus Ubharajaya
val longitude: Double = 107.6100, // Longitude kampus Ubharajaya
val radius: Float = 100f // Radius validasi dalam meter
)
Catatan: Koordinat dapat diubah sesuai lokasi kampus yang sebenarnya. Untuk privacy, koordinat dapat ditambah/kurangi dengan offset tertentu.
🔐 Permissions yang Diperlukan
File: app/src/main/AndroidManifest.xml
<!-- Location Permissions -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- Camera Permission -->
<uses-permission android:name="android.permission.CAMERA"/>
<!-- Network Permission -->
<uses-permission android:name="android.permission.INTERNET"/>
Request permission dilakukan secara runtime menggunakan ActivityResultContracts.
🌐 N8n Webhook Integration
Endpoint
- Production: https://n8n.lab.ubharajaya.ac.id/webhook/23c6993d-1792-48fb-ad1c-ffc78a3e6254
- Testing: https://n8n.lab.ubharajaya.ac.id/webhook-test/23c6993d-1792-48fb-ad1c-ffc78a3e6254
Request Format (JSON)
{
"npm": "12345678",
"nama": "John Doe",
"latitude": -6.8961234,
"longitude": 107.6100567,
"timestamp": 1704067200000,
"foto_base64": "[base64 encoded image]"
}
Response Handling
- HTTP 200: Absensi diterima (status = "accepted")
- HTTP lainnya: Absensi ditolak (status = "rejected")
💾 Database Schema
Attendance Table
CREATE TABLE attendance (
id INTEGER PRIMARY KEY AUTOINCREMENT,
npm TEXT NOT NULL,
nama TEXT NOT NULL,
latitude REAL NOT NULL,
longitude REAL NOT NULL,
timestamp INTEGER NOT NULL,
fotoBase64 TEXT NOT NULL,
status TEXT DEFAULT 'pending', -- pending, accepted, rejected
message TEXT DEFAULT ''
)
🛣️ Navigation Routes
| Route | Screen | Purpose |
|---|---|---|
login |
LoginScreen | Input NPM & Nama |
attendance |
AttendanceScreen | Main attendance interface |
history |
HistoryScreen | View attendance history |
🚀 Cara Menjalankan
Prerequisites
- Android Studio (latest)
- Android SDK 28+ (minSdk)
- Target SDK 36
- Kotlin 2.0.21
Build & Run
# Build project
./gradlew build
# Run on emulator/device
./gradlew installDebug
# Or dari Android Studio
- Click "Run" atau tekan Shift+F10
📝 Notes & Future Enhancements
Current Implementation
- ✅ Basic location validation dengan radius check
- ✅ Photo capture dari camera intent
- ✅ Local database dengan Room
- ✅ Session management dengan DataStore
- ✅ N8n webhook integration
- ✅ Responsive UI dengan Jetpack Compose
Possible Improvements
- Location Tracking - Real-time location updates selama proses absensi
- Image Compression - Compress foto sebelum upload untuk efisiensi bandwidth
- Offline Mode - Queue absensi jika offline, sync saat online
- Face Recognition - Validasi foto dengan face detection
- Map Integration - Google Maps untuk visualisasi area absensi
- Biometric Auth - Fingerprint/Face unlock untuk login
- Export Data - Export riwayat absensi ke format CSV/PDF
🐛 Troubleshooting
Masalah Permission
- Lokasi tidak tersedia: Pastikan GPS device nyala dan permission diizinkan
- Kamera tidak berfungsi: Periksa izin camera di system settings
Masalah Network
- N8n webhook timeout: Pastikan device terhubung internet
- HTTPS error: Webhook URL sudah benar (https, bukan http)
Masalah Database
- Error saat insert: Pastikan Room migration sudah sesuai dengan schema
📧 Support & Contact
- Dokumentasi: Lihat README ini
- Webhook Testing: https://ntfy.ubharajaya.ac.id/EAS
- Monitoring: https://docs.google.com/spreadsheets/d/1jH15MfnNgpPGuGeid0hYfY7fFUHCEFbCmg8afTyyLZs/
Created: 2025 Version: 1.0 Status: In Development