📱 Aplikasi Absensi Akademik Berbasis Koordinat dan Foto (Mobile)
📌 Deskripsi Proyek
Proyek ini merupakan Tugas Project Akhir Mata Kuliah Pemrograman Mobile yang bertujuan untuk membangun aplikasi akademik berbasis mobile dengan fokus pada fitur absensi menggunakan data koordinat (GPS) dan pengambilan foto mahasiswa.
Aplikasi ini dirancang untuk meningkatkan validitas kehadiran mahasiswa, dengan memastikan bahwa absensi hanya dapat dilakukan apabila mahasiswa:
- Berada pada lokasi yang telah ditentukan, dan
- Melakukan pengambilan foto (selfie) secara langsung saat absensi
Nama: HAGA DALPINTO GINTING
NPM: 202310715176
Kampus: Universitas Bhayangkara Jakarta Raya - Bekasi Utara
🎯 Tujuan Proyek
- Mengimplementasikan Location-Based Service (LBS) pada aplikasi mobile
- Mengintegrasikan kamera perangkat untuk dokumentasi absensi
- Mencegah kecurangan absensi (titip absen)
- Mengembangkan aplikasi mobile akademik berbasis Android
- Melatih kemampuan perancangan dan implementasi aplikasi mobile
🚀 Fitur Utama
✅ Fitur yang Sudah Dikembangkan:
- 🔐 Login & Authentication dengan validasi NPM dan session management
- 📋 Dashboard Menu dengan navigasi lengkap
- 📅 Jadwal Kuliah Lengkap dengan data real mahasiswa
- 🎓 Pemilihan Mata Kuliah sebelum absensi (filter hari ini + prevent duplicate)
- 📍 Deteksi Lokasi GPS Real-time dengan Fused Location Provider
- 🏫 Validasi Radius Lokasi (100m dari kampus) dengan Haversine Formula
- 📸 Pengambilan Foto Selfie dengan preview
- 💾 Penyimpanan Offline menggunakan Room Database
- 🕒 Pencatatan Lengkap (NPM, Nama, MK, Lokasi, Foto, Timestamp)
- 📄 Riwayat Kehadiran dengan detail mata kuliah
- ☁️ Pengiriman ke Server (webhook n8n)
- ⚠️ Validasi Lengkap (lokasi, foto, duplicate check)
🗺️ Mekanisme Absensi
- Mahasiswa melakukan login
- Memilih menu "Mulai Absensi"
- Memilih mata kuliah dari jadwal hari ini
- Sistem meminta izin akses lokasi dan akses kamera
- Aplikasi mengambil:
- 📍 Koordinat lokasi mahasiswa (GPS)
- 📸 Foto mahasiswa secara real-time (selfie)
- Sistem melakukan validasi:
- ✅ Lokasi berada dalam radius 100m dari kampus
- ✅ Foto berhasil diambil
- ✅ Belum pernah absen untuk MK yang sama hari ini
- Jika valid → Absensi berhasil → Data tersimpan + terkirim ke server
- Jika tidak valid → Absensi ditolak dengan notifikasi
🛠️ Teknologi yang Digunakan
- Platform: Android
- Bahasa Pemrograman: Kotlin
- UI Framework: Jetpack Compose
- Arsitektur: MVVM (Model-View-ViewModel)
- Navigation: Navigation Compose
- Location Service:
- Google Play Services Location 21.1.0
- Fused Location Provider
- Camera API: Android Camera Intent
- Database: Room Database 2.6.1 (SQLite)
- Storage: DataStore Preferences 1.0.0
- Network: HttpURLConnection + JSON
- Image Processing: Bitmap + Base64 Encoding
- Additional Libraries:
- Gson 2.10.1 (JSON serialization)
- Kotlinx Coroutines (async operations)
- Lifecycle Runtime Compose
- IDE: Android Studio
🔐 Izin Aplikasi (Permissions)
Aplikasi memerlukan izin berikut:
ACCESS_FINE_LOCATION- Untuk GPS akuratACCESS_COARSE_LOCATION- Untuk lokasi network-basedCAMERA- Untuk pengambilan foto selfieINTERNET- Untuk pengiriman data ke serverACCESS_NETWORK_STATE- Untuk cek status koneksi
📊 Koordinat Kampus
- Universitas: Universitas Bhayangkara Jakarta Raya
- Lokasi: Bekasi Utara, Jawa Barat
- Alamat: Jl. Raya Perjuangan No.81, Marga Mulya
- Koordinat GPS:
- Latitude:
-6.224190375334469 - Longitude:
107.00928773168418
- Latitude:
- Radius Validasi: 100 meter
🎨 Struktur Aplikasi
app/src/main/java/id/ac/ubharajaya/sistemakademik/
├── MainActivity.kt # Main activity dengan navigation
├── data/ # Data layer
│ ├── AbsensiEntity.kt # Database entity
│ ├── AbsensiDao.kt # Database DAO
│ ├── AppDatabase.kt # Database configuration
│ ├── UserPreferences.kt # Session storage
│ └── MataKuliah.kt # MK data class
├── screens/ # UI screens
│ ├── LoginScreen.kt # Login
│ ├── DashboardScreen.kt # Dashboard menu
│ ├── ScheduleScreen.kt # Jadwal kuliah
│ ├── SelectMatakuliahScreen.kt # Pilih MK
│ ├── AbsensiScreen.kt # Absensi (GPS + foto)
│ ├── SuccessScreen.kt # Konfirmasi sukses
│ └── HistoryScreen.kt # Riwayat absensi
├── utils/ # Utilities
│ ├── Constants.kt # Konstanta
│ └── LocationValidator.kt # Validasi lokasi
└── ui/theme/ # Theme files
📱 Flow Aplikasi
Login (NPM + Password)
↓
Dashboard (Menu utama)
├─→ Jadwal Kuliah (lihat jadwal)
├─→ Mulai Absensi
│ ↓
│ Pilih Mata Kuliah (dari jadwal hari ini)
│ ↓
│ Absensi Screen
│ ├─ Validasi Lokasi GPS
│ ├─ Ambil Foto Selfie
│ └─ Kirim Absensi
│ ↓
│ Success Screen
│
└─→ Riwayat Absensi (lihat history)
🔄 CHANGELOG - Pengembangan dari Starter
✨ Fitur Baru yang Ditambahkan:
1. Authentication & Session Management
- ✅ Implementasi LoginScreen dengan validasi NPM
- ✅ Session management menggunakan DataStore Preferences
- ✅ Auto-login jika sudah pernah login
- ✅ Logout functionality
2. Database & Offline Storage
- ✅ Setup Room Database untuk offline storage
- ✅ AbsensiEntity dengan field lengkap (NPM, Nama, MK, Lokasi, Foto, Timestamp)
- ✅ AbsensiDao dengan query CRUD lengkap
- ✅ Query khusus: get absensi hari ini, count absensi, filter by MK
- ✅ UserPreferences untuk menyimpan data login
3. Location-Based Service (LBS)
- ✅ Integrasi Google Play Services Location
- ✅ Implementasi Fused Location Provider
- ✅ LocationValidator dengan Haversine Formula
- ✅ Validasi radius 100 meter dari koordinat kampus
- ✅ Visual indicator status lokasi (hijau/merah)
- ✅ Tampilan jarak real-time dari kampus
- ✅ Error handling untuk GPS errors
4. Fitur Mata Kuliah
- ✅ Data class MataKuliah dengan Parcelable
- ✅ SelectMatakuliahScreen untuk pilih MK sebelum absen
- ✅ Filter otomatis: hanya tampil jadwal HARI INI
- ✅ Auto-disable MK yang sudah diabsen (prevent duplicate)
- ✅ Tampilan jadwal lengkap dengan data real
- ✅ Passing MK data via Navigation (JSON + URL encode)
- ✅ Database menyimpan info lengkap MK per absensi
5. Enhanced UI/UX
- ✅ Modern design dengan Material Design 3
- ✅ Consistent color scheme (hijau akademik: #2E7D32)
- ✅ LoginScreen dengan form validation
- ✅ DashboardScreen dengan menu cards & info user
- ✅ ScheduleScreen dengan jadwal real (9 mata kuliah)
- ✅ SelectMatakuliahScreen dengan filter & disable logic
- ✅ AbsensiScreen dengan info MK + status lokasi + preview foto
- ✅ SuccessScreen dengan konfirmasi visual
- ✅ HistoryScreen dengan detail MK & grouping
- ✅ Loading indicators untuk semua async operations
- ✅ Toast messages untuk feedback
6. Navigation
- ✅ Setup Navigation Compose
- ✅ Navigation graph dengan 7 routes
- ✅ Type-safe navigation arguments
- ✅ Back stack management
- ✅ Deep linking support
7. Camera Integration
- ✅ Camera Intent untuk selfie
- ✅ Preview foto sebelum kirim
- ✅ Image compression & Base64 encoding
- ✅ Runtime permission handling
8. Network & API
- ✅ HTTP POST ke webhook n8n
- ✅ JSON payload dengan data lengkap
- ✅ Background thread untuk network operations
- ✅ Error handling & retry mechanism
- ✅ Status tracking (terkirim/pending)
9. Validations
- ✅ Validasi NPM saat login
- ✅ Validasi lokasi dengan radius
- ✅ Validasi foto harus ada
- ✅ Validasi prevent duplicate: 1 MK = 1 absensi per hari
- ✅ Form validation di semua input
10. Data Management
- ✅ AbsensiEntity diperluas dengan 5 field MK
- ✅ MataKuliah data class
- ✅ UserPreferences data class
- ✅ Constants untuk konfigurasi terpusat
- ✅ Flow untuk reactive data
🔧 Update File yang Sudah Ada:
-
MainActivity.kt
- ✅ Diganti dengan Navigation Compose
- ✅ Setup navigation graph
- ✅ Handling argument passing
-
AndroidManifest.xml
- ✅ Tambah permissions lengkap
- ✅ Location permissions
- ✅ Camera permission
- ✅ Internet permission
-
build.gradle.kts
- ✅ Tambah Navigation Compose dependency
- ✅ Tambah Room Database dependencies
- ✅ Tambah DataStore Preferences
- ✅ Tambah Google Play Services Location
- ✅ Tambah Gson untuk JSON
- ✅ Setup kapt plugin untuk Room
📦 File Baru yang Dibuat:
Data Layer (5 files):
- ✅
data/AbsensiEntity.kt- Database entity - ✅
data/AbsensiDao.kt- Database queries - ✅
data/AppDatabase.kt- Database config - ✅
data/UserPreferences.kt- Session storage - ✅
data/MataKuliah.kt- MK data class
Screens (6 files):
- ✅
screens/LoginScreen.kt- Login UI - ✅
screens/DashboardScreen.kt- Dashboard UI - ✅
screens/ScheduleScreen.kt- Jadwal UI - ✅
screens/SelectMatakuliahScreen.kt- Pilih MK UI - ✅
screens/SuccessScreen.kt- Success UI - ✅
screens/HistoryScreen.kt- History UI
Utils (2 files):
- ✅
utils/Constants.kt- Konstanta - ✅
utils/LocationValidator.kt- Location logic
📊 Statistik Pengembangan:
- Total Files Created: 13 files baru
- Total Files Updated: 4 files
- Total Lines of Code: ~3,000+ lines
- Screens Developed: 6 screens
- Database Tables: 1 table (absensi)
- Navigation Routes: 6 routes
- Permissions Required: 5 permissions
- API Endpoints: 1 webhook
- Features Implemented: 10+ major features
🧪 Testing
Di Emulator:
- Set koordinat manual di Emulator Settings
- Latitude:
-6.224190375334469 - Longitude:
107.00928773168418 - Atau ubah
RADIUS_METERdi Constants.kt jadi lebih besar untuk testing
Di HP Fisik:
- Gunakan Fake GPS app untuk testing di rumah
- Atau berada di area kampus untuk testing real
Testing Credentials:
- NPM:
202310715176 - Password: Bebas (minimal 4 karakter)
🔗 Links
- Repository: https://git.lab.ubharajaya.ac.id/202310715176-HAGA-DALPINTO-GINTING/EAS-202310715176-HagaDalpintoGinting.git
- Webhook Production: https://n8n.lab.ubharajaya.ac.id/webhook/23c6993d-1792-48fb-ad1c-ffc78a3e6254
- Webhook Test: https://n8n.lab.ubharajaya.ac.id/webhook-test/23c6993d-1792-48fb-ad1c-ffc78a3e6254
- Monitoring: https://ntfy.ubharajaya.ac.id/EAS
- Google Sheet: https://docs.google.com/spreadsheets/d/1jH15MfnNgpPGuGeid0hYfY7fFUHCEFbCmg8afTyyLZs/edit?gid=0#gid=0
📝 Catatan Penting
-
Database Migration: Karena struktur AbsensiEntity berubah (tambah 5 field MK), disarankan uninstall app lama sebelum install yang baru.
-
Koordinat Real: Koordinat kampus menggunakan data real dari Google Maps (Universitas Bhayangkara Jakarta Raya - Bekasi Utara).
-
Jadwal Real: Jadwal mata kuliah disesuaikan dengan jadwal real mahasiswa (9 mata kuliah).
-
Prevent Duplicate: Sistem otomatis mencegah absensi duplikat untuk mata kuliah yang sama dalam satu hari.
-
Offline First: Data tersimpan di local database terlebih dahulu, baru dikirim ke server. Jadi tetap bisa lihat history meskipun offline.
🤖 Acknowledgment - AI Assistance Aplikasi ini dikembangkan dengan bantuan Claude AI (Anthropic) sebagai coding assistant dan learning companion.
✅ Code Generation: Membantu generate boilerplate code dan struktur awal aplikasi ✅ Problem Solving: Membantu debugging dan troubleshooting errors ✅ Best Practices: Memberikan saran implementasi mengikuti Android best practices ✅ Documentation: Membantu membuat dokumentasi lengkap dan changelog ✅ Learning Resource: Menjelaskan konsep-konsep seperti Room Database, Navigation Compose, Location Services, dll
👨💻 Developer
- Nama: HAGA DALPINTO GINTING
- NPM: 202310715176
- Jurusan: Informatika
- Fakultas: Ilmu Komputer
- Universitas: Universitas Bhayangkara Jakarta Raya
📜 License
Educational Project - Universitas Bhayangkara Jakarta Raya