update readme

This commit is contained in:
HagaDalpintoGinting 2026-01-14 20:36:17 +07:00
parent ce05e1a617
commit 8cc6685816
4 changed files with 388 additions and 58 deletions

View File

@ -0,0 +1,50 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="ComposePreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="ComposePreviewMustBeTopLevelFunction" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="ComposePreviewNeedsComposableAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="ComposePreviewNotSupportedInUnitTestFiles" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="GlancePreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="GlancePreviewMustBeTopLevelFunction" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="GlancePreviewNeedsComposableAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="GlancePreviewNotSupportedInUnitTestFiles" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewAnnotationInFunctionWithParameters" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewApiLevelMustBeValid" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewDeviceShouldUseNewSpec" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewFontScaleMustBeGreaterThanZero" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewMultipleParameterProviders" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewParameterProviderOnFirstParameter" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewPickerAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
</profile>
</component>

380
README.md
View File

@ -8,8 +8,12 @@ Aplikasi ini dirancang untuk meningkatkan **validitas kehadiran mahasiswa**, den
2. Melakukan **pengambilan foto (selfie) secara langsung saat absensi** 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 ## 🎯 Tujuan Proyek
- Mengimplementasikan **Location-Based Service (LBS)** pada aplikasi mobile - Mengimplementasikan **Location-Based Service (LBS)** pada aplikasi mobile
@ -21,77 +25,341 @@ NPM : 202310715176
--- ---
## 🚀 Fitur Utama ## 🚀 Fitur Utama
- 🔐 **Login Pengguna (Mahasiswa)**
- 📍 **Pengambilan Koordinat Lokasi (Latitude & Longitude)** ### ✅ Fitur yang Sudah Dikembangkan:
- 🏫 **Validasi Lokasi Absensi (Radius Area)** - 🔐 **Login & Authentication** dengan validasi NPM dan session management
- 📸 **Pengambilan Foto Mahasiswa Saat Absensi** - 📋 **Dashboard Menu** dengan navigasi lengkap
- 🕒 **Pencatatan Waktu Absensi** - 📅 **Jadwal Kuliah Lengkap** dengan data real mahasiswa
- 📄 **Riwayat Kehadiran Mahasiswa** - 🎓 **Pemilihan Mata Kuliah** sebelum absensi (filter hari ini + prevent duplicate)
- ⚠️ **Notifikasi Absensi Ditolak jika Tidak Valid** - 📍 **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** 1. Mahasiswa melakukan **login**
2. Memilih menu **Absensi** 2. Memilih menu **"Mulai Absensi"**
3. Sistem meminta: 3. Memilih **mata kuliah** dari jadwal hari ini
- Izin **akses lokasi** 4. Sistem meminta izin **akses lokasi** dan **akses kamera**
- Izin **akses kamera** 5. Aplikasi mengambil:
4. Aplikasi mengambil: - 📍 **Koordinat lokasi mahasiswa** (GPS)
- 📍 **Koordinat lokasi mahasiswa** - 📸 **Foto mahasiswa secara real-time** (selfie)
- 📸 **Foto mahasiswa secara real-time** 6. Sistem melakukan validasi:
5. Sistem melakukan validasi: - ✅ Lokasi berada dalam **radius 100m** dari kampus
- Lokasi berada dalam **radius absensi** - ✅ Foto berhasil diambil
- Foto berhasil diambil - ✅ Belum pernah absen untuk MK yang sama hari ini
6. Jika valid → **Absensi berhasil** 7. Jika valid → **Absensi berhasil** → Data tersimpan + terkirim ke server
7. Jika tidak valid → **Absensi ditolak** 8. Jika tidak valid → **Absensi ditolak** dengan notifikasi
---
## 📸 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
--- ---
## 🛠️ Teknologi yang Digunakan ## 🛠️ Teknologi yang Digunakan
- **Platform** : Android
- **Bahasa Pemrograman** : Kotlin / Java - **Platform**: Android
- **Location Service** : - **Bahasa Pemrograman**: Kotlin
- Google Maps API - **UI Framework**: Jetpack Compose
- **Arsitektur**: MVVM (Model-View-ViewModel)
- **Navigation**: Navigation Compose
- **Location Service**:
- Google Play Services Location 21.1.0
- Fused Location Provider - Fused Location Provider
- **Camera API** : CameraX / Camera2 - **Camera API**: Android Camera Intent
- **Database** : Firebase / SQLite / MySQL - **Database**: Room Database 2.6.1 (SQLite)
- **Storage** : Firebase Storage / Local Storage - **Storage**: DataStore Preferences 1.0.0
- **IDE** : Android Studio - **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) ## 🔐 Izin Aplikasi (Permissions)
Aplikasi memerlukan izin berikut: Aplikasi memerlukan izin berikut:
- `ACCESS_FINE_LOCATION` - `ACCESS_FINE_LOCATION` - Untuk GPS akurat
- `ACCESS_COARSE_LOCATION` - `ACCESS_COARSE_LOCATION` - Untuk lokasi network-based
- `CAMERA` - `CAMERA` - Untuk pengambilan foto selfie
- `INTERNET` - `INTERNET` - Untuk pengiriman data ke server
- `WRITE_EXTERNAL_STORAGE` (jika diperlukan) - `ACCESS_NETWORK_STATE` - Untuk cek status koneksi
--- ---
## 📂 Mockup ## 📊 Koordinat Kampus
![mockup](Mockup.png)
## Catatan: - **Universitas**: Universitas Bhayangkara Jakarta Raya
- Kembangkan project dari starter yang sudah disediakan, tidak membuat dari awal. - **Lokasi**: Bekasi Utara, Jawa Barat
- Untuk koordinat bisa ditambah/kurangi angka tertentu agar tidak memunculkan koordinat rumah masing-masing, data awal tetap dari GPS. - **Alamat**: Jl. Raya Perjuangan No.81, Marga Mulya
- **Koordinat GPS**:
- Latitude: `-6.224190375334469`
- Longitude: `107.00928773168418`
- **Radius Validasi**: 100 meter
## Pengecekan: ---
- https://ntfy.ubharajaya.ac.id/EAS
- https://docs.google.com/spreadsheets/d/1jH15MfnNgpPGuGeid0hYfY7fFUHCEFbCmg8afTyyLZs/edit?gid=0#gid=0
## Webhook: ## 🎨 Struktur Aplikasi
- 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 ```
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

View File

@ -658,6 +658,18 @@ private fun kirimKeWebhook(
val json = JSONObject().apply { val json = JSONObject().apply {
put("npm", absensi.npm) put("npm", absensi.npm)
put("nama", absensi.nama) 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("latitude", absensi.latitude)
put("longitude", absensi.longitude) put("longitude", absensi.longitude)
put("jarak", absensi.jarak) put("jarak", absensi.jarak)

View File

@ -104,7 +104,7 @@ fun DashboardScreen(
modifier = Modifier.padding(16.dp) modifier = Modifier.padding(16.dp)
) { ) {
Text( Text(
text = "Selamat Datang, Budi!", text = "Selamat Datang, Haga!",
fontSize = 20.sp, fontSize = 20.sp,
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
color = primaryGreen color = primaryGreen