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 --- .../app/src/main/res/drawable/ic_wind_arrow.xml | 21 ++++++++ .../app/src/main/res/layout/activity_main.xml | 22 ++++++++ .../app/src/main/res/layout/fragment_forecast.xml | 42 +++++++++++++++ .../app/src/main/res/layout/fragment_map.xml | 30 +++++++++++ .../app/src/main/res/layout/item_forecast.xml | 59 ++++++++++++++++++++++ .../app/src/main/res/menu/bottom_nav_menu.xml | 11 ++++ android-app/app/src/main/res/values/colors.xml | 12 +++++ android-app/app/src/main/res/values/strings.xml | 13 +++++ android-app/app/src/main/res/values/themes.xml | 9 ++++ 9 files changed, 219 insertions(+) create mode 100644 android-app/app/src/main/res/drawable/ic_wind_arrow.xml create mode 100644 android-app/app/src/main/res/layout/activity_main.xml create mode 100644 android-app/app/src/main/res/layout/fragment_forecast.xml create mode 100644 android-app/app/src/main/res/layout/fragment_map.xml create mode 100644 android-app/app/src/main/res/layout/item_forecast.xml create mode 100644 android-app/app/src/main/res/menu/bottom_nav_menu.xml create mode 100644 android-app/app/src/main/res/values/colors.xml create mode 100644 android-app/app/src/main/res/values/strings.xml create mode 100644 android-app/app/src/main/res/values/themes.xml (limited to 'android-app/app/src/main/res') diff --git a/android-app/app/src/main/res/drawable/ic_wind_arrow.xml b/android-app/app/src/main/res/drawable/ic_wind_arrow.xml new file mode 100644 index 0000000..110f1b3 --- /dev/null +++ b/android-app/app/src/main/res/drawable/ic_wind_arrow.xml @@ -0,0 +1,21 @@ + + + + + + + + + + diff --git a/android-app/app/src/main/res/layout/activity_main.xml b/android-app/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..757dbdb --- /dev/null +++ b/android-app/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/android-app/app/src/main/res/layout/fragment_forecast.xml b/android-app/app/src/main/res/layout/fragment_forecast.xml new file mode 100644 index 0000000..aca38ba --- /dev/null +++ b/android-app/app/src/main/res/layout/fragment_forecast.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + diff --git a/android-app/app/src/main/res/layout/fragment_map.xml b/android-app/app/src/main/res/layout/fragment_map.xml new file mode 100644 index 0000000..e5b86b7 --- /dev/null +++ b/android-app/app/src/main/res/layout/fragment_map.xml @@ -0,0 +1,30 @@ + + + + + + + + + diff --git a/android-app/app/src/main/res/layout/item_forecast.xml b/android-app/app/src/main/res/layout/item_forecast.xml new file mode 100644 index 0000000..473661a --- /dev/null +++ b/android-app/app/src/main/res/layout/item_forecast.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + diff --git a/android-app/app/src/main/res/menu/bottom_nav_menu.xml b/android-app/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..6922dee --- /dev/null +++ b/android-app/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/android-app/app/src/main/res/values/colors.xml b/android-app/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..2382364 --- /dev/null +++ b/android-app/app/src/main/res/values/colors.xml @@ -0,0 +1,12 @@ + + + #0D47A1 + #002171 + #FF6D00 + #FFFFFF + #FFFFFF + #FFFFFFFF + #4CAF50 + #FF9800 + #F44336 + diff --git a/android-app/app/src/main/res/values/strings.xml b/android-app/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..b7d3bd8 --- /dev/null +++ b/android-app/app/src/main/res/values/strings.xml @@ -0,0 +1,13 @@ + + + Nav + Map + Forecast + Fetching weather… + Could not get location. Showing default position. + Failed to load weather data. + %.0f kt + %.0f °C + %d%% + Location is needed to show weather for your current position. + diff --git a/android-app/app/src/main/res/values/themes.xml b/android-app/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..cecd32f --- /dev/null +++ b/android-app/app/src/main/res/values/themes.xml @@ -0,0 +1,9 @@ + + + + -- cgit v1.2.3