HagaDalpintoGinting 8cc6685816 update readme
2026-01-14 20:36:17 +07:00

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