update readme
This commit is contained in:
parent
ce05e1a617
commit
8cc6685816
50
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
50
.idea/inspectionProfiles/Project_Default.xml
generated
Normal 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>
|
||||||
382
README.md
382
README.md
@ -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
|
||||||

|
|
||||||
|
|
||||||
## 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**:
|
||||||
## Pengecekan:
|
- Latitude: `-6.224190375334469`
|
||||||
- https://ntfy.ubharajaya.ac.id/EAS
|
- Longitude: `107.00928773168418`
|
||||||
- https://docs.google.com/spreadsheets/d/1jH15MfnNgpPGuGeid0hYfY7fFUHCEFbCmg8afTyyLZs/edit?gid=0#gid=0
|
- **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
|
## 🎨 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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user