kopia lustrzana https://github.com/meshtastic/Meshtastic-Android
refactor: replace `nodeDBbyID` with `getUser()` function
rodzic
a6cfbcbfa7
commit
84939a74d2
|
@ -26,9 +26,6 @@ interface NodeInfoDao {
|
|||
@Query("SELECT * FROM NodeInfo ORDER BY CASE WHEN num = (SELECT myNodeNum FROM MyNodeInfo LIMIT 1) THEN 0 ELSE 1 END, lastHeard DESC")
|
||||
fun nodeDBbyNum(): Flow<Map<@MapColumn(columnName = "num") Int, NodeInfo>>
|
||||
|
||||
@Query("SELECT * FROM NodeInfo")
|
||||
fun nodeDBbyID(): Flow<Map<@MapColumn(columnName = "user_id") String, NodeInfo>>
|
||||
|
||||
@Query(
|
||||
"""
|
||||
WITH OurNode AS (
|
||||
|
|
|
@ -36,12 +36,10 @@ class NodeDB @Inject constructor(
|
|||
// A map from nodeNum to NodeInfo
|
||||
private val _nodeDBbyNum = MutableStateFlow<Map<Int, NodeInfo>>(mapOf())
|
||||
val nodeDBbyNum: StateFlow<Map<Int, NodeInfo>> get() = _nodeDBbyNum
|
||||
val nodesByNum get() = nodeDBbyNum.value
|
||||
|
||||
// A map from userId to NodeInfo
|
||||
private val _nodeDBbyID = MutableStateFlow<Map<String, NodeInfo>>(mapOf())
|
||||
val nodeDBbyID: StateFlow<Map<String, NodeInfo>> get() = _nodeDBbyID
|
||||
val nodes get() = nodeDBbyID
|
||||
fun getUser(userId: String?) = userId?.let { id ->
|
||||
nodeDBbyNum.value.values.find { it.user?.id == id }?.user
|
||||
}
|
||||
|
||||
init {
|
||||
nodeInfoDao.getMyNodeInfo().onEach { _myNodeInfo.value = it }
|
||||
|
@ -53,11 +51,6 @@ class NodeDB @Inject constructor(
|
|||
_ourNodeInfo.value = ourNodeInfo
|
||||
_myId.value = ourNodeInfo?.user?.id
|
||||
}.launchIn(processLifecycle.coroutineScope)
|
||||
|
||||
nodeInfoDao.nodeDBbyID().onEach {
|
||||
_nodeDBbyID.value = it
|
||||
}
|
||||
.launchIn(processLifecycle.coroutineScope)
|
||||
}
|
||||
|
||||
fun getNodes(
|
||||
|
|
|
@ -150,10 +150,11 @@ internal fun getShortDateTime(time: Long): String? {
|
|||
}
|
||||
}
|
||||
|
||||
@Suppress("LongParameterList")
|
||||
@HiltViewModel
|
||||
class UIViewModel @Inject constructor(
|
||||
private val app: Application,
|
||||
val nodeDB: NodeDB,
|
||||
private val nodeDB: NodeDB,
|
||||
private val radioConfigRepository: RadioConfigRepository,
|
||||
private val radioInterfaceService: RadioInterfaceService,
|
||||
private val meshLogRepository: MeshLogRepository,
|
||||
|
@ -238,6 +239,14 @@ class UIViewModel @Inject constructor(
|
|||
// hardware info about our local device (can be null)
|
||||
val myNodeInfo: StateFlow<MyNodeInfo?> get() = nodeDB.myNodeInfo
|
||||
val ourNodeInfo: StateFlow<NodeInfo?> get() = nodeDB.ourNodeInfo
|
||||
val nodesByNum get() = nodeDB.nodeDBbyNum.value // FIXME only used in MapFragment
|
||||
|
||||
fun getUser(userId: String?) = nodeDB.getUser(userId) ?: MeshUser(
|
||||
userId ?: DataPacket.ID_LOCAL,
|
||||
app.getString(R.string.unknown_username),
|
||||
app.getString(R.string.unknown_node_short_name),
|
||||
MeshProtos.HardwareModel.UNSET,
|
||||
)
|
||||
|
||||
private val _snackbarText = MutableLiveData<Any?>(null)
|
||||
val snackbarText: LiveData<Any?> get() = _snackbarText
|
||||
|
@ -289,13 +298,13 @@ class UIViewModel @Inject constructor(
|
|||
val toBroadcast = data.to == DataPacket.ID_BROADCAST
|
||||
|
||||
// grab usernames from NodeInfo
|
||||
val node = nodeDB.nodes.value[if (fromLocal) data.to else data.from]
|
||||
val user = getUser(if (fromLocal) data.to else data.from)
|
||||
|
||||
val shortName = node?.user?.shortName ?: app.getString(R.string.unknown_node_short_name)
|
||||
val shortName = user.shortName
|
||||
val longName = if (toBroadcast) {
|
||||
channelSet.getChannel(data.channel)?.name ?: app.getString(R.string.channel_name)
|
||||
} else {
|
||||
node?.user?.longName ?: app.getString(R.string.unknown_username)
|
||||
user.longName
|
||||
}
|
||||
|
||||
Contact(
|
||||
|
@ -318,16 +327,10 @@ class UIViewModel @Inject constructor(
|
|||
@OptIn(ExperimentalCoroutinesApi::class)
|
||||
fun getMessagesFrom(contactKey: String) = packetRepository.getMessagesFrom(contactKey).mapLatest { list ->
|
||||
list.map {
|
||||
val defaultUser = MeshUser(
|
||||
it.data.from ?: DataPacket.ID_LOCAL,
|
||||
app.getString(R.string.unknown_username),
|
||||
app.getString(R.string.unknown_node_short_name),
|
||||
MeshProtos.HardwareModel.UNSET,
|
||||
)
|
||||
Message(
|
||||
uuid = it.uuid,
|
||||
receivedTime = it.received_time,
|
||||
user = nodeDB.nodes.value[it.data.from]?.user ?: defaultUser,
|
||||
user = getUser(it.data.from),
|
||||
text = it.data.text.orEmpty(),
|
||||
time = it.data.time,
|
||||
read = it.read,
|
||||
|
|
|
@ -53,10 +53,7 @@ class RadioConfigRepository @Inject constructor(
|
|||
fun myNodeInfoFlow(): Flow<MyNodeInfo?> = nodeDB.myNodeInfoFlow()
|
||||
suspend fun getMyNodeInfo(): MyNodeInfo? = myNodeInfoFlow().firstOrNull()
|
||||
val myNodeInfo: StateFlow<MyNodeInfo?> get() = nodeDB.myNodeInfo
|
||||
val ourNodeInfo: StateFlow<NodeInfo?> get() = nodeDB.ourNodeInfo
|
||||
|
||||
val nodeDBbyNum: StateFlow<Map<Int, NodeInfo>> get() = nodeDB.nodeDBbyNum
|
||||
val nodeDBbyID: StateFlow<Map<String, NodeInfo>> get() = nodeDB.nodeDBbyID
|
||||
|
||||
/**
|
||||
* Flow representing the [NodeInfo] database.
|
||||
|
|
|
@ -383,7 +383,7 @@ fun MapView(
|
|||
fun getUsername(id: String?) = if (id == DataPacket.ID_LOCAL) {
|
||||
context.getString(R.string.you)
|
||||
} else {
|
||||
model.nodeDB.nodes.value[id]?.user?.longName ?: context.getString(R.string.unknown_username)
|
||||
model.getUser(id).longName
|
||||
}
|
||||
|
||||
fun MapView.onWaypointChanged(waypoints: Collection<Packet>): List<MarkerWithLabel> {
|
||||
|
@ -467,7 +467,7 @@ fun MapView(
|
|||
}
|
||||
|
||||
fun MapView.zoomToNodes() {
|
||||
val nodeMarkers = onNodesChanged(model.nodeDB.nodesByNum.values)
|
||||
val nodeMarkers = onNodesChanged(model.nodesByNum.values)
|
||||
if (nodeMarkers.isNotEmpty()) {
|
||||
val box = BoundingBox.fromGeoPoints(nodeMarkers.map { it.position })
|
||||
val center = GeoPoint(box.centerLatitude, box.centerLongitude)
|
||||
|
|
Ładowanie…
Reference in New Issue