366 lines
13 KiB
Markdown
366 lines
13 KiB
Markdown
# 📱 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:
|
|
1. Berada pada **lokasi yang telah ditentukan**, dan
|
|
2. 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
|
|
|
|
1. Mahasiswa melakukan **login**
|
|
2. Memilih menu **"Mulai Absensi"**
|
|
3. Memilih **mata kuliah** dari jadwal hari ini
|
|
4. Sistem meminta izin **akses lokasi** dan **akses kamera**
|
|
5. Aplikasi mengambil:
|
|
- 📍 **Koordinat lokasi mahasiswa** (GPS)
|
|
- 📸 **Foto mahasiswa secara real-time** (selfie)
|
|
6. Sistem melakukan validasi:
|
|
- ✅ Lokasi berada dalam **radius 100m** dari kampus
|
|
- ✅ Foto berhasil diambil
|
|
- ✅ Belum pernah absen untuk MK yang sama hari ini
|
|
7. Jika valid → **Absensi berhasil** → Data tersimpan + terkirim ke server
|
|
8. 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 akurat
|
|
- `ACCESS_COARSE_LOCATION` - Untuk lokasi network-based
|
|
- `CAMERA` - Untuk pengambilan foto selfie
|
|
- `INTERNET` - Untuk pengiriman data ke server
|
|
- `ACCESS_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`
|
|
- **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:
|
|
|
|
1. **MainActivity.kt**
|
|
- ✅ Diganti dengan Navigation Compose
|
|
- ✅ Setup navigation graph
|
|
- ✅ Handling argument passing
|
|
|
|
2. **AndroidManifest.xml**
|
|
- ✅ Tambah permissions lengkap
|
|
- ✅ Location permissions
|
|
- ✅ Camera permission
|
|
- ✅ Internet permission
|
|
|
|
3. **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):
|
|
1. ✅ `data/AbsensiEntity.kt` - Database entity
|
|
2. ✅ `data/AbsensiDao.kt` - Database queries
|
|
3. ✅ `data/AppDatabase.kt` - Database config
|
|
4. ✅ `data/UserPreferences.kt` - Session storage
|
|
5. ✅ `data/MataKuliah.kt` - MK data class
|
|
|
|
#### Screens (6 files):
|
|
1. ✅ `screens/LoginScreen.kt` - Login UI
|
|
2. ✅ `screens/DashboardScreen.kt` - Dashboard UI
|
|
3. ✅ `screens/ScheduleScreen.kt` - Jadwal UI
|
|
4. ✅ `screens/SelectMatakuliahScreen.kt` - Pilih MK UI
|
|
5. ✅ `screens/SuccessScreen.kt` - Success UI
|
|
6. ✅ `screens/HistoryScreen.kt` - History UI
|
|
|
|
#### Utils (2 files):
|
|
1. ✅ `utils/Constants.kt` - Konstanta
|
|
2. ✅ `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:
|
|
1. Set koordinat manual di Emulator Settings
|
|
2. Latitude: `-6.224190375334469`
|
|
3. Longitude: `107.00928773168418`
|
|
4. Atau ubah `RADIUS_METER` di Constants.kt jadi lebih besar untuk testing
|
|
|
|
### Di HP Fisik:
|
|
1. Gunakan Fake GPS app untuk testing di rumah
|
|
2. 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
|
|
|
|
1. **Database Migration**: Karena struktur AbsensiEntity berubah (tambah 5 field MK), disarankan uninstall app lama sebelum install yang baru.
|
|
|
|
2. **Koordinat Real**: Koordinat kampus menggunakan data real dari Google Maps (Universitas Bhayangkara Jakarta Raya - Bekasi Utara).
|
|
|
|
3. **Jadwal Real**: Jadwal mata kuliah disesuaikan dengan jadwal real mahasiswa (9 mata kuliah).
|
|
|
|
4. **Prevent Duplicate**: Sistem otomatis mencegah absensi duplikat untuk mata kuliah yang sama dalam satu hari.
|
|
|
|
5. **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
|