diff options
| author | Claude <noreply@anthropic.com> | 2026-05-20 08:38:33 +0000 |
|---|---|---|
| committer | Claude <noreply@anthropic.com> | 2026-05-20 08:38:33 +0000 |
| commit | d6a2e71c155f62a03e1ab466198a256c96c13b3b (patch) | |
| tree | 465800f928be7a7ae2e7440db12a29a6c997a736 /android-app/app/src/main/res/layout | |
| parent | 06fc6564b73ff2403eebabf5f9374a62abfe0772 (diff) | |
Fix GPX file opening, share sheet visibility, and add SAF track storage
Intent filter fixes:
- Remove pathSuffix=".gpx" + scheme restriction from the application/octet-stream
ACTION_VIEW filter; pathSuffix matches the URI path, not the filename, so it
never fired against file manager content URIs (opaque paths like /provider/uuid).
The existing display-name check in handleIncomingGpx() is the correct gate.
- Add ACTION_SEND filter for application/octet-stream; Nav was invisible in share
sheets because most file managers send this type for .gpx files.
SAF-based track storage (API 29+):
- Replace fragile SharedPrefs URI cache + OWNER_PACKAGE_NAME MediaStore query with
Storage Access Framework as the primary write/read path. The user grants access to
their tracks folder once via ACTION_OPEN_DOCUMENT_TREE; DocumentFile.listFiles()
finds all GPX files without relying on MediaStore ownership (which Android clears
on uninstall). After reinstall, a one-tap "Restore track access" button in Saved
Tracks re-authorizes the same folder and all tracks immediately reappear.
- MediaStore path (existing) is kept as fallback for tracks saved before this change
- Add SafState enum (CONFIGURED / PERMISSION_LOST / NOT_CONFIGURED) in TrackStorage
- TrackRepository exposes safState() and initSafDirectory() thin wrappers
- MainViewModel exposes safState StateFlow and onSafDirectorySelected()
- SavedTracksFragment observes safState and shows contextual setup / re-auth button
- MainActivity registers safPickerLauncher and exposes launchSafPicker()
- Add androidx.documentfile:documentfile:1.0.1 dependency
https://claude.ai/code/session_01YUbuZNDAoLea4cf9UGQ9qn
Diffstat (limited to 'android-app/app/src/main/res/layout')
| -rw-r--r-- | android-app/app/src/main/res/layout/fragment_saved_tracks.xml | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/android-app/app/src/main/res/layout/fragment_saved_tracks.xml b/android-app/app/src/main/res/layout/fragment_saved_tracks.xml index 7485e59..a95b368 100644 --- a/android-app/app/src/main/res/layout/fragment_saved_tracks.xml +++ b/android-app/app/src/main/res/layout/fragment_saved_tracks.xml @@ -34,15 +34,32 @@ </LinearLayout> - <TextView - android:id="@+id/tv_empty" + <LinearLayout + android:id="@+id/layout_empty" android:layout_width="match_parent" android:layout_height="match_parent" + android:orientation="vertical" android:gravity="center" - android:text="No saved tracks yet.\nRecord a trip to see it here." - android:textAlignment="center" - android:textColor="?attr/colorOnSurfaceVariant" - android:visibility="gone" /> + android:padding="32dp" + android:visibility="gone"> + + <TextView + android:id="@+id/tv_empty" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="No saved tracks yet.\nRecord a trip to see it here." + android:textAlignment="center" + android:textColor="?attr/colorOnSurfaceVariant" /> + + <com.google.android.material.button.MaterialButton + android:id="@+id/btn_setup_storage" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="24dp" + android:text="Set up track storage" + android:visibility="gone" /> + + </LinearLayout> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv_saved_tracks" |
