Skip to content

Instantly share code, notes, and snippets.

@marenovakovic
Last active March 30, 2021 13:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save marenovakovic/e26f3efe9bb3d561723bbf9b26fe6ce2 to your computer and use it in GitHub Desktop.
Save marenovakovic/e26f3efe9bb3d561723bbf9b26fe6ce2 to your computer and use it in GitHub Desktop.
class NetworkStatusTracker(context: Context) {
private val connectivityManager =
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkStatus = callbackFlow<NetworkStatus> {
val networkStatusCallback = object : ConnectivityManager.NetworkCallback() {
override fun onUnavailable() {
offer(NetworkStatus.Unavailable)
}
override fun onAvailable(network: Network) {
offer(NetworkStatus.Available)
}
override fun onLost(network: Network) {
offer(NetworkStatus.Unavailable)
}
}
val request = NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build()
connectivityManager.registerNetworkCallback(request, networkStatusCallback)
awaitClose {
connectivityManager.unregisterNetworkCallback(networkStatusCallback)
}
}
}
inline fun <Result> Flow<NetworkStatus>.map(
crossinline onUnavailable: suspend () -> Result,
crossinline onAvailable: suspend () -> Result,
): Flow<Result> = map { status ->
when (status) {
NetworkStatus.Unavailable -> onUnavailable()
NetworkStatus.Available -> onAvailable()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment