From 3673ed0ef79d776c6da3bfa0db9de8b08326fd32 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 26 May 2026 07:46:09 +0000 Subject: Fix ANR, false tack detections, and empty-state flash on track load MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ANR: getSavedTracks() had no IO dispatcher — TackDetector ran on main thread at O(n²) cost (~77M ops for a 2.5h track). Added withContext(IO). TackDetector: replaced O(n) list.filter with O(log n) binary-search subList for before/after windows; O(n²) → O(n log n). Raised MIN_DELTA 60°→75° to stop detecting ordinary course corrections as maneuvers. Removed MAX_DELTA cap entirely — 180° crash-tacks are valid; the circularMAD stability windows are the real quality gate. TrackDetailSheet: dropped the arbitrary abs(delta)>70 Tack/Jibe heuristic. Now uses true wind angle when available for classification; falls back to "Maneuver" when TWD is absent. SavedTracksFragment: added isLoadingTracks StateFlow (MainViewModel); combine() suppresses the empty-state layout while the initial IO load runs so it no longer flashes "No saved tracks yet" before data arrives. 16/16 TackDetector tests pass. https://claude.ai/code/session_01KXYBuAHZkvv63DeUG6XaZD --- .../src/test/kotlin/org/terst/nav/track/TackDetectorTest.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'test-runner/src/test') diff --git a/test-runner/src/test/kotlin/org/terst/nav/track/TackDetectorTest.kt b/test-runner/src/test/kotlin/org/terst/nav/track/TackDetectorTest.kt index 6d946a0..265ba76 100644 --- a/test-runner/src/test/kotlin/org/terst/nav/track/TackDetectorTest.kt +++ b/test-runner/src/test/kotlin/org/terst/nav/track/TackDetectorTest.kt @@ -49,13 +49,13 @@ class TackDetectorTest { } @Test fun `heading change below MIN_DELTA is ignored`() { - // 45° delta — below MIN_DELTA=60° + // 45° delta — below MIN_DELTA=75° assertTrue(TackDetector.detectTacks(tackTrack(90.0, 135.0)).isEmpty()) } - @Test fun `heading change above MAX_DELTA is ignored`() { - // 170° delta — above MAX_DELTA=160° (U-turn, not a tack) - assertTrue(TackDetector.detectTacks(tackTrack(90.0, 260.0)).isEmpty()) + @Test fun `heading change of 170 degrees is detected`() { + // 170° delta — valid crash-tack; no upper cap + assertEquals(1, TackDetector.detectTacks(tackTrack(90.0, 260.0)).size) } @Test fun `detects two tacks in sequence with sufficient gap`() { -- cgit v1.2.3