From 555483b7248b0cb75bb9ed83b47880349f0c6ee0 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 15 May 2026 20:11:41 +0000 Subject: fix: saved tracks overlay, GPX file handler, nav import MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Saved tracks overlay was immediately hidden after showing because bottomNav.selectedItemId = nav_map fires the nav item listener, which calls hideOverlays(). Removed that line — the map tab is already selected when the instrument sheet is open. GPX file handler: - Manifest: intent-filter for application/gpx+xml + singleTop launch mode so onNewIntent is called when app is already running - MainActivity: handleIncomingGpx() called from onCreate + onNewIntent; parses the URI on IO dispatcher and hands points to ViewModel - MainViewModel: addImportedTrack() prepends parsed points to pastTracks and savedTracks state flows (displayed in session only, not persisted) https://claude.ai/code/session_01DNjbYxiC1cco83dArNGW3G --- android-app/app/src/main/AndroidManifest.xml | 6 +++++ .../src/main/kotlin/org/terst/nav/MainActivity.kt | 31 +++++++++++++++++++++- .../main/kotlin/org/terst/nav/ui/MainViewModel.kt | 8 ++++++ 3 files changed, 44 insertions(+), 1 deletion(-) (limited to 'android-app') diff --git a/android-app/app/src/main/AndroidManifest.xml b/android-app/app/src/main/AndroidManifest.xml index 7cbafc7..7b9a9e4 100644 --- a/android-app/app/src/main/AndroidManifest.xml +++ b/android-app/app/src/main/AndroidManifest.xml @@ -27,12 +27,18 @@ + + + + + diff --git a/android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt b/android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt index 0df4069..10eb0a8 100644 --- a/android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt +++ b/android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt @@ -3,6 +3,10 @@ package org.terst.nav import android.Manifest import android.content.Intent import android.content.pm.PackageManager +import android.util.Log +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import org.terst.nav.track.GpxParser import android.graphics.Bitmap import android.graphics.Canvas import android.media.MediaPlayer @@ -127,6 +131,30 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener { unitPrefs = UnitPrefs(this) checkForegroundPermissions() initializeUI() + handleIncomingGpx(intent) + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + handleIncomingGpx(intent) + } + + private fun handleIncomingGpx(intent: Intent?) { + if (intent?.action != Intent.ACTION_VIEW) return + val uri = intent.data ?: return + lifecycleScope.launch { + runCatching { + val points = withContext(Dispatchers.IO) { + contentResolver.openInputStream(uri)?.use { GpxParser.parse(it) } ?: emptyList() + } + if (points.isNotEmpty()) { + viewModel.addImportedTrack(points) + showOverlay(SavedTracksFragment()) + } + }.onFailure { e -> + Log.e("MainActivity", "Failed to open GPX: ${e.message}") + } + } } private fun initializeUI() { @@ -242,7 +270,8 @@ class MainActivity : AppCompatActivity(), SafetyFragment.SafetyListener { showOverlay(SavedTracksFragment()) bottomSheetBehavior.isHideable = true bottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN - bottomNav.selectedItemId = R.id.nav_map // keep map tab highlighted + // Note: do NOT set selectedItemId here — it triggers the nav listener + // which calls hideOverlays(), immediately undoing showOverlay(). } } 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 cc51dd1..dcbd98e 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 @@ -18,6 +18,7 @@ import org.terst.nav.track.SavedTrack import org.terst.nav.track.TrackPoint import org.terst.nav.track.TrackRepository import org.terst.nav.track.TrackStats +import org.terst.nav.track.toSavedTrack import org.terst.nav.settings.FeatureFlags import org.terst.nav.settings.HardwareSource import org.terst.nav.vessel.CrewMember @@ -410,6 +411,13 @@ class MainViewModel( fun selectTrack(track: SavedTrack) { _selectedTrack.value = track } fun clearSelectedTrack() { _selectedTrack.value = null } + /** Adds a track parsed from an external GPX file (not persisted to storage). */ + fun addImportedTrack(points: List) { + val updated = _pastTracks.value.toMutableList().also { it.add(0, points) } + _pastTracks.value = updated + _savedTracks.value = updated.filter { it.isNotEmpty() }.map { it.toSavedTrack() } + } + fun panToTrackPoint(lat: Double, lon: Double) { viewModelScope.launch { _panToPosition.emit(lat to lon) } } -- cgit v1.2.3