# πŸ“± 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