From e4fb66791269d761a96a97213b3fd6aaeb151772 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 20 May 2026 23:59:20 +0000 Subject: Fix savedTracks silently empty when getSavedTracks() throws getSavedTracks() was called inside .onSuccess{} with no error boundary; any exception from toSavedTrack() crashed the coroutine silently after _pastTracks was already set, leaving _savedTracks empty (tracks visible on the main map dim layer but missing from the Log tab list). Wrap every getSavedTracks() call in runCatching, and make toSavedTrack() inside getSavedTracks() skip individual bad tracks via mapNotNull so one corrupt GPX can't blank the whole list. https://claude.ai/code/session_01YUbuZNDAoLea4cf9UGQ9qn --- .../kotlin/org/terst/nav/track/TrackRepository.kt | 6 +++++- .../main/kotlin/org/terst/nav/ui/MainViewModel.kt | 20 +++++++++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/android-app/app/src/main/kotlin/org/terst/nav/track/TrackRepository.kt b/android-app/app/src/main/kotlin/org/terst/nav/track/TrackRepository.kt index 0cc098b..0bf1dff 100644 --- a/android-app/app/src/main/kotlin/org/terst/nav/track/TrackRepository.kt +++ b/android-app/app/src/main/kotlin/org/terst/nav/track/TrackRepository.kt @@ -148,7 +148,11 @@ class TrackRepository(context: Context) { suspend fun getSavedTracks(): List = getPastTracks() .filter { it.isNotEmpty() } - .map { it.toSavedTrack() } + .mapNotNull { points -> + runCatching { points.toSavedTrack() } + .onFailure { e -> NavLogger.e("track", "toSavedTrack failed: ${e.javaClass.simpleName}: ${e.message}") } + .getOrNull() + } fun safState(): SafState = storage.safState() diff --git a/android-app/app/src/main/kotlin/org/terst/nav/ui/MainViewModel.kt b/android-app/app/src/main/kotlin/org/terst/nav/ui/MainViewModel.kt index 01cec43..3d022e8 100644 --- a/android-app/app/src/main/kotlin/org/terst/nav/ui/MainViewModel.kt +++ b/android-app/app/src/main/kotlin/org/terst/nav/ui/MainViewModel.kt @@ -103,7 +103,9 @@ class MainViewModel( runCatching { trackRepository.getPastTracks() } .onSuccess { _pastTracks.value = it - _savedTracks.value = trackRepository.getSavedTracks() + runCatching { trackRepository.getSavedTracks() } + .onSuccess { saved -> _savedTracks.value = saved } + .onFailure { e -> NavLogger.e("track", "init: getSavedTracks failed: ${e.javaClass.simpleName}: ${e.message}") } } .onFailure { e -> NavLogger.e("track", "init: failed to load past tracks: ${e.javaClass.simpleName}: ${e.message}") } } @@ -167,7 +169,9 @@ class MainViewModel( viewModelScope.launch { val summary = trackRepository.stopTrack() _pastTracks.value = trackRepository.getPastTracks() - _savedTracks.value = trackRepository.getSavedTracks() + runCatching { trackRepository.getSavedTracks() } + .onSuccess { _savedTracks.value = it } + .onFailure { e -> NavLogger.e("track", "stopTrack: getSavedTracks failed: ${e.javaClass.simpleName}: ${e.message}") } _trackPoints.value = emptyList() _isRecording.value = false _trackStats.value = null @@ -184,7 +188,9 @@ class MainViewModel( points.forEach { trackRepository.addPoint(it) } val summary = trackRepository.stopTrack() _pastTracks.value = trackRepository.getPastTracks() - _savedTracks.value = trackRepository.getSavedTracks() + runCatching { trackRepository.getSavedTracks() } + .onSuccess { _savedTracks.value = it } + .onFailure { e -> NavLogger.e("track", "injectTestTrack: getSavedTracks failed: ${e.javaClass.simpleName}: ${e.message}") } _trackPoints.value = emptyList() _isRecording.value = false _trackStats.value = null @@ -426,7 +432,9 @@ class MainViewModel( viewModelScope.launch { trackRepository.importTrack(points) _pastTracks.value = trackRepository.getPastTracks() - _savedTracks.value = trackRepository.getSavedTracks() + runCatching { trackRepository.getSavedTracks() } + .onSuccess { _savedTracks.value = it } + .onFailure { e -> NavLogger.e("track", "addImportedTrack: getSavedTracks failed: ${e.javaClass.simpleName}: ${e.message}") } } } @@ -440,7 +448,9 @@ class MainViewModel( runCatching { trackRepository.reloadTracks() } .onSuccess { tracks -> _pastTracks.value = tracks - _savedTracks.value = trackRepository.getSavedTracks() + runCatching { trackRepository.getSavedTracks() } + .onSuccess { saved -> _savedTracks.value = saved } + .onFailure { e -> NavLogger.e("track", "reloadPastTracks: getSavedTracks failed: ${e.javaClass.simpleName}: ${e.message}") } NavLogger.i("track", "reloadPastTracks: ${tracks.size} tracks loaded") } .onFailure { e -> -- cgit v1.2.3