Skip to content

Instantly share code, notes, and snippets.

@nurmaj
Created April 23, 2023 14:56
Show Gist options
  • Save nurmaj/3d0ac5e012b3f0ff1c42190ab9355a61 to your computer and use it in GitHub Desktop.
Save nurmaj/3d0ac5e012b3f0ff1c42190ab9355a61 to your computer and use it in GitHub Desktop.
import android.content.Context
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
import android.net.NetworkRequest
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.callbackFlow
interface ConnectivityObserver {
fun observe(): Flow<Status>
enum class Status {
Available, Unavailable, NotObservedYet
}
}
class NetworkConnectivityObserver(
context: Context
): ConnectivityObserver {
private val connectivityManager =
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
private val availableNetworks: MutableSet<Network> = HashSet()
override fun observe(): Flow<ConnectivityObserver.Status> = callbackFlow<ConnectivityObserver.Status> {
val networkStatusCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
availableNetworks.add(network)
trySend(ConnectivityObserver.Status.Available)
}
override fun onLost(network: Network) {
availableNetworks.remove(network)
if (availableNetworks.size == 0) {
trySend(ConnectivityObserver.Status.Unavailable)
}
}
}
val request = NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build()
connectivityManager.registerNetworkCallback(request, networkStatusCallback)
if (connectivityManager.activeNetwork == null) {
trySend(ConnectivityObserver.Status.Unavailable)
}
awaitClose {
connectivityManager.unregisterNetworkCallback(networkStatusCallback)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment