Re-exported at 46a0726, which adds README.md plus docs/ARCHITECTURE, DEVELOPMENT, TESTING, v1 history including the original brief, and a v3 backlog. 112 files, and the bundle now carries 19 commits. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Rippr v2 — Task Index
Project overview: ../../README.md · Architecture: ../ARCHITECTURE.md · v1 history: ../v1/ · Next: ../v3/BACKLOG.md
Trips, path rendering, and export. Full rationale lives in the plan; this directory holds one document per task, each self-contained enough to implement from.
Why v2
v1 records GPS telemetry reliably — a real ride confirmed the whole pipeline including
speedKmh. What it lacks is structure: track_points is one unbounded append-only
table with no boundary between rides. "No reset", "no pause", and "no trips" are all the
same missing concept.
Path data is already captured (latitude, longitude, altitudeM, bearingDeg at
1–2 Hz). v2 adds rendering, not capture.
Decisions
| Decision | Choice |
|---|---|
| Map library | osmdroid — Apache-2.0, no API key, no billing |
| Trip lifecycle | Manual only — explicit Start/Stop |
| Reset | Discard current trip, behind a confirm |
| Live map | None. Phone rides in a pocket; the map is a post-ride artifact |
| Map visibility | Behind a toggle, trip detail only, never touched by the service |
| v1 data | Nuked — v1 was a test, so no migration |
| Trip management | Rename, delete, merge |
| Group ride view | Deferred to v3+ |
Tasks
| # | Task | Phase | Depends | Status |
|---|---|---|---|---|
| T01 | Repo + dependency baseline | 0 | — | Done |
| T02 | Schema v2 entities + DAOs | 1 | T01 | Done |
| T03 | Trip repository + reactive state | 1 | T02 | Done |
| T04 | Geo utilities | 2 | T01 | Done |
| T05 | Ride statistics | 2 | T04 | Done |
| T06 | Trip lifecycle in the service | 3 | T03 | Done |
| T07 | Live aggregate accumulation | 3 | T04, T06 | Done |
| T08 | Navigation shell + ViewModels | 4 | T01 | Done |
| T09 | Record screen v2 | 4 | T06, T08 | Done |
| T10 | Trips list | 4 | T02, T08 | Done |
| T11 | Trip detail (stats only) | 4 | T05, T08 | Done |
| T12 | Rename / delete / merge | 4 | T10, T11 | Done |
| T13 | osmdroid integration + toggle | 5 | T11 | Done |
| T14 | Path rendering | 5 | T04, T13 | Done |
| T15 | GPX + GeoJSON writers | 6 | T04 | Done |
| T16 | Export UI | 6 | T15 | Done |
| T17 | Uploader trip-awareness | 7 | T02 | Done |
| T18 | Verification + remove destructive migration | 7 | all | Done (real-ride checklist outstanding) |
Dependency graph
T01 ──┬─► T02 ──► T03 ──► T06 ──► T07 ──┐
│ ├─────────► T10 ──┐ │
│ └─────────► T17 │ │
├─► T04 ──► T05 ──► T11├─► T12 │
│ └──────────► T14│ │
└─► T08 ──► T09 ───────┘ │
T11 ──► T13 ──► T14 │
T04 ──► T15 ──► T16 ▼
T18
Critical path: T01 → T02 → T03 → T06 → T07 → T09 → T18. T04/T05, T08, and T15 are parallelisable early wins requiring no device.
Progress log with per-task outcomes and hiccups: PROGRESS.md.
Conventions
- Package layout:
data/,geo/,stats/,export/,ui/undercom.rippr - Pure logic stays Android-free so it is JVM-unit-testable — the pattern
Telemetry.ktalready follows - Comments explain why, not what, matching the existing codebase
- Each task ends green:
./gradlew assembleDebug testDebugUnitTest lintDebug
Standing constraints
- minSdk 26 ⇒ SQLite 3.18 ⇒ no window functions. Consecutive-point maths cannot be done in SQL; it is accumulated in Kotlin.
- Migrations are now mandatory. The destructive fallback was removed in T18. Any
schema change must ship a
Migrationagainstschemas/com.rippr.data.AppDatabase/2.json. - Decimation is render-only. Storage and export always use raw points.