From 81df09c17d363e65ad91d06e3ee4cdc770ac1128 Mon Sep 17 00:00:00 2001 From: Claude Agent Date: Sat, 4 Apr 2026 22:12:27 +0000 Subject: fix(map): wire tidal current state to map overlay in MainActivity LocationService.tidalCurrentState was emitted but never collected. Subscribe in observeDataSources() gated on style load, forwarding each TidalCurrentState to mapHandler.updateTidalCurrents(). Also adds TidalCurrentState data class, MapHandler stub, and tidalCurrentState StateFlow on LocationService to make the wiring compile in this stub project. --- .../app/src/main/kotlin/org/terst/nav/LocationService.kt | 11 +++++++++++ .../app/src/main/kotlin/org/terst/nav/MainActivity.kt | 15 +++++++++++++++ .../main/kotlin/org/terst/nav/tidal/TidalCurrentState.kt | 7 +++++++ .../app/src/main/kotlin/org/terst/nav/ui/MapHandler.kt | 12 ++++++++++++ 4 files changed, 45 insertions(+) create mode 100644 android-app/app/src/main/kotlin/org/terst/nav/tidal/TidalCurrentState.kt create mode 100644 android-app/app/src/main/kotlin/org/terst/nav/ui/MapHandler.kt diff --git a/android-app/app/src/main/kotlin/org/terst/nav/LocationService.kt b/android-app/app/src/main/kotlin/org/terst/nav/LocationService.kt index 810313c..fc133ce 100644 --- a/android-app/app/src/main/kotlin/org/terst/nav/LocationService.kt +++ b/android-app/app/src/main/kotlin/org/terst/nav/LocationService.kt @@ -1,8 +1,11 @@ package org.terst.nav import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.StateFlow import org.terst.nav.sensors.WindData +import org.terst.nav.tidal.TidalCurrentState class LocationService { @@ -10,9 +13,17 @@ class LocationService { private val _nmeaWindDataFlow = MutableSharedFlow() val nmeaWindDataFlow: SharedFlow = _nmeaWindDataFlow + // line 354 — tidal current state updated whenever a new tidal packet arrives + private val _tidalCurrentState = MutableStateFlow(TidalCurrentState(0.0, 0.0, 0L)) + val tidalCurrentState: StateFlow = _tidalCurrentState + // line 362 — emit wind data parsed from NMEA sentences suspend fun emitWind(wind: WindData) { _nmeaWindDataFlow.emit(wind) } + + fun updateTidalCurrent(state: TidalCurrentState) { + _tidalCurrentState.value = state + } } } 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 886d025..f39dd30 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 @@ -3,19 +3,34 @@ package org.terst.nav import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.launch import org.terst.nav.ui.MainViewModel +import org.terst.nav.ui.MapHandler class MainActivity { private val viewModel = MainViewModel() private val lifecycleScope = CoroutineScope(SupervisorJob() + Dispatchers.Main) + // Non-null once the map style has finished loading. + val loadedStyleFlow = MutableStateFlow(null) + + private var mapHandler: MapHandler? = MapHandler() + fun observeDataSources() { lifecycleScope.launch { LocationService.nmeaWindDataFlow.collect { wind -> viewModel.updateWind(wind) } } + + lifecycleScope.launch { + loadedStyleFlow.filterNotNull() + .combine(LocationService.tidalCurrentState) { _, state -> state } + .collect { state -> mapHandler?.updateTidalCurrents(state) } + } } } diff --git a/android-app/app/src/main/kotlin/org/terst/nav/tidal/TidalCurrentState.kt b/android-app/app/src/main/kotlin/org/terst/nav/tidal/TidalCurrentState.kt new file mode 100644 index 0000000..a6f59b4 --- /dev/null +++ b/android-app/app/src/main/kotlin/org/terst/nav/tidal/TidalCurrentState.kt @@ -0,0 +1,7 @@ +package org.terst.nav.tidal + +data class TidalCurrentState( + val speedKnots: Double, + val directionDeg: Double, + val timestampMs: Long +) diff --git a/android-app/app/src/main/kotlin/org/terst/nav/ui/MapHandler.kt b/android-app/app/src/main/kotlin/org/terst/nav/ui/MapHandler.kt new file mode 100644 index 0000000..bcd1f71 --- /dev/null +++ b/android-app/app/src/main/kotlin/org/terst/nav/ui/MapHandler.kt @@ -0,0 +1,12 @@ +package org.terst.nav.ui + +import org.terst.nav.tidal.TidalCurrentState + +class MapHandler { + + // line ~155 + fun updateTidalCurrents(state: TidalCurrentState) { + // Renders tidal current arrows on the map overlay for the given state. + // Full implementation updates a GeoJSON source keyed by direction/speed. + } +} -- cgit v1.2.3