Redundant methods in `RadioConfigRepository` (#3198)

pull/3176/head
Phil Oliver 2025-09-25 09:57:26 -04:00 zatwierdzone przez GitHub
rodzic 8be9c38ae6
commit 8317b704ea
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: B5690EEEBB952194
13 zmienionych plików z 97 dodań i 171 usunięć

Wyświetl plik

@ -19,7 +19,7 @@ package com.geeksville.mesh.ui.map
import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.database.PacketRepository
import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.service.ServiceRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import org.meshtastic.core.prefs.map.MapPrefs
import javax.inject.Inject
@ -31,8 +31,8 @@ constructor(
mapPrefs: MapPrefs,
packetRepository: PacketRepository,
nodeRepository: NodeRepository,
radioConfigRepository: RadioConfigRepository,
) : BaseMapViewModel(mapPrefs, nodeRepository, packetRepository, radioConfigRepository) {
serviceRepository: ServiceRepository,
) : BaseMapViewModel(mapPrefs, nodeRepository, packetRepository, serviceRepository) {
var mapStyleId: Int
get() = mapPrefs.mapStyle

Wyświetl plik

@ -26,6 +26,7 @@ import com.geeksville.mesh.android.BuildUtils.debug
import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.database.PacketRepository
import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.service.ServiceRepository
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.model.TileProvider
import com.google.android.gms.maps.model.UrlTileProvider
@ -85,8 +86,9 @@ constructor(
nodeRepository: NodeRepository,
packetRepository: PacketRepository,
radioConfigRepository: RadioConfigRepository,
serviceRepository: ServiceRepository,
private val customTileProviderRepository: CustomTileProviderRepository,
) : BaseMapViewModel(mapPrefs, nodeRepository, packetRepository, radioConfigRepository) {
) : BaseMapViewModel(mapPrefs, nodeRepository, packetRepository, serviceRepository) {
private val _errorFlow = MutableSharedFlow<String>()
val errorFlow: SharedFlow<String> = _errorFlow.asSharedFlow()

Wyświetl plik

@ -28,7 +28,7 @@ import com.geeksville.mesh.StoreAndForwardProtos
import com.geeksville.mesh.TelemetryProtos
import com.geeksville.mesh.android.Logging
import com.geeksville.mesh.database.MeshLogRepository
import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.ui.debug.FilterMode
import com.google.protobuf.InvalidProtocolBufferException
import dagger.hilt.android.lifecycle.HiltViewModel
@ -202,7 +202,7 @@ class DebugViewModel
@Inject
constructor(
private val meshLogRepository: MeshLogRepository,
private val radioConfigRepository: RadioConfigRepository,
private val nodeRepository: NodeRepository,
) : ViewModel(),
Logging {
@ -345,7 +345,7 @@ constructor(
val presetFilters: List<String>
get() = buildList {
// Our address if available
radioConfigRepository.myNodeInfo.value?.myNodeNum?.let { add("!%08x".format(it)) }
nodeRepository.myNodeInfo.value?.myNodeNum?.let { add("!%08x".format(it)) }
// broadcast
add("!ffffffff")
// decoded

Wyświetl plik

@ -36,10 +36,12 @@ import com.geeksville.mesh.Portnums.PortNum
import com.geeksville.mesh.TelemetryProtos.Telemetry
import com.geeksville.mesh.android.Logging
import com.geeksville.mesh.database.MeshLogRepository
import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.repository.api.DeviceHardwareRepository
import com.geeksville.mesh.repository.api.FirmwareReleaseRepository
import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.service.ServiceAction
import com.geeksville.mesh.service.ServiceRepository
import com.geeksville.mesh.util.safeNumber
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
@ -203,7 +205,9 @@ constructor(
private val app: Application,
private val dispatchers: CoroutineDispatchers,
private val meshLogRepository: MeshLogRepository,
private val radioConfigRepository: RadioConfigRepository,
radioConfigRepository: RadioConfigRepository,
private val serviceRepository: ServiceRepository,
private val nodeRepository: NodeRepository,
private val deviceHardwareRepository: DeviceHardwareRepository,
private val firmwareReleaseRepository: FirmwareReleaseRepository,
private val mapPrefs: MapPrefs,
@ -233,7 +237,7 @@ constructor(
return Node(num = nodeNum, user = defaultUser)
}
fun getUser(nodeNum: Int) = radioConfigRepository.getUser(nodeNum)
fun getUser(nodeNum: Int) = nodeRepository.getUser(nodeNum)
val tileSource
get() = CustomTileSource.getTileSource(mapPrefs.mapStyle)
@ -244,7 +248,7 @@ constructor(
destNum?.let { meshLogRepository.deleteLogs(it, PortNum.POSITION_APP_VALUE) }
}
fun onServiceAction(action: ServiceAction) = viewModelScope.launch { radioConfigRepository.onServiceAction(action) }
fun onServiceAction(action: ServiceAction) = viewModelScope.launch { serviceRepository.onServiceAction(action) }
private val _state = MutableStateFlow(MetricsState.Empty)
val state: StateFlow<MetricsState> = _state
@ -257,7 +261,7 @@ constructor(
init {
if (destNum != null) {
radioConfigRepository.nodeDBbyNum
nodeRepository.nodeDBbyNum
.mapLatest { nodes -> nodes[destNum] to nodes.keys.firstOrNull() }
.distinctUntilChanged()
.onEach { (node, ourNode) ->

Wyświetl plik

@ -53,6 +53,7 @@ import com.geeksville.mesh.repository.radio.MeshActivity
import com.geeksville.mesh.repository.radio.RadioInterfaceService
import com.geeksville.mesh.service.MeshServiceNotifications
import com.geeksville.mesh.service.ServiceAction
import com.geeksville.mesh.service.ServiceRepository
import com.geeksville.mesh.ui.node.components.NodeMenuAction
import com.geeksville.mesh.util.safeNumber
import dagger.hilt.android.lifecycle.HiltViewModel
@ -185,6 +186,7 @@ constructor(
private val app: Application,
private val nodeDB: NodeRepository,
private val radioConfigRepository: RadioConfigRepository,
private val serviceRepository: ServiceRepository,
radioInterfaceService: RadioInterfaceService,
private val meshLogRepository: MeshLogRepository,
private val deviceHardwareRepository: DeviceHardwareRepository,
@ -215,10 +217,10 @@ constructor(
}
.stateIn(scope = viewModelScope, started = SharingStarted.WhileSubscribed(5_000), initialValue = null)
val clientNotification: StateFlow<MeshProtos.ClientNotification?> = radioConfigRepository.clientNotification
val clientNotification: StateFlow<MeshProtos.ClientNotification?> = serviceRepository.clientNotification
fun clearClientNotification(notification: MeshProtos.ClientNotification) {
radioConfigRepository.clearClientNotification()
serviceRepository.clearClientNotification()
meshServiceNotifications.clearClientNotification(notification)
}
@ -275,7 +277,7 @@ constructor(
}
val meshService: IMeshService?
get() = radioConfigRepository.meshService
get() = serviceRepository.meshService
private val localConfig = MutableStateFlow<LocalConfig>(LocalConfig.getDefaultInstance())
@ -447,13 +449,13 @@ constructor(
}
init {
radioConfigRepository.errorMessage
serviceRepository.errorMessage
.filterNotNull()
.onEach {
showAlert(
title = app.getString(R.string.client_notification),
message = it,
onConfirm = { radioConfigRepository.clearErrorMessage() },
onConfirm = { serviceRepository.clearErrorMessage() },
dismissable = false,
)
}
@ -590,9 +592,8 @@ constructor(
}
}
fun sendReaction(emoji: String, replyId: Int, contactKey: String) = viewModelScope.launch {
radioConfigRepository.onServiceAction(ServiceAction.Reaction(emoji, replyId, contactKey))
}
fun sendReaction(emoji: String, replyId: Int, contactKey: String) =
viewModelScope.launch { serviceRepository.onServiceAction(ServiceAction.Reaction(emoji, replyId, contactKey)) }
private val _sharedContactRequested: MutableStateFlow<AdminProtos.SharedContact?> = MutableStateFlow(null)
val sharedContactRequested: StateFlow<AdminProtos.SharedContact?>
@ -603,7 +604,7 @@ constructor(
}
fun addSharedContact(sharedContact: AdminProtos.SharedContact) =
viewModelScope.launch { radioConfigRepository.onServiceAction(ServiceAction.AddSharedContact(sharedContact)) }
viewModelScope.launch { serviceRepository.onServiceAction(ServiceAction.AddSharedContact(sharedContact)) }
fun requestTraceroute(destNum: Int) {
info("Requesting traceroute for '$destNum'")
@ -663,10 +664,10 @@ constructor(
// Connection state to our radio device
val connectionState
get() = radioConfigRepository.connectionState
get() = serviceRepository.connectionState
val isConnectedStateFlow =
radioConfigRepository.connectionState
serviceRepository.connectionState
.map { it.isConnected() }
.stateIn(viewModelScope, SharingStarted.Eagerly, false)
@ -701,7 +702,7 @@ constructor(
fun favoriteNode(node: Node) = viewModelScope.launch {
try {
radioConfigRepository.onServiceAction(ServiceAction.Favorite(node))
serviceRepository.onServiceAction(ServiceAction.Favorite(node))
} catch (ex: RemoteException) {
errormsg("Favorite node error:", ex)
}
@ -709,7 +710,7 @@ constructor(
fun ignoreNode(node: Node) = viewModelScope.launch {
try {
radioConfigRepository.onServiceAction(ServiceAction.Ignore(node))
serviceRepository.onServiceAction(ServiceAction.Ignore(node))
} catch (ex: RemoteException) {
errormsg("Ignore node error:", ex)
}
@ -817,10 +818,10 @@ constructor(
}
val tracerouteResponse: LiveData<String?>
get() = radioConfigRepository.tracerouteResponse.asLiveData()
get() = serviceRepository.tracerouteResponse.asLiveData()
fun clearTracerouteResponse() {
radioConfigRepository.clearTracerouteResponse()
serviceRepository.clearTracerouteResponse()
}
fun setNodeFilterText(text: String) {

Wyświetl plik

@ -22,29 +22,14 @@ import com.geeksville.mesh.ChannelProtos.Channel
import com.geeksville.mesh.ChannelProtos.ChannelSettings
import com.geeksville.mesh.ClientOnlyProtos.DeviceProfile
import com.geeksville.mesh.ConfigProtos.Config
import com.geeksville.mesh.IMeshService
import com.geeksville.mesh.LocalOnlyProtos.LocalConfig
import com.geeksville.mesh.LocalOnlyProtos.LocalModuleConfig
import com.geeksville.mesh.MeshProtos
import com.geeksville.mesh.MeshProtos.DeviceMetadata
import com.geeksville.mesh.MeshProtos.MeshPacket
import com.geeksville.mesh.ModuleConfigProtos.ModuleConfig
import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.deviceProfile
import com.geeksville.mesh.model.getChannelUrl
import com.geeksville.mesh.service.ConnectionState
import com.geeksville.mesh.service.ServiceAction
import com.geeksville.mesh.service.ServiceRepository
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.first
import org.meshtastic.core.database.entity.MetadataEntity
import org.meshtastic.core.database.entity.MyNodeEntity
import org.meshtastic.core.database.entity.NodeEntity
import org.meshtastic.core.database.model.Node
import org.meshtastic.core.datastore.ChannelSetDataSource
import org.meshtastic.core.datastore.LocalConfigDataSource
import org.meshtastic.core.datastore.ModuleConfigDataSource
@ -57,54 +42,11 @@ import javax.inject.Inject
class RadioConfigRepository
@Inject
constructor(
private val serviceRepository: ServiceRepository,
private val nodeDB: NodeRepository,
private val channelSetDataSource: ChannelSetDataSource,
private val localConfigDataSource: LocalConfigDataSource,
private val moduleConfigDataSource: ModuleConfigDataSource,
) {
val meshService: IMeshService?
get() = serviceRepository.meshService
// Connection state to our radio device
val connectionState
get() = serviceRepository.connectionState
fun setConnectionState(state: ConnectionState) = serviceRepository.setConnectionState(state)
/** Flow representing the unique userId of our node. */
val myId: StateFlow<String?>
get() = nodeDB.myId
/** Flow representing the [MyNodeEntity] database. */
val myNodeInfo: StateFlow<MyNodeEntity?>
get() = nodeDB.myNodeInfo
/** Flow representing the [Node] database. */
val nodeDBbyNum: StateFlow<Map<Int, Node>>
get() = nodeDB.nodeDBbyNum
fun getUser(nodeNum: Int) = nodeDB.getUser(nodeNum)
suspend fun getNodeDBbyNum() = nodeDB.getNodeDBbyNum().first()
suspend fun upsert(node: NodeEntity) = nodeDB.upsert(node)
suspend fun installMyNodeInfo(mi: MyNodeEntity) {
nodeDB.installMyNodeInfo(mi)
}
suspend fun installNodeDb(nodes: List<NodeEntity>) {
nodeDB.installNodeDb(nodes)
}
suspend fun insertMetadata(fromNum: Int, metadata: DeviceMetadata) {
nodeDB.insertMetadata(MetadataEntity(fromNum, metadata))
}
suspend fun clearNodeDB() {
nodeDB.clearNodeDB()
}
/** Flow representing the [ChannelSet] data store. */
val channelSetFlow: Flow<ChannelSet> = channelSetDataSource.channelSetFlow
@ -185,50 +127,4 @@ constructor(
}
}
}
val clientNotification = serviceRepository.clientNotification
fun setClientNotification(notification: MeshProtos.ClientNotification?) {
serviceRepository.setClientNotification(notification)
}
fun clearClientNotification() {
serviceRepository.clearClientNotification()
}
val errorMessage: StateFlow<String?>
get() = serviceRepository.errorMessage
fun setErrorMessage(text: String) {
serviceRepository.setErrorMessage(text)
}
fun clearErrorMessage() {
serviceRepository.clearErrorMessage()
}
fun setStatusMessage(text: String) {
serviceRepository.setStatusMessage(text)
}
val meshPacketFlow: SharedFlow<MeshPacket>
get() = serviceRepository.meshPacketFlow
suspend fun emitMeshPacket(packet: MeshPacket) = coroutineScope { serviceRepository.emitMeshPacket(packet) }
val serviceAction: Flow<ServiceAction>
get() = serviceRepository.serviceAction
suspend fun onServiceAction(action: ServiceAction) = coroutineScope { serviceRepository.onServiceAction(action) }
val tracerouteResponse: StateFlow<String?>
get() = serviceRepository.tracerouteResponse
fun setTracerouteResponse(value: String?) {
serviceRepository.setTracerouteResponse(value)
}
fun clearTracerouteResponse() {
setTracerouteResponse(null)
}
}

Wyświetl plik

@ -19,6 +19,7 @@ package com.geeksville.mesh.repository.network
import com.geeksville.mesh.MeshProtos.MqttClientProxyMessage
import com.geeksville.mesh.android.Logging
import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.model.subscribeList
import com.geeksville.mesh.mqttClientProxyMessage
import com.geeksville.mesh.repository.datastore.RadioConfigRepository
@ -44,7 +45,12 @@ import javax.net.ssl.SSLContext
import javax.net.ssl.TrustManager
@Singleton
class MQTTRepository @Inject constructor(private val radioConfigRepository: RadioConfigRepository) : Logging {
class MQTTRepository
@Inject
constructor(
private val radioConfigRepository: RadioConfigRepository,
private val nodeRepository: NodeRepository,
) : Logging {
companion object {
/**
@ -73,7 +79,7 @@ class MQTTRepository @Inject constructor(private val radioConfigRepository: Radi
}
val proxyMessageFlow: Flow<MqttClientProxyMessage> = callbackFlow {
val ownerId = "MeshtasticAndroidMqttProxy-${radioConfigRepository.myId.value ?: generateClientId()}"
val ownerId = "MeshtasticAndroidMqttProxy-${nodeRepository.myId.value ?: generateClientId()}"
val channelSet = radioConfigRepository.channelSetFlow.first()
val mqttConfig = radioConfigRepository.moduleConfigFlow.first().mqtt

Wyświetl plik

@ -55,6 +55,7 @@ import com.geeksville.mesh.android.hasLocationPermission
import com.geeksville.mesh.concurrent.handledLaunch
import com.geeksville.mesh.copy
import com.geeksville.mesh.database.MeshLogRepository
import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.database.PacketRepository
import com.geeksville.mesh.fromRadio
import com.geeksville.mesh.model.NO_DEVICE_SELECTED
@ -80,11 +81,13 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import org.meshtastic.core.database.entity.MeshLog
import org.meshtastic.core.database.entity.MetadataEntity
import org.meshtastic.core.database.entity.MyNodeEntity
import org.meshtastic.core.database.entity.NodeEntity
import org.meshtastic.core.database.entity.Packet
@ -144,6 +147,10 @@ class MeshService :
@Inject lateinit var radioConfigRepository: RadioConfigRepository
@Inject lateinit var serviceRepository: ServiceRepository
@Inject lateinit var nodeRepository: NodeRepository
@Inject lateinit var mqttRepository: MQTTRepository
@Inject lateinit var serviceNotifications: MeshServiceNotifications
@ -215,7 +222,7 @@ class MeshService :
private val clientPackages = mutableMapOf<String, String>()
private val serviceBroadcasts =
MeshServiceBroadcasts(this, clientPackages) {
connectionState.also { radioConfigRepository.setConnectionState(it) }
connectionState.also { serviceRepository.setConnectionState(it) }
}
private val packetHandler: PacketHandler by lazy {
PacketHandler(
@ -338,8 +345,8 @@ class MeshService :
radioConfigRepository.localConfigFlow.onEach { localConfig = it }.launchIn(serviceScope)
radioConfigRepository.moduleConfigFlow.onEach { moduleConfig = it }.launchIn(serviceScope)
radioConfigRepository.channelSetFlow.onEach { channelSet = it }.launchIn(serviceScope)
radioConfigRepository.serviceAction.onEach(::onServiceAction).launchIn(serviceScope)
radioConfigRepository.myNodeInfo
serviceRepository.serviceAction.onEach(::onServiceAction).launchIn(serviceScope)
nodeRepository.myNodeInfo
.flatMapLatest { myNodeEntity ->
// When myNodeInfo changes, set up emissions for the "provide-location-nodeNum" pref.
if (myNodeEntity == null) {
@ -443,8 +450,8 @@ class MeshService :
private fun loadSettings() = serviceScope.handledLaunch {
discardNodeDB() // Get rid of any old state
myNodeInfo = radioConfigRepository.myNodeInfo.value
nodeDBbyNodeNum.putAll(radioConfigRepository.getNodeDBbyNum())
myNodeInfo = nodeRepository.myNodeInfo.value
nodeDBbyNodeNum.putAll(nodeRepository.getNodeDBbyNum().first())
// Note: we do not haveNodeDB = true because that means we've got a valid db from a real
// device (rather than
// this possibly stale hint)
@ -543,7 +550,7 @@ class MeshService :
}
}
private fun getUserName(num: Int): String = with(radioConfigRepository.getUser(num)) { "$longName ($shortName)" }
private fun getUserName(num: Int): String = with(nodeRepository.getUser(num)) { "$longName ($shortName)" }
private val numNodes
get() = nodeDBbyNodeNum.size
@ -569,7 +576,7 @@ class MeshService :
updateFn(info)
if (info.user.id.isNotEmpty() && haveNodeDB) {
serviceScope.handledLaunch { radioConfigRepository.upsert(info) }
serviceScope.handledLaunch { nodeRepository.upsert(info) }
}
if (withBroadcast) {
@ -834,7 +841,7 @@ class MeshService :
val u = MeshProtos.Routing.parseFrom(data.payload)
if (u.errorReason == MeshProtos.Routing.Error.DUTY_CYCLE_LIMIT) {
radioConfigRepository.setErrorMessage(getString(R.string.error_duty_cycle))
serviceRepository.setErrorMessage(getString(R.string.error_duty_cycle))
}
handleAckNak(data.requestId, fromId, u.errorReasonValue)
@ -884,7 +891,7 @@ class MeshService :
} else {
full
}
radioConfigRepository.setTracerouteResponse(response)
serviceRepository.setTracerouteResponse(response)
}
}
@ -934,7 +941,7 @@ class MeshService :
AdminProtos.AdminMessage.PayloadVariantCase.GET_DEVICE_METADATA_RESPONSE -> {
debug("Admin: received DeviceMetadata from $fromNodeNum")
serviceScope.handledLaunch {
radioConfigRepository.insertMetadata(fromNodeNum, a.getDeviceMetadataResponse)
nodeRepository.insertMetadata(MetadataEntity(fromNodeNum, a.getDeviceMetadataResponse))
}
}
@ -1188,7 +1195,7 @@ class MeshService :
)
insertMeshLog(packetToSave)
serviceScope.handledLaunch { radioConfigRepository.emitMeshPacket(packet) }
serviceScope.handledLaunch { serviceRepository.emitMeshPacket(packet) }
// Update last seen for the node that sent the packet, but also for _our node_ because
// anytime a packet
@ -1488,7 +1495,7 @@ class MeshService :
insertMeshLog(packetToSave)
setLocalConfig(config)
val configCount = localConfig.allFields.size
radioConfigRepository.setStatusMessage("Device config ($configCount / $configTotal)")
serviceRepository.setStatusMessage("Device config ($configCount / $configTotal)")
}
private fun handleModuleConfig(config: ModuleConfigProtos.ModuleConfig) {
@ -1504,7 +1511,7 @@ class MeshService :
insertMeshLog(packetToSave)
setLocalModuleConfig(config)
val moduleCount = moduleConfig.allFields.size
radioConfigRepository.setStatusMessage("Module config ($moduleCount / $moduleTotal)")
serviceRepository.setStatusMessage("Module config ($moduleCount / $moduleTotal)")
}
private fun handleChannel(ch: ChannelProtos.Channel) {
@ -1520,7 +1527,7 @@ class MeshService :
insertMeshLog(packetToSave)
if (ch.role != ChannelProtos.Channel.Role.DISABLED) updateChannelSettings(ch)
val maxChannels = myNodeInfo?.maxChannels ?: 8
radioConfigRepository.setStatusMessage("Channels (${ch.index + 1} / $maxChannels)")
serviceRepository.setStatusMessage("Channels (${ch.index + 1} / $maxChannels)")
}
/** Convert a protobuf NodeInfo into our model objects and update our node DB */
@ -1584,7 +1591,7 @@ class MeshService :
insertMeshLog(packetToSave)
newNodes.add(info)
radioConfigRepository.setStatusMessage("Nodes (${newNodes.size})")
serviceRepository.setStatusMessage("Nodes (${newNodes.size})")
}
private var rawMyNodeInfo: MeshProtos.MyNodeInfo? = null
@ -1619,7 +1626,7 @@ class MeshService :
deviceId = deviceId.toStringUtf8(),
)
}
serviceScope.handledLaunch { radioConfigRepository.insertMetadata(mi.myNodeNum, metadata) }
serviceScope.handledLaunch { nodeRepository.insertMetadata(MetadataEntity(mi.myNodeNum, metadata)) }
newMyNodeInfo = mi
}
}
@ -1693,7 +1700,7 @@ class MeshService :
private fun handleClientNotification(notification: MeshProtos.ClientNotification) {
debug("Received clientNotification ${notification.toOneLineString()}")
radioConfigRepository.setClientNotification(notification)
serviceRepository.setClientNotification(notification)
serviceNotifications.showClientNotification(notification)
// if the future for the originating request is still in the queue, complete as unsuccessful
// for now
@ -1774,7 +1781,7 @@ class MeshService :
.onEach { message ->
packetHandler.sendToRadio(ToRadio.newBuilder().apply { mqttClientProxyMessage = message })
}
.catch { throwable -> radioConfigRepository.setErrorMessage("MqttClientProxy failed: $throwable") }
.catch { throwable -> serviceRepository.setErrorMessage("MqttClientProxy failed: $throwable") }
.launchIn(serviceScope)
}
}
@ -1857,8 +1864,8 @@ class MeshService :
newNodes.clear() // Just to save RAM ;-)
serviceScope.handledLaunch {
radioConfigRepository.installMyNodeInfo(myNodeInfo!!)
radioConfigRepository.installNodeDb(nodeDBbyNodeNum.values.toList())
nodeRepository.installMyNodeInfo(myNodeInfo!!)
nodeRepository.installNodeDb(nodeDBbyNodeNum.values.toList())
}
haveNodeDB = true // we now have nodes from real hardware
@ -2058,7 +2065,7 @@ class MeshService :
fun clearDatabases() = serviceScope.handledLaunch {
debug("Clearing nodeDB")
radioConfigRepository.clearNodeDB()
nodeRepository.clearNodeDB()
}
private fun updateLastAddress(deviceAddr: String?) {

Wyświetl plik

@ -23,6 +23,7 @@ import com.geeksville.mesh.LocalOnlyProtos.LocalConfig
import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.repository.bluetooth.BluetoothRepository
import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.service.ServiceRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
@ -39,6 +40,7 @@ class ConnectionsViewModel
@Inject
constructor(
radioConfigRepository: RadioConfigRepository,
serviceRepository: ServiceRepository,
nodeRepository: NodeRepository,
bluetoothRepository: BluetoothRepository,
private val uiPrefs: UiPrefs,
@ -50,7 +52,7 @@ constructor(
LocalConfig.getDefaultInstance(),
)
val connectionState = radioConfigRepository.connectionState
val connectionState = serviceRepository.connectionState
val myNodeInfo: StateFlow<MyNodeEntity?> = nodeRepository.myNodeInfo

Wyświetl plik

@ -21,7 +21,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.database.PacketRepository
import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.service.ServiceRepository
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
@ -38,7 +38,7 @@ abstract class BaseMapViewModel(
protected val mapPrefs: MapPrefs,
nodeRepository: NodeRepository,
packetRepository: PacketRepository,
radioConfigRepository: RadioConfigRepository,
serviceRepository: ServiceRepository,
) : ViewModel() {
val nodes: StateFlow<List<Node>> =
@ -72,7 +72,7 @@ abstract class BaseMapViewModel(
val ourNodeInfo: StateFlow<Node?> = nodeRepository.ourNodeInfo
val isConnected =
radioConfigRepository.connectionState
serviceRepository.connectionState
.map { it.isConnected() }
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), false)

Wyświetl plik

@ -29,6 +29,7 @@ import com.geeksville.mesh.android.Logging
import com.geeksville.mesh.database.MeshLogRepository
import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.service.ServiceRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
@ -57,12 +58,14 @@ import java.util.Locale
import javax.inject.Inject
import kotlin.math.roundToInt
@Suppress("LongParameterList")
@HiltViewModel
class SettingsViewModel
@Inject
constructor(
private val app: Application,
private val radioConfigRepository: RadioConfigRepository,
radioConfigRepository: RadioConfigRepository,
private val serviceRepository: ServiceRepository,
private val nodeRepository: NodeRepository,
private val meshLogRepository: MeshLogRepository,
private val uiPrefs: UiPrefs,
@ -77,7 +80,7 @@ constructor(
val ourNodeInfo: StateFlow<Node?> = nodeRepository.ourNodeInfo
val isConnected =
radioConfigRepository.connectionState
serviceRepository.connectionState
.map { it.isConnected() }
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000L), false)
@ -89,7 +92,7 @@ constructor(
)
val meshService: IMeshService?
get() = radioConfigRepository.meshService
get() = serviceRepository.meshService
val provideLocation: StateFlow<Boolean> =
myNodeInfo

Wyświetl plik

@ -20,7 +20,7 @@ package com.geeksville.mesh.ui.settings.radio
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.service.ServiceRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
@ -41,7 +41,7 @@ class CleanNodeDatabaseViewModel
@Inject
constructor(
private val nodeRepository: NodeRepository,
private val radioConfigRepository: RadioConfigRepository,
private val serviceRepository: ServiceRepository,
) : ViewModel() {
private val _olderThanDays = MutableStateFlow(30f)
val olderThanDays = _olderThanDays.asStateFlow()
@ -110,7 +110,7 @@ constructor(
if (nodeNums.isNotEmpty()) {
nodeRepository.deleteNodes(nodeNums)
val service = radioConfigRepository.meshService
val service = serviceRepository.meshService
if (service != null) {
for (nodeNum in nodeNums) {
service.removeByNodenum(service.packetId, nodeNum)

Wyświetl plik

@ -45,6 +45,7 @@ import com.geeksville.mesh.android.GeeksvilleApplication
import com.geeksville.mesh.android.Logging
import com.geeksville.mesh.android.isAnalyticsAvailable
import com.geeksville.mesh.config
import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.deviceProfile
import com.geeksville.mesh.model.getChannelList
import com.geeksville.mesh.model.toChannelSet
@ -54,6 +55,7 @@ import com.geeksville.mesh.navigation.ModuleRoute
import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.repository.location.LocationRepository
import com.geeksville.mesh.service.ConnectionState
import com.geeksville.mesh.service.ServiceRepository
import com.geeksville.mesh.util.UiText
import com.google.protobuf.MessageLite
import dagger.hilt.android.lifecycle.HiltViewModel
@ -98,6 +100,7 @@ data class RadioConfigState(
val analyticsEnabled: Boolean = false,
)
@Suppress("LongParameterList")
@HiltViewModel
class RadioConfigViewModel
@Inject
@ -105,13 +108,15 @@ constructor(
savedStateHandle: SavedStateHandle,
private val app: Application,
private val radioConfigRepository: RadioConfigRepository,
private val serviceRepository: ServiceRepository,
private val nodeRepository: NodeRepository,
private val locationRepository: LocationRepository,
private val mapConsentPrefs: MapConsentPrefs,
private val analyticsPrefs: AnalyticsPrefs,
) : ViewModel(),
Logging {
private val meshService: IMeshService?
get() = radioConfigRepository.meshService
get() = serviceRepository.meshService
private val destNum = savedStateHandle.toRoute<SettingsRoutes.Settings>().destNum
private val _destNode = MutableStateFlow<Node?>(null)
@ -137,7 +142,7 @@ constructor(
}
init {
radioConfigRepository.nodeDBbyNum
nodeRepository.nodeDBbyNum
.mapLatest { nodes -> nodes[destNum] ?: nodes.values.firstOrNull() }
.distinctUntilChanged()
.onEach {
@ -148,9 +153,9 @@ constructor(
radioConfigRepository.deviceProfileFlow.onEach { _currentDeviceProfile.value = it }.launchIn(viewModelScope)
radioConfigRepository.meshPacketFlow.onEach(::processPacketResponse).launchIn(viewModelScope)
serviceRepository.meshPacketFlow.onEach(::processPacketResponse).launchIn(viewModelScope)
combine(radioConfigRepository.connectionState, radioConfigState) { connState, configState ->
combine(serviceRepository.connectionState, radioConfigState) { connState, configState ->
_radioConfigState.update { it.copy(connected = connState == ConnectionState.CONNECTED) }
if (connState == ConnectionState.DISCONNECTED && configState.responseState.isWaiting()) {
sendError(R.string.disconnected)
@ -158,7 +163,7 @@ constructor(
}
.launchIn(viewModelScope)
radioConfigRepository.myNodeInfo
nodeRepository.myNodeInfo
.onEach { ni ->
_radioConfigState.update { it.copy(isLocal = destNum == null || destNum == ni?.myNodeNum) }
}
@ -170,7 +175,7 @@ constructor(
}
private val myNodeInfo: StateFlow<MyNodeEntity?>
get() = radioConfigRepository.myNodeInfo
get() = nodeRepository.myNodeInfo
val myNodeNum
get() = myNodeInfo.value?.myNodeNum
@ -342,7 +347,7 @@ constructor(
"Request factory reset error",
)
if (destNum == myNodeNum) {
viewModelScope.launch { radioConfigRepository.clearNodeDB() }
viewModelScope.launch { nodeRepository.clearNodeDB() }
}
}
@ -353,7 +358,7 @@ constructor(
"Request NodeDB reset error",
)
if (destNum == myNodeNum) {
viewModelScope.launch { radioConfigRepository.clearNodeDB() }
viewModelScope.launch { nodeRepository.clearNodeDB() }
}
}