From 76151e153fd9fadab2ee672debc0636c2964cad5 Mon Sep 17 00:00:00 2001 From: andrekir Date: Sun, 7 Apr 2024 16:35:04 -0300 Subject: [PATCH] refactor: move error message handling to `ServiceRepository` --- .../java/com/geeksville/mesh/model/BTScanModel.kt | 2 +- .../java/com/geeksville/mesh/model/UIState.kt | 4 ++-- .../repository/datastore/RadioConfigRepository.kt | 10 ++++++++++ .../repository/radio/RadioInterfaceService.kt | 12 ------------ .../com/geeksville/mesh/service/MeshService.kt | 4 ++-- .../geeksville/mesh/service/ServiceRepository.kt | 15 ++++++++++++++- 6 files changed, 29 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/model/BTScanModel.kt b/app/src/main/java/com/geeksville/mesh/model/BTScanModel.kt index 9843253e7..17953c1e3 100644 --- a/app/src/main/java/com/geeksville/mesh/model/BTScanModel.kt +++ b/app/src/main/java/com/geeksville/mesh/model/BTScanModel.kt @@ -194,7 +194,7 @@ class BTScanModel @Inject constructor( addDevice(entry) } }.catch { ex -> - radioInterfaceService.setErrorMessage("Unexpected Bluetooth scan failure: ${ex.message}") + serviceRepository.setErrorMessage("Unexpected Bluetooth scan failure: ${ex.message}") }.launchIn(viewModelScope) } diff --git a/app/src/main/java/com/geeksville/mesh/model/UIState.kt b/app/src/main/java/com/geeksville/mesh/model/UIState.kt index 649eae57a..a32210460 100644 --- a/app/src/main/java/com/geeksville/mesh/model/UIState.kt +++ b/app/src/main/java/com/geeksville/mesh/model/UIState.kt @@ -159,9 +159,9 @@ class UIViewModel @Inject constructor( val snackbarText: LiveData get() = _snackbarText init { - radioInterfaceService.errorMessage.filterNotNull().onEach { + radioConfigRepository.errorMessage.filterNotNull().onEach { _snackbarText.value = it - radioInterfaceService.clearErrorMessage() + radioConfigRepository.clearErrorMessage() }.launchIn(viewModelScope) viewModelScope.launch { diff --git a/app/src/main/java/com/geeksville/mesh/repository/datastore/RadioConfigRepository.kt b/app/src/main/java/com/geeksville/mesh/repository/datastore/RadioConfigRepository.kt index e5dd6560d..d1163dfee 100644 --- a/app/src/main/java/com/geeksville/mesh/repository/datastore/RadioConfigRepository.kt +++ b/app/src/main/java/com/geeksville/mesh/repository/datastore/RadioConfigRepository.kt @@ -157,6 +157,16 @@ class RadioConfigRepository @Inject constructor( } } + val errorMessage: StateFlow get() = serviceRepository.errorMessage + + fun setErrorMessage(text: String) { + serviceRepository.setErrorMessage(text) + } + + fun clearErrorMessage() { + serviceRepository.clearErrorMessage() + } + val tracerouteResponse: StateFlow get() = serviceRepository.tracerouteResponse fun setTracerouteResponse(value: String?) { diff --git a/app/src/main/java/com/geeksville/mesh/repository/radio/RadioInterfaceService.kt b/app/src/main/java/com/geeksville/mesh/repository/radio/RadioInterfaceService.kt index 0866a02ee..bf760c12d 100644 --- a/app/src/main/java/com/geeksville/mesh/repository/radio/RadioInterfaceService.kt +++ b/app/src/main/java/com/geeksville/mesh/repository/radio/RadioInterfaceService.kt @@ -56,18 +56,6 @@ class RadioInterfaceService @Inject constructor( private val _receivedData = MutableSharedFlow() val receivedData: SharedFlow = _receivedData - private val _errorMessage = MutableStateFlow(null) - val errorMessage: SharedFlow = _errorMessage - - fun setErrorMessage(text: String) { - errormsg(text) - _errorMessage.value = text - } - - fun clearErrorMessage() { - _errorMessage.value = null - } - private val logSends = false private val logReceives = false private lateinit var sentPacketsLog: BinaryLogFile // inited in onCreate 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 9009e1a76..224ba5450 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt @@ -671,7 +671,7 @@ class MeshService : Service(), Logging { val isAck = u.errorReasonValue == MeshProtos.Routing.Error.NONE_VALUE if (u.errorReason == MeshProtos.Routing.Error.DUTY_CYCLE_LIMIT) { - radioInterfaceService.setErrorMessage(getString(R.string.error_duty_cycle)) + radioConfigRepository.setErrorMessage(getString(R.string.error_duty_cycle)) } handleAckNak(isAck, fromId, data.requestId) @@ -1446,7 +1446,7 @@ class MeshService : Service(), Logging { mqttMessageFlow = mqttRepository.proxyMessageFlow.onEach { message -> sendToRadio(ToRadio.newBuilder().apply { mqttClientProxyMessage = message }) }.catch { throwable -> - radioInterfaceService.setErrorMessage("MqttClientProxy failed: $throwable") + radioConfigRepository.setErrorMessage("MqttClientProxy failed: $throwable") }.launchIn(serviceScope) } } diff --git a/app/src/main/java/com/geeksville/mesh/service/ServiceRepository.kt b/app/src/main/java/com/geeksville/mesh/service/ServiceRepository.kt index 048cf2976..ab544ab72 100644 --- a/app/src/main/java/com/geeksville/mesh/service/ServiceRepository.kt +++ b/app/src/main/java/com/geeksville/mesh/service/ServiceRepository.kt @@ -1,6 +1,7 @@ package com.geeksville.mesh.service import com.geeksville.mesh.IMeshService +import com.geeksville.mesh.android.Logging import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import javax.inject.Inject @@ -10,7 +11,7 @@ import javax.inject.Singleton * Repository class for managing the [IMeshService] instance and connection state */ @Singleton -class ServiceRepository @Inject constructor() { +class ServiceRepository @Inject constructor() : Logging { var meshService: IMeshService? = null private set @@ -26,6 +27,18 @@ class ServiceRepository @Inject constructor() { _connectionState.value = connectionState } + private val _errorMessage = MutableStateFlow(null) + val errorMessage: StateFlow get() = _errorMessage + + fun setErrorMessage(text: String) { + errormsg(text) + _errorMessage.value = text + } + + fun clearErrorMessage() { + _errorMessage.value = null + } + private val _tracerouteResponse = MutableStateFlow(null) val tracerouteResponse: StateFlow get() = _tracerouteResponse