kopia lustrzana https://github.com/meshtastic/Meshtastic-Android
Refactor: Improve network availability observation (#2247)
rodzic
caf367c12d
commit
0e03a181aa
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Ładowanie…
Reference in New Issue