@@ -26,57 +26,68 @@ import android.net.NetworkRequest.Builder
26
26
import android.os.Build.VERSION
27
27
import android.os.Build.VERSION_CODES
28
28
import androidx.core.content.getSystemService
29
+ import androidx.tracing.trace
30
+ import com.google.samples.apps.nowinandroid.core.network.Dispatcher
31
+ import com.google.samples.apps.nowinandroid.core.network.NiaDispatchers.IO
29
32
import dagger.hilt.android.qualifiers.ApplicationContext
33
+ import kotlinx.coroutines.CoroutineDispatcher
30
34
import kotlinx.coroutines.channels.awaitClose
31
35
import kotlinx.coroutines.flow.Flow
32
36
import kotlinx.coroutines.flow.callbackFlow
33
37
import kotlinx.coroutines.flow.conflate
38
+ import kotlinx.coroutines.flow.flowOn
34
39
import javax.inject.Inject
35
40
36
41
internal class ConnectivityManagerNetworkMonitor @Inject constructor(
37
42
@ApplicationContext private val context : Context ,
43
+ @Dispatcher(IO ) private val ioDispatcher : CoroutineDispatcher ,
38
44
) : NetworkMonitor {
39
45
override val isOnline: Flow <Boolean > = callbackFlow {
40
- val connectivityManager = context.getSystemService<ConnectivityManager >()
41
- if (connectivityManager == null ) {
42
- channel.trySend(false )
43
- channel.close()
44
- return @callbackFlow
45
- }
46
+ trace(" NetworkMonitor.callbackFlow" ) {
47
+ val connectivityManager = context.getSystemService<ConnectivityManager >()
48
+ if (connectivityManager == null ) {
49
+ channel.trySend(false )
50
+ channel.close()
51
+ return @callbackFlow
52
+ }
46
53
47
- /* *
48
- * The callback's methods are invoked on changes to *any* network matching the [NetworkRequest],
49
- * not just the active network. So we can simply track the presence (or absence) of such [Network].
50
- */
51
- val callback = object : NetworkCallback () {
54
+ /* *
55
+ * The callback's methods are invoked on changes to *any* network matching the [NetworkRequest],
56
+ * not just the active network. So we can simply track the presence (or absence) of such [Network].
57
+ */
58
+ val callback = object : NetworkCallback () {
52
59
53
- private val networks = mutableSetOf<Network >()
60
+ private val networks = mutableSetOf<Network >()
54
61
55
- override fun onAvailable (network : Network ) {
56
- networks + = network
57
- channel.trySend(true )
58
- }
62
+ override fun onAvailable (network : Network ) {
63
+ networks + = network
64
+ channel.trySend(true )
65
+ }
59
66
60
- override fun onLost (network : Network ) {
61
- networks - = network
62
- channel.trySend(networks.isNotEmpty())
67
+ override fun onLost (network : Network ) {
68
+ networks - = network
69
+ channel.trySend(networks.isNotEmpty())
70
+ }
63
71
}
64
- }
65
72
66
- val request = Builder ()
67
- .addCapability(NetworkCapabilities .NET_CAPABILITY_INTERNET )
68
- .build()
69
- connectivityManager.registerNetworkCallback(request, callback)
73
+ trace(" NetworkMonitor.registerNetworkCallback" ) {
74
+ val request = Builder ()
75
+ .addCapability(NetworkCapabilities .NET_CAPABILITY_INTERNET )
76
+ .build()
77
+ connectivityManager.registerNetworkCallback(request, callback)
78
+ }
70
79
71
- /* *
72
- * Sends the latest connectivity status to the underlying channel.
73
- */
74
- channel.trySend(connectivityManager.isCurrentlyConnected())
80
+ /* *
81
+ * Sends the latest connectivity status to the underlying channel.
82
+ */
83
+ channel.trySend(connectivityManager.isCurrentlyConnected())
75
84
76
- awaitClose {
77
- connectivityManager.unregisterNetworkCallback(callback)
85
+ awaitClose {
86
+ connectivityManager.unregisterNetworkCallback(callback)
87
+ }
78
88
}
79
89
}
90
+ .flowOn(ioDispatcher)
80
91
.conflate()
81
92
82
93
@Suppress(" DEPRECATION" )
0 commit comments