package mx.trackermap.TrackerMap.controllers 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 kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import mx.trackermap.TrackerMap.Injectable actual class NetworkController(context: Context): Injectable { private val networkRequest = NetworkRequest.Builder().build() private val connectivityManager: ConnectivityManager private val _networkAvailable = MutableStateFlow(null) actual val networkAvailable = _networkAvailable.asStateFlow() private val networkCallback = object: ConnectivityManager.NetworkCallback() { override fun onCapabilitiesChanged( network: Network, networkCapabilities: NetworkCapabilities ) { super.onCapabilitiesChanged(network, networkCapabilities) _networkAvailable.value = checkNetworkAccess(networkCapabilities) } override fun onLost(network: Network) { super.onLost(network) _networkAvailable.value = false } } init { connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager _networkAvailable.value = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { checkNetworkAccess(connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)) } else { connectivityManager.activeNetworkInfo?.isConnected == true } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { connectivityManager.registerDefaultNetworkCallback(networkCallback) } else { connectivityManager.registerNetworkCallback(networkRequest, networkCallback) } } private fun checkNetworkAccess(capabilities: NetworkCapabilities?) = capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) } else true }