@@ -30,61 +30,61 @@ import kotlinx.coroutines.channels.awaitClose
3030import kotlinx.coroutines.flow.Flow
3131import kotlinx.coroutines.flow.callbackFlow
3232import kotlinx.coroutines.flow.conflate
33+ import Kotlinx.coroutines.flow.flowOf
3334import javax.inject.Inject
3435
3536class ConnectivityManagerNetworkMonitor @Inject constructor(
3637 @ApplicationContext private val context : Context ,
3738) : NetworkMonitor {
38- override val isOnline: Flow <Boolean > = callbackFlow {
39+ override val isOnline: Flow <Boolean > {
3940 val connectivityManager = context.getSystemService<ConnectivityManager >()
41+ ? : return flowOf(false )
4042
41- /* *
42- * The callback's methods are invoked on changes to *any* network, not just the active
43- * network. So to check for network connectivity, one must query the active network of the
44- * ConnectivityManager.
45- */
46- val callback = object : NetworkCallback () {
47- override fun onAvailable (network : Network ) {
48- channel.trySend(connectivityManager.isCurrentlyConnected())
49- }
43+ return callbackFlow {
5044
51- override fun onLost (network : Network ) {
52- channel.trySend(connectivityManager.isCurrentlyConnected())
53- }
45+ /* *
46+ * The callback's methods are invoked on changes to *any* network, not just the active
47+ * network. So to check for network connectivity, one must query the active network of the
48+ * ConnectivityManager.
49+ */
50+ val callback = object : NetworkCallback () {
51+ override fun onAvailable (network : Network ) {
52+ channel.trySend(connectivityManager.isCurrentlyConnected())
53+ }
54+
55+ override fun onLost (network : Network ) {
56+ channel.trySend(connectivityManager.isCurrentlyConnected())
57+ }
5458
55- override fun onCapabilitiesChanged (
56- network : Network ,
57- networkCapabilities : NetworkCapabilities ,
58- ) {
59- channel.trySend(connectivityManager.isCurrentlyConnected())
59+ override fun onCapabilitiesChanged (
60+ network : Network ,
61+ networkCapabilities : NetworkCapabilities ,
62+ ) {
63+ channel.trySend(connectivityManager.isCurrentlyConnected())
64+ }
6065 }
61- }
6266
63- connectivityManager? .registerNetworkCallback(
64- Builder ()
65- .addCapability(NetworkCapabilities .NET_CAPABILITY_INTERNET )
66- .build(),
67- callback,
68- )
67+ connectivityManager.registerNetworkCallback(
68+ Builder ()
69+ .addCapability(NetworkCapabilities .NET_CAPABILITY_INTERNET )
70+ .build(),
71+ callback,
72+ )
6973
70- channel.trySend(connectivityManager.isCurrentlyConnected())
74+ channel.trySend(connectivityManager.isCurrentlyConnected())
7175
72- awaitClose {
73- connectivityManager?.unregisterNetworkCallback(callback)
76+ awaitClose {
77+ connectivityManager.unregisterNetworkCallback(callback)
78+ }
7479 }
75- }
76- .conflate()
80+ .conflate()
7781
7882 @Suppress(" DEPRECATION" )
79- private fun ConnectivityManager?.isCurrentlyConnected () = when (this ) {
80- null -> false
81- else -> when {
82- VERSION .SDK_INT >= VERSION_CODES .M ->
83- activeNetwork
84- ?.let (::getNetworkCapabilities)
85- ?.hasCapability(NetworkCapabilities .NET_CAPABILITY_INTERNET )
86- ? : false
87- else -> activeNetworkInfo?.isConnected ? : false
88- }
89- }
83+ private fun ConnectivityManager.isCurrentlyConnected () = when {
84+ VERSION .SDK_INT >= VERSION_CODES .M ->
85+ activeNetwork
86+ ?.let (::getNetworkCapabilities)
87+ ?.hasCapability(NetworkCapabilities .NET_CAPABILITY_INTERNET )
88+ else -> activeNetworkInfo?.isConnected
89+ } ? : false
9090}
0 commit comments