Last active
March 8, 2022 08:40
-
-
Save andrewsafwatsamuel/82debec21e422b64592ed6c6ad36fc90 to your computer and use it in GitHub Desktop.
Android connectivity listener
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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