package com.taf.attendance.sync import android.content.Context import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkRequest import android.os.Build import android.util.Log import androidx.lifecycle.LiveData /** * Utility class to monitor network connectivity changes and trigger actions when device comes online. * Provides both immediate connectivity check and continuous monitoring capabilities. */ class NetworkMonitor(private val context: Context) : LiveData() { private val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager private val networkCallback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { Log.d("NetworkMonitor", "Network became available") postValue(true) } override fun onLost(network: Network) { Log.d("NetworkMonitor", "Network lost") postValue(false) } override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) { val hasInternet = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) Log.d("NetworkMonitor", "Network capabilities changed, has internet: $hasInternet") postValue(hasInternet) } } override fun onActive() { super.onActive() startMonitoring() // Post current connectivity status postValue(isNetworkAvailable()) } override fun onInactive() { super.onInactive() stopMonitoring() } private fun startMonitoring() { val networkRequest = NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) .build() try { connectivityManager.registerNetworkCallback(networkRequest, networkCallback) Log.d("NetworkMonitor", "Network monitoring started") } catch (e: Exception) { Log.e("NetworkMonitor", "Failed to register network callback", e) } } private fun stopMonitoring() { try { connectivityManager.unregisterNetworkCallback(networkCallback) Log.d("NetworkMonitor", "Network monitoring stopped") } catch (e: Exception) { Log.e("NetworkMonitor", "Failed to unregister network callback", e) } } /** * Check if network is currently available and has internet connectivity */ fun isNetworkAvailable(): Boolean { 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) } companion object { @Volatile private var INSTANCE: NetworkMonitor? = null fun getInstance(context: Context): NetworkMonitor { return INSTANCE ?: synchronized(this) { INSTANCE ?: NetworkMonitor(context.applicationContext).also { INSTANCE = it } } } } }