Refactor: Improve network availability observation (#2247)

pull/2245/head
James Rich 2025-06-25 20:45:39 +00:00 zatwierdzone przez GitHub
rodzic caf367c12d
commit 0e03a181aa
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: B5690EEEBB952194
2 zmienionych plików z 28 dodań i 9 usunięć

Wyświetl plik

@ -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<Boolean> =
allNetworks().map { it.isNotEmpty() }.distinctUntilChanged()
internal fun ConnectivityManager.networkAvailable(): Flow<Boolean> = observeNetworks()
.map { activeNetworksList -> activeNetworksList.isNotEmpty() }
.distinctUntilChanged()
internal fun ConnectivityManager.allNetworks(
internal fun ConnectivityManager.observeNetworks(
networkRequest: NetworkRequest = NetworkRequest.Builder().build(),
): Flow<Array<Network>> = callbackFlow {
): Flow<List<Network>> = callbackFlow {
// Keep track of the current active networks
val activeNetworks = mutableSetOf<Network>()
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)
}
}

Wyświetl plik

@ -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