fix(firmware): Retry ESP32 OTA service connections cleanly (#6081)

This commit is contained in:
Jeremiah K
2026-07-08 22:07:25 -05:00
committed by GitHub
parent bd14228fb6
commit c2a8e67aee
16 changed files with 1297 additions and 105 deletions

View File

@@ -47,9 +47,11 @@ import org.meshtastic.core.model.TracerouteMapAvailability
import org.meshtastic.core.model.evaluateTracerouteMapAvailability
import org.meshtastic.core.model.service.TracerouteResponse
import org.meshtastic.core.model.util.dispatchMeshtasticUri
import org.meshtastic.core.model.util.isOtaStatusNotification
import org.meshtastic.core.navigation.DeepLinkRouter
import org.meshtastic.core.repository.EventFirmwareRepository
import org.meshtastic.core.repository.FirmwareReleaseRepository
import org.meshtastic.core.repository.FirmwareUpdateStatusRepository
import org.meshtastic.core.repository.LockdownCoordinator
import org.meshtastic.core.repository.LockdownPassphraseStore
import org.meshtastic.core.repository.MeshLogRepository
@@ -88,6 +90,7 @@ class UIViewModel(
meshLogRepository: MeshLogRepository,
firmwareReleaseRepository: FirmwareReleaseRepository,
private val eventFirmwareRepository: EventFirmwareRepository,
private val firmwareUpdateStatusRepository: FirmwareUpdateStatusRepository,
private val uiPrefs: UiPrefs,
private val notificationManager: NotificationManager,
packetRepository: PacketRepository,
@@ -261,6 +264,14 @@ class UIViewModel(
serviceRepository.clientNotification
.filterNotNull()
.onEach { notification ->
val firmwareUpdateStatus = firmwareUpdateStatusRepository.status.value
if (notification.isOtaStatusNotification() && firmwareUpdateStatus.isOtaUpdateActive) {
Logger.i { "Suppressing OTA status ClientNotification generic alert during firmware update" }
if (!firmwareUpdateStatus.isAwaitingOtaStatus) {
clearClientNotification(notification)
}
return@onEach
}
val isCompromised = notification.low_entropy_key != null || notification.duplicated_public_key != null
showAlert(
titleRes = Res.string.client_notification,

View File

@@ -17,6 +17,8 @@
package org.meshtastic.core.ui.viewmodel
import org.meshtastic.core.common.util.CommonUri
import org.meshtastic.core.model.util.isOtaStatusNotification
import org.meshtastic.proto.ClientNotification
import kotlin.test.Test
import kotlin.test.assertFalse
import kotlin.test.assertTrue
@@ -46,4 +48,23 @@ class UIViewModelImportSummaryTest {
assertTrue(summary.contains("hasFragment=false"))
}
@Test
fun ota_status_notifications_are_suppressed() {
assertTrue(ClientNotification(message = "Rebooting to WiFi OTA").isOtaStatusNotification())
assertTrue(ClientNotification(message = "Rebooting to BLE OTA").isOtaStatusNotification())
assertTrue(
ClientNotification(message = "Cannot start OTA: OTA Loader partition not found.").isOtaStatusNotification(),
)
assertTrue(ClientNotification(message = "OTA Loader does not support WiFi").isOtaStatusNotification())
assertTrue(ClientNotification(message = "Unable to switch to the OTA partition.").isOtaStatusNotification())
}
@Test
fun non_ota_status_notifications_are_not_suppressed() {
assertFalse(ClientNotification(message = "Low battery").isOtaStatusNotification())
assertFalse(ClientNotification(message = "Key verification requested").isOtaStatusNotification())
assertFalse(ClientNotification(message = "ROTATE credentials").isOtaStatusNotification())
assertFalse(ClientNotification(message = "Quota exceeded").isOtaStatusNotification())
}
}