Export and share the recorded ride GPX #47

Closed
opened 2026-08-31 17:14:54 +02:00 by robert · 1 comment
robert commented 2026-08-31 17:14:54 +02:00 (Migrated from git.butzei.de)

Goal

Close the loop: the ride goes back to komoot, Strava or anywhere else, without needing anyone's API.

Acceptance criteria

  • Recorded ride exported as GPX via the Android share sheet
  • Heart rate and elevation preserved in the export
  • Re-imports into komoot cleanly - verified end to end
  • Verified against at least one other platform, for example Strava
  • Sensible default filename including date and route name
  • Old rides listed and re-exportable

Files

  • companion/.../ride/GpxExporter.kt
## Goal Close the loop: the ride goes back to komoot, Strava or anywhere else, without needing anyone's API. ## Acceptance criteria - [ ] Recorded ride exported as GPX via the Android share sheet - [ ] Heart rate and elevation preserved in the export - [ ] **Re-imports into komoot cleanly** - verified end to end - [ ] Verified against at least one other platform, for example Strava - [ ] Sensible default filename including date and route name - [ ] Old rides listed and re-exportable ## Files - `companion/.../ride/GpxExporter.kt`
Owner

Closed by PR #112 (merged). Real FileProvider-based sharing (Intent.ACTION_SEND), verified against the current developer.android.com reference, correctly exported=false + grantUriPermissions, and the ${applicationId} manifest placeholder correctly reasoned against the debug variant's applicationIdSuffix. Filename generation (rideExportFilename: PedalPebble--

Ride history checked honestly before building anything -- nothing persisted what was recorded before this issue, so this is real new scope: RideRecord/RideHistoryStorage/RideHistory (pure, mirrors RouteRecordStorage/RouteLibrary's split) plus Room-backed storage and a list/share/delete screen -- :companion:ride's first Room DB and first Compose UI, kept deliberately minimal rather than a full ride-history feature.

HR/elevation unchanged and still correctly optional (#20's existing GpxRecorderTest round-trip through GpxImporter stays green and is the closest available proxy for "re-imports into komoot cleanly" -- real komoot/Strava verification still needs Robert on a device, stated honestly).

Verified for real: ./gradlew :companion:core:test -- 257 tests, 0 failures (14 new). ./gradlew :companion:assembleDebug -- real build succeeds, Room/KSP codegen ran, @OptIn(ExperimentalMaterial3Api::class) present on both new screens from the start, manifest inspected directly. No device/emulator to exercise Room's generated code against real SQLite -- same honest gap RouteDatabase already carried.

Closed by PR #112 (merged). Real FileProvider-based sharing (Intent.ACTION_SEND), verified against the current developer.android.com reference, correctly exported=false + grantUriPermissions, and the ${applicationId} manifest placeholder correctly reasoned against the debug variant's applicationIdSuffix. Filename generation (rideExportFilename: PedalPebble-<date>-<time>-<route>.gpx, seconds-resolution, sanitized route name) is real and used both on-disk and at export time, so there's no separate rename step. Ride history checked honestly before building anything -- nothing persisted what was recorded before this issue, so this is real new scope: RideRecord/RideHistoryStorage/RideHistory (pure, mirrors RouteRecordStorage/RouteLibrary's split) plus Room-backed storage and a list/share/delete screen -- :companion:ride's first Room DB and first Compose UI, kept deliberately minimal rather than a full ride-history feature. HR/elevation unchanged and still correctly optional (#20's existing GpxRecorderTest round-trip through GpxImporter stays green and is the closest available proxy for "re-imports into komoot cleanly" -- real komoot/Strava verification still needs Robert on a device, stated honestly). Verified for real: ./gradlew :companion:core:test -- 257 tests, 0 failures (14 new). ./gradlew :companion:assembleDebug -- real build succeeds, Room/KSP codegen ran, @OptIn(ExperimentalMaterial3Api::class) present on both new screens from the start, manifest inspected directly. No device/emulator to exercise Room's generated code against real SQLite -- same honest gap RouteDatabase already carried.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Depends on
Reference
robert/PedalPebble#47
No description provided.