summaryrefslogtreecommitdiff
path: root/android-app
diff options
context:
space:
mode:
authorPeter Stone <thepeterstone@gmail.com>2026-05-05 21:07:29 -1000
committerPeter Stone <thepeterstone@gmail.com>2026-05-05 21:07:29 -1000
commit32e510f90442988884a78ff1ec473ebf66facf76 (patch)
tree0de7d58ef68e6fa6df9d24fedbd24b34be21fedf /android-app
parent68b58d45c54fcb9e4861491f19137f065c4035b9 (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')
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/track/TrackStorage.kt6
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/ui/MainViewModel.kt4
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}") }
}
}