feat(android): upload all + per-file retry (Phase 28.3 complete)

This commit is contained in:
Mathieu Moran
2026-08-15 19:32:05 -04:00
parent 749feeb9d5
commit b6f8416b5c
5 changed files with 77 additions and 15 deletions
+7 -3
View File
@@ -2021,7 +2021,7 @@ tracked in FEATURES.md.
2. **FEAT-02** — QR / claim-code device pairing flow (medium)
3. **FEAT-04** — Replace SIM868 2G GSM with 4G LTE modem (large)
### Phase 28: Native Android companion app — 🚧 IN PROGRESS (28.1 ✅, 28.2 ✅, 28.3 🚧, 28.4–28.7 pending)
### Phase 28: Native Android companion app — 🚧 IN PROGRESS (28.1 ✅, 28.2 ✅, 28.3 ✅, 28.4–28.7 pending)
**Renumbered from former Phase 26 on 2026-08-10 to make room for the road-test bug-fix phase.
Renumbered to Phase 28 on 2026-08-11 to make room for Phase 27 feature additions. Planning
completed 2026-08-11. Detailed implementation plan in [android/plan.md](android/plan.md).**
@@ -2046,12 +2046,16 @@ completed 2026-08-11. Detailed implementation plan in [android/plan.md](android/
- Bottom nav: Dashcam tab + Test tab.
- **Verified:** video list loads from real Pi over "yaris 911" hotspot on the owner's Pixel.
**28.3 — Cellular upload 🚧 IN PROGRESS (2026-08-12)**
**28.3 — Cellular upload ✅ DONE (2026-08-15)**
- `ServerApi.kt`: Retrofit chunked-upload endpoints (`/api/v1/dashcam/upload/status` + `.../chunk`).
- `UploadWorker.kt`: WorkManager foreground worker — SHA256 → `/status` check → 40MB chunks,
skipping already-received chunks. Byte-level progress via okio `ForwardingSink` (real bytes
sent, not chunk count), debug logging, robust chunk reads, re-upload guard.
- `DownloadsScreen`: per-file upload status + inline progress bar; in-app test file generator.
- `DownloadsScreen`: per-file upload status + inline progress bar; in-app test file generator;
"Upload all" button (queues all pending files); per-file "Retry" button (tracks failed
uploads via `failedUploads` StateFlow).
- **Pending:** real-device verification of the upload path end-to-end (chunk 0 through the Pi
NAT + Cloudflare still needs confirming on the owner's Pixel).
#### Why native (not web, not PWA)
Revives the phone-relay goal (Phase 11/12) properly this time. The Phase 11 update proved