From 3ddf436958ffde3198492895725fc0ca8ab0a1b2 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 11 Apr 2026 09:48:52 +0000 Subject: Show loading spinners next to each instrument value during conditions fetch - Add _conditionsLoading StateFlow to MainViewModel; set true when loadConditions() fires, false when the fetch completes (success or fail) - Cancel any in-flight conditions job when a new loadConditions() call arrives (e.g. rapid map pans) so only the latest fetch drives the state - Add a 10dp ProgressBar after each of the six data values in layout_instruments_sheet.xml (wind, temp, baro, current, waves, swell); visibility GONE by default, alpha 0.5; header section tinted colorOnSurfaceVariant, forecast section tinted #5B9EC2 to match its labels - Observe conditionsLoading in MainActivity and toggle all six spinners together (all values come from one API call so they load in sync) https://claude.ai/code/session_01HXPjBsogsJVRwCiekDGkJX --- .../src/main/kotlin/org/terst/nav/MainActivity.kt | 10 ++++ .../main/kotlin/org/terst/nav/ui/MainViewModel.kt | 19 +++++-- .../main/res/layout/layout_instruments_sheet.xml | 60 ++++++++++++++++++++++ 3 files changed, 85 insertions(+), 4 deletions(-) (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 d0b0d87..f531a68 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 @@ -514,6 +514,16 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener { applyConditions(c) } } + val conditionSpinners = listOf( + R.id.spinner_tws, R.id.spinner_temp, R.id.spinner_baro, + R.id.spinner_curr, R.id.spinner_waves, R.id.spinner_swell + ).mapNotNull { findViewById(it) } + lifecycleScope.launch { + viewModel.conditionsLoading.collect { loading -> + val vis = if (loading) android.view.View.VISIBLE else android.view.View.GONE + conditionSpinners.forEach { it.visibility = vis } + } + } 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 6ec8c76..36811f7 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 @@ -20,6 +20,7 @@ import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.Job import kotlinx.coroutines.launch import org.terst.nav.track.TrackSummary import retrofit2.Retrofit @@ -52,6 +53,10 @@ class MainViewModel( private val _marineConditions = MutableStateFlow(null) val marineConditions: StateFlow = _marineConditions.asStateFlow() + private val _conditionsLoading = MutableStateFlow(false) + val conditionsLoading: StateFlow = _conditionsLoading.asStateFlow() + private var conditionsJob: Job? = null + private val _aisTargets = MutableStateFlow>(emptyList()) val aisTargets: StateFlow> = _aisTargets.asStateFlow() @@ -166,10 +171,16 @@ class MainViewModel( * Silently ignored on network failure — the UI keeps showing dashes. */ fun loadConditions(lat: Double, lon: Double) { - viewModelScope.launch { - repository.fetchCurrentConditions(lat, lon) - .onSuccess { _marineConditions.value = it } - .onFailure { android.util.Log.e("Nav", "fetchCurrentConditions failed", it) } + conditionsJob?.cancel() + conditionsJob = viewModelScope.launch { + _conditionsLoading.value = true + try { + repository.fetchCurrentConditions(lat, lon) + .onSuccess { _marineConditions.value = it } + .onFailure { android.util.Log.e("Nav", "fetchCurrentConditions failed", it) } + } finally { + _conditionsLoading.value = false + } } } diff --git a/android-app/app/src/main/res/layout/layout_instruments_sheet.xml b/android-app/app/src/main/res/layout/layout_instruments_sheet.xml index 03cefb7..edf0928 100644 --- a/android-app/app/src/main/res/layout/layout_instruments_sheet.xml +++ b/android-app/app/src/main/res/layout/layout_instruments_sheet.xml @@ -64,6 +64,16 @@ android:layout_marginStart="3dp" android:layout_marginBottom="3dp" android:layout_gravity="bottom" /> + + @@ -124,6 +144,16 @@ style="@style/InstrumentPrimaryValue" tools:text="1013" /> + @@ -176,6 +206,16 @@ style="@style/ForecastValue" tools:text="0.8" /> + + +