From 59fc12b4a8703765736195a9e07cd4617a210d31 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Sun, 16 Aug 2026 18:31:45 -0500 Subject: [PATCH 1/2] fix(node): stop rendering saved-on-phone nodes as freshly heard Root-caused via #6682/#6693: Node.hopsAway defaults to the sentinel -1 instead of null, and nothing distinguished a locally-retained node from one the connected radio just reported this session. Together that made a legitimately cached row (multi-radio use, or a radio with a smaller NodeDB than the phone) render as if it were freshly heard with 0 hops, 0 SNR, 0 RSSI. - Add Node.hopsAwayOrNull, extending the existing snrOrNull/rssiOrNull pattern, and fix both copies of getRelayNode (the live one in Packet.kt and the unused one in Node.kt) whose plain minByOrNull { it.hopsAway } let the unresolved -1 sentinel look closer than a real hop count. - Track the current connection session's exact NodeDB membership via NodeManager.currentSessionNodeNums, published right after each Stage 2 handshake and reconciled against the same generation-race window already used for connectionIdentity. - Add a "Saved on phone" badge (node list rows + detail screen) for any node retained locally but absent from that snapshot, and stop those rows from claiming "online" from a cached, no-longer-current lastHeard (list rows, a11y description). New/updated tests across core:model, core:data, core:ui, core:database and feature:node; screenshot goldens regenerated for the new "Saved on phone" previews. Full baseline (spotlessApply/spotlessCheck/detekt/assembleDebug/test/allTests) and :screenshot-tests:validateDebugScreenshotTest are green. Fixes #6263 Co-Authored-By: Claude Sonnet 5 --- .skills/compose-ui/strings-index.txt | 2 + .../data/manager/MeshConfigFlowManagerImpl.kt | 5 + .../core/data/manager/NodeManagerImpl.kt | 22 ++++ .../manager/MeshConfigFlowManagerImplTest.kt | 39 +++++++ .../core/data/manager/NodeManagerImplTest.kt | 54 +++++++++ .../meshtastic/core/database/entity/Packet.kt | 5 +- .../database/entity/PacketGetRelayNodeTest.kt | 56 +++++++++ .../kotlin/org/meshtastic/core/model/Node.kt | 21 +++- .../org/meshtastic/core/model/NodeTest.kt | 29 +++++ .../meshtastic/core/repository/NodeManager.kt | 22 ++++ .../composeResources/values/strings.xml | 2 + .../core/ui/component/BuildNodeDescription.kt | 12 +- .../meshtastic/core/ui/component/NodeItem.kt | 19 ++- .../core/ui/component/NodeItemCompact.kt | 31 ++++- .../core/ui/component/NodeStatusIcons.kt | 15 ++- .../core/ui/component/SavedOnPhoneBadge.kt | 53 +++++++++ .../ui/component/BuildNodeDescriptionTest.kt | 31 +++++ .../ui/component/NodeItemZeroMetricsTest.kt | 110 +++++++++++++++++- .../component/NodeDetailComponentPreviews.kt | 9 ++ .../node/component/NodeDetailsSection.kt | 12 +- .../node/component/NodeListItemPreviews.kt | 44 +++++++ .../feature/node/detail/NodeDetailContent.kt | 1 + .../node/detail/NodeDetailViewModel.kt | 2 + .../usecase/CommonGetNodeDetailsUseCase.kt | 13 ++- .../feature/node/list/NodeListScreen.kt | 10 ++ .../feature/node/list/NodeListViewModel.kt | 10 ++ .../node/list/NodeListViewModelTest.kt | 18 +++ .../feature/NodeScreenshotTests.kt | 24 ++++ ...ilsSectionSavedOnPhone_Dark_d19fbf1f_0.png | Bin 0 -> 61697 bytes ...lsSectionSavedOnPhone_Light_b29dc7a7_0.png | Bin 0 -> 62414 bytes ...temCompactSavedOnPhone_Dark_d19fbf1f_0.png | Bin 0 -> 23710 bytes ...emCompactSavedOnPhone_Light_b29dc7a7_0.png | Bin 0 -> 23732 bytes ...otNodeItemSavedOnPhone_Dark_d19fbf1f_0.png | Bin 0 -> 35369 bytes ...tNodeItemSavedOnPhone_Light_b29dc7a7_0.png | Bin 0 -> 35175 bytes 34 files changed, 642 insertions(+), 29 deletions(-) create mode 100644 core/database/src/commonTest/kotlin/org/meshtastic/core/database/entity/PacketGetRelayNodeTest.kt create mode 100644 core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/SavedOnPhoneBadge.kt create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeDetailsSectionSavedOnPhone_Dark_d19fbf1f_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeDetailsSectionSavedOnPhone_Light_b29dc7a7_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeItemCompactSavedOnPhone_Dark_d19fbf1f_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeItemCompactSavedOnPhone_Light_b29dc7a7_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeItemSavedOnPhone_Dark_d19fbf1f_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeItemSavedOnPhone_Light_b29dc7a7_0.png diff --git a/.skills/compose-ui/strings-index.txt b/.skills/compose-ui/strings-index.txt index 59667819e7a..e3de2500c0d 100644 --- a/.skills/compose-ui/strings-index.txt +++ b/.skills/compose-ui/strings-index.txt @@ -1239,6 +1239,8 @@ node_list_long_click_label node_number node_request_send_failed node_restarting +node_saved_on_phone +node_saved_on_phone_description node_sort_alpha node_sort_button node_sort_channel diff --git a/core/data/src/commonMain/kotlin/org/meshtastic/core/data/manager/MeshConfigFlowManagerImpl.kt b/core/data/src/commonMain/kotlin/org/meshtastic/core/data/manager/MeshConfigFlowManagerImpl.kt index bf94b5df59e..a055643b421 100644 --- a/core/data/src/commonMain/kotlin/org/meshtastic/core/data/manager/MeshConfigFlowManagerImpl.kt +++ b/core/data/src/commonMain/kotlin/org/meshtastic/core/data/manager/MeshConfigFlowManagerImpl.kt @@ -298,8 +298,13 @@ class MeshConfigFlowManagerImpl( nodeManager.applyTrustedIdentityMigrations(removedNums) } + // Exactly what this session's Stage 2 handshake downloaded (+ the local node) — the UI's "is this node part + // of the connected radio's own NodeDB right now" signal (#6263). Published before setNodeDbReady(true) so no + // reader can observe "ready" without an up-to-date snapshot to compare against. + val currentSessionNodeNums = entities.mapTo(mutableSetOf()) { it.num }.apply { add(info.myNodeNum) } val published = runForSession(session) { + nodeManager.publishCurrentSessionNodeNums(session.generation, currentSessionNodeNums) nodeManager.setNodeDbReady(true) nodeManager.setAllowNodeDbWrites(true) serviceStateWriter.setConnectionState(ConnectionState.Connected) diff --git a/core/data/src/commonMain/kotlin/org/meshtastic/core/data/manager/NodeManagerImpl.kt b/core/data/src/commonMain/kotlin/org/meshtastic/core/data/manager/NodeManagerImpl.kt index 7dfd70f9c7e..01a2bb75938 100644 --- a/core/data/src/commonMain/kotlin/org/meshtastic/core/data/manager/NodeManagerImpl.kt +++ b/core/data/src/commonMain/kotlin/org/meshtastic/core/data/manager/NodeManagerImpl.kt @@ -317,18 +317,35 @@ class NodeManagerImpl( override fun clearConnectionIdentity() { _connectionIdentity.value = null + currentSessionNodeNumsGeneration.value = NO_SESSION_NODE_NUMS_GENERATION + _currentSessionNodeNums.value = null } override fun clearStaleConnectionIdentity(activeSessionGeneration: Long) { _connectionIdentity.updateStateFlow { identity -> identity?.takeIf { it.sessionGeneration == activeSessionGeneration } } + // Same reconciliation as connectionIdentity: a snapshot already published for the active generation must + // survive a delayed boundary collector from that same generation (RadioControllerImpl's sessionGeneration + // collector can fire after installAndPublishNodeDatabase already published for the new session). + if (currentSessionNodeNumsGeneration.value != activeSessionGeneration) { + _currentSessionNodeNums.value = null + } } override fun publishConnectionIdentity(sessionGeneration: Long, address: String, nodeNum: Int, deviceId: String?) { _connectionIdentity.value = ConnectionIdentity(sessionGeneration, address, nodeNum, deviceId) } + private val currentSessionNodeNumsGeneration = atomic(NO_SESSION_NODE_NUMS_GENERATION) + private val _currentSessionNodeNums = MutableStateFlow?>(null) + override val currentSessionNodeNums: StateFlow?> = _currentSessionNodeNums + + override fun publishCurrentSessionNodeNums(sessionGeneration: Long, nodeNums: Set) { + currentSessionNodeNumsGeneration.value = sessionGeneration + _currentSessionNodeNums.value = nodeNums + } + override val firmwareEdition = MutableStateFlow(null) override fun setFirmwareEdition(edition: FirmwareEdition?) { @@ -401,6 +418,9 @@ class NodeManagerImpl( * legitimately busy mesh never reaches it and only sustained novel-`from` traffic does. */ const val MAX_IN_MEMORY_NODES = 2_000 + + /** Sentinel for [currentSessionNodeNumsGeneration] meaning "no snapshot published yet this process". */ + private const val NO_SESSION_NODE_NUMS_GENERATION = -1L } override fun loadCachedNodeDB() { @@ -475,6 +495,8 @@ class NodeManagerImpl( myDeviceId.value = null firmwareEdition.value = null _connectionIdentity.value = null + currentSessionNodeNumsGeneration.value = NO_SESSION_NODE_NUMS_GENERATION + _currentSessionNodeNums.value = null } override fun getMyNodeInfo(): MyNodeInfo? { diff --git a/core/data/src/commonTest/kotlin/org/meshtastic/core/data/manager/MeshConfigFlowManagerImplTest.kt b/core/data/src/commonTest/kotlin/org/meshtastic/core/data/manager/MeshConfigFlowManagerImplTest.kt index 8bfc06a9e8c..cbc39135210 100644 --- a/core/data/src/commonTest/kotlin/org/meshtastic/core/data/manager/MeshConfigFlowManagerImplTest.kt +++ b/core/data/src/commonTest/kotlin/org/meshtastic/core/data/manager/MeshConfigFlowManagerImplTest.kt @@ -627,6 +627,45 @@ class MeshConfigFlowManagerImplTest { verifySuspend { connectionManager.onNodeDbReady() } } + @Test + fun `Stage 2 complete publishes exact session membership before readiness`() = testScope.runTest { + val firstNum = 100 + val secondNum = 200 + val firstNode = org.meshtastic.core.testing.TestDataFactory.createTestNode(num = firstNum) + val secondNode = org.meshtastic.core.testing.TestDataFactory.createTestNode(num = secondNum) + every { nodeManager.nodeDBbyNodeNum } returns mapOf(firstNum to firstNode, secondNum to secondNode) + val callOrder = mutableListOf() + every { nodeManager.publishCurrentSessionNodeNums(any(), any()) } calls + { + callOrder.add("publishSessionNodeNums") + } + every { nodeManager.setNodeDbReady(true) } calls { callOrder.add("nodeDbReady") } + + handleMyInfo(protoMyNodeInfo) + advanceUntilIdle() + manager.handleLocalMetadata(metadata) + advanceUntilIdle() + manager.handleConfigComplete(HandshakeConstants.CONFIG_NONCE) + advanceTimeBy(STAGE_TRANSITION_ADVANCE_MS) + runCurrent() + manager.handleNodeInfo(NodeInfo(num = firstNum)) + manager.handleNodeInfo(NodeInfo(num = secondNum)) + manager.handleConfigComplete(HandshakeConstants.NODE_INFO_NONCE) + advanceUntilIdle() + + // Exactly the downloaded set plus the local node — not the entire (possibly larger, locally-retained) + // nodeDBbyNodeNum, which would defeat the badge's purpose of flagging rows the radio did NOT just report. + verify { + nodeManager.publishCurrentSessionNodeNums( + activeSession.generation, + setOf(myNodeNum, firstNum, secondNum), + ) + } + // Published strictly before setNodeDbReady(true), so no reader can observe "ready" against a stale/absent + // session snapshot. + assertEquals(listOf("publishSessionNodeNums", "nodeDbReady"), callOrder) + } + @Test fun `Stage 2 applies trusted migrations before readiness and replay`() = testScope.runTest { val retiredNum = 456 diff --git a/core/data/src/commonTest/kotlin/org/meshtastic/core/data/manager/NodeManagerImplTest.kt b/core/data/src/commonTest/kotlin/org/meshtastic/core/data/manager/NodeManagerImplTest.kt index 364cd1ce60c..bd801bd3a6c 100644 --- a/core/data/src/commonTest/kotlin/org/meshtastic/core/data/manager/NodeManagerImplTest.kt +++ b/core/data/src/commonTest/kotlin/org/meshtastic/core/data/manager/NodeManagerImplTest.kt @@ -2726,4 +2726,58 @@ class NodeManagerImplTest { assertEquals(reuseKey, reused.publicKey) assertEquals(1, reuseDispatches.count { it.id == num && it.message == "Replacement" }) } + + // ---------- currentSessionNodeNums (#6263) ---------- + + @Test + fun `currentSessionNodeNums is null until the current session publishes a snapshot`() { + assertNull(nodeManager.currentSessionNodeNums.value) + } + + @Test + fun `publishCurrentSessionNodeNums exposes exactly the published set`() { + nodeManager.publishCurrentSessionNodeNums(sessionGeneration = 0L, nodeNums = setOf(1, 2, 3)) + + assertEquals(setOf(1, 2, 3), nodeManager.currentSessionNodeNums.value) + } + + @Test + fun `clearConnectionIdentity clears the session node-number snapshot unconditionally`() { + nodeManager.publishCurrentSessionNodeNums(sessionGeneration = 0L, nodeNums = setOf(1, 2, 3)) + + nodeManager.clearConnectionIdentity() + + assertNull(nodeManager.currentSessionNodeNums.value) + } + + @Test + fun `clearStaleConnectionIdentity clears a snapshot from a superseded generation`() { + nodeManager.publishCurrentSessionNodeNums(sessionGeneration = 0L, nodeNums = setOf(1, 2, 3)) + + nodeManager.clearStaleConnectionIdentity(activeSessionGeneration = 1L) + + assertNull(nodeManager.currentSessionNodeNums.value) + } + + @Test + fun `clearStaleConnectionIdentity preserves a snapshot already published for the active generation`() { + // Regression: RadioControllerImpl's sessionGeneration collector can be delayed and fire + // clearStaleConnectionIdentity(activeGeneration) AFTER installAndPublishNodeDatabase already published the + // new session's snapshot for that same generation. A generation-blind clear would silently blank the badge + // for the rest of the session — mirrors connectionIdentity's own race-survival contract. + nodeManager.publishCurrentSessionNodeNums(sessionGeneration = 5L, nodeNums = setOf(1, 2, 3)) + + nodeManager.clearStaleConnectionIdentity(activeSessionGeneration = 5L) + + assertEquals(setOf(1, 2, 3), nodeManager.currentSessionNodeNums.value) + } + + @Test + fun `clear resets the session node-number snapshot`() { + nodeManager.publishCurrentSessionNodeNums(sessionGeneration = 0L, nodeNums = setOf(1, 2, 3)) + + nodeManager.clear() + + assertNull(nodeManager.currentSessionNodeNums.value) + } } diff --git a/core/database/src/commonMain/kotlin/org/meshtastic/core/database/entity/Packet.kt b/core/database/src/commonMain/kotlin/org/meshtastic/core/database/entity/Packet.kt index 25dae5c58c2..3529495a5c9 100644 --- a/core/database/src/commonMain/kotlin/org/meshtastic/core/database/entity/Packet.kt +++ b/core/database/src/commonMain/kotlin/org/meshtastic/core/database/entity/Packet.kt @@ -159,7 +159,10 @@ data class Packet( if (candidateRelayNodes.size == 1) { candidateRelayNodes.first() } else { - candidateRelayNodes.minByOrNull { it.hopsAway } + // hopsAwayOrNull sorts last via Int.MAX_VALUE: an unresolved hop count (-1) must never look + // "closer" than a real, known hop count under a plain minByOrNull { it.hopsAway }. Mirrors + // Node.Companion.getRelayNode's fix for the same defect (#6263). + candidateRelayNodes.minByOrNull { it.hopsAwayOrNull ?: Int.MAX_VALUE } } return closestRelayNode diff --git a/core/database/src/commonTest/kotlin/org/meshtastic/core/database/entity/PacketGetRelayNodeTest.kt b/core/database/src/commonTest/kotlin/org/meshtastic/core/database/entity/PacketGetRelayNodeTest.kt new file mode 100644 index 00000000000..50f3d5b7f31 --- /dev/null +++ b/core/database/src/commonTest/kotlin/org/meshtastic/core/database/entity/PacketGetRelayNodeTest.kt @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.database.entity + +import org.meshtastic.core.model.Node +import kotlin.test.Test +import kotlin.test.assertEquals + +/** + * Regression coverage for [Packet.Companion.getRelayNode] — the copy of this resolver actually wired into production + * (`DebugViewModel`), as opposed to the unused [Node.Companion.getRelayNode] of the same name. Both must sort an + * unresolved hop count last rather than let it look like the closest relay (#6263). + */ +class PacketGetRelayNodeTest { + + @Test + fun getRelayNode_neverPrefersAnUnresolvedHopCountOverAKnownOne() { + val unresolved = Node(num = 0x000001AA, lastHeard = 100, hopsAway = Node.HOPS_AWAY_UNSET) + val knownFar = Node(num = 0x000002AA, lastHeard = 100, hopsAway = 4) + val otherSuffix = Node(num = 0x000003BB, lastHeard = 100, hopsAway = 1) + + val relayNode = + Packet.getRelayNode( + relayNodeId = 0x0000FFAA.toInt(), + nodes = listOf(unresolved, knownFar, otherSuffix), + ourNodeNum = null, + ) + + assertEquals(knownFar, relayNode) + } + + @Test + fun getRelayNode_picksTheClosestOfSeveralResolvedCandidates() { + val far = Node(num = 0x000001AA, lastHeard = 100, hopsAway = 4) + val near = Node(num = 0x000002AA, lastHeard = 100, hopsAway = 1) + + val relayNode = + Packet.getRelayNode(relayNodeId = 0x0000FFAA.toInt(), nodes = listOf(far, near), ourNodeNum = null) + + assertEquals(near, relayNode) + } +} diff --git a/core/model/src/commonMain/kotlin/org/meshtastic/core/model/Node.kt b/core/model/src/commonMain/kotlin/org/meshtastic/core/model/Node.kt index 9f794e1be15..94d81696cb0 100644 --- a/core/model/src/commonMain/kotlin/org/meshtastic/core/model/Node.kt +++ b/core/model/src/commonMain/kotlin/org/meshtastic/core/model/Node.kt @@ -106,6 +106,14 @@ data class Node( val rssiOrNull: Int? get() = rssi.takeIf { it != RSSI_UNSET } + /** + * Hop count to this node, or null when it has never been resolved ([hopsAway] still holds [HOPS_AWAY_UNSET]). 0 + * hops is a real reading (a direct neighbor) — every read of [hopsAway] should go through this rather than + * comparing against the raw sentinel. + */ + val hopsAwayOrNull: Int? + get() = hopsAway.takeIf { it != HOPS_AWAY_UNSET } + val hasEnvironmentMetrics: Boolean get() = environmentMetrics != EnvironmentMetrics() @@ -193,13 +201,16 @@ data class Node( const val PUBLIC_KEY_SIZE: Int = 32 /** - * Sentinels stored when a node has no radio-metric reading. They exist because [snr]/[rssi] are not nullable - * (the Room columns behind them are NOT NULL); resolve them with [snrOrNull]/[rssiOrNull] rather than comparing - * against them at call sites. + * Sentinels stored when a node has no radio-metric reading. They exist because [snr]/[rssi]/[hopsAway] are not + * nullable (the Room columns behind them are NOT NULL); resolve them with [snrOrNull]/[rssiOrNull]/ + * [hopsAwayOrNull] rather than comparing against them at call sites. */ const val SNR_UNSET: Float = Float.MAX_VALUE const val RSSI_UNSET: Int = Int.MAX_VALUE + /** Mirrors the `-1` default already carried by [hopsAway] (and `NodeEntity.hopsAway`). */ + const val HOPS_AWAY_UNSET: Int = -1 + val ERROR_BYTE_STRING: ByteString = ByteArray(PUBLIC_KEY_SIZE) { 0 }.toByteString() fun getRelayNode(relayNodeId: Int, nodes: List, ourNodeNum: Int?): Node? { @@ -216,7 +227,9 @@ data class Node( if (candidateRelayNodes.size == 1) { candidateRelayNodes.first() } else { - candidateRelayNodes.minByOrNull { it.hopsAway } + // hopsAwayOrNull sorts last via Int.MAX_VALUE: an unresolved hop count (-1) must never look + // "closer" than a real, known hop count under a plain minByOrNull { it.hopsAway }. + candidateRelayNodes.minByOrNull { it.hopsAwayOrNull ?: Int.MAX_VALUE } } return closestRelayNode diff --git a/core/model/src/commonTest/kotlin/org/meshtastic/core/model/NodeTest.kt b/core/model/src/commonTest/kotlin/org/meshtastic/core/model/NodeTest.kt index 2da8c6b1d97..326be8a83bb 100644 --- a/core/model/src/commonTest/kotlin/org/meshtastic/core/model/NodeTest.kt +++ b/core/model/src/commonTest/kotlin/org/meshtastic/core/model/NodeTest.kt @@ -101,6 +101,35 @@ class NodeTest { assertEquals(chosen, relayNode) } + @Test + fun getRelayNode_neverPrefersAnUnresolvedHopCountOverAKnownOne() { + // Regression for the presence-vs-sentinel-zero class: a plain `minByOrNull { it.hopsAway }` would rank + // -1 (unresolved) below every real hop count, wrongly picking `unresolved` as the "closest" relay. + val unresolved = Node(num = 0x000001AA, lastHeard = 100, hopsAway = Node.HOPS_AWAY_UNSET) + val knownFar = Node(num = 0x000002AA, lastHeard = 100, hopsAway = 4) + val otherSuffix = Node(num = 0x000003BB, lastHeard = 100, hopsAway = 1) + + val relayNode = + Node.getRelayNode( + relayNodeId = 0x0000FFAA.toInt(), + nodes = listOf(unresolved, knownFar, otherSuffix), + ourNodeNum = null, + ) + + assertEquals(knownFar, relayNode) + } + + @Test + fun hopsAwayOrNull_isNullOnlyForTheUnsetSentinel() { + val unset = Node(num = 1, hopsAway = Node.HOPS_AWAY_UNSET) + val direct = Node(num = 2, hopsAway = 0) + val relayed = Node(num = 3, hopsAway = 3) + + assertEquals(null, unset.hopsAwayOrNull) + assertEquals(0, direct.hopsAwayOrNull) + assertEquals(3, relayed.hopsAwayOrNull) + } + @Test fun isUnknownUser_falseWhenHardwareModelIsKnown() { val node = Node(num = 1, user = User(hw_model = HardwareModel.TLORA_V2)) diff --git a/core/repository/src/commonMain/kotlin/org/meshtastic/core/repository/NodeManager.kt b/core/repository/src/commonMain/kotlin/org/meshtastic/core/repository/NodeManager.kt index 71d1265c929..0154d6052e9 100644 --- a/core/repository/src/commonMain/kotlin/org/meshtastic/core/repository/NodeManager.kt +++ b/core/repository/src/commonMain/kotlin/org/meshtastic/core/repository/NodeManager.kt @@ -116,6 +116,28 @@ interface NodeManager : NodeIdLookup { */ fun publishConnectionIdentity(sessionGeneration: Long, address: String, nodeNum: Int, deviceId: String?) + /** + * Node numbers confirmed present in the connected radio's own NodeDB for the current connection session — exactly + * the set the Stage 2 handshake downloaded, plus the local node. Null before that handshake has completed at least + * once this session (no snapshot to compare against yet, so nothing should be flagged). + * + * Distinct from [nodeDBbyNodeNum]: the phone's node database is deliberately cumulative and keeps rows the + * connected radio no longer reports (multi-radio use, meshes bigger than the radio's own bounded/evicting NodeDB). + * A row present in [nodeDBbyNodeNum] but absent here is real, locally-retained history — not a fabricated or stale + * entry — and UI should badge it as such (see #6263) rather than hide or delete it. + * + * Reconciled alongside [connectionIdentity] at every transport-session boundary — see [clearConnectionIdentity] and + * [clearStaleConnectionIdentity] — using the same generation carried by [publishCurrentSessionNodeNums], so a + * snapshot already published for the active generation survives a delayed boundary collector from that same + * generation, exactly like [connectionIdentity]. + */ + val currentSessionNodeNums: StateFlow?> + + /** + * Publishes the exact set of node numbers [sessionGeneration]'s Stage 2 handshake downloaded (+ the local node). + */ + fun publishCurrentSessionNodeNums(sessionGeneration: Long, nodeNums: Set) + /** Loads the cached node database from the repository. */ fun loadCachedNodeDB() diff --git a/core/resources/src/commonMain/composeResources/values/strings.xml b/core/resources/src/commonMain/composeResources/values/strings.xml index 15f772168b6..e02b6777fcd 100644 --- a/core/resources/src/commonMain/composeResources/values/strings.xml +++ b/core/resources/src/commonMain/composeResources/values/strings.xml @@ -1272,6 +1272,8 @@ Node Number Couldn't send request. Try again. Restarting… + Saved on phone + Not in the radio's current node list — showing data saved on this phone A-Z Node sorting options Channel diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/BuildNodeDescription.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/BuildNodeDescription.kt index eacf3919621..95d60ac1fb4 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/BuildNodeDescription.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/BuildNodeDescription.kt @@ -31,6 +31,7 @@ import org.meshtastic.core.resources.a11y_node_online import org.meshtastic.core.resources.a11y_node_role import org.meshtastic.core.resources.a11y_node_signal import org.meshtastic.core.resources.node_incomplete +import org.meshtastic.core.resources.node_saved_on_phone_description import org.meshtastic.core.resources.now import org.meshtastic.core.resources.unknown import org.meshtastic.core.ui.util.formatAgo @@ -54,6 +55,7 @@ internal data class NodeDescriptionStrings( val unknown: String, val now: String, val incomplete: String, + val savedOnPhone: String, ) /** Resolves [NodeDescriptionStrings] from Compose string resources. */ @@ -71,6 +73,7 @@ internal fun rememberNodeDescriptionStrings(): NodeDescriptionStrings = NodeDesc unknown = stringResource(Res.string.unknown), now = stringResource(Res.string.now), incomplete = stringResource(Res.string.node_incomplete), + savedOnPhone = stringResource(Res.string.node_saved_on_phone_description), ) /** Builds a TalkBack-friendly description aggregating node state. Shared between [NodeItem] and [NodeItemCompact]. */ @@ -90,6 +93,7 @@ internal fun buildNodeDescription( lastHeardIsRelative: Boolean = true, modemPreset: ModemPreset? = null, isUnknownUser: Boolean = false, + isSavedOnPhone: Boolean = false, ): String = buildString { append(name) if (isUnknownUser) { @@ -97,11 +101,17 @@ internal fun buildNodeDescription( append(strings.incomplete) } append(", ") - append(if (isOnline) strings.online else strings.offline) + // A saved-on-phone row wasn't observed this session — announcing "online" from a cached reading would repeat + // the same false-freshness claim the badge exists to correct (#6263). + append(if (isOnline && !isSavedOnPhone) strings.online else strings.offline) if (isFavorite) { append(", ") append(strings.favorite) } + if (isSavedOnPhone) { + append(", ") + append(strings.savedOnPhone) + } if (lastHeard > 0) { val timeText = if (lastHeardIsRelative) { diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/NodeItem.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/NodeItem.kt index 755e8780c12..1b1ce654b07 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/NodeItem.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/NodeItem.kt @@ -94,6 +94,7 @@ fun NodeItem( isActive: Boolean = false, showTelemetry: Boolean = true, deviceImageUrl: String? = null, + isSavedOnPhone: Boolean = false, ) { val originalLongName = thatNode.user.long_name.ifEmpty { stringResource(Res.string.unknown_username) } val isMuted = remember(thatNode) { thatNode.isMuted } @@ -135,7 +136,7 @@ fun NodeItem( val a11yStrings = rememberNodeDescriptionStrings() val modemPreset = LocalModemPreset.current val nodeDescription = - remember(thatNode, distance, a11yStrings, modemPreset) { + remember(thatNode, distance, a11yStrings, modemPreset, isSavedOnPhone) { buildNodeDescription( name = originalLongName, isOnline = thatNode.isOnline, @@ -150,6 +151,7 @@ fun NodeItem( strings = a11yStrings, modemPreset = modemPreset, isUnknownUser = thatNode.isUnknownUser, + isSavedOnPhone = isSavedOnPhone, ) } @@ -188,6 +190,7 @@ fun NodeItem( connectionState = connectionState, deviceType = deviceType, contentColor = contentColor, + isSavedOnPhone = isSavedOnPhone, ) thatNode.nodeStatus?.let { status -> @@ -309,9 +312,10 @@ private fun NodeSignalRow(thatNode: Node, isThisNode: Boolean, contentColor: Col ) } } else { - if (thatNode.hopsAway > 0) { - add { HopsInfo(hops = thatNode.hopsAway, contentColor = contentColor) } - } else if (thatNode.hopsAway == 0 && !thatNode.viaMqtt) { + val hopsAway = thatNode.hopsAwayOrNull + if (hopsAway != null && hopsAway > 0) { + add { HopsInfo(hops = hopsAway, contentColor = contentColor) } + } else if (hopsAway == 0 && !thatNode.viaMqtt) { val snr = thatNode.snrOrNull val rssi = thatNode.rssiOrNull if (snr != null || rssi != null) { @@ -501,6 +505,7 @@ private fun NodeItemHeader( connectionState: ConnectionState, deviceType: DeviceType?, contentColor: Color, + isSavedOnPhone: Boolean, ) { Row( modifier = Modifier.fillMaxWidth(), @@ -533,7 +538,10 @@ private fun NodeItemHeader( Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(4.dp)) { StatusAwareLastHeard( lastHeard = thatNode.lastHeard, - online = !isThisNode && thatNode.isOnline, + // A row not observed this session must not carry the "online" affordance forward from a cached + // reading — that's the same false-freshness claim the "Saved on phone" badge exists to correct + // (#6263). + online = !isThisNode && thatNode.isOnline && !isSavedOnPhone, contentColor = contentColor, ) } @@ -548,6 +556,7 @@ private fun NodeItemHeader( deviceType = deviceType, contentColor = contentColor, isUnknownUser = thatNode.isUnknownUser, + isSavedOnPhone = isSavedOnPhone, ) } } diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/NodeItemCompact.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/NodeItemCompact.kt index 5d002ef4299..4d4c0e83f9e 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/NodeItemCompact.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/NodeItemCompact.kt @@ -63,6 +63,8 @@ import org.meshtastic.core.resources.ic_memory import org.meshtastic.core.resources.node_incomplete import org.meshtastic.core.resources.node_list_click_label import org.meshtastic.core.resources.node_list_long_click_label +import org.meshtastic.core.resources.node_saved_on_phone +import org.meshtastic.core.resources.node_saved_on_phone_description import org.meshtastic.core.resources.unknown_username import org.meshtastic.core.ui.icon.Channel import org.meshtastic.core.ui.icon.Counter0 @@ -83,6 +85,7 @@ import org.meshtastic.core.ui.icon.MapCompass import org.meshtastic.core.ui.icon.MeshtasticIcons import org.meshtastic.core.ui.icon.MqttConnected import org.meshtastic.core.ui.icon.PersonQuestion +import org.meshtastic.core.ui.icon.PhoneAndroid import org.meshtastic.core.ui.icon.Pressure import org.meshtastic.core.ui.icon.Temperature import org.meshtastic.core.ui.icon.Unmessageable @@ -114,6 +117,7 @@ fun NodeItemCompact( showTelemetry: Boolean = true, tempInFahrenheit: Boolean = false, deviceImageUrl: String? = null, + isSavedOnPhone: Boolean = false, ) { val longName = thatNode.user.long_name.ifEmpty { stringResource(Res.string.unknown_username) } val isFavorite = thatNode.isFavorite @@ -147,7 +151,7 @@ fun NodeItemCompact( val a11yStrings = rememberNodeDescriptionStrings() val modemPreset = LocalModemPreset.current val nodeDescription = - remember(thatNode, distance, lastHeardIsRelative, a11yStrings, modemPreset) { + remember(thatNode, distance, lastHeardIsRelative, a11yStrings, modemPreset, isSavedOnPhone) { buildNodeDescription( name = longName, isOnline = thatNode.isOnline, @@ -163,6 +167,7 @@ fun NodeItemCompact( lastHeardIsRelative = lastHeardIsRelative, modemPreset = modemPreset, isUnknownUser = thatNode.isUnknownUser, + isSavedOnPhone = isSavedOnPhone, ) } @@ -216,6 +221,7 @@ fun NodeItemCompact( isIgnored = isIgnored, isFavorite = isFavorite, unmessageable = unmessageable, + isSavedOnPhone = isSavedOnPhone, ) // Row 2: Glanceable health — online + last heard + distance + signal @@ -229,6 +235,7 @@ fun NodeItemCompact( showLocation = showLocation, showSignal = showSignal, contentColor = contentColor, + isSavedOnPhone = isSavedOnPhone, ) // Row 3: Environment metrics — temp · humidity · pressure (icon + value only) @@ -262,6 +269,7 @@ private fun CompactNameRow( isIgnored: Boolean, isFavorite: Boolean, unmessageable: Boolean, + isSavedOnPhone: Boolean, ) { Row( modifier = Modifier.fillMaxWidth(), @@ -277,6 +285,14 @@ private fun CompactNameRow( overflow = TextOverflow.Ellipsis, modifier = Modifier.weight(1f), ) + if (isSavedOnPhone) { + StatusBadge( + imageVector = MeshtasticIcons.PhoneAndroid, + contentDescription = Res.string.node_saved_on_phone, + tooltipText = Res.string.node_saved_on_phone_description, + tint = MaterialTheme.colorScheme.outline, + ) + } if (thatNode.isUnknownUser) { Icon( imageVector = MeshtasticIcons.PersonQuestion, @@ -316,6 +332,7 @@ private fun CompactHealthRow( showLocation: Boolean, showSignal: Boolean, contentColor: Color, + isSavedOnPhone: Boolean, ) { val segments = buildList { // Last heard (tinted by online status) @@ -324,7 +341,10 @@ private fun CompactHealthRow( @Composable { StatusAwareLastHeard( lastHeard = thatNode.lastHeard, - online = thatNode.isOnline, + // A row not observed this session must not carry the "online" affordance forward from a + // cached reading — that's the same false-freshness claim the "Saved on phone" badge exists + // to correct (#6263). + online = thatNode.isOnline && !isSavedOnPhone, contentColor = contentColor, relative = lastHeardIsRelative, ) @@ -418,13 +438,14 @@ private fun CompactFooterRow( ) } } - if (showHops && thatNode.hopsAway > 0 && !isThisNode) { + val hopsAway = thatNode.hopsAwayOrNull + if (showHops && hopsAway != null && hopsAway > 0 && !isThisNode) { add { IconInfo( icon = MeshtasticIcons.HopCount, - contentDescription = "${thatNode.hopsAway} hops", + contentDescription = "$hopsAway hops", contentColor = tertiaryColor, - text = thatNode.hopsAway.toString(), + text = hopsAway.toString(), ) } } diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/NodeStatusIcons.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/NodeStatusIcons.kt index 64508e54835..6d6fffcece7 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/NodeStatusIcons.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/NodeStatusIcons.kt @@ -47,11 +47,14 @@ import org.meshtastic.core.resources.favorite import org.meshtastic.core.resources.mute_always import org.meshtastic.core.resources.node_incomplete import org.meshtastic.core.resources.node_incomplete_description +import org.meshtastic.core.resources.node_saved_on_phone +import org.meshtastic.core.resources.node_saved_on_phone_description import org.meshtastic.core.resources.unmessageable import org.meshtastic.core.resources.unmonitored_or_infrastructure import org.meshtastic.core.ui.icon.Favorite import org.meshtastic.core.ui.icon.MeshtasticIcons import org.meshtastic.core.ui.icon.PersonQuestion +import org.meshtastic.core.ui.icon.PhoneAndroid import org.meshtastic.core.ui.icon.Unmessageable import org.meshtastic.core.ui.icon.VolumeOff import org.meshtastic.core.ui.theme.StatusColors.StatusYellow @@ -69,8 +72,17 @@ fun NodeStatusIcons( deviceType: DeviceType? = null, contentColor: Color = LocalContentColor.current, isUnknownUser: Boolean = false, + isSavedOnPhone: Boolean = false, ) { Row(modifier = modifier.padding(4.dp)) { + if (isSavedOnPhone) { + StatusBadge( + imageVector = MeshtasticIcons.PhoneAndroid, + contentDescription = Res.string.node_saved_on_phone, + tooltipText = Res.string.node_saved_on_phone_description, + tint = contentColor, + ) + } if (isUnknownUser) { StatusBadge( imageVector = MeshtasticIcons.PersonQuestion, @@ -150,9 +162,10 @@ private fun ThisNodeStatusBadge(connectionState: ConnectionState, deviceType: De } } +/** Icon + tooltip status indicator. Internal (not private) so [NodeItemCompact] can reuse it for its own badges. */ @OptIn(ExperimentalMaterial3Api::class) @Composable -private fun StatusBadge( +internal fun StatusBadge( imageVector: ImageVector, contentDescription: StringResource, tooltipText: StringResource, diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/SavedOnPhoneBadge.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/SavedOnPhoneBadge.kt new file mode 100644 index 00000000000..47c88c21d9b --- /dev/null +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/SavedOnPhoneBadge.kt @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.ui.component + +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.PreviewLightDark +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.resources.Res +import org.meshtastic.core.resources.node_saved_on_phone +import org.meshtastic.core.resources.node_saved_on_phone_description +import org.meshtastic.core.ui.icon.MeshtasticIcons +import org.meshtastic.core.ui.icon.PhoneAndroid +import org.meshtastic.core.ui.theme.AppTheme + +/** + * Labeled indicator for a node that is locally cached but wasn't part of the connected radio's current session snapshot + * — the phone deliberately keeps rows the radio no longer reports (multi-radio use, meshes bigger than the radio's own + * bounded NodeDB), so this explains why the row's live metrics may be absent or dated rather than letting it look + * broken (#6263). See [NodeStatusIcons] for the icon-only variant used in dense node rows. + */ +@Composable +fun SavedOnPhoneBadge(modifier: Modifier = Modifier, contentColor: Color = MaterialTheme.colorScheme.outline) { + IconInfo( + modifier = modifier, + icon = MeshtasticIcons.PhoneAndroid, + contentDescription = stringResource(Res.string.node_saved_on_phone_description), + label = stringResource(Res.string.node_saved_on_phone), + contentColor = contentColor, + ) +} + +@PreviewLightDark +@Composable +private fun SavedOnPhoneBadgePreview() { + AppTheme { SavedOnPhoneBadge() } +} diff --git a/core/ui/src/commonTest/kotlin/org/meshtastic/core/ui/component/BuildNodeDescriptionTest.kt b/core/ui/src/commonTest/kotlin/org/meshtastic/core/ui/component/BuildNodeDescriptionTest.kt index 9ba609691b0..a79a498749c 100644 --- a/core/ui/src/commonTest/kotlin/org/meshtastic/core/ui/component/BuildNodeDescriptionTest.kt +++ b/core/ui/src/commonTest/kotlin/org/meshtastic/core/ui/component/BuildNodeDescriptionTest.kt @@ -38,6 +38,7 @@ class BuildNodeDescriptionTest { unknown = "unknown", now = "now", incomplete = "incomplete", + savedOnPhone = "saved on phone", ) private fun describe( @@ -53,6 +54,7 @@ class BuildNodeDescriptionTest { viaMqtt: Boolean = false, lastHeardIsRelative: Boolean = true, isUnknownUser: Boolean = false, + isSavedOnPhone: Boolean = false, ): String = buildNodeDescription( name = name, isOnline = isOnline, @@ -67,6 +69,7 @@ class BuildNodeDescriptionTest { strings = testStrings, lastHeardIsRelative = lastHeardIsRelative, isUnknownUser = isUnknownUser, + isSavedOnPhone = isSavedOnPhone, ) // ---- Basic output ---- @@ -199,4 +202,32 @@ class BuildNodeDescriptionTest { val result = describe(snr = -5f, hopsAway = 0, viaMqtt = false) assertContains(result, "signal") } + + // ---- Saved on phone (#6263) ---- + + @Test + fun includes_saved_on_phone_when_flagged() { + val result = describe(isSavedOnPhone = true) + assertContains(result, "saved on phone") + } + + @Test + fun omits_saved_on_phone_by_default() { + val result = describe() + assertFalse(result.contains("saved on phone")) + } + + @Test + fun reports_offline_when_saved_on_phone_even_if_isOnline_is_true() { + // A row not observed this session must not announce "online" from a cached reading (#6263) — that's the + // same false-freshness claim the badge exists to correct. + val result = describe(isOnline = true, isSavedOnPhone = true) + assertContains(result, "offline") + } + + @Test + fun reports_online_normally_when_not_saved_on_phone() { + val result = describe(isOnline = true, isSavedOnPhone = false) + assertTrue(result.contains("online")) + } } diff --git a/core/ui/src/commonTest/kotlin/org/meshtastic/core/ui/component/NodeItemZeroMetricsTest.kt b/core/ui/src/commonTest/kotlin/org/meshtastic/core/ui/component/NodeItemZeroMetricsTest.kt index 68d6e91a469..4b0560955d3 100644 --- a/core/ui/src/commonTest/kotlin/org/meshtastic/core/ui/component/NodeItemZeroMetricsTest.kt +++ b/core/ui/src/commonTest/kotlin/org/meshtastic/core/ui/component/NodeItemZeroMetricsTest.kt @@ -20,10 +20,12 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.ui.test.ComposeUiTest import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.v2.runComposeUiTest import org.meshtastic.core.model.ConnectionState import org.meshtastic.core.model.Node +import org.meshtastic.core.model.util.onlineTimeThreshold import org.meshtastic.proto.Config.DisplayConfig.DisplayUnits import org.meshtastic.proto.EnvironmentMetrics import org.meshtastic.proto.User @@ -103,24 +105,120 @@ class NodeItemZeroMetricsTest { onNodeWithText("0.0°C").assertDoesNotExist() } - private fun ComposeUiTest.setNodeItem(metrics: EnvironmentMetrics) = setContent { + // hopsAway: -1 (Node.HOPS_AWAY_UNSET) is "never resolved", not a real reading — 0 is a real direct-neighbor + // reading. Pinned as a pair (per the code-review "presence vs. sentinel zero" checklist) so the two states can't + // collapse back into one: a real 0 must not read as "unresolved", and "unresolved" must not paint a fake "0 hops". + @Test + fun nodeItem_showsHopsChipForARealNonZeroReading() = runComposeUiTest { + setNodeItem(EnvironmentMetrics(), hopsAway = 3) + onNodeWithText("Hops Away").assertIsDisplayed() + onNodeWithText("3").assertIsDisplayed() + } + + @Test + fun nodeItem_hidesHopsChipWhenNeverResolved() = runComposeUiTest { + setNodeItem(EnvironmentMetrics(), hopsAway = Node.HOPS_AWAY_UNSET) + onNodeWithText("Hops Away").assertDoesNotExist() + } + + @Test + fun nodeItemCompact_showsHopsChipForARealNonZeroReading() = runComposeUiTest { + setNodeItemCompact(EnvironmentMetrics(), hopsAway = 4) + onNodeWithText("4").assertIsDisplayed() + } + + @Test + fun nodeItemCompact_hidesHopsChipWhenNeverResolved() = runComposeUiTest { + setNodeItemCompact(EnvironmentMetrics(), hopsAway = Node.HOPS_AWAY_UNSET) + onNodeWithText("4").assertDoesNotExist() + } + + // "Saved on phone" badge (#6263): flags a node that is locally cached but wasn't part of the connected radio's + // current session snapshot, instead of letting it render as if it were freshly heard. + @Test + fun nodeItem_showsSavedOnPhoneBadgeWhenFlagged() = runComposeUiTest { + setNodeItem(EnvironmentMetrics(), isSavedOnPhone = true) + onNodeWithContentDescription("Saved on phone").assertIsDisplayed() + } + + @Test + fun nodeItem_hidesSavedOnPhoneBadgeByDefault() = runComposeUiTest { + setNodeItem(EnvironmentMetrics()) + onNodeWithContentDescription("Saved on phone").assertDoesNotExist() + } + + @Test + fun nodeItemCompact_showsSavedOnPhoneBadgeWhenFlagged() = runComposeUiTest { + setNodeItemCompact(EnvironmentMetrics(), isSavedOnPhone = true) + onNodeWithContentDescription("Saved on phone").assertIsDisplayed() + } + + @Test + fun nodeItemCompact_hidesSavedOnPhoneBadgeByDefault() = runComposeUiTest { + setNodeItemCompact(EnvironmentMetrics()) + onNodeWithContentDescription("Saved on phone").assertDoesNotExist() + } + + // A saved-on-phone row's lastHeard is real historical data (not a sentinel), but announcing it as "online" would + // carry forward the exact false-freshness claim the badge exists to correct (#6263) — see + // BuildNodeDescriptionTest for the string-level coverage of this same branch. + @Test + fun nodeItem_doesNotClaimOnlineWhenSavedOnPhoneEvenWithRecentLastHeard() = runComposeUiTest { + setNodeItem(EnvironmentMetrics(), isSavedOnPhone = true, lastHeard = onlineTimeThreshold() + 1) + onNodeWithContentDescription("online", substring = true).assertDoesNotExist() + } + + @Test + fun nodeItem_claimsOnlineForARecentlyHeardNodeNotSavedOnPhone() = runComposeUiTest { + setNodeItem(EnvironmentMetrics(), isSavedOnPhone = false, lastHeard = onlineTimeThreshold() + 1) + onNodeWithContentDescription("online", substring = true).assertIsDisplayed() + } + + @Test + fun nodeItemCompact_doesNotClaimOnlineWhenSavedOnPhoneEvenWithRecentLastHeard() = runComposeUiTest { + setNodeItemCompact(EnvironmentMetrics(), isSavedOnPhone = true, lastHeard = onlineTimeThreshold() + 1) + onNodeWithContentDescription("online", substring = true).assertDoesNotExist() + } + + private fun ComposeUiTest.setNodeItem( + metrics: EnvironmentMetrics, + hopsAway: Int = Node.HOPS_AWAY_UNSET, + isSavedOnPhone: Boolean = false, + lastHeard: Int = 0, + ) = setContent { MaterialTheme { NodeItem( thisNode = null, - thatNode = node(metrics), + thatNode = node(metrics, hopsAway, lastHeard), distanceUnits = DisplayUnits.METRIC.value, tempInFahrenheit = false, connectionState = ConnectionState.Connected, + isSavedOnPhone = isSavedOnPhone, ) } } - private fun ComposeUiTest.setNodeItemCompact(metrics: EnvironmentMetrics) = setContent { + private fun ComposeUiTest.setNodeItemCompact( + metrics: EnvironmentMetrics, + hopsAway: Int = Node.HOPS_AWAY_UNSET, + isSavedOnPhone: Boolean = false, + lastHeard: Int = 0, + ) = setContent { MaterialTheme { - NodeItemCompact(thisNode = null, thatNode = node(metrics), distanceUnits = DisplayUnits.METRIC.value) + NodeItemCompact( + thisNode = null, + thatNode = node(metrics, hopsAway, lastHeard), + distanceUnits = DisplayUnits.METRIC.value, + isSavedOnPhone = isSavedOnPhone, + ) } } - private fun node(metrics: EnvironmentMetrics) = - Node(num = 2, user = User(id = "!2", long_name = "Sensor"), environmentMetrics = metrics) + private fun node(metrics: EnvironmentMetrics, hopsAway: Int = Node.HOPS_AWAY_UNSET, lastHeard: Int = 0) = Node( + num = 2, + user = User(id = "!2", long_name = "Sensor"), + environmentMetrics = metrics, + hopsAway = hopsAway, + lastHeard = lastHeard, + ) } diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeDetailComponentPreviews.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeDetailComponentPreviews.kt index c85a9d1edc5..260740f158d 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeDetailComponentPreviews.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeDetailComponentPreviews.kt @@ -301,6 +301,15 @@ fun NodeDetailsSectionSignedPreview() { AppTheme { Surface { NodeDetailsSection(node = node) } } } +@Suppress("PreviewPublic") +@PreviewLightDark +@Composable +fun NodeDetailsSectionSavedOnPhonePreview() { + // Locally-retained node absent from the connected radio's current session snapshot (#6263). + val node = previewData.mickeyMouse + AppTheme { Surface { NodeDetailsSection(node = node, isSavedOnPhone = true) } } +} + @PreviewLightDark @Composable private fun NodeDetailsSectionWithDeviceHeroPreview() { diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeDetailsSection.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeDetailsSection.kt index c2d1f7160d8..6f1f7a462f2 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeDetailsSection.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeDetailsSection.kt @@ -81,6 +81,7 @@ import org.meshtastic.core.resources.supported import org.meshtastic.core.resources.transport import org.meshtastic.core.resources.uptime import org.meshtastic.core.resources.user_id +import org.meshtastic.core.ui.component.SavedOnPhoneBadge import org.meshtastic.core.ui.component.SignedNodeDialog import org.meshtastic.core.ui.component.transportInfo import org.meshtastic.core.ui.icon.ArrowCircleUp @@ -110,9 +111,13 @@ fun NodeDetailsSection( modifier: Modifier = Modifier, deviceHardware: DeviceHardware? = null, reportedTarget: String? = null, + isSavedOnPhone: Boolean = false, ) { SectionCard(title = Res.string.details, modifier = modifier) { Column(modifier = Modifier.animateContentSize()) { + if (isSavedOnPhone) { + SavedOnPhoneBadge(modifier = Modifier.padding(horizontal = 16.dp, vertical = 4.dp)) + } if (node.mismatchKey) { MismatchKeyWarning(Modifier.padding(horizontal = 16.dp)) Spacer(Modifier.height(16.dp)) @@ -176,7 +181,7 @@ private fun MainNodeDetails(node: Node) { HearsAndHopsRow(node) SectionDivider() UserAndUptimeRow(node) - if (node.hopsAway == 0 && !node.viaMqtt) { + if (node.hopsAwayOrNull == 0 && !node.viaMqtt) { SectionDivider() SignalRow(node) } @@ -251,10 +256,11 @@ private fun HearsAndHopsRow(node: Node) { icon = MeshtasticIcons.History, modifier = Modifier.weight(1f), ) - if (node.hopsAway >= 0) { + val hopsAway = node.hopsAwayOrNull + if (hopsAway != null) { InfoItem( label = stringResource(Res.string.hops_away), - value = node.hopsAway.toString(), + value = hopsAway.toString(), icon = MeshtasticIcons.HopCount, modifier = Modifier.weight(1f), ) diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeListItemPreviews.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeListItemPreviews.kt index 3b683e9dd4f..abbd65d3eca 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeListItemPreviews.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeListItemPreviews.kt @@ -100,6 +100,30 @@ fun NodeItemSignedPreview() { } } +@PreviewLightDark +@Composable +fun NodeItemSavedOnPhonePreview() { + // Locally-retained node absent from the connected radio's current session snapshot (#6263). Backdated lastHeard + // shows the "Saved on phone" badge suppresses the "online" affordance even for a reading that would otherwise + // read as live. + val savedOnPhoneNode = + previewNodes.minnieMouse.copy(lastHeard = (org.meshtastic.core.common.util.nowSeconds - 300).toInt()) + AppTheme { + Surface { + Column(modifier = Modifier.fillMaxWidth().padding(8.dp)) { + NodeItem( + thisNode = previewNodes.mickeyMouse, + thatNode = savedOnPhoneNode, + distanceUnits = 0, + tempInFahrenheit = false, + connectionState = ConnectionState.Connected, + isSavedOnPhone = true, + ) + } + } + } +} + @PreviewLightDark @Composable fun NodeItemUnknownPreview() { @@ -206,6 +230,26 @@ fun NodeItemCompactOnlineRemotePreview() { } } +@PreviewLightDark +@Composable +fun NodeItemCompactSavedOnPhonePreview() { + // Compact-density counterpart of [NodeItemSavedOnPhonePreview] (#6263). + val savedOnPhoneNode = + previewNodes.minnieMouse.copy(lastHeard = (org.meshtastic.core.common.util.nowSeconds - 300).toInt()) + AppTheme { + Surface { + Column(modifier = Modifier.fillMaxWidth().padding(8.dp)) { + NodeItemCompact( + thisNode = previewNodes.mickeyMouse, + thatNode = savedOnPhoneNode, + distanceUnits = 0, + isSavedOnPhone = true, + ) + } + } + } +} + @PreviewLightDark @Composable fun NodeItemCompleteOnlineRemotePreview() { diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/detail/NodeDetailContent.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/detail/NodeDetailContent.kt index f3c94df515f..b9dc9bfc564 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/detail/NodeDetailContent.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/detail/NodeDetailContent.kt @@ -108,6 +108,7 @@ fun NodeDetailList( node = node, deviceHardware = uiState.metricsState.deviceHardware, reportedTarget = uiState.metricsState.reportedTarget, + isSavedOnPhone = uiState.isSavedOnPhone, ) } if (uiState.metricsState.deviceLinks.isNotEmpty()) { diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/detail/NodeDetailViewModel.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/detail/NodeDetailViewModel.kt index 354f91f348b..1a5cb40e07e 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/detail/NodeDetailViewModel.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/detail/NodeDetailViewModel.kt @@ -71,6 +71,8 @@ data class NodeDetailUiState( val lastRequestNeighborsTime: Long? = null, val sessionStatus: SessionStatus = SessionStatus.NoSession, val isEnsuringSession: Boolean = false, + /** True when [node] is locally cached but wasn't part of the connected radio's current session snapshot. */ + val isSavedOnPhone: Boolean = false, ) /** diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/domain/usecase/CommonGetNodeDetailsUseCase.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/domain/usecase/CommonGetNodeDetailsUseCase.kt index 25e87fc1090..145a7b8fd89 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/domain/usecase/CommonGetNodeDetailsUseCase.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/domain/usecase/CommonGetNodeDetailsUseCase.kt @@ -38,6 +38,7 @@ import org.meshtastic.core.repository.DeviceHardwareRepository import org.meshtastic.core.repository.DeviceLinkRepository import org.meshtastic.core.repository.FirmwareReleaseRepository import org.meshtastic.core.repository.MeshLogRepository +import org.meshtastic.core.repository.NodeManager import org.meshtastic.core.repository.NodeRepository import org.meshtastic.core.repository.RadioConfigRepository import org.meshtastic.core.resources.Res @@ -66,13 +67,19 @@ constructor( private val deviceLinkRepository: DeviceLinkRepository, private val firmwareReleaseRepository: FirmwareReleaseRepository, private val nodeRequestActions: NodeRequestActions, + private val nodeManager: NodeManager, ) : GetNodeDetailsUseCase { @OptIn(ExperimentalCoroutinesApi::class) @Suppress("LongMethod", "CyclomaticComplexMethod") - override operator fun invoke(nodeId: Int): Flow = - nodeRepository.effectiveLogNodeId(nodeId).flatMapLatest { effectiveNodeId -> - buildFlow(nodeId, effectiveNodeId) + override operator fun invoke(nodeId: Int): Flow = nodeRepository + .effectiveLogNodeId(nodeId) + .flatMapLatest { effectiveNodeId -> buildFlow(nodeId, effectiveNodeId) } + .combine(nodeManager.currentSessionNodeNums) { state, sessionNodeNums -> + // Null session snapshot means the current session's Stage 2 handshake hasn't completed yet — there + // is nothing trustworthy to compare against, so nothing should be flagged (#6263). + val isSavedOnPhone = sessionNodeNums != null && state.node?.num?.let { it !in sessionNodeNums } == true + state.copy(isSavedOnPhone = isSavedOnPhone) } @Suppress("LongMethod", "CyclomaticComplexMethod") diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/list/NodeListScreen.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/list/NodeListScreen.kt index f550b26584f..a84c00bdd70 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/list/NodeListScreen.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/list/NodeListScreen.kt @@ -117,6 +117,7 @@ fun NodeListScreen( val totalNodeCount by viewModel.totalNodeCount.collectAsStateWithLifecycle(0) val unfilteredNodes by viewModel.unfilteredNodeList.collectAsStateWithLifecycle() val deviceImageUrls by viewModel.deviceImageUrls.collectAsStateWithLifecycle() + val currentSessionNodeNums by viewModel.currentSessionNodeNums.collectAsStateWithLifecycle() val ignoredNodeCount = unfilteredNodes.count { it.isIgnored } val listState = rememberLazyListState() @@ -265,6 +266,13 @@ fun NodeListScreen( } val isActive = remember(activeNodeId, node.num) { activeNodeId == node.num } + // Null session snapshot (not yet connected, or handshake not yet complete this session) + // means there is nothing trustworthy to compare against — don't badge anything until the + // radio has actually reported its own NodeDB for this connection (#6263). + val isSavedOnPhone = + remember(currentSessionNodeNums, node.num) { + currentSessionNodeNums?.let { node.num !in it } ?: false + } when (density) { NodeListDensity.COMPLETE -> @@ -281,6 +289,7 @@ fun NodeListScreen( isActive = isActive, showTelemetry = showTelemetry, deviceImageUrl = deviceImageUrls[node.user.hw_model.value], + isSavedOnPhone = isSavedOnPhone, ) NodeListDensity.COMPACT -> @@ -303,6 +312,7 @@ fun NodeListScreen( showTelemetry = showTelemetry, tempInFahrenheit = state.tempInFahrenheit, deviceImageUrl = deviceImageUrls[node.user.hw_model.value], + isSavedOnPhone = isSavedOnPhone, ) } val isThisNode = remember(node) { ourNode?.num == node.num } diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/list/NodeListViewModel.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/list/NodeListViewModel.kt index 47aa3ba22e8..6df651217ec 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/list/NodeListViewModel.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/list/NodeListViewModel.kt @@ -39,6 +39,7 @@ import org.meshtastic.core.model.util.DistanceUnit import org.meshtastic.core.repository.AdminController import org.meshtastic.core.repository.ConnectionStateProvider import org.meshtastic.core.repository.DeviceHardwareRepository +import org.meshtastic.core.repository.NodeManager import org.meshtastic.core.repository.NodeRepository import org.meshtastic.core.repository.RadioConfigRepository import org.meshtastic.core.repository.RadioInterfaceService @@ -60,6 +61,7 @@ class NodeListViewModel( private val adminController: AdminController, private val radioInterfaceService: RadioInterfaceService, private val deviceHardwareRepository: DeviceHardwareRepository, + private val nodeManager: NodeManager, val nodeManagementActions: NodeManagementActions, private val nodeRequestActions: NodeRequestActions, private val getFilteredNodesUseCase: GetFilteredNodesUseCase, @@ -68,6 +70,14 @@ class NodeListViewModel( val ourNodeInfo: StateFlow = nodeRepository.ourNodeInfo + /** + * Node numbers the connected radio's own NodeDB reported for the current session, or null before that handshake has + * completed at least once. Used to badge locally-retained rows the radio did NOT just report (#6263) — see + * [NodeManager.currentSessionNodeNums]. + */ + val currentSessionNodeNums: StateFlow?> = + nodeManager.currentSessionNodeNums.stateInWhileSubscribed(initialValue = null) + val onlineNodeCount = nodeRepository.onlineNodeCount.stateInWhileSubscribed(initialValue = 0) val totalNodeCount = nodeRepository.totalNodeCount.stateInWhileSubscribed(initialValue = 0) diff --git a/feature/node/src/commonTest/kotlin/org/meshtastic/feature/node/list/NodeListViewModelTest.kt b/feature/node/src/commonTest/kotlin/org/meshtastic/feature/node/list/NodeListViewModelTest.kt index e4bcc4a6157..1200f143fdf 100644 --- a/feature/node/src/commonTest/kotlin/org/meshtastic/feature/node/list/NodeListViewModelTest.kt +++ b/feature/node/src/commonTest/kotlin/org/meshtastic/feature/node/list/NodeListViewModelTest.kt @@ -29,6 +29,7 @@ import org.meshtastic.core.model.ConnectionState import org.meshtastic.core.model.Node import org.meshtastic.core.model.NodeSortOption import org.meshtastic.core.repository.ConnectionStateProvider +import org.meshtastic.core.repository.NodeManager import org.meshtastic.core.repository.RadioConfigRepository import org.meshtastic.core.testing.FakeDeviceHardwareRepository import org.meshtastic.core.testing.FakeNodeRepository @@ -55,6 +56,7 @@ class NodeListViewModelTest { private val nodeManagementActions: NodeManagementActions = mock(MockMode.autofill) private val nodeRequestActions: NodeRequestActions = mock(MockMode.autofill) private val getFilteredNodesUseCase: GetFilteredNodesUseCase = mock(MockMode.autofill) + private val nodeManager: NodeManager = mock(MockMode.autofill) @BeforeTest fun setUp() { @@ -75,6 +77,7 @@ class NodeListViewModelTest { every { nodeFilterPreferences.excludeMqtt } returns MutableStateFlow(false) every { getFilteredNodesUseCase(any(), any()) } returns MutableStateFlow(emptyList()) + every { nodeManager.currentSessionNodeNums } returns MutableStateFlow(null) viewModel = createViewModel() } @@ -87,6 +90,7 @@ class NodeListViewModelTest { adminController = radioController, radioInterfaceService = radioInterfaceService, deviceHardwareRepository = FakeDeviceHardwareRepository(), + nodeManager = nodeManager, nodeManagementActions = nodeManagementActions, nodeRequestActions = nodeRequestActions, getFilteredNodesUseCase = getFilteredNodesUseCase, @@ -141,4 +145,18 @@ class NodeListViewModelTest { cancelAndIgnoreRemainingEvents() } } + + @Test + fun `currentSessionNodeNums mirrors nodeManager until a session snapshot is published`() = runTest { + val stateFlow = MutableStateFlow?>(null) + every { nodeManager.currentSessionNodeNums } returns stateFlow + + val vm = createViewModel() + vm.currentSessionNodeNums.test { + assertEquals(null, awaitItem()) + stateFlow.value = setOf(100, 200) + assertEquals(setOf(100, 200), awaitItem()) + cancelAndIgnoreRemainingEvents() + } + } } diff --git a/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/NodeScreenshotTests.kt b/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/NodeScreenshotTests.kt index 64304a71aad..ba05bcf8c5b 100644 --- a/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/NodeScreenshotTests.kt +++ b/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/NodeScreenshotTests.kt @@ -26,15 +26,18 @@ import org.meshtastic.feature.node.component.EnvironmentMetricsPreview import org.meshtastic.feature.node.component.HopHistogramContentPreview import org.meshtastic.feature.node.component.HopHistogramEmptyPreview import org.meshtastic.feature.node.component.NodeDetailsSectionPreview +import org.meshtastic.feature.node.component.NodeDetailsSectionSavedOnPhonePreview import org.meshtastic.feature.node.component.NodeDetailsSectionSignedPreview import org.meshtastic.feature.node.component.NodeItemCompactActivePreview import org.meshtastic.feature.node.component.NodeItemCompactAllFieldsPreview import org.meshtastic.feature.node.component.NodeItemCompactMinimalPreview import org.meshtastic.feature.node.component.NodeItemCompactOnlineRemotePreview +import org.meshtastic.feature.node.component.NodeItemCompactSavedOnPhonePreview import org.meshtastic.feature.node.component.NodeItemCompactUnknownPreview import org.meshtastic.feature.node.component.NodeItemCompleteActivePreview import org.meshtastic.feature.node.component.NodeItemCompleteOnlineRemotePreview import org.meshtastic.feature.node.component.NodeItemCompletePreview +import org.meshtastic.feature.node.component.NodeItemSavedOnPhonePreview import org.meshtastic.feature.node.component.NodeItemSignedPreview import org.meshtastic.feature.node.component.NodeItemUnknownPreview import org.meshtastic.feature.node.component.PositionInlineContentPreview @@ -144,6 +147,13 @@ fun ScreenshotNodeDetailsSectionSigned() { NodeDetailsSectionSignedPreview() } +@PreviewTest +@PreviewLightDark +@Composable +fun ScreenshotNodeDetailsSectionSavedOnPhone() { + NodeDetailsSectionSavedOnPhonePreview() +} + @PreviewTest @PreviewLightDark @Composable @@ -267,6 +277,20 @@ fun ScreenshotNodeItemCompleteOnlineRemote() { NodeItemCompleteOnlineRemotePreview() } +@PreviewTest +@PreviewLightDark +@Composable +fun ScreenshotNodeItemSavedOnPhone() { + NodeItemSavedOnPhonePreview() +} + +@PreviewTest +@PreviewLightDark +@Composable +fun ScreenshotNodeItemCompactSavedOnPhone() { + NodeItemCompactSavedOnPhonePreview() +} + @PreviewTest @PreviewLightDark @Composable diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeDetailsSectionSavedOnPhone_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeDetailsSectionSavedOnPhone_Dark_d19fbf1f_0.png new file mode 100644 index 0000000000000000000000000000000000000000..bc19197fcfb795bb6ba4e1bb7140ae34d96d04ea GIT binary patch literal 61697 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⪼0EUs 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 literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeDetailsSectionSavedOnPhone_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeDetailsSectionSavedOnPhone_Light_b29dc7a7_0.png new file mode 100644 index 0000000000000000000000000000000000000000..6332a1f6502061fd7e22dd5c351d64e0ebae9fb9 GIT binary patch literal 62414 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 OsYfl2o6}9t$Nmr2URSjM literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeItemCompactSavedOnPhone_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeItemCompactSavedOnPhone_Dark_d19fbf1f_0.png new file mode 100644 index 0000000000000000000000000000000000000000..8b7aff275ba78cbf5e0794d2e132c6a3bd126cc3 GIT binary patch literal 23710 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 RD|9$nO*M#W(Y;5{{|CpZi=qGk literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeItemCompactSavedOnPhone_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeItemCompactSavedOnPhone_Light_b29dc7a7_0.png new file mode 100644 index 0000000000000000000000000000000000000000..3725d3c3c989da5e155857adcfa17b4de7e8bcd8 GIT binary patch literal 23732 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 z%0D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 literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeItemSavedOnPhone_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeItemSavedOnPhone_Light_b29dc7a7_0.png new file mode 100644 index 0000000000000000000000000000000000000000..c379db5563d8e0e214a1c5239943afedf65b7559 GIT binary patch literal 35175 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 literal 0 HcmV?d00001 From 4f90acbcaa3402fa876b4abdaca35124f507f39d Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Mon, 17 Aug 2026 07:46:04 -0500 Subject: [PATCH 2/2] fix(node): grow session membership as nodes are heard mid-session MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit currentSessionNodeNums was captured once, from the Stage 2 NodeDB download, and never updated again for the life of the connection. Any node that announced itself afterwards — extremely common on a long-lived BLE connection — was therefore absent from the set and got badged "Saved on phone" with its online/fresh status suppressed, reintroducing the very "presence looks wrong" defect #6263 exists to fix, only inverted: genuinely fresh nodes now looked falsely stale. Every mid-session path that learns about a node through the radio carries a RadioSessionContext, and every local-only write (optimistic admin projections, shared-contact imports, fixed-position edits) carries none. That distinction is exactly the one the badge needs, so it drives the new private noteHeardInSession(): NodeInfo via handleReceivedUser, position, node status, PaxCounter, and the updateNodeForSession path that mesh telemetry and admin replies arrive on all extend the set; sessionless writes deliberately do not, since those nodes really are phone-only. Membership is claimed only where the mutation actually committed. For handleReceivedUser that means the winning CAS branch, using a new ReceivedUserTransition.sessionMemberNodeNum so a suppressed retired-number replay claims nothing and a stale noncanonical presentation credits the canonical row it yields to rather than the slot it vacates. The generation is re-read inside the StateFlow update so a concurrent session boundary makes it a no-op instead of resurrecting a number into the new session's set, and an already-present member returns the same instance rather than copying a set of up to MAX_IN_MEMORY_NODES on every inbound packet. The converse gap is documented rather than fixed: a node evicted from the radio's own bounded NodeDB mid-session keeps its membership, because firmware sends no eviction notification and the phone has no signal short of re-downloading the NodeDB. Withholding a badge is the safe direction. Co-Authored-By: Claude Sonnet 5 --- .../core/data/manager/NodeManagerImpl.kt | 51 ++++++- .../core/data/manager/NodeManagerImplTest.kt | 142 ++++++++++++++++++ .../meshtastic/core/repository/NodeManager.kt | 24 ++- 3 files changed, 212 insertions(+), 5 deletions(-) diff --git a/core/data/src/commonMain/kotlin/org/meshtastic/core/data/manager/NodeManagerImpl.kt b/core/data/src/commonMain/kotlin/org/meshtastic/core/data/manager/NodeManagerImpl.kt index 01a2bb75938..bc2c07dee3a 100644 --- a/core/data/src/commonMain/kotlin/org/meshtastic/core/data/manager/NodeManagerImpl.kt +++ b/core/data/src/commonMain/kotlin/org/meshtastic/core/data/manager/NodeManagerImpl.kt @@ -346,6 +346,31 @@ class NodeManagerImpl( _currentSessionNodeNums.value = nodeNums } + /** + * Extends the current session's membership set with [nodeNum] after the radio forwarded live traffic for it, so a + * node that announces itself *after* the Stage 2 snapshot is not mistaken for locally-retained history (#6263). + * + * A null [session] means the mutation did not come from the radio at all (an optimistic admin projection, a + * shared-contact import, a locally applied fixed position) and must not claim session membership. Everything else + * is decided inside the [updateStateFlow] lambda so a concurrent session boundary makes this a no-op rather than + * resurrecting a number into the wrong session's set: + * - no snapshot published yet → nothing to extend (leaving it null keeps every row unbadged, per the contract); + * - the published snapshot belongs to a different generation → this packet is from a superseded session; + * - already a member → return the same instance, so the hot inbound path neither copies a set of up to + * [MAX_IN_MEMORY_NODES] entries nor emits a conflated no-change update. + */ + private fun noteHeardInSession(nodeNum: Int, session: RadioSessionContext?) { + if (session == null) return + _currentSessionNodeNums.updateStateFlow { current -> + when { + current == null -> null + currentSessionNodeNumsGeneration.value != session.generation -> current + nodeNum in current -> current + else -> current + nodeNum + } + } + } + override val firmwareEdition = MutableStateFlow(null) override fun setFirmwareEdition(edition: FirmwareEdition?) { @@ -612,7 +637,13 @@ class NodeManagerImpl( session: RadioSessionContext? = null, transform: (Node) -> Node, ): NodeStateChange? = updateNodeState(nodeNum, channel, transform).also { change -> - if (change != null && shouldPersist(change.next)) { + if (change == null) return@also + // A committed session-scoped update means the radio just forwarded traffic for this node — position, + // telemetry, node status, PaxCounter, admin reply — so it belongs to this session's membership set even if + // Stage 2 never listed it (#6263). A null change means the update was refused (retired-absent number) and + // proves nothing. Retries are impossible here: updateNodeState commits at most once. + noteHeardInSession(nodeNum, session) + if (shouldPersist(change.next)) { radioInterfaceService.launchSessionWork(scope, session) { persistLatestNode(nodeNum) } } } @@ -690,6 +721,9 @@ class NodeManagerImpl( " key=$keyStr canonical=$canonicalNum" + " decision=${transition.decision} notify=${transition.notifyNode != null}" } + // Only the winning CAS may claim session membership: a packet that lost the race breaks out of this + // loop and is logged as discarded, and an entry-point add would have already polluted the set (#6263). + transition.sessionMemberNodeNum?.let { noteHeardInSession(it, session) } applyReceivedUserEffects(transition, session) return } @@ -857,6 +891,14 @@ class NodeManagerImpl( val notifyNode: Node?, /** Retired number to reactivate after a validated, genuinely new identity claims the vacant slot. */ val unretireNodeNum: Int? = null, + /** + * Number under which [after] actually keys the node this packet was attributed to, to be recorded as a member + * of the live connection session (#6263). Deliberately not always `fromNum`: a stale noncanonical presentation + * yields to the canonical row, so the *canonical* number is the row the traffic evidences. Null when the + * reduction suppressed or ignored the packet — a suppressed replay proves nothing about session membership, and + * claiming `fromNum` there would badge a slot held by an entirely different identity. + */ + val sessionMemberNodeNum: Int? = null, val decision: ReceivedUserDecision, ) @@ -954,6 +996,7 @@ class NodeManagerImpl( after = afterRemovals.put(fromNum, transformed, preferredNum = fromNum), upsertNode = transformed, notifyNode = null, + sessionMemberNodeNum = fromNum, decision = ReceivedUserDecision.LOCAL_UPDATE, ) } @@ -1007,6 +1050,7 @@ class NodeManagerImpl( after = afterRemovals.put(fromNum, transformed, preferredNum = fromNum), upsertNode = null, notifyNode = null, + sessionMemberNodeNum = fromNum, decision = ReceivedUserDecision.CANONICAL_DUPLICATE_RECONCILED, ) } @@ -1020,6 +1064,9 @@ class NodeManagerImpl( after = after, upsertNode = null, notifyNode = null, + // The identity lives at canonicalNum (that is what `canonicalNum in otherSameKeyNums` asserts), so + // that — not the yielding fromNum slot — is the row this traffic proves the radio just relayed. + sessionMemberNodeNum = canonicalNum, decision = ReceivedUserDecision.STALE_PRESENTATION_REMOVED, ) } @@ -1048,6 +1095,7 @@ class NodeManagerImpl( after = before.put(fromNum, transformed, preferredNum = fromNum), upsertNode = null, notifyNode = null, + sessionMemberNodeNum = fromNum, decision = ReceivedUserDecision.AMBIGUOUS_DUPLICATE_UPDATED, ) } @@ -1090,6 +1138,7 @@ class NodeManagerImpl( upsertNode = transformed.takeIf { persist }, notifyNode = notify, unretireNodeNum = unretireNodeNum, + sessionMemberNodeNum = fromNum, decision = decision, ) } diff --git a/core/data/src/commonTest/kotlin/org/meshtastic/core/data/manager/NodeManagerImplTest.kt b/core/data/src/commonTest/kotlin/org/meshtastic/core/data/manager/NodeManagerImplTest.kt index bd801bd3a6c..d21cab136e7 100644 --- a/core/data/src/commonTest/kotlin/org/meshtastic/core/data/manager/NodeManagerImplTest.kt +++ b/core/data/src/commonTest/kotlin/org/meshtastic/core/data/manager/NodeManagerImplTest.kt @@ -62,6 +62,7 @@ import kotlin.test.assertEquals import kotlin.test.assertFalse import kotlin.test.assertNotNull import kotlin.test.assertNull +import kotlin.test.assertSame import kotlin.test.assertTrue import org.meshtastic.proto.NodeInfo as ProtoNodeInfo import org.meshtastic.proto.Position as ProtoPosition @@ -2780,4 +2781,145 @@ class NodeManagerImplTest { assertNull(nodeManager.currentSessionNodeNums.value) } + + // ---------- Mid-session membership growth (#6263) ---------- + + private val liveSession = RadioSessionContext(generation = SESSION_GEN, address = "ble:live") + + /** Publishes a Stage 2 snapshot that deliberately does NOT contain [MID_SESSION_NUM]. */ + private fun publishStageTwoSnapshot() { + nodeManager.publishCurrentSessionNodeNums(SESSION_GEN, setOf(LOCAL_NUM, STAGE_TWO_NUM)) + } + + /** + * The exact predicate every consumer applies (`NodeListScreen`, `CommonGetNodeDetailsUseCase`): a row is badged + * "Saved on phone" — and has its online/fresh affordance suppressed — when a snapshot exists and omits it. + */ + private fun isSavedOnPhone(nodeNum: Int): Boolean = + nodeManager.currentSessionNodeNums.value?.let { nodeNum !in it } ?: false + + private fun midSessionUser(num: Int = MID_SESSION_NUM) = User( + id = NodeAddress.numToDefaultId(num), + long_name = "Mid Session Arrival", + short_name = "MSA", + hw_model = HardwareModel.TLORA_V2, + ) + + @Test + fun `a node first heard mid-session joins the session set instead of being badged saved-on-phone`() { + // The defect this locks down: the Stage 2 snapshot is a point-in-time photograph, so a node that announces + // itself later on a long-lived connection was flagged as locally-retained history and had its genuinely fresh + // online status suppressed — the same "presence looks wrong" defect #6263 set out to fix, inverted. + publishStageTwoSnapshot() + assertTrue(isSavedOnPhone(MID_SESSION_NUM), "precondition: absent from the Stage 2 snapshot") + + nodeManager.handleReceivedUser(MID_SESSION_NUM, midSessionUser(), session = liveSession) + + assertTrue(MID_SESSION_NUM in nodeManager.currentSessionNodeNums.value.orEmpty()) + assertFalse(isSavedOnPhone(MID_SESSION_NUM), "a node just heard over the mesh must not be badged") + // Purely additive: Stage 2's own membership is untouched. + assertEquals(setOf(LOCAL_NUM, STAGE_TWO_NUM, MID_SESSION_NUM), nodeManager.currentSessionNodeNums.value) + } + + @Test + fun `a session-scoped position joins the session set`() { + publishStageTwoSnapshot() + + nodeManager.handleReceivedPosition( + MID_SESSION_NUM, + myNodeNum = LOCAL_NUM, + p = ProtoPosition(latitude_i = 123, longitude_i = 456), + defaultTime = 1000L, + session = liveSession, + ) + + assertFalse(isSavedOnPhone(MID_SESSION_NUM)) + } + + @Test + fun `a session-scoped node update joins the session set`() { + // updateNodeForSession is the mesh telemetry (TelemetryPacketHandlerImpl) and admin-reply + // (AdminPacketHandlerImpl) arrival path — neither reaches handleReceivedUser. + publishStageTwoSnapshot() + + nodeManager.updateNodeForSession(MID_SESSION_NUM, liveSession) { it.copy(lastHeard = 42) } + + assertFalse(isSavedOnPhone(MID_SESSION_NUM)) + } + + @Test + fun `a session-scoped node status joins the session set`() { + publishStageTwoSnapshot() + + nodeManager.handleReceivedNodeStatus(MID_SESSION_NUM, StatusMessage(status = "live"), liveSession) + + assertFalse(isSavedOnPhone(MID_SESSION_NUM)) + } + + @Test + fun `a sessionless user update cannot claim session membership`() { + // MessagingControllerImpl imports a shared contact, AdminControllerImpl projects an optimistic config write, + // and CommandSenderImpl applies a local fixed position — all with no session. Those nodes are precisely the + // "saved on phone" case, so a session-blind add would badge nothing at all and make the feature inert. + publishStageTwoSnapshot() + + nodeManager.handleReceivedUser(MID_SESSION_NUM, midSessionUser(), manuallyVerified = true) + nodeManager.updateNode(MID_SESSION_NUM) { it.copy(lastHeard = 42) } + + assertEquals(setOf(LOCAL_NUM, STAGE_TWO_NUM), nodeManager.currentSessionNodeNums.value) + assertTrue(isSavedOnPhone(MID_SESSION_NUM)) + } + + @Test + fun `traffic from a superseded generation cannot contaminate the active session set`() { + publishStageTwoSnapshot() + val supersededSession = RadioSessionContext(generation = SESSION_GEN - 1, address = "ble:old") + + nodeManager.handleReceivedUser(MID_SESSION_NUM, midSessionUser(), session = supersededSession) + + assertEquals(setOf(LOCAL_NUM, STAGE_TWO_NUM), nodeManager.currentSessionNodeNums.value) + } + + @Test + fun `mid-session traffic before any snapshot leaves the set null rather than fabricating one`() { + // Nothing may be badged until the radio has actually reported its own NodeDB, so a partial set built only from + // live traffic would badge the entire real NodeDB as saved-on-phone. + nodeManager.handleReceivedUser(MID_SESSION_NUM, midSessionUser(), session = liveSession) + + assertNull(nodeManager.currentSessionNodeNums.value) + assertFalse(isSavedOnPhone(MID_SESSION_NUM)) + } + + @Test + fun `a suppressed replay for a retired number claims no session membership`() { + val retiredNum = validPk.noncanonicalNum(4600) + nodeManager.updateNode(retiredNum) { makeKnownNode(retiredNum, validPk, "Pre-migration") } + nodeManager.applyTrustedIdentityMigrations(listOf(retiredNum)) + publishStageTwoSnapshot() + + // No valid key against a retired slot: the reducer suppresses the packet outright, so it is no evidence that + // the radio still knows this number. + nodeManager.handleReceivedUser(retiredNum, midSessionUser(retiredNum), session = liveSession) + + assertEquals(setOf(LOCAL_NUM, STAGE_TWO_NUM), nodeManager.currentSessionNodeNums.value) + } + + @Test + fun `repeat traffic from an existing member allocates no new set`() { + // Guards the hot inbound path: every position and telemetry packet reaches this, and a blind `set + num` would + // copy up to MAX_IN_MEMORY_NODES entries per packet for a change StateFlow conflates away regardless. + publishStageTwoSnapshot() + val before = nodeManager.currentSessionNodeNums.value + + nodeManager.handleReceivedUser(STAGE_TWO_NUM, midSessionUser(STAGE_TWO_NUM), session = liveSession) + + assertSame(before, nodeManager.currentSessionNodeNums.value) + } + + private companion object { + const val SESSION_GEN = 5L + const val LOCAL_NUM = 1111 + const val STAGE_TWO_NUM = 2222 + const val MID_SESSION_NUM = 3333 + } } diff --git a/core/repository/src/commonMain/kotlin/org/meshtastic/core/repository/NodeManager.kt b/core/repository/src/commonMain/kotlin/org/meshtastic/core/repository/NodeManager.kt index 0154d6052e9..18e2c5fb056 100644 --- a/core/repository/src/commonMain/kotlin/org/meshtastic/core/repository/NodeManager.kt +++ b/core/repository/src/commonMain/kotlin/org/meshtastic/core/repository/NodeManager.kt @@ -117,24 +117,40 @@ interface NodeManager : NodeIdLookup { fun publishConnectionIdentity(sessionGeneration: Long, address: String, nodeNum: Int, deviceId: String?) /** - * Node numbers confirmed present in the connected radio's own NodeDB for the current connection session — exactly - * the set the Stage 2 handshake downloaded, plus the local node. Null before that handshake has completed at least - * once this session (no snapshot to compare against yet, so nothing should be flagged). + * Node numbers the connected radio is known to know about during the current connection session: the set its Stage + * 2 handshake downloaded, plus the local node, plus **every node the radio has forwarded live traffic for since** + * (see below). Null before that handshake has completed at least once this session (no snapshot to compare against + * yet, so nothing should be flagged). * * Distinct from [nodeDBbyNodeNum]: the phone's node database is deliberately cumulative and keeps rows the * connected radio no longer reports (multi-radio use, meshes bigger than the radio's own bounded/evicting NodeDB). * A row present in [nodeDBbyNodeNum] but absent here is real, locally-retained history — not a fabricated or stale * entry — and UI should badge it as such (see #6263) rather than hide or delete it. * + * **This set grows for the life of the session.** The Stage 2 snapshot alone would be a point-in-time photograph: + * on a long-lived connection, any node announcing itself mid-session (NodeInfo, Position, Telemetry, node status, + * PaxCounter, admin reply) is genuinely part of the live session, and treating it as locally-retained history would + * suppress its real, freshly observed presence. Every mid-session path that carries a [RadioSessionContext] — i.e. + * that reached the phone through the radio, as opposed to a local projection or an imported contact — adds its node + * number here. Local-only writes (optimistic config projections, shared-contact imports, fixed-position edits) + * carry no session and deliberately do not, since those nodes are exactly the "saved on phone" case. + * + * It never shrinks mid-session. A node evicted from the radio's *own* bounded NodeDB after Stage 2 keeps its + * membership until the next handshake republishes: the firmware sends no eviction notification, so the phone has no + * signal short of re-downloading the whole NodeDB. Erring toward "the radio knew about this node this session" is + * the safe direction — it withholds a badge rather than falsely claiming locally-retained history. + * * Reconciled alongside [connectionIdentity] at every transport-session boundary — see [clearConnectionIdentity] and * [clearStaleConnectionIdentity] — using the same generation carried by [publishCurrentSessionNodeNums], so a * snapshot already published for the active generation survives a delayed boundary collector from that same - * generation, exactly like [connectionIdentity]. + * generation, exactly like [connectionIdentity]. Mid-session additions are gated on that same generation, so + * late-arriving traffic from a superseded session can never contaminate the new session's set. */ val currentSessionNodeNums: StateFlow?> /** * Publishes the exact set of node numbers [sessionGeneration]'s Stage 2 handshake downloaded (+ the local node). + * This replaces (rather than extends) any previous set, and is the only point at which membership can shrink. */ fun publishCurrentSessionNodeNums(sessionGeneration: Long, nodeNums: Set)