@@ -37,54 +37,56 @@ class ConnectivityManagerNetworkMonitor @Inject constructor(
3737) : NetworkMonitor {
3838 override val isOnline: Flow <Boolean > = callbackFlow {
3939 val connectivityManager = context.getSystemService<ConnectivityManager >()
40+ if (connectivityManager == null ) {
41+ channel.trySend(false )
42+ channel.close()
43+ return @callbackFlow
44+ }
45+
46+ /* *
47+ * Sends the latest connectivity status to the underlying channel.
48+ */
49+ fun update () {
50+ channel.trySend(connectivityManager.isCurrentlyConnected())
51+ }
4052
4153 /* *
4254 * The callback's methods are invoked on changes to *any* network, not just the active
4355 * network. So to check for network connectivity, one must query the active network of the
4456 * ConnectivityManager.
4557 */
4658 val callback = object : NetworkCallback () {
47- override fun onAvailable (network : Network ) {
48- channel.trySend(connectivityManager.isCurrentlyConnected())
49- }
59+ override fun onAvailable (network : Network ) = update()
5060
51- override fun onLost (network : Network ) {
52- channel.trySend(connectivityManager.isCurrentlyConnected())
53- }
61+ override fun onLost (network : Network ) = update()
5462
5563 override fun onCapabilitiesChanged (
5664 network : Network ,
5765 networkCapabilities : NetworkCapabilities ,
58- ) {
59- channel.trySend(connectivityManager.isCurrentlyConnected())
60- }
66+ ) = update()
6167 }
6268
63- connectivityManager? .registerNetworkCallback(
69+ connectivityManager.registerNetworkCallback(
6470 Builder ()
6571 .addCapability(NetworkCapabilities .NET_CAPABILITY_INTERNET )
6672 .build(),
6773 callback,
6874 )
6975
70- channel.trySend(connectivityManager.isCurrentlyConnected() )
76+ update( )
7177
7278 awaitClose {
73- connectivityManager? .unregisterNetworkCallback(callback)
79+ connectivityManager.unregisterNetworkCallback(callback)
7480 }
7581 }
7682 .conflate()
7783
7884 @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- }
85+ private fun ConnectivityManager.isCurrentlyConnected () = when {
86+ VERSION .SDK_INT >= VERSION_CODES .M ->
87+ activeNetwork
88+ ?.let (::getNetworkCapabilities)
89+ ?.hasCapability(NetworkCapabilities .NET_CAPABILITY_INTERNET )
90+ else -> activeNetworkInfo?.isConnected
91+ } ? : false
9092}
0 commit comments