From 9e8900ec4f08649f6845dd64447c54c0a8826095 Mon Sep 17 00:00:00 2001 From: andrekir Date: Thu, 2 Feb 2023 17:13:44 -0300 Subject: [PATCH] refactor: convert ourNodeInfo to Flow --- .../java/com/geeksville/mesh/model/NodeDB.kt | 13 ------------- .../java/com/geeksville/mesh/model/UIState.kt | 18 ++++++++++++------ .../mesh/ui/DeviceSettingsItemList.kt | 2 +- .../java/com/geeksville/mesh/ui/MapFragment.kt | 2 +- .../com/geeksville/mesh/ui/UsersFragment.kt | 2 +- 5 files changed, 15 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/model/NodeDB.kt b/app/src/main/java/com/geeksville/mesh/model/NodeDB.kt index 414e0f663..9b2ab9861 100644 --- a/app/src/main/java/com/geeksville/mesh/model/NodeDB.kt +++ b/app/src/main/java/com/geeksville/mesh/model/NodeDB.kt @@ -1,7 +1,6 @@ package com.geeksville.mesh.model import androidx.lifecycle.LiveData -import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.MutableLiveData import com.geeksville.mesh.MeshProtos import com.geeksville.mesh.MeshUser @@ -61,16 +60,4 @@ class NodeDB(private val ui: UIViewModel) { fun setNodes(nodes: Map) { _nodes.value = nodes } - - /// Could be null if we haven't received our node DB yet - val ourNodeInfo = MediatorLiveData() - - init { - ourNodeInfo.addSource(_nodes) { updatedValue -> - ourNodeInfo.value = updatedValue[_myId.value] - } - ourNodeInfo.addSource(_myId) { updatedValue -> - ourNodeInfo.value = _nodes.value?.get(updatedValue) - } - } } \ No newline at end of file diff --git a/app/src/main/java/com/geeksville/mesh/model/UIState.kt b/app/src/main/java/com/geeksville/mesh/model/UIState.kt index 8ef09757d..611c7b639 100644 --- a/app/src/main/java/com/geeksville/mesh/model/UIState.kt +++ b/app/src/main/java/com/geeksville/mesh/model/UIState.kt @@ -7,6 +7,7 @@ import android.net.Uri import android.os.RemoteException import android.view.Menu import androidx.core.content.edit +import androidx.lifecycle.asFlow import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel @@ -33,6 +34,7 @@ import com.geeksville.mesh.util.positionToMeter import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.first @@ -89,6 +91,10 @@ class UIViewModel @Inject constructor( private val preferences: SharedPreferences ) : ViewModel(), Logging { + var actionBarMenu: Menu? = null + var meshService: IMeshService? = null + val nodeDB = NodeDB(this) + private val _meshLog = MutableStateFlow>(emptyList()) val meshLog: StateFlow> = _meshLog @@ -109,6 +115,9 @@ class UIViewModel @Inject constructor( private val _quickChatActions = MutableStateFlow>(emptyList()) val quickChatActions: StateFlow> = _quickChatActions + private val _ourNodeInfo = MutableStateFlow(null) + val ourNodeInfo: StateFlow = _ourNodeInfo + init { viewModelScope.launch { meshLogRepository.getAllLogs().collect { logs -> @@ -134,6 +143,9 @@ class UIViewModel @Inject constructor( channelSetRepository.channelSetFlow.onEach { channelSet -> _channels.value = ChannelSet(channelSet) }.launchIn(viewModelScope) + combine(nodeDB.nodes.asFlow(), nodeDB.myId.asFlow()) { nodes, id -> nodes[id] }.onEach { + _ourNodeInfo.value = it + }.launchIn(viewModelScope) debug("ViewModel created") } @@ -226,12 +238,6 @@ class UIViewModel @Inject constructor( context.getSharedPreferences("ui-prefs", Context.MODE_PRIVATE) } - var actionBarMenu: Menu? = null - - var meshService: IMeshService? = null - - val nodeDB = NodeDB(this) - /// Connection state to our radio device private val _connectionState = MutableLiveData(MeshService.ConnectionState.DISCONNECTED) val connectionState: LiveData get() = _connectionState diff --git a/app/src/main/java/com/geeksville/mesh/ui/DeviceSettingsItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/DeviceSettingsItemList.kt index 6cbc6218b..7f320700c 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/DeviceSettingsItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/DeviceSettingsItemList.kt @@ -42,7 +42,7 @@ fun DeviceSettingsItemList(viewModel: UIViewModel) { val connected = connectionState == MeshService.ConnectionState.CONNECTED val localConfig by viewModel.localConfig.collectAsState() - val ourNodeInfo by viewModel.nodeDB.ourNodeInfo.observeAsState() + val ourNodeInfo by viewModel.ourNodeInfo.collectAsState() var userInput by remember(ourNodeInfo?.user) { mutableStateOf(ourNodeInfo?.user) } var positionInfo by remember(ourNodeInfo?.position) { mutableStateOf(ourNodeInfo?.position) } diff --git a/app/src/main/java/com/geeksville/mesh/ui/MapFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/MapFragment.kt index 8df784228..1e50415fa 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/MapFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/MapFragment.kt @@ -506,7 +506,7 @@ class MapFragment : ScreenFragment("Map Fragment"), Logging, View.OnClickListene marker = MarkerWithLabel(map, label) marker.title = "${it.longName} ${node.batteryStr}" marker.snippet = model.gpsString(p) - model.nodeDB.nodes.value?.get(model.nodeDB.myId.value)?.let { our -> + model.ourNodeInfo.value?.let { our -> our.distanceStr(node)?.let { dist -> marker.subDescription = getString(R.string.map_subDescription).format( our.bearing(node), diff --git a/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt index cff205b46..808c0ddab 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt @@ -221,7 +221,7 @@ class UsersFragment : ScreenFragment("Users"), Logging { holder.coordsView.visibility = View.INVISIBLE } - val ourNodeInfo = model.nodeDB.nodes.value?.get(model.nodeDB.myId.value) + val ourNodeInfo = model.ourNodeInfo.value val distance = ourNodeInfo?.distanceStr(n) if (distance != null) { holder.distanceView.text = distance