<feed xmlns='http://www.w3.org/2005/Atom'>
<title>nav.git/android-app/app, branch main</title>
<subtitle>nav — android navigation app
</subtitle>
<id>https://git.terst.org/nav.git/atom?h=main</id>
<link rel='self' href='https://git.terst.org/nav.git/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/'/>
<updated>2026-04-07T06:42:51+00:00</updated>
<entry>
<title>fix(track): fix silent GPX save failure + add stop friction + quit button</title>
<updated>2026-04-07T06:42:51+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-07T06:42:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=5ee2dd8925afa858f466ae63db3f7df5c7516953'/>
<id>urn:sha1:5ee2dd8925afa858f466ae63db3f7df5c7516953</id>
<content type='text'>
TrackStorage: openOutputStream null returned true (file never written).
Added IS_PENDING flag to fix Android 10-11 race where insert succeeds
but file isn't physically created yet. Added storage-mounted guard.
TrackRepository now logs save failures.

Stop tracking now requires a long press (haptic feedback) — prevents
accidental mid-sail stops from a single tap.

Quit button (top-right, tonal X) stops LocationService and calls
finishAffinity(). Prompts if a track is in progress.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(nav): replace Map+Instruments with Map+Layers in bottom nav</title>
<updated>2026-04-06T18:03:39+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-06T18:03:39+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=d98b441f2f9ca8b11a04406240dd19ecc0cac7ab'/>
<id>urn:sha1:d98b441f2f9ca8b11a04406240dd19ecc0cac7ab</id>
<content type='text'>
Layers acts as an action button — shows LayerPickerSheet and snaps
back to Map so it never stays selected. Instruments tab removed;
sheet expand/collapse via swipe as before.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(map): layer manager — satellite/charts/hybrid + wind toggle, long-press picker</title>
<updated>2026-04-06T16:22:42+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-06T16:22:42+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=676314e3b5ad2445e64120c691fd1c2671076ebb'/>
<id>urn:sha1:676314e3b5ad2445e64120c691fd1c2671076ebb</id>
<content type='text'>
MapLayerManager: all raster sources registered at style-build time,
visibility toggled on demand. Persists base preset and wind state to
SharedPreferences. Sources: Google satellite, NOAA RNC charts
(tileservice.charts.noaa.gov), OWM wind, OpenSeaMap seamarks.

LayerPickerSheet: bottom sheet with chip group (Satellite/Charts/Hybrid)
and wind toggle, launched from map long-press.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(map): switch wind layer to OpenWeatherMap wind_new tiles</title>
<updated>2026-04-06T16:14:53+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-06T16:14:53+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=49f1a77fd6365a396ab45e3dbc7456bdb3335078'/>
<id>urn:sha1:49f1a77fd6365a396ab45e3dbc7456bdb3335078</id>
<content type='text'>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(map): add Windy Map Forecast API key to wind tile URL</title>
<updated>2026-04-06T15:58:32+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-06T15:58:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=67d9535148c055adac6f7a90f308205d669a423e'/>
<id>urn:sha1:67d9535148c055adac6f7a90f308205d669a423e</id>
<content type='text'>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(tracks): show summary sheet on track stop; 2-min minimum</title>
<updated>2026-04-06T15:38:31+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-06T15:38:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=59d31d8d6198d5a8c2c4ba17cf9ad1b42a7e2018'/>
<id>urn:sha1:59d31d8d6198d5a8c2c4ba17cf9ad1b42a7e2018</id>
<content type='text'>
TrackSummarySheet: bottom sheet showing distance (nm), duration,
max/avg speed, avg wind and waves (when available, waves in ft).
Only shown for tracks ≥ 2 minutes — shorter tracks are discarded silently.

MainViewModel: exposes trackSummary SharedFlow (replay=0) and trackStartMs.
MainActivity: observes flow, shows sheet after stopTrack completes.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(tracks): persist tracks as GPX in Documents/Nav/ — survives uninstall</title>
<updated>2026-04-06T09:41:32+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-06T09:41:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=f9b8801eb52c48986eb0123e8758f7ab78736dec'/>
<id>urn:sha1:f9b8801eb52c48986eb0123e8758f7ab78736dec</id>
<content type='text'>
GpxSerializer/GpxParser: full round-trip of all TrackPoint fields via
GPX 1.1 + nav: extensions namespace. 13 unit tests.

TrackStorage: MediaStore on API 29+ (no permission needed), direct file
I/O on API 24-28 (WRITE_EXTERNAL_STORAGE maxSdkVersion=28).

TrackRepository: stopTrack() is now suspend, writes GPX and returns
TrackSummary (distance nm, duration, max/avg SOG, avg wind, avg wave).
getPastTracks() lazy-loads from Documents/Nav/ on first call.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(ui): wave height scales view, period drives speed, whitecaps gated on wind</title>
<updated>2026-04-06T08:20:12+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-06T08:20:12+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=36af31c9bda660706c3271380b13cba8486c0604'/>
<id>urn:sha1:36af31c9bda660706c3271380b13cba8486c0604</id>
<content type='text'>
WaveView: animation speed = 8/period so long swell animates slowly;
amplitude ceiling raised to 42% of view height; whitecaps only when
windSpeedKt &gt;= 12 (Beaufort 4).

InstrumentHandler.updateWaveState: sizes view height from swell height
(1ft→56dp, 8ft→160dp) and forwards windSpeedKt to WaveView.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(ui): dark theme — match instrument sheet to WaveView sky palette</title>
<updated>2026-04-06T07:34:06+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-06T07:34:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=61c50f135e69643bf2f905b2241fdb8dcc08abd3'/>
<id>urn:sha1:61c50f135e69643bf2f905b2241fdb8dcc08abd3</id>
<content type='text'>
Surface/background → #1C1B1F (WaveView sky), text tokens updated to
light M3 dark-mode values, status bar icons set to light.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(ui): wire redesigned instrument sheet — InstrumentHandler rewrite + MainActivity</title>
<updated>2026-04-06T06:49:34+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-06T06:49:34+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=c8a1e81faec6663b258898c109db1f63e57b07eb'/>
<id>urn:sha1:c8a1e81faec6663b258898c109db1f63e57b07eb</id>
<content type='text'>
InstrumentHandler: direction arrows (SKY/OCEAN palettes), WaveView state,
metres→feet conversion, bearing formatting, all helpers top-level for TDD.

MainActivity: setupHandlers wires all new view refs; observeDataSources
passes cogBearingDeg, twsBearingDeg, raw metres to handler; depth collector
wired from nmeaDepthDataFlow.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
