From f3ef61ea24a6d8d1068d847c3104437c1a874069 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 11 Apr 2026 18:01:04 +0000 Subject: Surface conditions API errors as Snackbar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds _conditionsError SharedFlow to MainViewModel that emits the exception class + message on fetchCurrentConditions failure. MainActivity collects it and shows a LENGTH_LONG Snackbar — no adb required to see why conditions aren't loading. https://claude.ai/code/session_01HXPjBsogsJVRwCiekDGkJX --- android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt | 7 +++++++ .../app/src/main/kotlin/org/terst/nav/ui/MainViewModel.kt | 10 +++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) (limited to 'android-app/app') diff --git a/android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt b/android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt index ecf2254..7a00748 100644 --- a/android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt +++ b/android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt @@ -528,6 +528,13 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener { conditionSpinners.forEach { it.visibility = vis } } } + lifecycleScope.launch { + viewModel.conditionsError.collect { msg -> + com.google.android.material.snackbar.Snackbar + .make(findViewById(android.R.id.content), msg, com.google.android.material.snackbar.Snackbar.LENGTH_LONG) + .show() + } + } lifecycleScope.launch { LocationService.nmeaDepthDataFlow.collect { depthData -> lastDepthMeters = depthData.depthMeters diff --git a/android-app/app/src/main/kotlin/org/terst/nav/ui/MainViewModel.kt b/android-app/app/src/main/kotlin/org/terst/nav/ui/MainViewModel.kt index b2d5529..e65cbd1 100644 --- a/android-app/app/src/main/kotlin/org/terst/nav/ui/MainViewModel.kt +++ b/android-app/app/src/main/kotlin/org/terst/nav/ui/MainViewModel.kt @@ -55,6 +55,10 @@ class MainViewModel( private val _conditionsLoading = MutableStateFlow(false) val conditionsLoading: StateFlow = _conditionsLoading.asStateFlow() + + private val _conditionsError = MutableSharedFlow(replay = 0) + val conditionsError: SharedFlow = _conditionsError.asSharedFlow() + private var conditionsJob: Job? = null private val _aisTargets = MutableStateFlow>(emptyList()) @@ -177,7 +181,11 @@ class MainViewModel( try { repository.fetchCurrentConditions(lat, lon) .onSuccess { _marineConditions.value = it } - .onFailure { android.util.Log.e("Nav", "fetchCurrentConditions failed: ${it.javaClass.simpleName} — ${it.message}", it) } + .onFailure { + val msg = "${it.javaClass.simpleName}: ${it.message}" + android.util.Log.e("Nav", "fetchCurrentConditions failed: $msg", it) + _conditionsError.emit(msg) + } } finally { _conditionsLoading.value = false } -- cgit v1.2.3