<feed xmlns='http://www.w3.org/2005/Atom'>
<title>nav.git/android-app/app/src/main/kotlin/org/terst/nav/track, 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(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(tripreport): add pre-trip planning and past track visualization</title>
<updated>2026-04-04T02:38:51+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-04T02:38:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=91645cc9029798d78f6d5630ff9ec121e391ec49'/>
<id>urn:sha1:91645cc9029798d78f6d5630ff9ec121e391ec49</id>
<content type='text'>
- Fix compilation errors (missing imports for PropertyFactory and MaterialButton)
- Implement Pre-Trip Report with weather summary, boat profile, and sail suggestions
- Differentiate between active track (solid red) and past tracks (dotted red) on map
- Add navigation to Pre-Trip Report from Safety Dashboard
- Robustify track storage to preserve multiple tracks in session

Co-Authored-By: Gemini CLI &lt;gemini-cli@google.com&gt;
</content>
</entry>
<entry>
<title>feat(map): satellite view, windy/chart overlays, and rich track recording</title>
<updated>2026-04-04T02:10:51+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-04T02:10:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=0e867ffb8aa287ecaed4e8f58c52a9cfef1da01a'/>
<id>urn:sha1:0e867ffb8aa287ecaed4e8f58c52a9cfef1da01a</id>
<content type='text'>
- Switch default map view to Satellite
- Add Windy (partial alpha) and OpenSeaMap overlays
- Add custom user position icon (ship arrow) with heading rotation
- Update TrackPoint to support rich instrument/weather metadata
- Change track visualization to a dotted red line
- Robustify NavApplication.isTesting with Espresso detection

Co-Authored-By: Gemini CLI &lt;gemini-cli@google.com&gt;
</content>
</entry>
<entry>
<title>refactor: address simplify review findings</title>
<updated>2026-03-25T18:23:54+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-25T18:23:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=e68212991935d33a4baca77d88cd20a82fbcf6a6'/>
<id>urn:sha1:e68212991935d33a4baca77d88cd20a82fbcf6a6</id>
<content type='text'>
TrackRepository.addPoint() now returns Boolean (true if point was
added). MainViewModel.addGpsPoint() only updates _trackPoints StateFlow
when a point is actually appended — eliminates ~3,600 no-op flow
emissions per hour when not recording.

MainActivity: loadedStyle promoted from nullable field to
MutableStateFlow&lt;Style?&gt;; trackPoints observer uses filterNotNull +
combine so no track points are silently dropped if the style loads
after the first GPS fix.

Smoke tests: replaced 11× ActivityScenario.launch().use{} with a
single @get:Rule ActivityScenarioRule — same isolation, less
boilerplate.

CI: removed redundant app-debug artifact upload (app-debug.apk is
already included inside the test-apks artifact).

Removed stale/placeholder comments from MainActivity.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(track): implement GPS track recording with map overlay</title>
<updated>2026-03-25T18:09:53+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-25T18:09:53+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=ca57e40adc0b89e7dc5409475f7510c0c188d715'/>
<id>urn:sha1:ca57e40adc0b89e7dc5409475f7510c0c188d715</id>
<content type='text'>
- TrackRepository + TrackPoint wired into MainViewModel:
  isRecording/trackPoints StateFlows, startTrack/stopTrack/addGpsPoint
- MapHandler.updateTrackLayer(): lazily initialises a red LineLayer
  and updates GeoJSON polyline from List&lt;TrackPoint&gt;
- fab_record_track FAB in activity_main.xml (top|end of bottom nav);
  icon toggles between ic_track_record and ic_close while recording
- MainActivity feeds every GPS fix into viewModel.addGpsPoint() and
  observes trackPoints to redraw the polyline in real time
- ic_track_record.xml vector drawable (red record dot)
- 8 TrackRepositoryTest tests all GREEN

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