@@ -5,7 +5,6 @@ import android.net.ConnectivityManager
55import android.net.Network
66import android.net.NetworkCapabilities
77import android.net.NetworkRequest
8- import android.os.Build
98import androidx.compose.runtime.Composable
109import androidx.compose.runtime.State
1110import androidx.compose.runtime.mutableStateOf
@@ -22,7 +21,7 @@ sealed class ConnectionState {
2221 data object Unavailable : ConnectionState ()
2322}
2423
25- val Context .currentConnectivityState: ConnectionState
24+ private val Context .currentConnectivityState: ConnectionState
2625 get() {
2726 val connectivityManager =
2827 getSystemService(Context .CONNECTIVITY_SERVICE ) as ConnectivityManager
@@ -32,18 +31,10 @@ val Context.currentConnectivityState: ConnectionState
3231private fun getCurrentConnectionState (
3332 connectivityManager : ConnectivityManager
3433): ConnectionState {
34+ val network = connectivityManager.activeNetwork
35+ val actNetwork = runCatching { connectivityManager.getNetworkCapabilities(network) }
3536 val connected =
36- if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .M ) {
37- val network = connectivityManager.activeNetwork
38- val actNetwork = runCatching { connectivityManager.getNetworkCapabilities(network) }
39- actNetwork.getOrNull()?.hasCapability(NetworkCapabilities .NET_CAPABILITY_INTERNET ) == true
40- } else {
41- @Suppress(" DEPRECATION" )
42- connectivityManager.allNetworks.any { network ->
43- connectivityManager.getNetworkCapabilities(network)
44- ?.hasCapability(NetworkCapabilities .NET_CAPABILITY_INTERNET ) == true
45- }
46- }
37+ actNetwork.getOrNull()?.hasCapability(NetworkCapabilities .NET_CAPABILITY_INTERNET ) == true
4738 return if (connected) ConnectionState .Available else ConnectionState .Unavailable
4839}
4940
@@ -56,19 +47,20 @@ fun Context.observeConnectionAsFlow() = callbackFlow {
5647 .addTransportType(NetworkCapabilities .TRANSPORT_CELLULAR )
5748 .build()
5849 connectivityManager.registerNetworkCallback(networkRequest, callback)
59- val currentState = getCurrentConnectionState(connectivityManager)
60- trySend(currentState)
6150 awaitClose { connectivityManager.unregisterNetworkCallback(callback) }
6251}
6352
53+ private val typesSet = HashSet <String >(2 )
6454fun networkCallback (callback : (ConnectionState ) -> Unit ): ConnectivityManager .NetworkCallback {
6555 return object : ConnectivityManager .NetworkCallback () {
6656 override fun onAvailable (network : Network ) {
57+ typesSet.add(network.toString())
6758 callback(ConnectionState .Available )
6859 }
6960
7061 override fun onLost (network : Network ) {
71- callback(ConnectionState .Unavailable )
62+ typesSet.remove(network.toString())
63+ if (typesSet.isEmpty()) callback(ConnectionState .Unavailable )
7264 }
7365 }
7466}
0 commit comments