package {{.PackageName}}.utils import android.content.Context import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkRequest import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.distinctUntilChanged class NetworkMonitor(private val context: Context) { private val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager /** * Flow that emits true when internet is available, false otherwise */ val isConnected: Flow = callbackFlow { val callback = object : ConnectivityManager.NetworkCallback() { private val networks = mutableSetOf() override fun onAvailable(network: Network) { networks.add(network) trySend(networks.isNotEmpty()) } override fun onLost(network: Network) { networks.remove(network) trySend(networks.isNotEmpty()) } override fun onCapabilitiesChanged( network: Network, networkCapabilities: NetworkCapabilities ) { val hasInternet = networkCapabilities.hasCapability( NetworkCapabilities.NET_CAPABILITY_INTERNET ) && networkCapabilities.hasCapability( NetworkCapabilities.NET_CAPABILITY_VALIDATED ) if (hasInternet) { networks.add(network) } else { networks.remove(network) } trySend(networks.isNotEmpty()) } } val request = NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .build() connectivityManager.registerNetworkCallback(request, callback) // Send initial state trySend(checkCurrentConnectivity()) awaitClose { connectivityManager.unregisterNetworkCallback(callback) } }.distinctUntilChanged() /** * Check current connectivity state synchronously */ fun checkCurrentConnectivity(): Boolean { val network = connectivityManager.activeNetwork ?: return false val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) } }