diff --git a/app/src/main/java/com/geeksville/mesh/repository/network/ConnectivityManager.kt b/app/src/main/java/com/geeksville/mesh/repository/network/ConnectivityManager.kt index e1d89e2be..b7944344e 100644 --- a/app/src/main/java/com/geeksville/mesh/repository/network/ConnectivityManager.kt +++ b/app/src/main/java/com/geeksville/mesh/repository/network/ConnectivityManager.kt @@ -19,6 +19,7 @@ package com.geeksville.mesh.repository.network 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 @@ -26,22 +27,40 @@ import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map -internal fun ConnectivityManager.networkAvailable(): Flow = - allNetworks().map { it.isNotEmpty() }.distinctUntilChanged() +internal fun ConnectivityManager.networkAvailable(): Flow = observeNetworks() + .map { activeNetworksList -> activeNetworksList.isNotEmpty() } + .distinctUntilChanged() -internal fun ConnectivityManager.allNetworks( +internal fun ConnectivityManager.observeNetworks( networkRequest: NetworkRequest = NetworkRequest.Builder().build(), -): Flow> = callbackFlow { +): Flow> = callbackFlow { + // Keep track of the current active networks + val activeNetworks = mutableSetOf() + val callback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { - trySend(allNetworks) + activeNetworks.add(network) + trySend(activeNetworks.toList()) } override fun onLost(network: Network) { - trySend(allNetworks) + activeNetworks.remove(network) + trySend(activeNetworks.toList()) + } + + override fun onCapabilitiesChanged( + network: Network, + networkCapabilities: NetworkCapabilities + ) { + if (activeNetworks.contains(network)) { + trySend(activeNetworks.toList()) + } } } + registerNetworkCallback(networkRequest, callback) - awaitClose { unregisterNetworkCallback(callback) } + awaitClose { + unregisterNetworkCallback(callback) + } } diff --git a/app/src/main/java/com/geeksville/mesh/repository/radio/RadioInterfaceService.kt b/app/src/main/java/com/geeksville/mesh/repository/radio/RadioInterfaceService.kt index a7b585b8b..f40c733d1 100644 --- a/app/src/main/java/com/geeksville/mesh/repository/radio/RadioInterfaceService.kt +++ b/app/src/main/java/com/geeksville/mesh/repository/radio/RadioInterfaceService.kt @@ -22,10 +22,10 @@ import android.content.SharedPreferences import androidx.core.content.edit import androidx.lifecycle.Lifecycle import androidx.lifecycle.coroutineScope +import com.geeksville.mesh.BuildConfig import com.geeksville.mesh.CoroutineDispatchers import com.geeksville.mesh.MeshProtos import com.geeksville.mesh.android.BinaryLogFile -import com.geeksville.mesh.android.BuildUtils import com.geeksville.mesh.android.GeeksvilleApplication import com.geeksville.mesh.android.Logging import com.geeksville.mesh.concurrent.handledLaunch @@ -140,7 +140,7 @@ class RadioInterfaceService @Inject constructor( } fun isMockInterface(): Boolean { - return BuildUtils.isEmulator || (context as GeeksvilleApplication).isInTestLab + return BuildConfig.DEBUG || (context as GeeksvilleApplication).isInTestLab } /** Return the device we are configured to use, or null for none