7.0 KiB
7.0 KiB
📋 QUICK REFERENCE CARD - Aplikasi Absensi Akademik
🚀 Quick Start
1. Build & Run
cd /Users/maccomputer/AndroidStudioProjects/Starter-EAS-2025-2026
./gradlew clean build
./gradlew installDebug
2. First Login
- NPM: (register dulu)
- Password: (sesuai pilihan)
3. Test Absensi
- Allow location & camera permissions
- Ambil foto
- Kirim absensi (otomatis validate lokasi)
- Lihat riwayat
🔧 Key Configuration Points
Campus Location
File: MainActivity.kt (line ~70)
campusLat: Double = -6.2030, // Ubah ini
campusLon: Double = 107.0045, // Ubah ini
radiusMeters: Float = 100f // Ubah ini (meter)
Webhook URL
File: MainActivity.kt (line ~110)
val url = URL("https://n8n.lab.ubharajaya.ac.id/webhook/...")
Database Version
File: DatabaseHelper.kt (line ~12)
private const val DATABASE_VERSION = 2
📱 Screen Navigation
LOGIN ←→ REGISTER
↓
ABSENSI (ambil foto + lokasi)
├─ Kirim (validate lokasi → webhook)
└─ Lihat Riwayat → HISTORY (list)
📊 Database Schema
Users Table
id | username | npm (UNIQUE) | password
Attendance Table (NEW)
id | npm (FK) | timestamp | latitude | longitude | status
Status Values:
"success"- dalam radius"invalid_location"- diluar radius
🔨 Main Functions
Location Functions
calculateDistance(lat1, lon1, lat2, lon2): Float
↓ Hitung jarak dalam meter
isWithinAbsensiRadius(studentLat, studentLon, ...): Boolean
↓ Cek apakah dalam radius absensi
obfuscateCoordinates(lat, lon, offset): Pair<Double, Double>
↓ Obfuscate koordinat untuk privacy
Database Functions
db.addAttendanceRecord(npm, timestamp, lat, lon, status): Boolean
↓ Simpan record absensi
db.getAttendanceHistory(npm): List<AttendanceRecord>
↓ Ambil riwayat absensi
Network Functions
kirimKeN8n(context, db, npm, nama, lat, lon, foto)
↓ Send data ke webhook dengan validasi
⚡ Common Tasks
Ubah Lokasi Campus
Edit MainActivity.kt line ~68:
fun isWithinAbsensiRadius(
studentLat: Double,
studentLon: Double,
campusLat: Double = -6.2030, // CHANGE THIS
campusLon: Double = 107.0045, // CHANGE THIS
radiusMeters: Float = 100f // CHANGE THIS
)
Ubah Radius
radiusMeters: Float = 200f // Ganti 100 menjadi 200
Ubah Webhook URL
Edit MainActivity.kt line ~110:
val url = URL("https://your-webhook-url-here")
Clear Database
adb shell pm clear id.ac.ubharajaya.sistemakademik
View Database
adb pull /data/data/id.ac.ubharajaya.sistemakademik/databases/Akademik.db
🧪 Testing Quick Checklist
- Register user baru
- Login dengan NPM/password
- Ambil foto (grant camera permission)
- Check lokasi (grant location permission)
- Kirim absensi
- Verifikasi di database:
- Attendance record tersimpan
- Status = "success" atau "invalid_location"
- Timestamp correct
- Lihat riwayat
- List muncul
- Status indicator (✓/✗) benar
- Tanggal format Indonesia
🐛 Debugging Tips
View Logs
adb logcat id.ac.ubharajaya.sistemakademik:V *:S
Check Database Content
adb shell
sqlite3 /data/data/id.ac.ubharajaya.sistemakademik/databases/Akademik.db
> SELECT * FROM users;
> SELECT * FROM attendance;
> .quit
Test Permission
adb shell pm grant id.ac.ubharajaya.sistemakademik android.permission.ACCESS_FINE_LOCATION
adb shell pm grant id.ac.ubharajaya.sistemakademik android.permission.CAMERA
📦 Dependencies
// Core
androidx.core:core-ktx
androidx.activity:activity-compose:1.9.0
// Compose
androidx.compose.ui
androidx.compose.material3
androidx.compose.material:material-icons-extended:1.6.0
// Location
com.google.android.gms:play-services-location:21.0.1
📂 Project Structure
app/
├── src/main/
│ ├── java/id/ac/ubharajaya/sistemakademik/
│ │ ├── MainActivity.kt (main app, all screens)
│ │ └── DatabaseHelper.kt (database operations)
│ ├── res/
│ │ ├── values/ (strings, colors, themes)
│ │ ├── layout/ (compose layouts)
│ │ └── drawable/ (icons, images)
│ └── AndroidManifest.xml (permissions, activities)
├── build.gradle.kts (dependencies, build config)
└── ...
🔐 Permissions Required
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.CAMERA"/>
📈 Useful Metrics
| Metric | Value |
|---|---|
| Min SDK | 28 |
| Target SDK | 36 |
| Compile SDK | 36 |
| Java Version | 11 |
| Default Radius | 100 meters |
| Photo Quality | 80% JPEG |
| DB Version | 2 |
🎯 Data Flow Summary
User Input
↓
Validate (location, photo)
↓
Save to Local DB
↓
Send to Webhook (n8n)
↓
Show Feedback
↓
Update History UI
💡 Tips & Tricks
-
Testing Location:
- Use Android Emulator's extended controls to simulate location
- Or physically go ke lokasi yang valid
-
Debugging Photo:
- Photo tersimpan sebagai Bitmap in-memory
- Convert to Base64 untuk webhook
- Tidak di-save ke storage (enhancement needed)
-
Database Testing:
- Pull database dan buka di SQLite browser
- Check attendance records dan status values
- Verify foreign key relationships
-
Network Testing:
- Monitor network calls di Android Studio Profiler
- Check webhook responses di n8n dashboard
- Use packet sniffer (tcpdump) untuk HTTPS analysis
🚨 Common Issues & Solutions
| Issue | Solution |
|---|---|
| Location null | Grant permission, wait for GPS lock |
| Photo not captured | Check camera permission, device has camera |
| Webhook timeout | Check internet, verify URL |
| DB migration error | Clear app data, reinstall |
| Permission denied | Grant at runtime, check manifest |
📚 Documentation Files
| File | Content |
|---|---|
DEVELOPMENT_GUIDE.md |
User guide, features, setup |
CHANGELOG.md |
Version history, detailed changes |
IMPLEMENTATION_NOTES.md |
Technical config, debugging |
IMPLEMENTATION_SUMMARY.md |
Project summary, metrics |
QUICK_REFERENCE.md |
This file - quick lookup |
🔗 Important URLs
- Webhook Test: https://n8n.lab.ubharajaya.ac.id/webhook-test/...
- Webhook Prod: https://n8n.lab.ubharajaya.ac.id/webhook/...
- Ntfy Monitoring: https://ntfy.ubharajaya.ac.id/EAS
- Spreadsheet Tracking: https://docs.google.com/spreadsheets/d/1jH15MfnNgpPGuGeid0hYfY7fFUHCEFbCmg8afTyyLZs/
Last Updated: 14 January 2026 Version: 1.1.0 For: Aplikasi Absensi Akademik Berbasis Koordinat dan Foto