From 552097888fe2710341923eeabea35215336e9ea0 Mon Sep 17 00:00:00 2001 From: Mac DeCourcy <49794076+mdecourcy@users.noreply.github.com> Date: Mon, 24 Nov 2025 06:13:31 -0800 Subject: [PATCH] fix: skip nodeinfo upsert when we recieve defaults from the node (#3796) --- .../geeksville/mesh/service/MeshService.kt | 31 ++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt index 6fa5eb2df..a2710dc49 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt @@ -1719,13 +1719,30 @@ class MeshService : Service() { // Just replace/add any entry updateNodeInfo(info.num) { if (info.hasUser()) { - it.user = - info.user.copy { - if (isLicensed) clearPublicKey() - if (info.viaMqtt) longName = "$longName (MQTT)" - } - it.longName = it.user.longName - it.shortName = it.user.shortName + // Check if this is a default/unknown user from firmware (node was evicted and re-created) + val isDefaultName = info.user.longName.matches(Regex("^Meshtastic [0-9a-fA-F]{4}$")) + val isDefaultHwModel = info.user.hwModel == MeshProtos.HardwareModel.UNSET + val hasExistingUser = it.user.id.isNotEmpty() && it.user.hwModel != MeshProtos.HardwareModel.UNSET + + // If firmware sends a default user (evicted node), preserve our existing user data + val shouldPreserveExisting = hasExistingUser && isDefaultName && isDefaultHwModel + + if (shouldPreserveExisting) { + // Firmware sent us a placeholder - keep all our existing user data + Timber.d( + "Preserving existing user data for node ${info.num}: " + + "kept='${it.user.longName}' (hwModel=${it.user.hwModel}), " + + "skipped default='${info.user.longName}' (hwModel=UNSET)", + ) + } else { + it.user = + info.user.copy { + if (isLicensed) clearPublicKey() + if (info.viaMqtt) longName = "$longName (MQTT)" + } + it.longName = it.user.longName + it.shortName = it.user.shortName + } } if (info.hasPosition()) {