TrimRecordedRouteRequest + @POST("recorded-routes/{id}/trim") in SpikerSoftApi (first used download-shaped call — exercises detail DTO mapping).
RouteRepository.replacePoints(routeId, points) — rebuild stats via TrackStats.statsFor, dao.upsert (REPLACE strategy).
RouteTrimScreen.kt + Hilt RouteTrimViewModel: Material3 RangeSlider, suggest, confirm; unsynced → local apply + replacePoints; synced → API trim then replacePoints from response — never re-enqueue RouteSyncWorker (server dup).
core/network/SpikerSoftApi.kt:83-84 → @POST("recorded-routes/{id}/trim") suspend fun trimRecordedRoute(...)
core/tracking/RouteRepository.kt:86 → suspend fun replacePoints(routeId, points)
features/tracker/RouteTrimScreen.kt (+ :128routes.replacePoints, :217controller.showTrimPreview) and TrackerMapView.kt:72showTrimPreview
assets-tracker/tracker_style.json:72,79,145,172 → trim-dimmed + trim-handles sources and layers
Nav wiring in features/home/SpikerSoftNavHost.kt:130,134 → tracker/trim/{routeId} plus the Trim entry from RouteDetailScreen
Live: nothing runtime-observable from this box (native app). Its server dependency is live: POST https://api.spikersoft.com/api/recorded-routes/{id}/trim → 401 (deployed) vs 404 for a bogus sibling path.
Verified complete 2026-08-07 — closing.
- **Code:** `spikersoft-android@4aa6100` (PR #10, `feat/route-trim-995`, commit `bcc59e0`) — every bullet in the body is present on main:
- `core/tracking/RouteTrimmer.kt` + `core/tracking/RouteTrimmerTest.kt` (shared fixture)
- `core/network/SpikerSoftApi.kt:83-84` → `@POST("recorded-routes/{id}/trim") suspend fun trimRecordedRoute(...)`
- `core/tracking/RouteRepository.kt:86` → `suspend fun replacePoints(routeId, points)`
- `features/tracker/RouteTrimScreen.kt` (+ `:128` `routes.replacePoints`, `:217` `controller.showTrimPreview`) and `TrackerMapView.kt:72` `showTrimPreview`
- `assets-tracker/tracker_style.json:72,79,145,172` → `trim-dimmed` + `trim-handles` sources and layers
- Nav wiring in `features/home/SpikerSoftNavHost.kt:130,134` → `tracker/trim/{routeId}` plus the Trim entry from `RouteDetailScreen`
- **Live:** nothing runtime-observable from this box (native app). Its server dependency is live: `POST https://api.spikersoft.com/api/recorded-routes/{id}/trim` → 401 (deployed) vs 404 for a bogus sibling path.
- **Shipped by:** android PR #10.
Not migrated: nothing left to do.
— Opus 5 Agent
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Part of epic #992.
core/tracking/RouteTrimmer.ktmirroring iOS exactly (apply + suggest,TrackStats.haversineKm).TrimRecordedRouteRequest+@POST("recorded-routes/{id}/trim")inSpikerSoftApi(first used download-shaped call — exercises detail DTO mapping).RouteRepository.replacePoints(routeId, points)— rebuild stats viaTrackStats.statsFor,dao.upsert(REPLACE strategy).RouteTrimScreen.kt+ HiltRouteTrimViewModel: Material3RangeSlider, suggest, confirm; unsynced → local apply + replacePoints; synced → API trim then replacePoints from response — never re-enqueueRouteSyncWorker(server dup).TrackerMapController.showTrimPreview/clearTrimPreview;tracker_style.jsontrim-dimmed+trim-handles.tracker/trim/{routeId}+ Trim button inRouteDetailScreen(reload on return).RouteTrimmerTest.ktwith the shared fixture.Verified complete 2026-08-07 — closing.
spikersoft-android@4aa6100(PR #10,feat/route-trim-995, commitbcc59e0) — every bullet in the body is present on main:core/tracking/RouteTrimmer.kt+core/tracking/RouteTrimmerTest.kt(shared fixture)core/network/SpikerSoftApi.kt:83-84→@POST("recorded-routes/{id}/trim") suspend fun trimRecordedRoute(...)core/tracking/RouteRepository.kt:86→suspend fun replacePoints(routeId, points)features/tracker/RouteTrimScreen.kt(+:128routes.replacePoints,:217controller.showTrimPreview) andTrackerMapView.kt:72showTrimPreviewassets-tracker/tracker_style.json:72,79,145,172→trim-dimmed+trim-handlessources and layersfeatures/home/SpikerSoftNavHost.kt:130,134→tracker/trim/{routeId}plus the Trim entry fromRouteDetailScreenPOST https://api.spikersoft.com/api/recorded-routes/{id}/trim→ 401 (deployed) vs 404 for a bogus sibling path.Not migrated: nothing left to do.
— Opus 5 Agent