From 38d29ee6cb67759dfb3c9ddf40fee1fa5bba68c8 Mon Sep 17 00:00:00 2001 From: James Rich Date: Thu, 21 May 2026 16:56:41 -0500 Subject: [PATCH] feat(specs): defer map implementation pending NAVIGATION vs POI decision Map strategy (User Story 5, FR-009, T029) deferred to allow proper evaluation of: - NAVIGATION category (full MapWithContentTemplate, live tracking) vs POI category (PlaceListMapTemplate, 6-item cap, simpler) - Google Maps SDK for AAOS availability timeline - Play Store review implications of NAVIGATION declaration - Whether convoy use case justifies nav app exclusivity Remaining 39 tasks (Phases 1-6, 8-10) proceed without map dependency. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../spec.md | 26 +++++++++++-------- .../tasks.md | 18 +++++-------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/specs/20260521-153452-car-app-library-integration/spec.md b/specs/20260521-153452-car-app-library-integration/spec.md index a488130f8..5e1907437 100644 --- a/specs/20260521-153452-car-app-library-integration/spec.md +++ b/specs/20260521-153452-car-app-library-integration/spec.md @@ -109,20 +109,24 @@ A driver participating in multiple mesh channels (e.g., "Convoy", "Emergency", " --- -### User Story 5 - View Node Locations on Map (Priority: P2) +### User Story 5 - View Node Locations on Map (Priority: DEFERRED) + +> **⚠️ DEFERRED:** Map implementation is deferred pending further research and discussion on whether to pursue POI category (PlaceListMapTemplate, limited but simpler) or NAVIGATION category (MapWithContentTemplate, full-featured but triggers stricter Play Store review and conflicts with active nav apps). This decision has significant architectural and distribution implications that warrant dedicated analysis. A driver in a convoy scenario views the locations of all mesh nodes on a map to understand relative positions and navigate toward or away from group members. -**Why this priority**: Location awareness is a core differentiator of Meshtastic and maps are natural for automotive interfaces. +**Why deferred**: The choice between POI (static pins, 6-item cap, no routing conflicts) and NAVIGATION (live tracking, full map control, but exclusive with Google Maps/Waze) fundamentally shapes the UX and distribution strategy. More research needed on: +- Google Maps SDK availability for AAOS (announced I/O 2026, timeline unclear) +- NAVIGATION category Play Store review requirements and timeline +- Whether Meshtastic's convoy use case justifies NAVIGATION exclusivity +- User expectations (passive awareness vs. active routing toward nodes) -**Independent Test**: Can be tested by having 2+ nodes reporting GPS positions and verifying pins appear at correct locations on the car map. +**Acceptance Scenarios** (to be finalized after map strategy decision): -**Acceptance Scenarios**: - -1. **Given** nodes are reporting GPS positions, **When** the driver opens the map screen, **Then** node locations appear as labeled items in a PlaceListMapTemplate with pins on the map -2. **Given** the map is displayed with node pins, **When** the driver taps a node item in the list, **Then** a detail panel shows node name, distance, last update time, and option to send a direct message +1. **Given** nodes are reporting GPS positions, **When** the driver opens the map screen, **Then** node locations are displayed with correct positions +2. **Given** the map is displayed, **When** the driver selects a node, **Then** a detail view shows node name, distance, last update time, and option to send a direct message 3. **Given** the driver's own position is available, **When** viewing the map, **Then** their position is shown distinctly from other nodes -4. **Given** a node's position updates, **When** the map is visible, **Then** the pin moves to the new position within 5 seconds +4. **Given** a node's position updates, **When** the map is visible, **Then** the display updates within 5 seconds --- @@ -183,12 +187,12 @@ A driver uses CAL's built-in voice input to compose messages and perform actions - **FR-006**: System MUST present emergency messages in a Spotlight Section when viewing the messaging screen - **FR-007**: System MUST display all known mesh nodes as Condensed Items showing name, signal quality, and battery level - **FR-008**: System MUST support channel switching via Chips displayed at the top of the messaging screen -- **FR-009**: System MUST render node positions on a map using PlaceListMapTemplate under the POI category (static pin list, refreshable; NAVIGATION category with MapWithContentTemplate deferred to v2) +- **FR-009**: ~~DEFERRED~~ — Map implementation deferred pending NAVIGATION vs POI category decision. See User Story 5. - **FR-010**: System MUST maintain a persistent Minimized Control Panel showing radio status, online node count, and last message time - **FR-011**: System MUST display a Banner when the Bluetooth connection to the radio is lost - **FR-012**: System MUST support expanding node details on tap (last heard, distance, hardware model) - **FR-013**: System MUST use Expanded Header Layout for the node dashboard showing mesh topology summary -- **FR-014**: System MUST declare MESSAGING as the primary category and POI as secondary +- **FR-014**: System MUST declare MESSAGING as the primary category. POI or NAVIGATION as secondary category is deferred pending map strategy decision. - **FR-015**: System MUST gracefully degrade to cached/read-only data when the mesh radio is disconnected - **FR-016**: System MUST support unread message indicators on channel Chips - **FR-017**: System MUST filter emoji-only and admin messages from the car display (only text messages shown) @@ -295,7 +299,7 @@ A driver uses CAL's built-in voice input to compose messages and perform actions - **SC-006**: Channel switching completes (chip tap to new message list rendered) within 1 second - **SC-007**: App passes Android Auto App Quality review criteria for the MESSAGING category - **SC-008**: 95% of voice-initiated replies complete successfully without fallback to touch input -- **SC-009**: Map displays node positions with < 5-second update latency when positions change +- **SC-009**: ~~DEFERRED~~ — Map latency criterion deferred with map implementation - **SC-010**: Zero crashes or ANRs attributed to the car module during a 2-hour continuous driving session ## Assumptions diff --git a/specs/20260521-153452-car-app-library-integration/tasks.md b/specs/20260521-153452-car-app-library-integration/tasks.md index 4fe54c62e..5e1d0fffa 100644 --- a/specs/20260521-153452-car-app-library-integration/tasks.md +++ b/specs/20260521-153452-car-app-library-integration/tasks.md @@ -43,7 +43,7 @@ - [ ] T012 Create MeshtasticCarAppService at feature/car/src/main/kotlin/org/meshtastic/feature/car/service/MeshtasticCarAppService.kt extending CarAppService, creating sessions via Koin - [ ] T013 Create MeshtasticCarSession at feature/car/src/main/kotlin/org/meshtastic/feature/car/service/MeshtasticCarSession.kt with onCreateScreen (returns HomeScreen), onNewIntent, onCarConfigurationChanged, Crashlytics tagging, 300ms invalidation debouncing - [ ] T014 Create presentation state models (CarSessionState, ConnectionStatus, MessagingUiState, ChannelUi, ConversationUi, NodeDashboardUiState, NodeUi, SignalQuality, TopologyHeader, MapUiState, NodePlace, LatLngWrapper, EmergencyAlert) at feature/car/src/main/kotlin/org/meshtastic/feature/car/model/CarUiModels.kt -- [ ] T015 Create HomeScreen (TabTemplate with Messages/Nodes/Map tabs) at feature/car/src/main/kotlin/org/meshtastic/feature/car/screens/HomeScreen.kt +- [ ] T015 Create HomeScreen (TabTemplate with Messages/Nodes tabs; Map tab placeholder deferred) at feature/car/src/main/kotlin/org/meshtastic/feature/car/screens/HomeScreen.kt **Checkpoint**: Foundation ready — CarAppService binds, session creates, HomeScreen renders tabs. User story implementation can now begin in parallel. @@ -114,17 +114,13 @@ --- -## Phase 7: User Story 5 — View Node Locations on Map (Priority: P2) +## Phase 7: User Story 5 — View Node Locations on Map (DEFERRED) -**Goal**: Nodes with GPS positions displayed as place items on a PlaceListMapTemplate with auto-zoom and detail drill-down +> **⚠️ DEFERRED:** Map implementation deferred pending NAVIGATION vs POI category decision. The choice between PlaceListMapTemplate (POI, 6-item cap, no nav conflicts) and MapWithContentTemplate (NAVIGATION, full-featured, exclusive with Google Maps) requires further research and discussion. See spec User Story 5 for open questions. -**Independent Test**: Have 2+ nodes reporting GPS → open map → pins at correct locations → tap list item → node detail with distance and DM option +~~- [ ] T029 [US5] Create MapScreen~~ -### Implementation for User Story 5 - -- [ ] T029 [US5] Create MapScreen at feature/car/src/main/kotlin/org/meshtastic/feature/car/screens/MapScreen.kt with PlaceListMapTemplate under POI category, node Place items with LatLng from NodeRepository (filtered to valid positions), distance + last update in row text, own position as anchor, onClickListener pushing NodeDetailScreen, 5-second refresh interval. **Cap at 6 Place items per CAL PlaceListMapTemplate limit — prioritize by distance (nearest first), then recency** - -**Checkpoint**: Map displays node pins, auto-zooms to fit, list items show distance, tap navigates to node detail +**Checkpoint**: SKIPPED — revisit after map strategy decision --- @@ -182,7 +178,7 @@ - **Phase 4 (US2 - Emergency)**: Depends on Phase 2; integrates with MessagingScreen (Phase 3 T016) - **Phase 5 (US3 - Nodes)**: Depends on Phase 2 — independent of messaging - **Phase 6 (US4 - Channels)**: Depends on Phase 3 (modifies MessagingScreen) -- **Phase 7 (US5 - Map)**: Depends on Phase 5 (reuses NodeDetailScreen from T027) +- **Phase 7 (US5 - Map)**: **DEFERRED** — pending NAVIGATION vs POI category decision - **Phase 8 (US6 - Status Panel)**: Depends on Phase 2 — independent - **Phase 9 (US7 - Voice)**: Depends on Phase 3 (ConversationScreen T017, FuzzyNodeNameResolver T018) - **Phase 10 (Polish)**: Depends on all user story phases @@ -193,7 +189,7 @@ - **US2 (Emergency, P1)**: Can start after Phase 2 — integrates with US1's MessagingScreen (T016) for Spotlight Section (T024) - **US3 (Nodes, P2)**: Can start after Phase 2 — fully independent - **US4 (Channels, P2)**: Depends on US1 (extends MessagingScreen) -- **US5 (Map, P2)**: Depends on US3 (reuses NodeDetailScreen) +- **US5 (Map, DEFERRED)**: Pending NAVIGATION vs POI category decision — requires further research - **US6 (Status Panel, P3)**: Can start after Phase 2 — fully independent - **US7 (Voice, P3)**: Depends on US1 (extends ConversationScreen)