Skip to content

Instantly share code, notes, and snippets.

@andrewsafwatsamuel
Last active March 8, 2022 08:40
Show Gist options
  • Save andrewsafwatsamuel/82debec21e422b64592ed6c6ad36fc90 to your computer and use it in GitHub Desktop.
Save andrewsafwatsamuel/82debec21e422b64592ed6c6ad36fc90 to your computer and use it in GitHub Desktop.
Android connectivity listener
import android.annotation.TargetApi
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.net.*
import android.os.Build
import androidx.annotation.RequiresApi
import androidx.lifecycle.LiveData
@Suppress("DEPRECATION")
class ConnectivityListener(private val context: Context) : LiveData<Boolean>() {
private val connectivityManager by lazy { context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager }
private lateinit var callbackManager: ConnectivityManager.NetworkCallback
override fun onActive() {
super.onActive()
updateConnection()
when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.N -> {
connectivityManager.registerDefaultNetworkCallback(connectivityManagerCallback())
}
Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP -> {
lollipopNetworkRequester()
}
else -> {
context.registerReceiver(
networkReceiver,
IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
)
}
}
}
override fun onInactive() {
super.onInactive()
when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP -> {
if (::callbackManager.isInitialized) connectivityManager.unregisterNetworkCallback(callbackManager)
}
else -> context.unregisterReceiver(networkReceiver)
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private fun lollipopNetworkRequester() {
val requestBuilder = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
connectivityManager?.registerNetworkCallback(requestBuilder.build(), connectivityManagerCallback())
}
private fun connectivityManagerCallback(): ConnectivityManager.NetworkCallback {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) throw IllegalAccessError("Error")
callbackManager = @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
object : ConnectivityManager.NetworkCallback() {
override fun onLost(network: Network) {
super.onLost(network)
postValue(false)
}
override fun onAvailable(network: Network) {
super.onAvailable(network)
postValue(true)
}
}
return callbackManager
}
private val networkReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
updateConnection()
}
}
private fun updateConnection() {
val activeNetwork: NetworkInfo? = connectivityManager.activeNetworkInfo
postValue(activeNetwork?.isConnected == true)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment