mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-07-13 06:42:23 -04:00
fix(firmware): Retry ESP32 OTA service connections cleanly (#6081)
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user