Skip to content

Instantly share code, notes, and snippets.

@renaudmathieu
Created July 5, 2019 09:39
Show Gist options
  • Save renaudmathieu/1903935ce92f58e658cbb490be5b78fb to your computer and use it in GitHub Desktop.
Save renaudmathieu/1903935ce92f58e658cbb490be5b78fb to your computer and use it in GitHub Desktop.
A LiveData class which wraps the network connection status
/**
* A LiveData class which wraps the network connection status
* Requires Permission: ACCESS_NETWORK_STATE
*
* See https://developer.android.com/training/monitoring-device-state/connectivity-monitoring
* See https://developer.android.com/reference/android/net/ConnectivityManager
* See https://developer.android.com/reference/android/net/ConnectivityManager#CONNECTIVITY_ACTION
*/
class ConnectivityLiveData @VisibleForTesting internal constructor(
private val connectivityManager: ConnectivityManager
) : LiveData<Boolean>() {
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
constructor(application: Application) : this(
application.getSystemService(Context.CONNECTIVITY_SERVICE)
as ConnectivityManager
)
private val networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network?) {
postValue(true)
}
override fun onLost(network: Network?) {
postValue(false)
}
}
override fun onActive() {
super.onActive()
val activeNetwork: NetworkInfo? = connectivityManager.activeNetworkInfo
postValue(activeNetwork?.isConnectedOrConnecting == true)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
connectivityManager.registerDefaultNetworkCallback(networkCallback)
} else {
val builder = NetworkRequest.Builder()
connectivityManager.registerNetworkCallback(builder.build(), networkCallback)
}
}
override fun onInactive() {
super.onInactive()
connectivityManager.unregisterNetworkCallback(networkCallback)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment