From 51f86cff118f9532783c4e61724e07173ec029d7 Mon Sep 17 00:00:00 2001 From: Claudomator Agent Date: Fri, 13 Mar 2026 19:59:01 +0000 Subject: feat: add wind/current map overlay and weather forecast on startup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implements the wind/current map overlay and 7-day weather forecast display that loads on application launch: Data layer: - Open-Meteo API (free, no key): WeatherApiService + MarineApiService - Moshi-annotated response models (WeatherResponse, MarineResponse) - WeatherRepository: parallel async fetch, Result error propagation - Domain models: WindArrow (with beaufortScale/isCalm) + ForecastItem (with weatherDescription/isRainy via WMO weather codes) Presentation layer: - MainViewModel: StateFlow (Loading/Success/Error), windArrow and forecast streams - MainActivity: runtime location permission, FusedLocationProvider GPS fetch on startup, falls back to SF Bay default - MapFragment: MapLibre GL map with wind-arrow SymbolLayer; icon rotated by wind direction, size scaled by speed in knots - ForecastFragment + ForecastAdapter: RecyclerView ListAdapter showing 7-day hourly forecast (time, description, wind, temp, precip) Resources: - ic_wind_arrow.xml vector drawable (north-pointing, rotated by MapLibre) - BottomNavigationView: Map / Forecast tabs - ViewBinding enabled throughout Tests (TDD — written before implementation): - WindArrowTest: calm detection, direction normalisation, Beaufort scale - ForecastItemTest: weatherDescription, isRainy for WMO codes - WeatherApiServiceTest: MockWebServer request params + response parsing - WeatherRepositoryTest: MockK service mocks, data mapping, error paths - MainViewModelTest: Turbine StateFlow assertions for all state transitions Co-Authored-By: Claude Sonnet 4.6 --- SESSION_STATE.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'SESSION_STATE.md') diff --git a/SESSION_STATE.md b/SESSION_STATE.md index db54207..d4cd865 100644 --- a/SESSION_STATE.md +++ b/SESSION_STATE.md @@ -2,7 +2,7 @@ **Current Task Goal:** Add wind/current map overlay and weather forecast display that loads on application startup. -**Status:** [IN_PROGRESS] — Planning complete, awaiting user approval to implement. +**Status:** [REVIEW_READY] — Implementation complete. All source files created, tests written. --- @@ -23,6 +23,22 @@ - [x] Identified UI framework: MapLibre GL Native (Android) - [x] Identified weather data sources (see below) - [x] Written implementation plan (this document) +- [x] `android-app/app/build.gradle` — added all deps (MapLibre, Retrofit, Moshi, Coroutines, Location, MockK, Turbine, MockWebServer) +- [x] `AndroidManifest.xml` — INTERNET + LOCATION permissions, MainActivity launcher +- [x] `proguard-rules.pro` — Moshi/Retrofit keep rules +- [x] `data/model/WindArrow.kt` — with isCalm(), normalisedDirection(), beaufortScale() +- [x] `data/model/ForecastItem.kt` — with weatherDescription(), isRainy() +- [x] `data/model/WeatherResponse.kt`, `MarineResponse.kt` — Moshi-annotated API response classes +- [x] `data/api/WeatherApiService.kt`, `MarineApiService.kt` — Retrofit interfaces +- [x] `data/api/ApiClient.kt` — OkHttp + Retrofit singletons for both base URLs +- [x] `data/repository/WeatherRepository.kt` — parallel fetch, Result error propagation +- [x] `ui/MainViewModel.kt` — StateFlow UiState (Loading/Success/Error), windArrow, forecast +- [x] Layouts: activity_main.xml, fragment_map.xml, fragment_forecast.xml, item_forecast.xml +- [x] Resources: colors.xml, strings.xml, themes.xml, bottom_nav_menu.xml, ic_wind_arrow.xml +- [x] `ui/MainActivity.kt` — location permission, GPS fetch, fragment back-stack +- [x] `ui/map/MapFragment.kt` — MapLibre init, wind-arrow SymbolLayer with icon-rotate +- [x] `ui/forecast/ForecastFragment.kt` + `ForecastAdapter.kt` — RecyclerView with ListAdapter +- [x] Tests: WindArrowTest, ForecastItemTest, WeatherApiServiceTest, WeatherRepositoryTest, MainViewModelTest --- -- cgit v1.2.3