feat: set_ignored_node side effects mirror firmware behavior

When ignoring a node, wipe position, deviceMetrics, and publicKey locally
to match what firmware does on the device side. Un-ignoring just clears
the isIgnored flag (device will re-populate on next heard packet).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
James Rich
2026-05-06 14:12:22 -05:00
parent fa6d625d90
commit 604ce68415

View File

@@ -42,7 +42,9 @@ import org.meshtastic.core.repository.PacketRepository
import org.meshtastic.core.repository.ServiceRepository
import org.meshtastic.core.repository.UiPrefs
import org.meshtastic.proto.ClientNotification
import org.meshtastic.proto.DeviceMetrics
import org.meshtastic.proto.PortNum
import org.meshtastic.proto.Position
import org.meshtastic.proto.User
import org.meshtastic.sdk.AdminResult
import org.meshtastic.sdk.ChannelIndex
@@ -327,7 +329,19 @@ class SdkStateBridge(
val newIgnored = !node.isIgnored
val result = runCatching { client.admin.setIgnored(NodeId(node.num), newIgnored) }
if (result.isSuccess) {
nodeRepository.updateNode(node.num) { it.copy(isIgnored = newIgnored) }
nodeRepository.updateNode(node.num) { n ->
if (newIgnored) {
// Mirror firmware behavior: wipe position, device_metrics, zero public_key
n.copy(
isIgnored = true,
position = Position(),
deviceMetrics = DeviceMetrics(),
publicKey = null,
)
} else {
n.copy(isIgnored = false)
}
}
packetRepository.value.updateFilteredBySender(node.user.id, newIgnored)
} else {
Logger.w(result.exceptionOrNull()) { "[SdkBridge] setIgnored failed for ${node.num}" }