package com.taf.attendance.sync import android.content.Context import android.net.ConnectivityManager import android.net.NetworkCapabilities import android.util.Log import androidx.work.CoroutineWorker import androidx.work.WorkerParameters import com.taf.attendance.data.AttendanceRepository /** * Background worker that syncs pending attendance records when device comes online. * Runs periodically to check for unsynced records and attempt to upload them. */ class SyncWorker( context: Context, params: WorkerParameters ) : CoroutineWorker(context, params) { private val repository = AttendanceRepository(applicationContext) override suspend fun doWork(): Result { Log.d("SyncWorker", "Starting sync work") return try { // Check if device is online if (!isNetworkAvailable()) { Log.d("SyncWorker", "No network available, skipping sync") return Result.success() } // Check if there are unsynced records val unsyncedCount = repository.getUnsyncedCount() Log.d("SyncWorker", "Found $unsyncedCount unsynced records") if (unsyncedCount > 0) { // Attempt to sync pending records repository.sync() Log.d("SyncWorker", "Sync completed successfully") } Result.success() } catch (e: Exception) { Log.e("SyncWorker", "Sync failed", e) // Retry on network errors, fail permanently on auth errors if (e.message?.contains("401") == true || e.message?.contains("403") == true) { Result.failure() } else { Result.retry() } } } private fun isNetworkAvailable(): Boolean { val connectivityManager = applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val network = connectivityManager.activeNetwork ?: return false val networkCapabilities = connectivityManager.getNetworkCapabilities(network) ?: return false return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) } }