diff options
| author | Peter Stone <thepeterstone@gmail.com> | 2026-05-05 21:07:29 -1000 |
|---|---|---|
| committer | Peter Stone <thepeterstone@gmail.com> | 2026-05-05 21:07:29 -1000 |
| commit | 32e510f90442988884a78ff1ec473ebf66facf76 (patch) | |
| tree | 0de7d58ef68e6fa6df9d24fedbd24b34be21fedf /android-app/app | |
| parent | 68b58d45c54fcb9e4861491f19137f065c4035b9 (diff) | |
fix: guard past-track load against SecurityException before permissions granted
MediaStore.query() throws SecurityException if storage permission hasn't
been granted yet. The ViewModel init{} fires before the permission dialog
result, so the coroutine crashed the app on first launch.
- Wrap contentResolver.query() in runCatching in loadViaMediaStore()
- Wrap getPastTracks() call in init{} with runCatching; log failure,
don't crash
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'android-app/app')
| -rw-r--r-- | android-app/app/src/main/kotlin/org/terst/nav/track/TrackStorage.kt | 6 | ||||
| -rw-r--r-- | android-app/app/src/main/kotlin/org/terst/nav/ui/MainViewModel.kt | 4 |
2 files changed, 8 insertions, 2 deletions
diff --git a/android-app/app/src/main/kotlin/org/terst/nav/track/TrackStorage.kt b/android-app/app/src/main/kotlin/org/terst/nav/track/TrackStorage.kt index 40ef6ea..7e9064c 100644 --- a/android-app/app/src/main/kotlin/org/terst/nav/track/TrackStorage.kt +++ b/android-app/app/src/main/kotlin/org/terst/nav/track/TrackStorage.kt @@ -119,7 +119,11 @@ class TrackStorage(private val context: Context) { "AND ${MediaStore.Files.FileColumns.DISPLAY_NAME} LIKE ?" val args = arrayOf("Documents/Nav/", "nav_%.gpx") - val cursor = context.contentResolver.query(uri, projection, selection, args, null) + val cursor = runCatching { + context.contentResolver.query(uri, projection, selection, args, null) + }.onFailure { e -> + NavLogger.e("track", "loadViaMediaStore: query failed (${e.javaClass.simpleName}: ${e.message})") + }.getOrNull() NavLogger.i("track", "loadViaMediaStore: cursor=${cursor?.count ?: "null"} rows") cursor?.use { c -> val idCol = c.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID) 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 0cc9d3c..57de608 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 @@ -93,7 +93,9 @@ class MainViewModel( init { viewModelScope.launch { - _pastTracks.value = trackRepository.getPastTracks() + runCatching { trackRepository.getPastTracks() } + .onSuccess { _pastTracks.value = it } + .onFailure { e -> NavLogger.e("track", "init: failed to load past tracks: ${e.javaClass.simpleName}: ${e.message}") } } } |
