diff options
| author | Claudomator Agent <agent@claudomator> | 2026-03-13 19:59:01 +0000 |
|---|---|---|
| committer | Claudomator Agent <agent@claudomator> | 2026-03-13 19:59:01 +0000 |
| commit | 51f86cff118f9532783c4e61724e07173ec029d7 (patch) | |
| tree | 1c5601142391003830527f0c97d8ef7fa4145052 /android-app/app/src/main/res/drawable | |
| parent | 7e40bd03ab0246552d26d92fda8623b8da4653f3 (diff) | |
feat: add wind/current map overlay and weather forecast on startup
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<T> error propagation
- Domain models: WindArrow (with beaufortScale/isCalm) + ForecastItem
(with weatherDescription/isRainy via WMO weather codes)
Presentation layer:
- MainViewModel: StateFlow<UiState> (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 <noreply@anthropic.com>
Diffstat (limited to 'android-app/app/src/main/res/drawable')
| -rw-r--r-- | android-app/app/src/main/res/drawable/ic_wind_arrow.xml | 21 |
1 files changed, 21 insertions, 0 deletions
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 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Wind-direction arrow pointing UP (north). + MapLibre rotates the icon to match wind direction via icon-rotate expression. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + + <!-- Arrowhead pointing up --> + <path + android:fillColor="#FFFFFF" + android:pathData="M12,2 L18,14 L12,11 L6,14 Z" /> + <!-- Shaft --> + <path + android:fillColor="#FFFFFF" + android:pathData="M11,11 L11,22 L13,22 L13,11 Z" /> + +</vector> |
