diff options
Diffstat (limited to 'android-app/app/src/main/kotlin')
3 files changed, 20 insertions, 3 deletions
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 0a37eaf..94b9c81 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 @@ -38,6 +38,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.util.Locale import org.maplibre.android.MapLibre +import org.maplibre.android.maps.MapLibreMap import org.maplibre.android.maps.MapView import org.maplibre.android.maps.Style import org.maplibre.android.style.layers.RasterLayer @@ -71,10 +72,12 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener { private var mobHandler: MobHandler? = null private var instrumentHandler: InstrumentHandler? = null private var mapHandler: MapHandler? = null + private var cachedMap: MapLibreMap? = null private val loadedStyleFlow = MutableStateFlow<Style?>(null) private lateinit var layerManager: MapLayerManager private var particleWindView: ParticleWindView? = null private var weatherLoaded = false + private var windGridLoaded = false private var cameraIdleJob: Job? = null private lateinit var bottomSheetBehavior: BottomSheetBehavior<View> @@ -624,6 +627,7 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener { mapView?.onCreate(null) mapView?.getMapAsync { maplibreMap -> mapHandler = MapHandler(maplibreMap) + cachedMap = maplibreMap particleWindView?.attachMap(maplibreMap) lifecycleScope.launch { @@ -768,6 +772,17 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener { weatherLoaded = true viewModel.loadWeather(gpsData.latitude, gpsData.longitude) } + if (!windGridLoaded) { + windGridLoaded = true + val r = cachedMap?.projection?.visibleRegion + val corners = listOfNotNull(r?.nearLeft, r?.nearRight, r?.farLeft, r?.farRight) + if (corners.size == 4) { + viewModel.loadWindGrid( + corners.minOf { it.latitude }, corners.maxOf { it.latitude }, + corners.minOf { it.longitude }, corners.maxOf { it.longitude } + ) + } + } } } lifecycleScope.launch { diff --git a/android-app/app/src/main/kotlin/org/terst/nav/data/api/WeatherApiService.kt b/android-app/app/src/main/kotlin/org/terst/nav/data/api/WeatherApiService.kt index bce3534..db5caee 100644 --- a/android-app/app/src/main/kotlin/org/terst/nav/data/api/WeatherApiService.kt +++ b/android-app/app/src/main/kotlin/org/terst/nav/data/api/WeatherApiService.kt @@ -19,8 +19,8 @@ interface WeatherApiService { /** Batch endpoint: comma-separated lat/lon → JSON array of WeatherResponse. */ @GET("v1/forecast") suspend fun getWeatherForecastBatch( - @Query("latitude") latitudes: String, - @Query("longitude") longitudes: String, + @Query(value = "latitude", encoded = true) latitudes: String, + @Query(value = "longitude", encoded = true) longitudes: String, @Query("hourly") hourly: String = "windspeed_10m,winddirection_10m", @Query("forecast_days") forecastDays: Int = 1, @Query("wind_speed_unit") windSpeedUnit: String = "kn" 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 7d0ab33..288fef4 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 @@ -381,7 +381,9 @@ class MainViewModel( windGridThrottle.update(centerLat, centerLon) viewModelScope.launch { val points = buildGrid(latMin, latMax, lonMin, lonMax, cols = 4, rows = 5) - repository.fetchWindGrid(points).getOrNull()?.let { _windGrid.value = it } + val result = repository.fetchWindGrid(points) + result.onFailure { NavLogger.w("windGrid", "fetchWindGrid failed: ${it.message}") } + result.getOrNull()?.let { _windGrid.value = it } } } |
