refactor: eliminate ProcessRadioResponseUseCase and packet-ID correlation

Replace the manual packet-ID tracking and meshPacketFlow subscription in
RadioConfigViewModel with direct typed returns from the SDK via
RadioConfigUseCase. The ViewModel now awaits typed results (User, Config,
ModuleConfig, channels, etc.) from suspend calls and maps AdminException
to UI error states.

Key changes:
- Delete ProcessRadioResponseUseCase (130 lines of manual proto decode)
- Remove requestIds state, registerRequestId, processPacketResponse,
  sendAdminRequest, and meshPacketFlow subscription from ViewModel
- Rewrite setResponseStateLoading to use direct coroutine calls
- Admin actions (reboot/shutdown/etc.) fire directly without session key
  preflight (SDK handles retryOnSessionExpiry transparently)
- All setters (setConfig, setModuleConfig, setOwner, updateChannels)
  no longer return/track packetIds
- Remove messageSender dependency from NodeManagementActions
- Update InstallProfileUseCase to use editSettings {} receiver pattern
- Update all callers: CleanNodeDatabaseUseCase, Esp32OtaUpdateHandler,
  NodeManagementActions
- Rewrite RadioConfigViewModelTest for new direct-await semantics
- Update RadioConfigUseCaseTest and InstallProfileUseCaseTest

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
James Rich
2026-05-06 10:50:02 -05:00
parent 6e5b159014
commit 140e062eee
19 changed files with 575 additions and 1017 deletions

View File

@@ -23,7 +23,6 @@ import org.jetbrains.compose.resources.getString
import org.koin.core.annotation.Single
import org.meshtastic.core.common.util.ioDispatcher
import org.meshtastic.core.model.DeviceControl
import org.meshtastic.core.model.MessageSender
import org.meshtastic.core.model.Node
import org.meshtastic.core.model.service.ServiceAction
import org.meshtastic.core.repository.NodeRepository
@@ -49,7 +48,6 @@ constructor(
private val nodeRepository: NodeRepository,
private val serviceRepository: ServiceRepository,
private val deviceControl: DeviceControl,
private val messageSender: MessageSender,
private val alertManager: AlertManager,
) {
open fun requestRemoveNode(scope: CoroutineScope, node: Node, onAfterRemove: () -> Unit = {}) {
@@ -66,8 +64,7 @@ constructor(
open fun removeNode(scope: CoroutineScope, nodeNum: Int) {
scope.launch(ioDispatcher) {
Logger.i { "Removing node '$nodeNum'" }
val packetId = messageSender.getPacketId()
deviceControl.removeByNodenum(packetId, nodeNum)
deviceControl.removeByNodenum(nodeNum)
nodeRepository.deleteNode(nodeNum)
}
}

View File

@@ -47,7 +47,6 @@ class NodeManagementActionsTest {
nodeRepository = nodeRepository,
serviceRepository = serviceRepository,
deviceControl = radioController,
messageSender = radioController,
alertManager = alertManager,
)
@@ -80,7 +79,6 @@ class NodeManagementActionsTest {
nodeRepository = nodeRepository,
serviceRepository = serviceRepository,
deviceControl = radioController,
messageSender = radioController,
alertManager = realAlertManager,
)
val node = Node(num = 123, user = User(long_name = "Test Node"))