Absensi GPS
Arsitektur Sistem
Backend
Frontend
API
  • Struktur
  • Alur Kerja
  • Implementasi GPS
  • Pengembangan dan Pengujian
Deployment
Pengujian
Arsitektur Sistem
Backend
Frontend
API
  • Struktur
  • Alur Kerja
  • Implementasi GPS
  • Pengembangan dan Pengujian
Deployment
Pengujian
  • Alur Kerja Aplikasi Android

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:

  1. 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
  2. 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/status dapat 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:

  1. User memasukkan ID Siswa dan Password
  2. Aplikasi melakukan validasi input
  3. Aplikasi mengirim request login ke endpoint /api/mobile/auth/login
  4. Jika login berhasil:
    • Simpan data siswa (ID, nama, kelas) ke SharedPreferences
    • Set status login menjadi true
    • Navigasi ke MainActivity
  5. 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:

  1. 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"
  2. 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/masuk dengan data lokasi
      • Jika berhasil, update status absensi dan ubah tombol menjadi "Absen Keluar"
  3. 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/keluar dengan 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:

  1. User menekan tombol "Logout"
  2. Aplikasi menampilkan dialog konfirmasi
  3. 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    │
└─────────────────┘     └─────────────────┘     └─────────────────┘
Last Updated:: 5/15/25, 10:00 PM
Contributors: Nur Wahyudin