diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..f0c6ad0 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,50 @@ + + + + \ No newline at end of file diff --git a/README.md b/README.md index 3ba104d..99b1547 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,12 @@ Aplikasi ini dirancang untuk meningkatkan **validitas kehadiran mahasiswa**, den 2. Melakukan **pengambilan foto (selfie) secara langsung saat absensi** --- -Nama : HAGA DALPINTO GINTING -NPM : 202310715176 + +**Nama**: HAGA DALPINTO GINTING +**NPM**: 202310715176 +**Kampus**: Universitas Bhayangkara Jakarta Raya - Bekasi Utara + +--- ## 🎯 Tujuan Proyek - Mengimplementasikan **Location-Based Service (LBS)** pada aplikasi mobile @@ -21,77 +25,341 @@ NPM : 202310715176 --- ## πŸš€ Fitur Utama -- πŸ” **Login Pengguna (Mahasiswa)** -- πŸ“ **Pengambilan Koordinat Lokasi (Latitude & Longitude)** -- 🏫 **Validasi Lokasi Absensi (Radius Area)** -- πŸ“Έ **Pengambilan Foto Mahasiswa Saat Absensi** -- πŸ•’ **Pencatatan Waktu Absensi** -- πŸ“„ **Riwayat Kehadiran Mahasiswa** -- ⚠️ **Notifikasi Absensi Ditolak jika Tidak Valid** + +### βœ… 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 Berbasis Lokasi dan Foto +## πŸ—ΊοΈ Mekanisme Absensi + 1. Mahasiswa melakukan **login** -2. Memilih menu **Absensi** -3. Sistem meminta: - - Izin **akses lokasi** - - Izin **akses kamera** -4. Aplikasi mengambil: - - πŸ“ **Koordinat lokasi mahasiswa** - - πŸ“Έ **Foto mahasiswa secara real-time** -5. Sistem melakukan validasi: - - Lokasi berada dalam **radius absensi** - - Foto berhasil diambil -6. Jika valid β†’ **Absensi berhasil** -7. Jika tidak valid β†’ **Absensi ditolak** - ---- - -## πŸ“Έ Pengambilan Foto Saat Absensi -- Foto diambil menggunakan **kamera depan (selfie)** -- Foto hanya dapat diambil **saat proses absensi** -- Foto disimpan sebagai **bukti kehadiran** -- Foto dapat digunakan untuk: - - Verifikasi manual oleh dosen - - Dokumentasi akademik +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 / Java -- **Location Service** : - - Google Maps API + +- **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** : CameraX / Camera2 -- **Database** : Firebase / SQLite / MySQL -- **Storage** : Firebase Storage / Local Storage -- **IDE** : Android Studio +- **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` -- `ACCESS_COARSE_LOCATION` -- `CAMERA` -- `INTERNET` -- `WRITE_EXTERNAL_STORAGE` (jika diperlukan) +- `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 --- -## πŸ“‚ Mockup -![mockup](Mockup.png) +## πŸ“Š Koordinat Kampus -## Catatan: -- Kembangkan project dari starter yang sudah disediakan, tidak membuat dari awal. -- Untuk koordinat bisa ditambah/kurangi angka tertentu agar tidak memunculkan koordinat rumah masing-masing, data awal tetap dari GPS. - -## Pengecekan: -- https://ntfy.ubharajaya.ac.id/EAS -- https://docs.google.com/spreadsheets/d/1jH15MfnNgpPGuGeid0hYfY7fFUHCEFbCmg8afTyyLZs/edit?gid=0#gid=0 +- **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 -## Webhook: -- test: https://n8n.lab.ubharajaya.ac.id/webhook-test/23c6993d-1792-48fb-ad1c-ffc78a3e6254 -- production: https://n8n.lab.ubharajaya.ac.id/webhook/23c6993d-1792-48fb-ad1c-ffc78a3e6254 \ No newline at end of file +--- + +## 🎨 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 diff --git a/app/src/main/java/id/ac/ubharajaya/sistemakademik/screens/AbsensiScreen.kt b/app/src/main/java/id/ac/ubharajaya/sistemakademik/screens/AbsensiScreen.kt index 88eeb85..1bb756e 100644 --- a/app/src/main/java/id/ac/ubharajaya/sistemakademik/screens/AbsensiScreen.kt +++ b/app/src/main/java/id/ac/ubharajaya/sistemakademik/screens/AbsensiScreen.kt @@ -658,6 +658,18 @@ private fun kirimKeWebhook( val json = JSONObject().apply { put("npm", absensi.npm) put("nama", absensi.nama) + + put("mata_kuliah", absensi.namaMatakuliah) + + + // πŸ”₯ TAMBAH INI + put("kode_matakuliah", absensi.kodeMatakuliah) + put("nama_matakuliah", absensi.namaMatakuliah) + put("dosen", absensi.dosenMatakuliah) + put("ruangan", absensi.ruanganMatakuliah) + put("waktu_kuliah", absensi.waktuMatakuliah) + + // Data lokasi & foto put("latitude", absensi.latitude) put("longitude", absensi.longitude) put("jarak", absensi.jarak) diff --git a/app/src/main/java/id/ac/ubharajaya/sistemakademik/screens/DashboardScreen.kt b/app/src/main/java/id/ac/ubharajaya/sistemakademik/screens/DashboardScreen.kt index 8631fbe..62386b1 100644 --- a/app/src/main/java/id/ac/ubharajaya/sistemakademik/screens/DashboardScreen.kt +++ b/app/src/main/java/id/ac/ubharajaya/sistemakademik/screens/DashboardScreen.kt @@ -104,7 +104,7 @@ fun DashboardScreen( modifier = Modifier.padding(16.dp) ) { Text( - text = "Selamat Datang, Budi!", + text = "Selamat Datang, Haga!", fontSize = 20.sp, fontWeight = FontWeight.Bold, color = primaryGreen