summaryrefslogtreecommitdiff
path: root/android-app/app/src
diff options
context:
space:
mode:
Diffstat (limited to 'android-app/app/src')
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/track/TrackRepository.kt6
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/track/TrackStorage.kt28
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/ui/MainViewModel.kt6
3 files changed, 31 insertions, 9 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 4a28bb4..bf25dfc 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
@@ -89,9 +89,15 @@ class TrackRepository(context: Context) {
suspend fun getPastTracks(): List<List<TrackPoint>> = withContext(Dispatchers.IO) {
if (!pastTracksLoaded) {
pastTracksLoaded = true
+ NavLogger.i("track", "getPastTracks: loading from storage (first call)")
val stored = storage.loadAllTracks()
+ NavLogger.i("track", "getPastTracks: storage returned ${stored.size} tracks " +
+ "(points: ${stored.map { it.size }})")
// Merge: put stored tracks behind any in-memory tracks from this session
_pastTracks.addAll(stored)
+ NavLogger.i("track", "getPastTracks: total in memory=${_pastTracks.size}")
+ } else {
+ NavLogger.i("track", "getPastTracks: returning cached ${_pastTracks.size} tracks")
}
_pastTracks.toList()
}
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 3a04688..40ef6ea 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,21 +119,31 @@ class TrackStorage(private val context: Context) {
"AND ${MediaStore.Files.FileColumns.DISPLAY_NAME} LIKE ?"
val args = arrayOf("Documents/Nav/", "nav_%.gpx")
- context.contentResolver.query(uri, projection, selection, args, null)?.use { cursor ->
- val idCol = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID)
- while (cursor.moveToNext()) {
- val fileUri = android.net.Uri.withAppendedPath(uri, cursor.getLong(idCol).toString())
+ val cursor = context.contentResolver.query(uri, projection, selection, args, null)
+ NavLogger.i("track", "loadViaMediaStore: cursor=${cursor?.count ?: "null"} rows")
+ cursor?.use { c ->
+ val idCol = c.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID)
+ while (c.moveToNext()) {
+ val id = c.getLong(idCol)
+ val fileUri = android.net.Uri.withAppendedPath(uri, id.toString())
+ NavLogger.i("track", "loadViaMediaStore: parsing id=$id uri=$fileUri")
runCatching {
- context.contentResolver.openInputStream(fileUri)?.use { stream ->
- val points = GpxParser.parse(stream)
- if (points.isNotEmpty()) tracks.add(points)
+ val stream = context.contentResolver.openInputStream(fileUri)
+ if (stream == null) {
+ NavLogger.e("track", "loadViaMediaStore: openInputStream null for id=$id")
+ } else {
+ stream.use { s ->
+ val points = GpxParser.parse(s)
+ NavLogger.i("track", "loadViaMediaStore: id=$id → ${points.size} points")
+ if (points.isNotEmpty()) tracks.add(points)
+ }
}
}.onFailure { e ->
- NavLogger.e("track", "load parse error: ${e.javaClass.simpleName}: ${e.message}")
+ NavLogger.e("track", "loadViaMediaStore: parse error id=$id: ${e.javaClass.simpleName}: ${e.message}")
}
}
}
- NavLogger.i("track", "loadViaMediaStore: ${tracks.size} tracks found")
+ NavLogger.i("track", "loadViaMediaStore: done — ${tracks.size} tracks loaded")
return tracks
}
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 502c44f..0cc9d3c 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
@@ -91,6 +91,12 @@ class MainViewModel(
val vesselRepository get() = org.terst.nav.NavApplication.vesselRepository
+ init {
+ viewModelScope.launch {
+ _pastTracks.value = trackRepository.getPastTracks()
+ }
+ }
+
private val _thermalState = MutableStateFlow(ThermalState.OK)
val thermalState: StateFlow<ThermalState> = _thermalState.asStateFlow()