Alur Kerja Aplikasi Android
Dokumen ini menjelaskan alur kerja (workflow) dari aplikasi Android Absensi GPS, mulai dari pencarian server hingga proses absensi.
1. Pencarian Server
Saat aplikasi pertama kali dibuka, SplashActivity akan melakukan proses berikut:
Memeriksa apakah ada IP server yang tersimpan di SharedPreferences
- Jika ada dan user sudah login, langsung navigasi ke MainActivity
- Jika ada tapi user belum login, cek status server dan navigasi ke LoginActivity
- Jika tidak ada, mulai proses scanning server
Proses scanning server:
- Mendapatkan IP device dari DHCP info
- Menentukan subnet berdasarkan IP device
- Melakukan scanning ke semua IP dalam subnet (1-254)
- Untuk setiap IP, cek apakah endpoint
/api/mobile/statusdapat diakses - Jika ditemukan server yang valid, simpan IP server dan navigasi ke LoginActivity
// Contoh kode scanning server
networkScanner.scanSubnet(object : NetworkScanner.ScanListener {
override fun onServerFound(serverIp: String) {
// Server ditemukan, simpan IP dan navigasi ke LoginActivity
SharedPreferencesManager.saveServerIp(serverIp)
navigateToLoginActivity()
}
override fun onScanComplete(serverIpList: List<String>) {
if (serverIpList.isEmpty()) {
// Tidak ada server yang ditemukan
showServerNotFoundMessage()
}
}
})
2. Proses Login
Setelah server ditemukan, LoginActivity akan menampilkan form login:
- User memasukkan ID Siswa dan Password
- Aplikasi melakukan validasi input
- Aplikasi mengirim request login ke endpoint
/api/mobile/auth/login - Jika login berhasil:
- Simpan data siswa (ID, nama, kelas) ke SharedPreferences
- Set status login menjadi true
- Navigasi ke MainActivity
- Jika login gagal, tampilkan pesan error
// Contoh kode login
apiService.login(LoginRequest(idSiswa, password)).enqueue(object : Callback<LoginResponse> {
override fun onResponse(call: Call<LoginResponse>, response: Response<LoginResponse>) {
if (response.isSuccessful && response.body()?.success == true) {
// Login berhasil, simpan data dan navigasi ke MainActivity
val siswa = response.body()?.data?.siswa
SharedPreferencesManager.saveUserData(
siswaId = siswa.id,
idSiswa = siswa.id_siswa,
nama = siswa.nama,
kelasId = siswa.kelas.id,
namaKelas = siswa.kelas.nama_kelas
)
navigateToMainActivity()
} else {
// Login gagal
showErrorMessage(response.body()?.message ?: "Login gagal")
}
}
})
3. Proses Absensi
Di MainActivity, user dapat melakukan absensi masuk dan keluar:
Saat activity dibuka, aplikasi akan:
- Menampilkan data profil siswa
- Mengecek status absensi hari ini dari endpoint
/api/mobile/absensi/status - Menentukan apakah tombol absensi adalah "Absen Masuk" atau "Absen Keluar"
Proses absensi masuk:
- User menekan tombol "Absen Masuk"
- Aplikasi menampilkan dialog konfirmasi
- Jika user mengkonfirmasi, aplikasi akan:
- Mengecek izin lokasi
- Mendapatkan lokasi GPS saat ini
- Mengirim request ke endpoint
/api/mobile/absensi/masukdengan data lokasi - Jika berhasil, update status absensi dan ubah tombol menjadi "Absen Keluar"
Proses absensi keluar:
- User menekan tombol "Absen Keluar"
- Aplikasi menampilkan dialog konfirmasi
- Jika user mengkonfirmasi, aplikasi akan:
- Mengecek izin lokasi
- Mendapatkan lokasi GPS saat ini
- Mengirim request ke endpoint
/api/mobile/absensi/keluardengan data lokasi - Jika berhasil, update status absensi dan nonaktifkan tombol absensi
// Contoh kode absensi masuk
locationHelper.getCurrentLocation { location ->
if (location != null) {
val lokasi = "${location.latitude},${location.longitude}"
apiService.absenMasuk(AbsensiRequest(siswaId, lokasi)).enqueue(object : Callback<AbsensiResponse> {
override fun onResponse(call: Call<AbsensiResponse>, response: Response<AbsensiResponse>) {
if (response.isSuccessful && response.body()?.success == true) {
// Absensi berhasil
showSuccessMessage(response.body()?.message)
checkAbsensiStatus() // Update status absensi
} else {
// Absensi gagal
showErrorMessage(response.body()?.message ?: "Gagal absen masuk")
}
}
})
}
}
4. Proses Logout
User dapat logout dari aplikasi:
- User menekan tombol "Logout"
- Aplikasi menampilkan dialog konfirmasi
- Jika user mengkonfirmasi, aplikasi akan:
- Menghapus data siswa dari SharedPreferences
- Set status login menjadi false
- Navigasi kembali ke LoginActivity
// Contoh kode logout
SharedPreferencesManager.clearUserData()
navigateToLoginActivity()
Diagram Alur
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ SplashActivity │────▶│ LoginActivity │────▶│ MainActivity │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Scan Server │ │ Login API │ │ Absensi API │
└─────────────────┘ └─────────────────┘ └─────────────────┘