Skip to content

Instantly share code, notes, and snippets.

@chydee
Forked from iRYO400/ConnectivityMonitor.kt
Created May 19, 2020 07:36
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save chydee/b542119cfcaf2f345adb0b2776878236 to your computer and use it in GitHub Desktop.
Save chydee/b542119cfcaf2f345adb0b2776878236 to your computer and use it in GitHub Desktop.
Check Internet Connection [API21+][API29+ supported] Lifecycle aware
import android.content.Context
import android.content.Context.CONNECTIVITY_SERVICE
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
import android.net.NetworkRequest
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.OnLifecycleEvent
import timber.log.Timber
class ConnectivityMonitor(
context: Context,
lifecycleOwner: LifecycleOwner,
private val callback: (Boolean) -> Unit
) : LifecycleObserver {
private var connectivityManager =
context.getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
private val networkRequest = NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
.addTransportType(NetworkCapabilities.TRANSPORT_VPN)
.build()
init {
lifecycleOwner.lifecycle.addObserver(this)
}
@Suppress("unused")
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onResume() {
toggleConnectionState(connectivityManager.isDefaultNetworkActive)
connectivityManager.registerNetworkCallback(networkRequest, networkCallback)
}
@Suppress("unused")
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onPause() {
connectivityManager.unregisterNetworkCallback(networkCallback)
}
private fun toggleConnectionState(isConnected: Boolean) = callback.invoke(isConnected)
private val networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onCapabilitiesChanged(
network: Network,
networkCapabilities: NetworkCapabilities
) {
super.onCapabilitiesChanged(network, networkCapabilities)
Timber.d("onCapabilitiesChanged")
lastInternetConnectionCheck()
}
override fun onAvailable(network: Network) {
super.onAvailable(network)
Timber.d("onAvailable")
lastInternetConnectionCheck()
}
override fun onLost(network: Network) {
super.onLost(network)
Timber.d("onLost")
lastInternetConnectionCheck()
}
private fun lastInternetConnectionCheck() =
connectivityManager.allNetworks.forEach { network ->
network?.let {
connectivityManager.getNetworkCapabilities(it)
?.let { networkCapabilities ->
val netInternet =
networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
val transportCellular =
networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
val transportWifi =
networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
val transportEthernet =
networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)
val transportVpn =
networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)
val isConnected = netInternet ||
transportWifi || transportCellular ||
transportEthernet || transportVpn
Timber.d("Connections State $isConnected netInternet: $netInternet, WiFi: $transportWifi, Cellular: $transportCellular, Ethernet: $transportEthernet, VPN: $transportVpn")
toggleConnectionState(isConnected)
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment