230 lines
6.6 KiB
Markdown

# 📱 Aplikasi Absensi Akademik Berbasis Koordinat dan Foto
## 📋 Deskripsi Proyek
Aplikasi mobile Android untuk sistem absensi akademik yang menggunakan **lokasi GPS** dan **pengambilan foto** untuk validasi kehadiran mahasiswa. Aplikasi ini dirancang untuk mencegah kecurangan absensi dan meningkatkan integritas sistem kehadiran.
## ✨ Fitur Utama
- 🔐 **Login Pengguna** - Autentikasi mahasiswa
- 📍 **Tracking Lokasi Real-time** - Menggunakan Fused Location Provider
- 🏫 **Validasi Area Absensi** - Radius-based location validation
- 📸 **Pengambilan Foto Selfie** - Dokumentasi kehadiran
-**Validasi Data** - Memastikan semua data lengkap sebelum submit
- 📡 **Integrasi N8n Webhook** - Pengiriman data ke server
- ⚠️ **Error Handling** - Pesan error yang user-friendly
- 🔄 **Loading States** - Visual feedback untuk proses async
## 🛠️ Tech Stack
- **Platform**: Android 12+ (API 28+)
- **Language**: Kotlin
- **UI Framework**: Jetpack Compose
- **Location Services**: Google Play Services (Fused Location Provider)
- **Camera**: Android Camera Intent
- **Networking**: HttpURLConnection + JSON
- **Build Tool**: Gradle Kotlin DSL
## 📦 Struktur Proyek
```
app/src/main/
├── java/id/ac/ubharajaya/sistemakademik/
│ ├── MainActivity.kt # Main UI dan Activity
│ ├── config/
│ │ └── AttendanceConfig.kt # Konfigurasi aplikasi
│ ├── models/
│ │ └── AttendanceRecord.kt # Data models
│ ├── network/
│ │ └── N8nService.kt # API service untuk N8n
│ ├── utils/
│ │ ├── LocationValidator.kt # Validasi lokasi
│ │ └── ErrorHandler.kt # Error handling
│ └── ui/
│ ├── components/
│ │ └── AttendanceComponents.kt # Reusable UI components
│ └── theme/
│ └── Theme.kt # Material 3 theme
└── res/ # Resources
```
## 🚀 Cara Menjalankan
### Prerequisites
- Android Studio (Flamingo atau lebih baru)
- Android SDK 28 atau lebih baru
- Device/Emulator dengan Google Play Services
### Setup
1. **Clone atau buka project**
```bash
cd Starter-EAS-2025-2026
```
2. **Sinkronisasi Gradle**
- Android Studio akan otomatis sinkronisasi atau jalankan:
```bash
./gradlew sync
```
3. **Update Konfigurasi** (opsional)
- Edit `AttendanceConfig.kt` untuk mengubah:
- Koordinat referensi kampus
- Radius area absensi
- NPM dan Nama mahasiswa
- Webhook URL
4. **Build & Run**
```bash
./gradlew installDebug
```
atau gunakan tombol "Run" di Android Studio
## ⚙️ Konfigurasi
### AttendanceConfig.kt
File ini berisi semua konfigurasi aplikasi:
```kotlin
// Lokasi kampus (latitude, longitude)
const val REFERENCE_LATITUDE = -7.0
const val REFERENCE_LONGITUDE = 110.4
// Radius area absensi (meter)
const val ALLOWED_RADIUS_METERS = 100.0
// Data mahasiswa
const val STUDENT_NPM = "202310715082"
const val STUDENT_NAMA = "Fazri Abdurrahman"
// Webhook endpoints
const val WEBHOOK_PRODUCTION = "https://n8n.lab.ubharajaya.ac.id/webhook/..."
const val WEBHOOK_TEST = "https://n8n.lab.ubharajaya.ac.id/webhook-test/..."
```
### Mengubah Koordinat Referensi
1. Buka `AttendanceConfig.kt`
2. Update `REFERENCE_LATITUDE` dan `REFERENCE_LONGITUDE`
3. Atur `ALLOWED_RADIUS_METERS` sesuai kebutuhan
4. Rebuild aplikasi
## 🔐 Permissions
Aplikasi memerlukan permissions berikut:
- `ACCESS_FINE_LOCATION` - Untuk GPS precision
- `ACCESS_COARSE_LOCATION` - Fallback lokasi
- `CAMERA` - Untuk pengambilan foto
- `INTERNET` - Untuk komunikasi dengan server
Semua permissions diminta secara runtime (Android 6+).
## 📡 API Integration
### Webhook N8n
Aplikasi mengirim data ke N8n webhook dengan format:
```json
{
"npm": "202310715082",
"nama": "Fazri Abdurrahman",
"latitude": -7.0251,
"longitude": 110.4105,
"timestamp": 1705250400000,
"foto_base64": "base64_encoded_image_string"
}
```
### Response Handling
- **Status 200**: Absensi diterima, akan reset form setelah 2 detik
- **Status lain**: Error, tampilkan pesan error
## 🎨 UI Components
### 1. PhotoPreviewCard
Menampilkan preview foto yang diambil dengan opsi untuk ambil ulang.
### 2. LocationStatusCard
Menampilkan status lokasi, koordinat, dan jarak dari titik referensi.
### 3. ErrorAlertCard
Card untuk menampilkan error messages yang dismissable.
### 4. SubmitButtonWithLoader
Button dengan loading indicator untuk submit.
## 🔧 Validasi Lokasi
### Haversine Formula
Aplikasi menggunakan Haversine formula untuk menghitung jarak antara dua koordinat GPS:
```kotlin
d = 2 * R * asin(sqrt(sin²(Δφ/2) + cos(φ1) * cos(φ2) * sin²(Δλ/2)))
```
### Proses Validasi
1. Ambil koordinat mahasiswa dari GPS
2. Hitung jarak ke koordinat referensi
3. Bandingkan dengan ALLOWED_RADIUS_METERS
4. Tampilkan status valid/invalid
## 🐛 Troubleshooting
### GPS tidak berfungsi
- Pastikan aplikasi memiliki izin GPS
- Nyalakan location services di device
- Gunakan device dengan Google Play Services
### Foto tidak terakses
- Pastikan izin CAMERA granted
- Coba restart aplikasi
### Koneksi ke N8n gagal
- Cek internet connection
- Verifikasi webhook URL di `AttendanceConfig.kt`
- Test dengan `WEBHOOK_TEST` terlebih dahulu
### Lokasi selalu invalid
- Update koordinat referensi di `AttendanceConfig.kt`
- Tingkatkan `ALLOWED_RADIUS_METERS` jika diperlukan
## 📊 Testing
### Test dengan N8n Webhook Test
1. Set `isTest = true` di MainActivity submit button
2. Data akan dikirim ke `WEBHOOK_TEST`
3. Lihat response di N8n dashboard
### Manual Testing Checklist
- [ ] Permission request berfungsi
- [ ] GPS location terakses
- [ ] Camera foto terakses
- [ ] Foto preview ditampilkan
- [ ] Validasi lokasi bekerja
- [ ] Submit ke webhook berhasil
- [ ] Error handling tampil dengan baik
## 📝 Notes
### Privacy & Security
- Foto disimpan sebagai JPEG dengan quality 80%
- Koordinat dapat di-offset untuk privacy (lihat `AttendanceConfig.LATITUDE_OFFSET`)
- Gunakan HTTPS untuk komunikasi dengan server
- Implementasikan authentication token di N8n
### Future Improvements
- [ ] Attendance history dengan Room Database
- [ ] User login screen
- [ ] Multiple course support
- [ ] Biometric verification
- [ ] Offline mode dengan sync
- [ ] Push notifications untuk deadline
- [ ] QR code verification
## 📧 Support
Untuk pertanyaan atau masalah, silakan hubungi:
- **Institusi**: Universitas Bhakti Raharya
- **Mata Kuliah**: Pemrograman Mobile
- **Tahun Ajaran**: 2025-2026
## 📄 License
Project ini dibuat sebagai tugas akademik. Gunakan dengan bijak.
---
**Version**: 1.0
**Last Updated**: January 14, 2026