summaryrefslogtreecommitdiff
path: root/android-app/app/src/main/res
AgeCommit message (Collapse)Author
4 daysfeat: add AnchorWatchHandler UI with Depth/Rode Out inputs and suggested radiusAgent
- Add AnchorWatchState with calculateRecommendedWatchCircleRadius, which uses ScopeCalculator.watchCircleRadius (Pythagorean scope formula) and falls back to rode length when geometry is invalid - Add AnchorWatchHandler Fragment with EditText inputs for Depth (m) and Rode Out (m); updates suggested watch circle radius live via TextWatcher - Add fragment_anchor_watch.xml layout - Wire AnchorWatchHandler into bottom navigation (MainActivity + menu) - Add AnchorWatchStateTest covering valid geometry, short-rode fallback Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
4 daysfeat: offline GRIB staleness checker, ViewModel integration, and UI badgeClaudomator Agent
- Add GribRegion, GribFile data models and GribFileManager interface - Add InMemoryGribFileManager for testing and default use - Add GribStalenessChecker with FreshnessResult sealed class (Fresh/Stale/NoData) - Integrate weatherStaleness StateFlow into MainViewModel (checked after loadWeather) - Add yellow staleness banner TextView to fragment_map.xml - Wire staleness banner in MapFragment (shown on Stale, hidden on Fresh/NoData) - Add GribStalenessCheckerTest (4 TDD tests) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
4 daysfix: add missing layout_width/height to instruments sheet include tagPeter Stone
Caused a fatal InflateException crash on app launch. Android requires layout_width and layout_height on <include> tags explicitly. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
4 daysfix: add layout_width/height to instrument text stylesPeter Stone
InstrumentLabel and InstrumentPrimaryValue were missing layout dimension attributes, causing InflateException crash on startup. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6 daysfix: resolve Kotlin compilation errors from UI refactorPeter Stone
- Make InstrumentHandler.labelTrend and barometerTrendView nullable - Remove anchorWatchHandler init block referencing non-existent view IDs - Fix state.radiusM -> state.watchCircleRadiusMeters - Add bottom_nav_weather_menu.xml with nav_forecast; point WeatherActivity at it Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6 daysfeat: refactor UI to BottomNavigationView with Safety and Doc fragmentsPeter Stone
Replace FAB-based navigation with a 4-tab BottomNavigationView (Map, Instruments, Log, Safety). Instruments use a collapsible bottom sheet; Log and Safety display as full-screen overlay fragments. - Add SafetyFragment with MOB and Anchor Watch controls - Add DocFragment for in-app markdown help (Markwon: core, tables, images) - Add layout_instruments_sheet with 3x3 instrument grid and PolarDiagramView - Add fragment_safety and fragment_doc layouts - Add vector drawables: ic_map, ic_instruments, ic_log, ic_safety, ic_close - Update activity_main.xml to CoordinatorLayout with bottom sheet + overlay - Fix: set isHideable=true before STATE_HIDDEN to avoid silent no-op from behavior_hideable=false default; restore false on Map/Instruments tabs Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
13 daysfeat: integrate AIS into ViewModel and MapFragment with vessel symbol layerClaudomator Agent
- MainViewModel: add _aisTargets StateFlow, processAisSentence(), refreshAisFromInternet() - AisRepository: add ingestVessel() for internet-sourced vessels - MapFragment: add AIS vessel SymbolLayer with heading-based rotation and zoom-gated labels - MainActivity: add startAisHardwareFeed() TCP stub, wire viewModel - ic_ship_arrow.xml: new vector drawable for AIS target icons - MainViewModelTest: 3 new AIS tests (processAisSentence happy path, dedup, non-AIS sentence) - JVM test harness: /tmp/ais-vm-test-runner/ — 3 tests GREEN Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
14 daysmerge: integrate weather/forecast feature from local remotePeter Stone
Merges wind/current overlay and weather forecast implementation: - Weather feature: WeatherRepository, MainViewModel, MapFragment, ForecastFragment, ForecastAdapter - Data models: WindArrow, ForecastItem, WeatherResponse, MarineResponse - API services: WeatherApiService, MarineApiService (Open-Meteo, no key required) - Layouts: activity_weather.xml, fragment_map.xml, fragment_forecast.xml, item_forecast.xml - Resources: merged colors (wind_slow/medium/strong), strings, themes (Theme.NavApp added) - Manifest: added ACCESS_COARSE_LOCATION - build.gradle: merged deps — kept Firebase+MapLibre 11.5.1, added kotlin-kapt, retrofit, moshi, turbine - Fix: re-packaged com.example.androidapp → org.terst.nav; weather MainActivity uses ActivityWeatherBinding Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
14 daysfeat: add voice log UI with FAB, fragment container, and logbook domain modelsPeter Stone
- Add VoiceLogFragment, VoiceLogViewModel, VoiceLogState, LogEntry, InMemoryLogbookRepository - Wire voice log FAB in MainActivity to show/hide fragment container - Add RECORD_AUDIO permission to manifest - Add native CMakeLists.txt and native-lib.cpp stubs - Fix missing BufferOverflow import in LocationService Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14fix: correct ConstraintLayout attribute typo in activity_main.xmlPeter Stone
layout_bottom_toTopOf → layout_constraintBottom_toTopOf on fab_tidal. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14Implement barometric pressure trend monitoring and visualizationClaudomator Agent
2026-03-14Implement tidal current overlay on the chart with toggle FABClaudomator Agent
2026-03-13refactor: rename app from AndroidApp to navPeter Stone
2026-03-13fix: resolve MapLibre 11.x migration issues and layout/resource errorsPeter Stone
2026-03-13fix: resolve XML syntax and resource formatting errorsPeter Stone
2026-03-13refactor: update package name to org.terst.nav and setup CI/CD with Firebase ↵Peter Stone
App Distribution
2026-03-13Implement polar performance diagram visualizationClaudomator Agent
2026-03-13feat: Implement MOB (Man Overboard) alarm functionalityClaudomator Agent
This commit introduces the core functionality for the Man Overboard (MOB) alarm. Key changes include: - Added a persistent, high-contrast red MOB Floating Action Button to the UI. - Implemented dynamic location permission requests and initialization of LocationService. - Created a MobWaypoint data class to store MOB location and timestamp. - Developed the activateMob() function to: - Capture current GPS coordinates. - Set the active MOB waypoint and mark MOB as activated. - Switch to a dedicated MOB navigation view, hiding other UI elements. - Start a continuous, looping audible alarm (assumes R.raw.mob_alarm exists). - Log the MOB event to the console (placeholder for future logbook integration). - Implemented a MOB navigation view (ConstraintLayout) with real-time distance to MOB and elapsed time display. - Added a recoverMob() function, triggered by a 'Recovered' button, to: - Deactivate MOB mode. - Stop and release the audible alarm. - Restore the main UI visibility. - Location updates are observed to continuously update the MOB navigation display. - Ensured MediaPlayer resources are properly released on activity destruction. Future enhancements (not part of this commit) include: - Implementing a bearing arrow in the MOB navigation view. - Integrating with a persistent logbook system.
2026-03-13feat: add wind/current map overlay and weather forecast on startupClaudomator Agent
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>
2026-03-13Implement basic instrument displayClaudomator Agent
2026-03-13feat: Implement initial chart display setup with MapLibre GL NativeClaudomator Agent
2026-03-13Implement GPS navigation with position, SOG, and COGClaudomator Agent