feat: Phase 28.2 — dashcam video browser + WiFi download
- DashcamScreen: LazyColumn of imported Pi videos with thumbnails (Coil), file size, date, upload status, converting progress - DashcamViewModel: Retrofit-backed video list + download to phone storage + delete local copy - PiApi extended: listVideos, getVideoFile (streaming), getThumbnail, deleteVideo - DTOs: VideoListResponse, VideoFile, ConvertProgress - Bottom nav: Dashcam tab + Test tab - Verified: video list loads from real Pi over yaris 911 hotspot
This commit is contained in:
+10
-16
@@ -69,35 +69,29 @@ android/
|
||||
|
||||
## Sub-phases
|
||||
|
||||
### 28.1 — Scaffold + networking proof-of-concept 🚧 IN PROGRESS
|
||||
**Gate: dual-network binding must work on the real Pixel before anything else is built.**
|
||||
### 28.1 — Scaffold + networking proof-of-concept ✅ DONE (gate passed 2026-08-12)
|
||||
|
||||
#### 28.1.1 — Project creation
|
||||
- [x] Create Android project in `android/` via Android Studio (Empty Activity + Compose)
|
||||
- [x] Kotlin DSL build files with version catalog
|
||||
- [x] `.gitignore` for Android (`*.iml`, `.gradle/`, `build/`, `local.properties`, `.idea/`)
|
||||
- [x] Create Android project in `android/` via Android Studio (Empty Activity + Compose)
|
||||
- [x] Kotlin DSL build files with version catalog
|
||||
- [x] `.gitignore` for Android (`*.iml`, `.gradle/`, `build/`, `local.properties`, `.idea/`)
|
||||
- [ ] Verify project builds and runs on emulator (needs Android Studio)
|
||||
- [x] Commit: `f1c83a2` init: android project scaffold
|
||||
|
||||
#### 28.1.2 — Networking layer
|
||||
- [x] Add dependencies: OkHttp 4.12, Retrofit 2.11, Kotlinx Serialization 1.7.3
|
||||
- [x] Create `NetworkBinder.kt` — discovers WiFi (Pi hotspot, no-internet) + cellular networks
|
||||
via `ConnectivityManager`, creates socket-bound `OkHttpClient` per network
|
||||
- [x] Create `NetworkBinder.kt` — discovers WiFi (Pi hotspot) + cellular networks (kept for future use)
|
||||
- [x] Create Retrofit service interfaces (`PiApi.kt`, `ServerApi.kt`) with placeholder endpoints
|
||||
- [x] Create DTOs: `GpsStatus`, `HealthResponse`
|
||||
- [x] Wire `DualNetworkTestScreen.kt` with real OkHttp calls + simultaneous "Test Both" button
|
||||
- [x] Wire `MainActivity.kt` to discover networks at startup and pass bound clients to screen
|
||||
- [ ] **Real-device gate test:**
|
||||
- Connect phone to Pi hotspot ("yaris 911")
|
||||
- Verify cellular data is still active (browse any website while on hotspot)
|
||||
- Press "Test Pi" → should return GPS status JSON
|
||||
- Press "Test Server" → should return `{"status":"ok"}`
|
||||
- Press "Test Both" → both should succeed simultaneously
|
||||
- If either fails: investigate `bindProcessToNetwork()` behavior on this Pixel/Android version
|
||||
- [ ] Commit: `feat: dual-network proof-of-concept`
|
||||
- [x] Wire `MainActivity.kt` — simplified to single OkHttpClient, OS routes correctly
|
||||
- [x] **Real-device gate test — PASSED 2026-08-12 on Pixel:**
|
||||
- "Test Pi" → `✓ Pi OK (200)` with live GPS fix data
|
||||
- "Test Server" → `✓ Server OK (200) — {"status":"ok"}`
|
||||
- "Test Both Simultaneously" → `✓ BOTH NETWORKS WORK SIMULTANEOUSLY`
|
||||
- Key finding: per-socket `Network.bindSocket()` not needed — Android OS routes
|
||||
`10.42.0.1` through WiFi and `yaris.ceaf.dev` through cellular automatically
|
||||
- [x] Commit: `348bfdc` feat: Phase 28.1 gate passed
|
||||
|
||||
#### 28.1.3 — Credential storage
|
||||
- [ ] Add EncryptedSharedPreferences for server URL, device name, API key
|
||||
|
||||
Reference in New Issue
Block a user