From a429359376b51dddadeccab50323cabbefc6a95c Mon Sep 17 00:00:00 2001 From: liu weikai Date: Sat, 13 Jun 2026 11:10:27 +0800 Subject: [PATCH] Burn down legacy presentation adapters --- apps/linux_cardputer_zero/CMakeLists.txt | 3 +- ...x_cardputer_zero_business_wiring_smoke.cpp | 39 +++++- .../linux_cardputer_zero_packaging_smoke.cpp | 2 +- apps/linux_sim_shell/CMakeLists.txt | 17 ++- apps/linux_uconsole_gtk/CMakeLists.txt | 4 +- cmake/TrailMateLinuxSources.cmake | 20 --- docs/audits/GPS_CONSUMER_BOUNDARY_AUDIT.md | 4 +- ...P_OVERLAY_ROUTE_TRACKER_OWNERSHIP_AUDIT.md | 4 +- .../audits/MAP_PRESENTATION_BOUNDARY_AUDIT.md | 6 +- docs/audits/MAP_UI_LEGACY_OWNERSHIP_AUDIT.md | 6 +- docs/audits/PHASE5_LEGACY_ISLAND_REGISTER.md | 4 +- .../PHASE5_PRESENTATION_BOUNDARY_SUMMARY.md | 12 +- .../PHASE5_PRESENTATION_CONFORMANCE_MATRIX.md | 12 +- .../PHASE7_FINAL_LEGACY_SURFACE_MATRIX.md | 2 +- .../PRODUCT_COMPOSITION_BOUNDARY_AUDIT.md | 16 +-- docs/audits/RENDERER_BOUNDARY_AUDIT.md | 6 +- docs/audits/TEAM_CHAT_PRESENTATION_AUDIT.md | 4 +- docs/audits/UI_SHARED_SPLIT_AUDIT.md | 4 +- .../CHAT_PRESENTATION_IDENTITY_SPEC.md | 2 +- .../CHAT_WORKSPACE_MODEL_SPEC.md | 2 +- .../specification/MAP_WORKSPACE_MODEL_SPEC.md | 10 +- .../legacy_air_device_status_source.h | 16 --- .../legacy_chat_action_sink.h | 35 ----- .../legacy_gps_status_source.h | 16 --- .../legacy_map_action_sink.h | 43 ------ .../legacy_map_presentation_source.h | 43 ------ .../legacy_map_presentation_state.h | 28 ---- .../legacy_mesh_status_source.h | 16 --- .../legacy_settings_action_sink.h | 16 --- .../legacy_settings_source.h | 16 --- .../team_chat_action_sink.h | 2 +- .../legacy_air_device_status_source.cpp | 19 --- .../legacy_chat_action_sink.cpp | 33 ----- .../legacy_gps_status_source.cpp | 19 --- .../legacy_map_action_sink.cpp | 67 --------- .../legacy_map_presentation_source.cpp | 127 ------------------ .../legacy_mesh_status_source.cpp | 19 --- .../legacy_settings_action_sink.cpp | 20 --- .../legacy_settings_source.cpp | 19 --- .../tests/test_chat_presentation_source.cpp | 4 +- ...est_runtime_map_presentation_adapters.cpp} | 21 +-- .../uconsole/uconsole_map_workspace_model.h | 16 +-- .../src/uconsole_map_workspace_model.cpp | 23 ++-- .../KNOWN_PRODUCT_ARCHITECTURE_VIOLATIONS.md | 8 +- .../architecture/check_phase5_final_ready.py | 5 +- tools/architecture/check_phase5_ready.py | 57 ++++---- .../check_phase5_renderer_ready.py | 16 +-- .../check_phase6_composition_ready.py | 2 +- .../check_phase7_runtime_ownership_ready.py | 6 +- .../phase6_composition_legacy_baseline.json | 12 +- 50 files changed, 190 insertions(+), 713 deletions(-) delete mode 100644 modules/ui_shared/include/ui/presentation_sources/legacy_air_device_status_source.h delete mode 100644 modules/ui_shared/include/ui/presentation_sources/legacy_chat_action_sink.h delete mode 100644 modules/ui_shared/include/ui/presentation_sources/legacy_gps_status_source.h delete mode 100644 modules/ui_shared/include/ui/presentation_sources/legacy_map_action_sink.h delete mode 100644 modules/ui_shared/include/ui/presentation_sources/legacy_map_presentation_source.h delete mode 100644 modules/ui_shared/include/ui/presentation_sources/legacy_map_presentation_state.h delete mode 100644 modules/ui_shared/include/ui/presentation_sources/legacy_mesh_status_source.h delete mode 100644 modules/ui_shared/include/ui/presentation_sources/legacy_settings_action_sink.h delete mode 100644 modules/ui_shared/include/ui/presentation_sources/legacy_settings_source.h delete mode 100644 modules/ui_shared/src/ui/presentation_sources/legacy_air_device_status_source.cpp delete mode 100644 modules/ui_shared/src/ui/presentation_sources/legacy_chat_action_sink.cpp delete mode 100644 modules/ui_shared/src/ui/presentation_sources/legacy_gps_status_source.cpp delete mode 100644 modules/ui_shared/src/ui/presentation_sources/legacy_map_action_sink.cpp delete mode 100644 modules/ui_shared/src/ui/presentation_sources/legacy_map_presentation_source.cpp delete mode 100644 modules/ui_shared/src/ui/presentation_sources/legacy_mesh_status_source.cpp delete mode 100644 modules/ui_shared/src/ui/presentation_sources/legacy_settings_action_sink.cpp delete mode 100644 modules/ui_shared/src/ui/presentation_sources/legacy_settings_source.cpp rename modules/ui_shared/tests/{test_legacy_map_presentation_adapters.cpp => test_runtime_map_presentation_adapters.cpp} (87%) diff --git a/apps/linux_cardputer_zero/CMakeLists.txt b/apps/linux_cardputer_zero/CMakeLists.txt index 943ed21a..eaa25cdb 100644 --- a/apps/linux_cardputer_zero/CMakeLists.txt +++ b/apps/linux_cardputer_zero/CMakeLists.txt @@ -82,8 +82,7 @@ if(TRAIL_MATE_CARDPUTER_ZERO_BUILD_SCREENSHOT_CAPTURE OR TRAIL_MATE_CARDPUTER_ZE trailmate_cardputer_zero_linux_common) trailmate_add_linux_ui_shell( trailmate_cardputer_zero_ui_shell - trailmate_cardputer_zero_linux_common - NO_LEGACY_PRESENTATION) + trailmate_cardputer_zero_linux_common) if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64|ARM64)$") set(cardputer_zero_arm64_asset_sources "") diff --git a/apps/linux_cardputer_zero/tests/linux_cardputer_zero_business_wiring_smoke.cpp b/apps/linux_cardputer_zero/tests/linux_cardputer_zero_business_wiring_smoke.cpp index 42660167..951801ca 100644 --- a/apps/linux_cardputer_zero/tests/linux_cardputer_zero_business_wiring_smoke.cpp +++ b/apps/linux_cardputer_zero/tests/linux_cardputer_zero_business_wiring_smoke.cpp @@ -83,7 +83,7 @@ int main(int argc, char** argv) const std::string cardputer_cmake = read_file( repo_root / "apps/linux_cardputer_zero/CMakeLists.txt"); - assert(contains(cardputer_cmake, "NO_LEGACY_PRESENTATION")); + assert(not_contains(cardputer_cmake, "NO_LEGACY_PRESENTATION")); assert(not_contains(cardputer_cmake, "ui_legacy_adapters")); const std::string board_facts = read_file( @@ -139,10 +139,19 @@ int main(int argc, char** argv) const std::string shell_includes = slice_between( linux_sources_cmake, "set(TRAIL_MATE_LINUX_UI_SHELL_INCLUDES", - "set(TRAIL_MATE_LINUX_UI_LEGACY_PRESENTATION_SOURCES"); + "function(trailmate_apply_linux_common_warnings"); assert(not_contains(common_includes, "TRAIL_MATE_UI_LEGACY_ADAPTERS_INCLUDE_ROOT")); assert(not_contains(shell_includes, "TRAIL_MATE_UI_LEGACY_ADAPTERS_INCLUDE_ROOT")); - assert(contains(linux_sources_cmake, "if(NOT ARG_NO_LEGACY_PRESENTATION)")); + assert(not_contains(linux_sources_cmake, "TRAIL_MATE_LINUX_UI_LEGACY_PRESENTATION_SOURCES")); + assert(not_contains(linux_sources_cmake, "NO_LEGACY_PRESENTATION")); + assert(not_contains(linux_sources_cmake, "legacy_air_device_status_source.cpp")); + assert(not_contains(linux_sources_cmake, "legacy_gps_status_source.cpp")); + assert(not_contains(linux_sources_cmake, "legacy_mesh_status_source.cpp")); + assert(not_contains(linux_sources_cmake, "legacy_settings_source.cpp")); + assert(not_contains(linux_sources_cmake, "legacy_settings_action_sink.cpp")); + assert(not_contains(linux_sources_cmake, "legacy_chat_action_sink.cpp")); + assert(not_contains(linux_sources_cmake, "legacy_map_presentation_source.cpp")); + assert(not_contains(linux_sources_cmake, "legacy_map_action_sink.cpp")); assert(contains(linux_sources_cmake, "TRAIL_MATE_UI_SHARED_SRC_ROOT}/ui/ui_status.cpp")); assert(contains(linux_sources_cmake, "TRAIL_MATE_UI_SHARED_SRC_ROOT}/ui/assets/gps_topbar.c")); assert(contains(linux_sources_cmake, "TRAIL_MATE_UI_SHARED_SRC_ROOT}/ui/assets/wifi_topbar.c")); @@ -291,6 +300,30 @@ int main(int argc, char** argv) assert(contains(settings_components, "gps_runtime::supports_altitude_reference_setting()")); assert(contains(settings_components, "gps_runtime::supports_coordinate_format_setting()")); + const std::string uconsole_cmake = read_file( + repo_root / "apps/linux_uconsole_gtk/CMakeLists.txt"); + assert(contains(uconsole_cmake, "runtime_gps_status_source.cpp")); + assert(contains(uconsole_cmake, "runtime_map_workspace_source.cpp")); + assert(not_contains(uconsole_cmake, "legacy_gps_status_source.cpp")); + assert(not_contains(uconsole_cmake, "legacy_map_presentation_source.cpp")); + assert(not_contains(uconsole_cmake, "legacy_map_action_sink.cpp")); + + const std::string uconsole_map_model_header = read_file( + repo_root / "platform/linux/uconsole/include/uconsole/uconsole_map_workspace_model.h"); + const std::string uconsole_map_model = read_file( + repo_root / "platform/linux/uconsole/src/uconsole_map_workspace_model.cpp"); + assert(contains(uconsole_map_model_header, "runtime_gps_status_source.h")); + assert(contains(uconsole_map_model_header, "runtime_map_workspace_source.h")); + assert(contains(uconsole_map_model_header, "RuntimeMapWorkspaceSource")); + assert(contains(uconsole_map_model_header, "RuntimeMapActionSink")); + assert(contains(uconsole_map_model, "runtime_gps_status_source()")); + assert(not_contains(uconsole_map_model_header, "LegacyGpsStatusSource")); + assert(not_contains(uconsole_map_model_header, "LegacyMapPresentationSource")); + assert(not_contains(uconsole_map_model_header, "LegacyMapActionSink")); + assert(not_contains(uconsole_map_model, "legacy_gps_source_")); + assert(not_contains(uconsole_map_model, "legacy_map_source_")); + assert(not_contains(uconsole_map_model, "legacy_map_sink_")); + const std::string linux_services = read_file( repo_root / "platform/linux/common/src/app/linux_app_services.cpp"); assert(contains(linux_services, "LinuxGpsTrackSource")); diff --git a/apps/linux_cardputer_zero/tests/linux_cardputer_zero_packaging_smoke.cpp b/apps/linux_cardputer_zero/tests/linux_cardputer_zero_packaging_smoke.cpp index 3ea50822..06bb6a0e 100644 --- a/apps/linux_cardputer_zero/tests/linux_cardputer_zero_packaging_smoke.cpp +++ b/apps/linux_cardputer_zero/tests/linux_cardputer_zero_packaging_smoke.cpp @@ -87,7 +87,7 @@ int main(int argc, char** argv) assert(contains(cmake, "unzip")); assert(contains(cmake, "ca-certificates")); assert(contains(cmake, "CPACK_DEBIAN_PACKAGE_SHLIBDEPS OFF")); - assert(contains(cmake, "NO_LEGACY_PRESENTATION")); + assert(not_contains(cmake, "NO_LEGACY_PRESENTATION")); assert(contains(cmake, "CMAKE_SYSTEM_PROCESSOR MATCHES \"^(aarch64|arm64|ARM64)$\"")); assert(contains(cmake, "cardputer_zero_arm64_asset_sources")); assert(contains(cmake, "foreach(source_path IN LISTS TRAIL_MATE_LINUX_UI_SHELL_SOURCES)")); diff --git a/apps/linux_sim_shell/CMakeLists.txt b/apps/linux_sim_shell/CMakeLists.txt index 26d7cd9a..bb9bcf09 100644 --- a/apps/linux_sim_shell/CMakeLists.txt +++ b/apps/linux_sim_shell/CMakeLists.txt @@ -122,7 +122,6 @@ if(BUILD_TESTING) "${TRAIL_MATE_REPO_ROOT}/modules/core_sys/src/sys/clock.cpp" "${TRAIL_MATE_REPO_ROOT}/modules/ui_shared/src/ui/presentation_sources/chat_presentation_source.cpp" "${TRAIL_MATE_REPO_ROOT}/modules/ui_shared/src/ui/presentation_sources/runtime_chat_action_sink.cpp" - "${TRAIL_MATE_REPO_ROOT}/modules/ui_shared/src/ui/presentation_sources/legacy_chat_action_sink.cpp" "${TRAIL_MATE_REPO_ROOT}/modules/chat_presentation_adapters/src/chat_conversation_mapper.cpp" "${TRAIL_MATE_REPO_ROOT}/modules/chat_presentation_adapters/src/chat_message_mapper.cpp") target_include_directories(trailmate_chat_presentation_source_smoke @@ -269,6 +268,22 @@ if(BUILD_TESTING) add_test(NAME trailmate_map_overlay_snapshot_source_smoke COMMAND trailmate_map_overlay_snapshot_source_smoke) + add_executable(trailmate_runtime_map_presentation_adapters_smoke + "${TRAIL_MATE_REPO_ROOT}/modules/ui_shared/tests/test_runtime_map_presentation_adapters.cpp" + "${TRAIL_MATE_REPO_ROOT}/modules/ui_shared/src/ui/presentation_sources/runtime_map_workspace_source.cpp" + "${TRAIL_MATE_REPO_ROOT}/modules/ui_shared/src/ui/team_presence/team_presence_model.cpp" + "${TRAIL_MATE_REPO_ROOT}/modules/core_sys/src/sys/clock.cpp") + target_include_directories(trailmate_runtime_map_presentation_adapters_smoke + PRIVATE + "${TRAIL_MATE_REPO_ROOT}/modules/ui_shared/include" + "${TRAIL_MATE_REPO_ROOT}/modules/ui_presentation/include" + "${TRAIL_MATE_REPO_ROOT}/modules/core_sys/include" + "${TRAIL_MATE_REPO_ROOT}/modules/core_team/include") + target_compile_features(trailmate_runtime_map_presentation_adapters_smoke + PRIVATE cxx_std_17) + add_test(NAME trailmate_runtime_map_presentation_adapters_smoke + COMMAND trailmate_runtime_map_presentation_adapters_smoke) + add_executable(trailmate_legacy_map_overlay_source_alias_smoke "${TRAIL_MATE_REPO_ROOT}/modules/ui_legacy_adapters/tests/test_legacy_map_overlay_source_legacy_alias.cpp") target_include_directories(trailmate_legacy_map_overlay_source_alias_smoke diff --git a/apps/linux_uconsole_gtk/CMakeLists.txt b/apps/linux_uconsole_gtk/CMakeLists.txt index a5c7f00d..5e092bfb 100644 --- a/apps/linux_uconsole_gtk/CMakeLists.txt +++ b/apps/linux_uconsole_gtk/CMakeLists.txt @@ -81,9 +81,7 @@ if(TRAIL_MATE_UCONSOLE_BUILD_REAL_GTK_UI AND CMAKE_SYSTEM_NAME STREQUAL "Linux") add_library(trailmate_uconsole_runtime_models "${TRAIL_MATE_REPO_ROOT}/modules/ui_shared/src/ui/presentation_sources/runtime_gps_status_source.cpp" - "${TRAIL_MATE_REPO_ROOT}/modules/ui_shared/src/ui/presentation_sources/legacy_gps_status_source.cpp" - "${TRAIL_MATE_REPO_ROOT}/modules/ui_shared/src/ui/presentation_sources/legacy_map_presentation_source.cpp" - "${TRAIL_MATE_REPO_ROOT}/modules/ui_shared/src/ui/presentation_sources/legacy_map_action_sink.cpp" + "${TRAIL_MATE_REPO_ROOT}/modules/ui_shared/src/ui/presentation_sources/runtime_map_workspace_source.cpp" "${TRAIL_MATE_REPO_ROOT}/platform/linux/uconsole/src/uconsole_chat_workspace_model.cpp" "${TRAIL_MATE_REPO_ROOT}/platform/linux/uconsole/src/uconsole_dashboard_model.cpp" "${TRAIL_MATE_REPO_ROOT}/platform/linux/uconsole/src/uconsole_hardware_probe.cpp" diff --git a/cmake/TrailMateLinuxSources.cmake b/cmake/TrailMateLinuxSources.cmake index 9d337d56..8ee2a2d7 100644 --- a/cmake/TrailMateLinuxSources.cmake +++ b/cmake/TrailMateLinuxSources.cmake @@ -545,17 +545,6 @@ set(TRAIL_MATE_LINUX_UI_SHELL_INCLUDES "${TRAIL_MATE_PLATFORM_SHARED_INCLUDE_ROOT}" ) -set(TRAIL_MATE_LINUX_UI_LEGACY_PRESENTATION_SOURCES - "${TRAIL_MATE_UI_SHARED_SRC_ROOT}/ui/presentation_sources/legacy_air_device_status_source.cpp" - "${TRAIL_MATE_UI_SHARED_SRC_ROOT}/ui/presentation_sources/legacy_gps_status_source.cpp" - "${TRAIL_MATE_UI_SHARED_SRC_ROOT}/ui/presentation_sources/legacy_mesh_status_source.cpp" - "${TRAIL_MATE_UI_SHARED_SRC_ROOT}/ui/presentation_sources/legacy_settings_source.cpp" - "${TRAIL_MATE_UI_SHARED_SRC_ROOT}/ui/presentation_sources/legacy_settings_action_sink.cpp" - "${TRAIL_MATE_UI_SHARED_SRC_ROOT}/ui/presentation_sources/legacy_chat_action_sink.cpp" - "${TRAIL_MATE_UI_SHARED_SRC_ROOT}/ui/presentation_sources/legacy_map_presentation_source.cpp" - "${TRAIL_MATE_UI_SHARED_SRC_ROOT}/ui/presentation_sources/legacy_map_action_sink.cpp" -) - # --------------------------------------------------------------------------- # Helper functions # --------------------------------------------------------------------------- @@ -608,17 +597,8 @@ function(trailmate_add_linux_common target_name) endfunction() function(trailmate_add_linux_ui_shell target_name common_target) - set(options NO_LEGACY_PRESENTATION) - cmake_parse_arguments(ARG "${options}" "" "" ${ARGN}) - set(linux_ui_shell_sources ${TRAIL_MATE_LINUX_UI_SHELL_SOURCES}) set(linux_ui_shell_includes ${TRAIL_MATE_LINUX_UI_SHELL_INCLUDES}) - if(NOT ARG_NO_LEGACY_PRESENTATION) - list(APPEND linux_ui_shell_sources - ${TRAIL_MATE_LINUX_UI_LEGACY_PRESENTATION_SOURCES}) - list(APPEND linux_ui_shell_includes - "${TRAIL_MATE_UI_LEGACY_ADAPTERS_INCLUDE_ROOT}") - endif() # common_target must already be created (via trailmate_add_linux_common). add_library(${target_name} diff --git a/docs/audits/GPS_CONSUMER_BOUNDARY_AUDIT.md b/docs/audits/GPS_CONSUMER_BOUNDARY_AUDIT.md index fdf59e68..1779af07 100644 --- a/docs/audits/GPS_CONSUMER_BOUNDARY_AUDIT.md +++ b/docs/audits/GPS_CONSUMER_BOUNDARY_AUDIT.md @@ -20,8 +20,8 @@ direct `gps_runtime` dependencies. | Shared Meshtastic phone runtime bridge | `platform/shared/include/platform/shared/ble/meshtastic_phone_runtime_bridge.h` converts `gps::ILocationSource` into Meshtastic GPS fix data. | Same source behind `IPhoneAppFacade` snapshot methods. | Done, but facade wiring still needs cleanup | Phase 4.5 | | ESP Team track sampler | `platform/esp/arduino_common/src/team/runtime/team_track_source_gps.cpp` consumes `gps::ILocationSource`. | Same, with team code isolated from GPS runtime details. | Done, verify in readiness checks | Phase 4.5 | | HostLink config/status time | `platform/esp/arduino_common/src/hostlink/hostlink_config_service.cpp` still calls `settimeofday`; status paths may compose time from legacy/system helpers. | `gps::ITimeAuthority` and `DeviceStatusSnapshot`. | Legacy | Phase 4.5/Phase 5 | -| LVGL GPS/status screens | `modules/ui_shared` screens and dashboard widgets include `platform/ui/gps_runtime.h`. The global menu/status GPS icon now reads `GpsStatusModel` through `LegacyGpsStatusSource`; dashboard GPS widgets still read the legacy runtime directly. | `GpsStatusModel` / `DeviceStatusModel` backed by `ILocationSource`, `ITimeAuthority`, and snapshots. | Partial: status icon migrated, richer GPS widgets remain legacy UI compatibility surface | Phase 5 | -| LVGL settings GPS controls | `modules/ui_shared/src/ui/screens/settings/settings_page_components.cpp` still calls legacy GPS runtime setters for receiver, GNSS, interval, power strategy, and external NMEA settings. The `gps_enabled` toggle now submits a `SettingsModel` patch through `LegacySettingsActionSink`. | `SettingsModel` command sink backed by config patches and platform GPS runtime shell. | Partial: GPS enabled migrated, remaining GPS controls are legacy UI compatibility surface | Phase 5 / later Config Core | +| LVGL GPS/status screens | `modules/ui_shared` screens and dashboard widgets include `platform/ui/gps_runtime.h`. The global menu/status GPS icon now reads `GpsStatusModel` through `RuntimeGpsStatusSource`; dashboard GPS widgets still read the legacy runtime directly. | `GpsStatusModel` / `DeviceStatusModel` backed by `ILocationSource`, `ITimeAuthority`, and snapshots. | Partial: status icon migrated, richer GPS widgets remain legacy UI compatibility surface | Phase 5 | +| LVGL settings GPS controls | `modules/ui_shared/src/ui/screens/settings/settings_page_components.cpp` still calls legacy GPS runtime setters for receiver, GNSS, interval, power strategy, and external NMEA settings. The `gps_enabled` toggle now submits a `SettingsModel` patch through `RuntimeSettingsActionSink`. | `SettingsModel` command sink backed by config patches and platform GPS runtime shell. | Partial: GPS enabled migrated, remaining GPS controls are legacy UI compatibility surface | Phase 5 / later Config Core | | Mono 128x64 UI runtime | `modules/ui_mono_128x64/include/ui/mono_128x64/runtime.h` includes `platform/ui/gps_runtime.h`. | Device/GPS presentation snapshots. | Legacy UI compatibility surface | Phase 5 | | GTK/uConsole dashboard, chat, map models | `platform/linux/uconsole/src/*_model.cpp` and GTK overview logic include `platform/ui/gps_runtime.h` or platform probes. | `GpsStatusModel`, `DeviceStatusModel`, and app snapshots. | Legacy UI compatibility surface | Phase 5 | | nRF52 Meshtastic radio adapter position payload | `platform/nrf52/arduino_common/src/chat/infra/meshtastic/meshtastic_radio_adapter.cpp` includes `platform/ui/gps_runtime.h` while building position payloads near radio/protocol behavior. | `gps::ILocationSource` supplied through mesh/app projection, not direct UI runtime. | Legacy non-UI consumer | Phase 4.5 mesh cleanup | diff --git a/docs/audits/MAP_OVERLAY_ROUTE_TRACKER_OWNERSHIP_AUDIT.md b/docs/audits/MAP_OVERLAY_ROUTE_TRACKER_OWNERSHIP_AUDIT.md index e992ee66..3fd8fef0 100644 --- a/docs/audits/MAP_OVERLAY_ROUTE_TRACKER_OWNERSHIP_AUDIT.md +++ b/docs/audits/MAP_OVERLAY_ROUTE_TRACKER_OWNERSHIP_AUDIT.md @@ -16,10 +16,10 @@ tile source, or filesystem state directly. | Question | Current owner before 7.12 | 7.12 owner | | --- | --- | --- | -| Current GPS marker facts | ESP GPS page/map runtime reads `platform::ui::gps::get_data()`; Linux map workspace reads `LegacyGpsStatusSource` | `LegacyMapOverlaySource` via `IMapOverlayGpsSource` | +| Current GPS marker facts | ESP GPS page/map runtime reads `platform::ui::gps::get_data()`; Linux map workspace reads `RuntimeGpsStatusSource` | `LegacyMapOverlaySource` via `IMapOverlayGpsSource` | | Team member marker facts | Team posring reads are contained in `TeamMapOverlaySource`; ESP GPS, Linux GPS, and uConsole dashboard consume that source | `TeamMapOverlaySource` via `IMapOverlayTeamSource` | | Route / tracker / breadcrumb facts | ESP route/tracker overlay code still owns platform-specific drawing state | Explicitly deferred with exit condition | -| Measurement state | `LegacyMapPresentationState` / `MapWorkspaceSnapshot::measurement` | Deferred overlay projection until measurement tool runtime is split | +| Measurement state | `RuntimeMapWorkspaceState` / `MapWorkspaceSnapshot::measurement` | Deferred overlay projection until measurement tool runtime is split | | Renderer access to GPS/team | `map_viewport` does not read GPS/team; ESP GPS map page still has contained legacy marker paths | Shared map renderer remains forbidden from reading GPS/team; ESP marker legacy remains contained | ## GPS Current Position Marker diff --git a/docs/audits/MAP_PRESENTATION_BOUNDARY_AUDIT.md b/docs/audits/MAP_PRESENTATION_BOUNDARY_AUDIT.md index 71bca713..1846a430 100644 --- a/docs/audits/MAP_PRESENTATION_BOUNDARY_AUDIT.md +++ b/docs/audits/MAP_PRESENTATION_BOUNDARY_AUDIT.md @@ -46,12 +46,12 @@ presentation-source adapters. - `ui_presentation/map` now contains the portable map workspace snapshot, source port, action sink port, and ViewModel. -- `LegacyMapPresentationSource` and `LegacyMapActionSink` now bound legacy - GPS/map/team compatibility state behind read/write adapters. +- `RuntimeMapWorkspaceSource` and `RuntimeMapActionSink` now bind GPS/map/team + runtime state behind read/write adapters. - The compact LVGL map runtime consumes `MapWorkspaceModel` for self-location rendering and center-on-self action flow. - `UConsoleMapWorkspaceModel` now exposes a portable - `presentation_workspace` and consumes `LegacyGpsStatusSource` instead of + `presentation_workspace` and consumes `RuntimeGpsStatusSource` instead of including `platform/ui/gps_runtime.h` directly in its map center path. - The ASCII/headless probe renders `MapWorkspaceSnapshot` without LVGL, GTK, GPS runtime, tile cache, or raw Team store dependencies. diff --git a/docs/audits/MAP_UI_LEGACY_OWNERSHIP_AUDIT.md b/docs/audits/MAP_UI_LEGACY_OWNERSHIP_AUDIT.md index aa1b38a4..074507fa 100644 --- a/docs/audits/MAP_UI_LEGACY_OWNERSHIP_AUDIT.md +++ b/docs/audits/MAP_UI_LEGACY_OWNERSHIP_AUDIT.md @@ -13,9 +13,9 @@ The following surfaces now have a `MapWorkspaceModel` boundary: - `ui_presentation/map` defines `MapWorkspaceSnapshot`, `IMapPresentationSource`, `IMapActionSink`, and `MapWorkspaceModel`. -- `LegacyMapPresentationSource` projects GPS self-location, layer state, +- `RuntimeMapWorkspaceSource` projects GPS self-location, layer state, measurement placeholder state, and Team overlay summary. -- `LegacyMapActionSink` handles center-on-self, viewport, layer, active tool, +- `RuntimeMapActionSink` handles center-on-self, viewport, layer, active tool, and clear-measurement actions. - The compact LVGL map runtime consumes `MapWorkspaceModel::snapshot()` for self-location focus and routes center-on-self through @@ -24,7 +24,7 @@ The following surfaces now have a `MapWorkspaceModel` boundary: `presentation_workspace` snapshot while preserving its legacy tile/cache snapshot. - `UConsoleMapWorkspaceModel` no longer includes `platform/ui/gps_runtime.h` - directly for its map center fix path; it consumes `LegacyGpsStatusSource`. + directly for its map center fix path; it consumes `RuntimeGpsStatusSource`. - `trailmate_map_workspace_ascii_probe` renders a headless `MapWorkspaceSnapshot` without LVGL, GTK, GPS runtime, tile cache, or Team raw store dependencies. diff --git a/docs/audits/PHASE5_LEGACY_ISLAND_REGISTER.md b/docs/audits/PHASE5_LEGACY_ISLAND_REGISTER.md index d76d6357..cfbaaf6f 100644 --- a/docs/audits/PHASE5_LEGACY_ISLAND_REGISTER.md +++ b/docs/audits/PHASE5_LEGACY_ISLAND_REGISTER.md @@ -55,8 +55,8 @@ Boundary established: - `GpsStatusModel` - `MapWorkspaceModel` -- `LegacyMapPresentationSource` -- `LegacyMapActionSink` +- `RuntimeMapWorkspaceSource` +- `RuntimeMapActionSink` - renderer hardening locks the migrated `map_workspace_model()` path Future cleanup: diff --git a/docs/audits/PHASE5_PRESENTATION_BOUNDARY_SUMMARY.md b/docs/audits/PHASE5_PRESENTATION_BOUNDARY_SUMMARY.md index 1d6fdb15..5204188a 100644 --- a/docs/audits/PHASE5_PRESENTATION_BOUNDARY_SUMMARY.md +++ b/docs/audits/PHASE5_PRESENTATION_BOUNDARY_SUMMARY.md @@ -13,13 +13,13 @@ remaining legacy ownership is documented. | Domain | Boundary established | Adapter | Remaining legacy | | --- | --- | --- | --- | -| Device | `DeviceStatusModel` | `LegacyAirDeviceStatusSource` | board/runtime status details | -| GPS | `GpsStatusModel` | `LegacyGpsStatusSource` | `gps_runtime` compatibility surface | -| Mesh | `MeshStatusModel` | `LegacyMeshStatusSource` | adapter-specific counters and runtime details | -| Settings | `SettingsModel` | `LegacySettingsSource` / `LegacySettingsActionSink` | full configuration migration | -| Chat | `ChatWorkspaceModel` | `ChatPresentationSource` / `LegacyChatActionSink` | `ChatUiController`, key verification, structured pending/failure | +| Device | `DeviceStatusModel` | `RuntimeDeviceStatusSource` | board/runtime status details | +| GPS | `GpsStatusModel` | `RuntimeGpsStatusSource` | `gps_runtime` compatibility surface | +| Mesh | `MeshStatusModel` | `RuntimeMeshStatusSource` | adapter-specific counters and runtime details | +| Settings | `SettingsModel` | `RuntimeSettingsSource` / `RuntimeSettingsActionSink` | full configuration migration | +| Chat | `ChatWorkspaceModel` | `ChatPresentationSource` / `RuntimeChatActionSink` | `ChatUiController`, key verification, structured pending/failure | | Team Chat | `ChatWorkspaceModel` with Team source/sink | `TeamChatPresentationSource` / `TeamChatActionSink` | location/command picker, rich payload UI, structured pending/failure | -| Map | `MapWorkspaceModel` | `LegacyMapPresentationSource` / `LegacyMapActionSink` | tile/cache/renderer/rich overlay cleanup | +| Map | `MapWorkspaceModel` | `RuntimeMapWorkspaceSource` / `RuntimeMapActionSink` | tile/cache/renderer/rich overlay cleanup | | Workspace | `PresentationWorkspace` | target-owned composition | target construction order and legacy UI islands | ## Interpretation diff --git a/docs/audits/PHASE5_PRESENTATION_CONFORMANCE_MATRIX.md b/docs/audits/PHASE5_PRESENTATION_CONFORMANCE_MATRIX.md index 7befc03b..7bdbfa6c 100644 --- a/docs/audits/PHASE5_PRESENTATION_CONFORMANCE_MATRIX.md +++ b/docs/audits/PHASE5_PRESENTATION_CONFORMANCE_MATRIX.md @@ -19,13 +19,13 @@ Phase 5-ready does not mean fully clean. | Domain | Model | Snapshot | Source | Sink | Tests | Consumer | Legacy audit | Status | | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Device | `DeviceStatusModel` | `DeviceStatusSnapshot` | `IDeviceStatusSource` / `LegacyAirDeviceStatusSource` | read-only | `test_device_status_model.cpp` | status/probe consumers | known violations | ready | -| GPS | `GpsStatusModel` | `GpsStatusSnapshot` | `IGpsStatusSource` / `LegacyGpsStatusSource` | read-only | `test_gps_status_model.cpp` | dashboard status, map source, probes | `GPS_CONSUMER_BOUNDARY_AUDIT.md` | ready-with-legacy | -| Mesh | `MeshStatusModel` | `MeshStatusSnapshot` | `IMeshStatusSource` / `LegacyMeshStatusSource` | read-only | `test_mesh_status_model.cpp` | status/probe consumers | known violations | ready-with-legacy | -| Settings | `SettingsModel` | `SettingsSnapshot` | `ISettingsSource` / `LegacySettingsSource` | `ISettingsActionSink` / `LegacySettingsActionSink` | `test_settings_model.cpp` | settings surface | known violations | ready-with-legacy | -| Chat | `ChatWorkspaceModel` | `ChatWorkspaceSnapshot` | `ChatPresentationSource` | `LegacyChatActionSink` | chat workspace and source/sink tests | `ChatUiController` migrated path | `CHAT_UI_CONTROLLER_LEGACY_OWNERSHIP_AUDIT.md` | ready-with-legacy | +| Device | `DeviceStatusModel` | `DeviceStatusSnapshot` | `IDeviceStatusSource` / `RuntimeDeviceStatusSource` | read-only | `test_device_status_model.cpp` | status/probe consumers | known violations | ready | +| GPS | `GpsStatusModel` | `GpsStatusSnapshot` | `IGpsStatusSource` / `RuntimeGpsStatusSource` | read-only | `test_gps_status_model.cpp` | dashboard status, map source, probes | `GPS_CONSUMER_BOUNDARY_AUDIT.md` | ready-with-legacy | +| Mesh | `MeshStatusModel` | `MeshStatusSnapshot` | `IMeshStatusSource` / `RuntimeMeshStatusSource` | read-only | `test_mesh_status_model.cpp` | status/probe consumers | known violations | ready-with-legacy | +| Settings | `SettingsModel` | `SettingsSnapshot` | `ISettingsSource` / `RuntimeSettingsSource` | `ISettingsActionSink` / `RuntimeSettingsActionSink` | `test_settings_model.cpp` | settings surface | known violations | ready-with-legacy | +| Chat | `ChatWorkspaceModel` | `ChatWorkspaceSnapshot` | `ChatPresentationSource` | `RuntimeChatActionSink` | chat workspace and source/sink tests | `ChatUiController` migrated path | `CHAT_UI_CONTROLLER_LEGACY_OWNERSHIP_AUDIT.md` | ready-with-legacy | | Team Chat | Team `ChatWorkspaceModel` | `ChatWorkspaceSnapshot` | `TeamChatPresentationSource` | `TeamChatActionSink` | Team chat source/sink tests | `ChatUiController` Team text path | `TEAM_CHAT_PRESENTATION_AUDIT.md` | ready-with-legacy | -| Map | `MapWorkspaceModel` | `MapWorkspaceSnapshot` | `LegacyMapPresentationSource` | `LegacyMapActionSink` | map workspace and legacy adapter tests | LVGL, uConsole, ASCII probe | `MAP_UI_LEGACY_OWNERSHIP_AUDIT.md` | ready-with-legacy | +| Map | `MapWorkspaceModel` | `MapWorkspaceSnapshot` | `RuntimeMapWorkspaceSource` | `RuntimeMapActionSink` | map workspace and runtime adapter tests | LVGL, uConsole, ASCII probe | `MAP_UI_LEGACY_OWNERSHIP_AUDIT.md` | ready-with-legacy | | Workspace | `PresentationWorkspace` | `PresentationWorkspaceSnapshot` | n/a | n/a | workspace/probe tests | ASCII workspace probe, uConsole smoke | `PHASE5_PRESENTATION_BOUNDARY_SUMMARY.md` | ready | | Renderer | n/a | presentation snapshots | n/a | presentation actions | renderer checker/probe tests | LVGL, GTK/uConsole, ASCII/headless | `PHASE5_RENDERER_HARDENING_SUMMARY.md` | ready-with-legacy | diff --git a/docs/audits/PHASE7_FINAL_LEGACY_SURFACE_MATRIX.md b/docs/audits/PHASE7_FINAL_LEGACY_SURFACE_MATRIX.md index 1c722723..93e20b77 100644 --- a/docs/audits/PHASE7_FINAL_LEGACY_SURFACE_MATRIX.md +++ b/docs/audits/PHASE7_FINAL_LEGACY_SURFACE_MATRIX.md @@ -23,7 +23,7 @@ | Map overlay current position | Legacy GPS source adapter | `LegacyMapOverlaySource` / `MapOverlayProjector` | contained | Renderer consumes `MapOverlaySnapshot` directly for markers | Existing ESP marker widgets are still page-local | Phase 8 map overlay renderer | | Map overlay team positions | Team map projection source | `TeamMapOverlaySource` / `MapOverlayProjector` | burned-down | GPS/map/dashboard consumers use `TeamMapOverlaySource`; only the Team map source seam reads Team posring | Route/tracker/measurement overlays remain separate deferred items | closed in Team consumer closeout | | Map route/tracker overlay | ESP route/tracker draw callbacks | Deferred overlay presentation source | explicitly deferred | Route/tracker stores expose presentation sources and renderer consumes overlay snapshot rows | Route/tracker stores are still platform/page-specific | Phase 8 route/tracker overlay | -| Measurement overlay | `LegacyMapPresentationState` | Deferred overlay projection | explicitly deferred | Measurement state projects as `MeasurementPoint` overlay rows | Measurement tool runtime boundary is not split | Phase 8 measurement tool | +| Measurement overlay | `RuntimeMapWorkspaceState` | Deferred overlay projection | explicitly deferred | Measurement state projects as `MeasurementPoint` overlay rows | Measurement tool runtime boundary is not split | Phase 8 measurement tool | | GPS page refresh cadence | `GpsPageRuntimePump` | Runtime scheduler / UI refresh sink | contained | Page-local refresh adapters are replaced by GPS presentation refresh model | ESP GPS page workflow remains large compatibility surface | Phase 8 GPS page runtime | | GNSS skyplot timer | GNSS page runtime | Deferred GNSS runtime pump | explicitly deferred | GNSS page cadence uses a runtime pump and skyplot renderer consumes snapshots | GNSS skyplot was outside Phase 7 map/GPS final scope | Phase 8 GNSS scheduling | | ACK timeout projection | Adapter hook | Delivery event source | explicitly deferred | Unified ACK source emits structured timeout event | Radio/EventBus source remains protocol-specific | Phase 8 delivery telemetry | diff --git a/docs/audits/PRODUCT_COMPOSITION_BOUNDARY_AUDIT.md b/docs/audits/PRODUCT_COMPOSITION_BOUNDARY_AUDIT.md index ea163381..d9c33afc 100644 --- a/docs/audits/PRODUCT_COMPOSITION_BOUNDARY_AUDIT.md +++ b/docs/audits/PRODUCT_COMPOSITION_BOUNDARY_AUDIT.md @@ -44,17 +44,17 @@ policy. ### Presentation Sources/Sinks -- `LegacyAirDeviceStatusSource` -- `LegacyGpsStatusSource` -- `LegacyMeshStatusSource` -- `LegacySettingsSource` -- `LegacySettingsActionSink` +- `RuntimeDeviceStatusSource` +- `RuntimeGpsStatusSource` +- `RuntimeMeshStatusSource` +- `RuntimeSettingsSource` +- `RuntimeSettingsActionSink` - `ChatPresentationSource` -- `LegacyChatActionSink` +- `RuntimeChatActionSink` - `TeamChatPresentationSource` - `TeamChatActionSink` -- `LegacyMapPresentationSource` -- `LegacyMapActionSink` +- `RuntimeMapWorkspaceSource` +- `RuntimeMapActionSink` ### Presentation Models diff --git a/docs/audits/RENDERER_BOUNDARY_AUDIT.md b/docs/audits/RENDERER_BOUNDARY_AUDIT.md index 1fa77aa9..1dc617ad 100644 --- a/docs/audits/RENDERER_BOUNDARY_AUDIT.md +++ b/docs/audits/RENDERER_BOUNDARY_AUDIT.md @@ -58,9 +58,9 @@ These should not regress: - `ui_presentation/*` - `apps/linux_sim/tests/*ascii_probe*.cpp` -- `ChatPresentationSource` / `LegacyChatActionSink` +- `ChatPresentationSource` / `RuntimeChatActionSink` - `TeamChatPresentationSource` / `TeamChatActionSink` -- `LegacyMapPresentationSource` / `LegacyMapActionSink` +- `RuntimeMapWorkspaceSource` / `RuntimeMapActionSink` - `ChatWorkspaceModel`-backed non-team message rendering - `TeamChatPresentationSource`-backed Team text rendering - `MapWorkspaceModel`-backed map workspace status/action path @@ -110,7 +110,7 @@ GTK/uConsole migrated path: - `UConsoleMapWorkspaceModel` must keep exposing `presentation_workspace` - `UConsoleMapWorkspaceModel` must keep map status/center projection behind - `LegacyMapPresentationSource`, `LegacyMapActionSink`, and + `RuntimeMapWorkspaceSource`, `RuntimeMapActionSink`, and `MapWorkspaceModel` - GTK overview GPS compatibility logic remains a baseline legacy island until a dedicated overview presentation model exists diff --git a/docs/audits/TEAM_CHAT_PRESENTATION_AUDIT.md b/docs/audits/TEAM_CHAT_PRESENTATION_AUDIT.md index 75518237..82558b10 100644 --- a/docs/audits/TEAM_CHAT_PRESENTATION_AUDIT.md +++ b/docs/audits/TEAM_CHAT_PRESENTATION_AUDIT.md @@ -106,7 +106,7 @@ Do not: - map Team to DirectPeer - map Team to Channel -- send Team text through `LegacyChatActionSink` +- send Team text through `RuntimeChatActionSink` - store Team messages as generic `ChatMessage` unless a separate design says so - force Team location/command payload into generic `MessageRow` payload fields @@ -135,4 +135,4 @@ own read adapter, command sink, and `ChatWorkspaceModel` instance. Location and command entries are read-side textual projections only. Their picker/send actions remain legacy-owned and must not be routed through -`LegacyChatActionSink`, `toCoreConversationId`, or direct/channel send paths. +`RuntimeChatActionSink`, `toCoreConversationId`, or direct/channel send paths. diff --git a/docs/audits/UI_SHARED_SPLIT_AUDIT.md b/docs/audits/UI_SHARED_SPLIT_AUDIT.md index d2fa0ccd..993176fb 100644 --- a/docs/audits/UI_SHARED_SPLIT_AUDIT.md +++ b/docs/audits/UI_SHARED_SPLIT_AUDIT.md @@ -53,8 +53,8 @@ to be created in Phase 8.1. | LVGL screens | `screens/chat`, `screens/gps`, `screens/team`, `screens/tracker`, `screens/settings`, `screens/node_info`, `screens/walkie_talkie` | `ui_lvgl_ux_packs` | Screen membership and feature depth should become UX pack choices | | LVGL menu/navigation surfaces | `menu/*`, `app_catalog*`, `app_runtime`, `loop_shell`, `startup_ui_shell` | split between `ui_lvgl_core` and `ui_lvgl_ux_packs` | Primitive navigation host belongs to core; product menu membership belongs to UX pack | | assets and fonts | `assets/*`, image/icon C files, font files | `ui_lvgl_core` or UX pack asset bundle | Common primitives can stay core; pack-specific icons should follow UX pack | -| legacy presentation sources | `presentation_sources/legacy_*_source.*`, `legacy_map_presentation_source`, `legacy_gps_status_source` | `ui_legacy_adapters` | Phase 7 bounded these; Phase 8 decides rename/delete/stable adapter | -| legacy action bridges | `legacy_chat_action_sink`, `legacy_chat_delivery_action_bridge`, `legacy_team_action_bridge`, `legacy_key_verification_action_sink` | `ui_legacy_adapters` | Adapter names should be normalized only after ownership replacement is clear | +| runtime presentation sources | `presentation_sources/runtime_*_source.*`, `chat_presentation_source`, `team_*_presentation_source` | stay in `ui_shared` until a runtime-adapter split is warranted | Concrete legacy presentation adapters have been burned down; future moves should preserve active build ownership | +| legacy alias bridges | `legacy_chat_delivery_action_bridge`, `legacy_team_action_bridge`, `legacy_key_verification_action_sink` | `ui_legacy_adapters` | Alias/deprecation names should remain explicit compatibility shims, not active presentation adapters | | chat screen runtime helpers | `chat_page_runtime_event_pump`, `chat_ui_refresh_sink`, chat runtime proxy, chat UI runtime helpers | `ui_chat_runtime` | Runtime scheduling helpers should stay outside renderer/widget ownership | | chat LVGL renderers/controllers | chat screen widgets, chat controller, key verification modal renderer | `ui_lvgl_ux_packs` with possible `ui_chat_runtime` split | UX pack chooses full/compact chat and modal implementation | | team picker renderer | `team_position_picker_renderer.*` | `ui_lvgl_ux_packs` | It is LVGL-specific picker lifecycle, not Team action ownership | diff --git a/docs/specification/CHAT_PRESENTATION_IDENTITY_SPEC.md b/docs/specification/CHAT_PRESENTATION_IDENTITY_SPEC.md index c9417fda..13530126 100644 --- a/docs/specification/CHAT_PRESENTATION_IDENTITY_SPEC.md +++ b/docs/specification/CHAT_PRESENTATION_IDENTITY_SPEC.md @@ -164,7 +164,7 @@ explicitly mapped in later phases. The current Phase 5.6-c compatibility adapter lives in `modules/ui_shared/src/ui/presentation_sources/chat_presentation_source.cpp` and -`modules/ui_shared/src/ui/presentation_sources/legacy_chat_action_sink.cpp`. +`modules/ui_shared/src/ui/presentation_sources/runtime_chat_action_sink.cpp`. It is a Source/Sink boundary around the existing `ChatService`, not a new chat domain model. diff --git a/docs/specification/CHAT_WORKSPACE_MODEL_SPEC.md b/docs/specification/CHAT_WORKSPACE_MODEL_SPEC.md index 16ea1d4b..383ff263 100644 --- a/docs/specification/CHAT_WORKSPACE_MODEL_SPEC.md +++ b/docs/specification/CHAT_WORKSPACE_MODEL_SPEC.md @@ -101,7 +101,7 @@ It must not: - access LVGL widgets - access radio, mesh adapters, PKI, or packet builders -`LegacyChatActionSink` is the Phase 5.6 compatibility command adapter. It may +`RuntimeChatActionSink` is the runtime command adapter. It may translate UI actions into `ChatService` commands. It must not: diff --git a/docs/specification/MAP_WORKSPACE_MODEL_SPEC.md b/docs/specification/MAP_WORKSPACE_MODEL_SPEC.md index b31c5da7..479d6c05 100644 --- a/docs/specification/MAP_WORKSPACE_MODEL_SPEC.md +++ b/docs/specification/MAP_WORKSPACE_MODEL_SPEC.md @@ -32,7 +32,7 @@ This model follows: - Source/Sink Port - Immutable Snapshot - CQRS Read/Command split -- Compatibility Adapter boundary for legacy map runtime +- Runtime Adapter boundary for map workspace state ## Snapshot Flow @@ -165,10 +165,10 @@ Team member position rows are projected through `TeamMapOverlaySource` / `MapOverlaySnapshotSource`. `TeamOverlaySummary` remains only the workspace summary; rich map marker facts must stay in the overlay source path. -## Legacy Adapters +## Runtime Adapters -`LegacyMapPresentationSource` is a read adapter. It projects legacy GPS/map/team -compatibility surfaces into `MapWorkspaceSnapshot`. +`RuntimeMapWorkspaceSource` is a read adapter. It projects GPS/map/team runtime +surfaces into `MapWorkspaceSnapshot`. It must not: @@ -179,7 +179,7 @@ It must not: - perform route planning - expose Team raw payloads -`LegacyMapActionSink` is a command adapter. It handles presentation-level map +`RuntimeMapActionSink` is a command adapter. It handles presentation-level map actions. It must not: diff --git a/modules/ui_shared/include/ui/presentation_sources/legacy_air_device_status_source.h b/modules/ui_shared/include/ui/presentation_sources/legacy_air_device_status_source.h deleted file mode 100644 index 8194a56c..00000000 --- a/modules/ui_shared/include/ui/presentation_sources/legacy_air_device_status_source.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include "ui_presentation/device/device_status_source.h" - -namespace ui::presentation_sources -{ - -class LegacyAirDeviceStatusSource final : public ui::device::IDeviceStatusSource -{ - public: - bool buildDeviceStatusSnapshot(ui::device::DeviceStatusSnapshot& out) const override; -}; - -LegacyAirDeviceStatusSource& legacy_air_device_status_source(); - -} // namespace ui::presentation_sources diff --git a/modules/ui_shared/include/ui/presentation_sources/legacy_chat_action_sink.h b/modules/ui_shared/include/ui/presentation_sources/legacy_chat_action_sink.h deleted file mode 100644 index 8d9b3e44..00000000 --- a/modules/ui_shared/include/ui/presentation_sources/legacy_chat_action_sink.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#include "chat/usecase/chat_service.h" -#include "ui_presentation/chat/chat_action_sink.h" - -namespace ui::presentation_sources -{ - -// LegacyChatActionSink is a Phase 5.6 compatibility command adapter. -// -// Pattern: -// Command Sink / anti-corruption adapter. -// -// It may translate UI actions into ChatService commands. -// -// It must not: -// - build ChatWorkspaceSnapshot -// - format UI labels -// - access LVGL widgets -// - inspect renderer state -// - build radio packets or perform PKI logic -class LegacyChatActionSink final : public ui::chat::IChatActionSink -{ - public: - explicit LegacyChatActionSink(::chat::ChatService& chat_service); - - ui::UiActionResult selectConversation(ui::chat::ConversationId id) override; - ui::UiActionResult sendMessage(const ui::chat::SendMessageView& message) override; - ui::UiActionResult markRead(ui::chat::ConversationId id) override; - - private: - ::chat::ChatService& chat_service_; -}; - -} // namespace ui::presentation_sources diff --git a/modules/ui_shared/include/ui/presentation_sources/legacy_gps_status_source.h b/modules/ui_shared/include/ui/presentation_sources/legacy_gps_status_source.h deleted file mode 100644 index 172cd769..00000000 --- a/modules/ui_shared/include/ui/presentation_sources/legacy_gps_status_source.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include "ui_presentation/gps/gps_status_source.h" - -namespace ui::presentation_sources -{ - -class LegacyGpsStatusSource final : public ui::gps::IGpsStatusSource -{ - public: - bool buildGpsStatusSnapshot(ui::gps::GpsStatusSnapshot& out) const override; -}; - -LegacyGpsStatusSource& legacy_gps_status_source(); - -} // namespace ui::presentation_sources diff --git a/modules/ui_shared/include/ui/presentation_sources/legacy_map_action_sink.h b/modules/ui_shared/include/ui/presentation_sources/legacy_map_action_sink.h deleted file mode 100644 index f5fbd156..00000000 --- a/modules/ui_shared/include/ui/presentation_sources/legacy_map_action_sink.h +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once - -#include "ui/presentation_sources/legacy_map_presentation_state.h" -#include "ui_presentation/gps/gps_status_source.h" -#include "ui_presentation/map/map_action_sink.h" - -namespace ui::presentation_sources -{ - -// LegacyMapActionSink is a Phase 5.7 compatibility command adapter. -// -// Pattern: -// Command Sink / anti-corruption adapter. -// -// It translates presentation-level map actions into compatibility state while -// tile rendering, GPS runtime, and rich overlay ownership remain legacy. -// -// It must not: -// - build MapWorkspaceSnapshot -// - touch LVGL widgets -// - load tile images -// - parse GPS data -// - write map storage directly -// - perform route planning or packet/radio work -class LegacyMapActionSink final : public ui::map::IMapActionSink -{ - public: - LegacyMapActionSink(ui::gps::IGpsStatusSource& gps_source, - LegacyMapPresentationState& state); - - ui::UiActionResult centerOnSelf() override; - ui::UiActionResult setViewport(const ui::map::MapViewport& viewport) override; - ui::UiActionResult setLayer(ui::map::MapLayerKind layer, - bool enabled) override; - ui::UiActionResult setActiveTool(ui::map::MapToolKind tool) override; - ui::UiActionResult clearMeasurement() override; - - private: - ui::gps::IGpsStatusSource& gps_source_; - LegacyMapPresentationState& state_; -}; - -} // namespace ui::presentation_sources diff --git a/modules/ui_shared/include/ui/presentation_sources/legacy_map_presentation_source.h b/modules/ui_shared/include/ui/presentation_sources/legacy_map_presentation_source.h deleted file mode 100644 index 695b93ea..00000000 --- a/modules/ui_shared/include/ui/presentation_sources/legacy_map_presentation_source.h +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once - -#include "platform/ui/team_ui_snapshot_store.h" -#include "ui/presentation_sources/legacy_map_presentation_state.h" -#include "ui_presentation/gps/gps_status_source.h" -#include "ui_presentation/map/map_presentation_source.h" - -namespace ui::presentation_sources -{ - -// LegacyMapPresentationSource is a Phase 5.7 compatibility read adapter. -// -// Pattern: -// CQRS read model / projection / anti-corruption adapter. -// -// It may read legacy GPS and Team UI compatibility surfaces and project them -// into ui_presentation::map snapshots. -// -// It must not: -// - load map tiles -// - mutate viewport state -// - access LVGL widgets -// - open SD card tile paths -// - perform route planning -// - expose Team raw payloads or rich marker objects -class LegacyMapPresentationSource final : public ui::map::IMapPresentationSource -{ - public: - LegacyMapPresentationSource(ui::gps::IGpsStatusSource& gps_source, - const LegacyMapPresentationState& state, - team::ui::ITeamUiSnapshotStore* team_store = nullptr); - - bool buildMapWorkspaceSnapshot( - const ui::map::MapWorkspaceRequest& request, - ui::map::MapWorkspaceSnapshot& out) const override; - - private: - ui::gps::IGpsStatusSource& gps_source_; - const LegacyMapPresentationState& state_; - team::ui::ITeamUiSnapshotStore* team_store_ = nullptr; -}; - -} // namespace ui::presentation_sources diff --git a/modules/ui_shared/include/ui/presentation_sources/legacy_map_presentation_state.h b/modules/ui_shared/include/ui/presentation_sources/legacy_map_presentation_state.h deleted file mode 100644 index 264b6f66..00000000 --- a/modules/ui_shared/include/ui/presentation_sources/legacy_map_presentation_state.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once - -#include "ui_presentation/map/map_workspace_snapshot.h" - -namespace ui::presentation_sources -{ - -// LegacyMapPresentationState is adapter-local compatibility state for Phase 5.7. -// -// It is not a map engine, tile cache, settings store, or GPS runtime. It only -// carries presentation-level toggles that the Phase 5.7 legacy source/sink pair -// share while map renderer/runtime ownership remains legacy. -struct LegacyMapPresentationState -{ - ui::map::MapLayerState layers{}; - ui::map::MeasurementState measurement{}; - ui::map::MapViewport last_viewport{}; - ui::map::MapToolKind active_tool = ui::map::MapToolKind::Pan; - - bool has_viewport = false; - bool can_zoom_in = true; - bool can_zoom_out = true; - bool can_toggle_layers = true; -}; - -LegacyMapPresentationState& legacy_map_presentation_state(); - -} // namespace ui::presentation_sources diff --git a/modules/ui_shared/include/ui/presentation_sources/legacy_mesh_status_source.h b/modules/ui_shared/include/ui/presentation_sources/legacy_mesh_status_source.h deleted file mode 100644 index 00a30554..00000000 --- a/modules/ui_shared/include/ui/presentation_sources/legacy_mesh_status_source.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include "ui_presentation/mesh/mesh_status_source.h" - -namespace ui::presentation_sources -{ - -class LegacyMeshStatusSource final : public ui::mesh::IMeshStatusSource -{ - public: - bool buildMeshStatusSnapshot(ui::mesh::MeshStatusSnapshot& out) const override; -}; - -LegacyMeshStatusSource& legacy_mesh_status_source(); - -} // namespace ui::presentation_sources diff --git a/modules/ui_shared/include/ui/presentation_sources/legacy_settings_action_sink.h b/modules/ui_shared/include/ui/presentation_sources/legacy_settings_action_sink.h deleted file mode 100644 index 35e88abc..00000000 --- a/modules/ui_shared/include/ui/presentation_sources/legacy_settings_action_sink.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include "ui_presentation/settings/settings_action_sink.h" - -namespace ui::presentation_sources -{ - -class LegacySettingsActionSink final : public ui::settings::ISettingsActionSink -{ - public: - ui::UiActionResult applySetting(const ui::settings::SettingsPatchView& patch) override; -}; - -LegacySettingsActionSink& legacy_settings_action_sink(); - -} // namespace ui::presentation_sources diff --git a/modules/ui_shared/include/ui/presentation_sources/legacy_settings_source.h b/modules/ui_shared/include/ui/presentation_sources/legacy_settings_source.h deleted file mode 100644 index f2be570b..00000000 --- a/modules/ui_shared/include/ui/presentation_sources/legacy_settings_source.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include "ui_presentation/settings/settings_source.h" - -namespace ui::presentation_sources -{ - -class LegacySettingsSource final : public ui::settings::ISettingsSource -{ - public: - bool buildSettingsSnapshot(ui::settings::SettingsSnapshot& out) const override; -}; - -LegacySettingsSource& legacy_settings_source(); - -} // namespace ui::presentation_sources diff --git a/modules/ui_shared/include/ui/presentation_sources/team_chat_action_sink.h b/modules/ui_shared/include/ui/presentation_sources/team_chat_action_sink.h index 0febe379..15c84e15 100644 --- a/modules/ui_shared/include/ui/presentation_sources/team_chat_action_sink.h +++ b/modules/ui_shared/include/ui/presentation_sources/team_chat_action_sink.h @@ -38,7 +38,7 @@ class ITeamChatCommandPort // Command Sink / Bounded Presentation Context. // // It handles ConversationKind::Team actions only. It must not send Team -// through LegacyChatActionSink or core chat direct/channel send paths. +// through runtime chat sinks or core chat direct/channel send paths. class TeamChatActionSink final : public ui::chat::IChatActionSink { public: diff --git a/modules/ui_shared/src/ui/presentation_sources/legacy_air_device_status_source.cpp b/modules/ui_shared/src/ui/presentation_sources/legacy_air_device_status_source.cpp deleted file mode 100644 index 2de72b0c..00000000 --- a/modules/ui_shared/src/ui/presentation_sources/legacy_air_device_status_source.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "ui/presentation_sources/legacy_air_device_status_source.h" - -#include "ui/presentation_sources/runtime_device_status_source.h" - -namespace ui::presentation_sources -{ - -bool LegacyAirDeviceStatusSource::buildDeviceStatusSnapshot(ui::device::DeviceStatusSnapshot& out) const -{ - return runtime_device_status_source().buildDeviceStatusSnapshot(out); -} - -LegacyAirDeviceStatusSource& legacy_air_device_status_source() -{ - static LegacyAirDeviceStatusSource source; - return source; -} - -} // namespace ui::presentation_sources diff --git a/modules/ui_shared/src/ui/presentation_sources/legacy_chat_action_sink.cpp b/modules/ui_shared/src/ui/presentation_sources/legacy_chat_action_sink.cpp deleted file mode 100644 index 03765c1b..00000000 --- a/modules/ui_shared/src/ui/presentation_sources/legacy_chat_action_sink.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "ui/presentation_sources/legacy_chat_action_sink.h" - -#include "ui/presentation_sources/runtime_chat_action_sink.h" - -namespace ui::presentation_sources -{ - -LegacyChatActionSink::LegacyChatActionSink(::chat::ChatService& chat_service) - : chat_service_(chat_service) -{ -} - -ui::UiActionResult LegacyChatActionSink::selectConversation( - ui::chat::ConversationId id) -{ - RuntimeChatActionSink sink(chat_service_); - return sink.selectConversation(id); -} - -ui::UiActionResult LegacyChatActionSink::sendMessage( - const ui::chat::SendMessageView& message) -{ - RuntimeChatActionSink sink(chat_service_); - return sink.sendMessage(message); -} - -ui::UiActionResult LegacyChatActionSink::markRead(ui::chat::ConversationId id) -{ - RuntimeChatActionSink sink(chat_service_); - return sink.markRead(id); -} - -} // namespace ui::presentation_sources diff --git a/modules/ui_shared/src/ui/presentation_sources/legacy_gps_status_source.cpp b/modules/ui_shared/src/ui/presentation_sources/legacy_gps_status_source.cpp deleted file mode 100644 index f342b973..00000000 --- a/modules/ui_shared/src/ui/presentation_sources/legacy_gps_status_source.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "ui/presentation_sources/legacy_gps_status_source.h" - -#include "ui/presentation_sources/runtime_gps_status_source.h" - -namespace ui::presentation_sources -{ - -bool LegacyGpsStatusSource::buildGpsStatusSnapshot(ui::gps::GpsStatusSnapshot& out) const -{ - return runtime_gps_status_source().buildGpsStatusSnapshot(out); -} - -LegacyGpsStatusSource& legacy_gps_status_source() -{ - static LegacyGpsStatusSource source; - return source; -} - -} // namespace ui::presentation_sources diff --git a/modules/ui_shared/src/ui/presentation_sources/legacy_map_action_sink.cpp b/modules/ui_shared/src/ui/presentation_sources/legacy_map_action_sink.cpp deleted file mode 100644 index 7d67af74..00000000 --- a/modules/ui_shared/src/ui/presentation_sources/legacy_map_action_sink.cpp +++ /dev/null @@ -1,67 +0,0 @@ -#include "ui/presentation_sources/legacy_map_action_sink.h" - -namespace ui::presentation_sources -{ - -LegacyMapActionSink::LegacyMapActionSink(ui::gps::IGpsStatusSource& gps_source, - LegacyMapPresentationState& state) - : gps_source_(gps_source), - state_(state) -{ -} - -ui::UiActionResult LegacyMapActionSink::centerOnSelf() -{ - ui::gps::GpsStatusSnapshot gps; - if (!gps_source_.buildGpsStatusSnapshot(gps) || !gps.header.valid || - !gps.fix_valid) - { - return ui::UiActionResult::fail(ui::UiActionFailure::NotReady); - } - - return ui::UiActionResult::success(); -} - -ui::UiActionResult LegacyMapActionSink::setViewport( - const ui::map::MapViewport& viewport) -{ - state_.last_viewport = viewport; - state_.has_viewport = true; - return ui::UiActionResult::success(); -} - -ui::UiActionResult LegacyMapActionSink::setLayer(ui::map::MapLayerKind layer, - bool enabled) -{ - switch (layer) - { - case ui::map::MapLayerKind::Osm: - state_.layers.osm = enabled; - return ui::UiActionResult::success(); - case ui::map::MapLayerKind::Terrain: - state_.layers.terrain = enabled; - return ui::UiActionResult::success(); - case ui::map::MapLayerKind::Satellite: - state_.layers.satellite = enabled; - return ui::UiActionResult::success(); - case ui::map::MapLayerKind::Contour: - state_.layers.contour = enabled; - return ui::UiActionResult::success(); - default: - return ui::UiActionResult::fail(ui::UiActionFailure::Unsupported); - } -} - -ui::UiActionResult LegacyMapActionSink::setActiveTool(ui::map::MapToolKind tool) -{ - state_.active_tool = tool; - return ui::UiActionResult::success(); -} - -ui::UiActionResult LegacyMapActionSink::clearMeasurement() -{ - state_.measurement = ui::map::MeasurementState{}; - return ui::UiActionResult::success(); -} - -} // namespace ui::presentation_sources diff --git a/modules/ui_shared/src/ui/presentation_sources/legacy_map_presentation_source.cpp b/modules/ui_shared/src/ui/presentation_sources/legacy_map_presentation_source.cpp deleted file mode 100644 index 86659d02..00000000 --- a/modules/ui_shared/src/ui/presentation_sources/legacy_map_presentation_source.cpp +++ /dev/null @@ -1,127 +0,0 @@ -#include "ui/presentation_sources/legacy_map_presentation_source.h" - -#include "sys/clock.h" -#include "ui/team_presence/team_presence_model.h" -#include "ui_presentation/common/fixed_text.h" - -namespace ui::presentation_sources -{ -namespace -{ -constexpr uint32_t kMinValidEpoch = 1577836800U; // 2020-01-01 - -uint32_t presenceNowForMember(uint32_t last_seen_s) -{ - if (last_seen_s >= kMinValidEpoch) - { - return sys::epoch_seconds_now(); - } - return sys::uptime_seconds_now(); -} - -void copyStatusLine(const ui::gps::GpsStatusSnapshot& gps, - ui::map::MapWorkspaceSnapshot& out) -{ - if (!gps.header.valid) - { - ui::copyText(out.status_line, "GPS unavailable"); - return; - } - - if (!gps.receiver_enabled) - { - ui::copyText(out.status_line, "GPS off"); - return; - } - - if (!gps.receiver_powered) - { - ui::copyText(out.status_line, "GPS power"); - return; - } - - ui::copyText(out.status_line, gps.fix_valid ? "GPS fix" : "No GPS fix"); -} - -void projectTeamSummary(team::ui::ITeamUiSnapshotStore* store, - ui::map::TeamOverlaySummary& out) -{ - out = ui::map::TeamOverlaySummary{}; - if (store == nullptr) - { - return; - } - - team::ui::TeamUiSnapshot snapshot; - if (!store->load(snapshot) || !snapshot.in_team || !snapshot.has_team_id) - { - return; - } - - out.available = true; - for (const auto& member : snapshot.members) - { - ++out.visible_members; - if (!::ui::team_presence::isTeamMemberOnline(presenceNowForMember(member.last_seen_s), - member.last_seen_s)) - { - ++out.stale_members; - } - } -} - -} // namespace - -LegacyMapPresentationSource::LegacyMapPresentationSource( - ui::gps::IGpsStatusSource& gps_source, - const LegacyMapPresentationState& state, - team::ui::ITeamUiSnapshotStore* team_store) - : gps_source_(gps_source), - state_(state), - team_store_(team_store) -{ -} - -bool LegacyMapPresentationSource::buildMapWorkspaceSnapshot( - const ui::map::MapWorkspaceRequest& request, - ui::map::MapWorkspaceSnapshot& out) const -{ - out = ui::map::MapWorkspaceSnapshot{}; - out.header.valid = true; - out.header.version = 1; - - out.viewport = request.requested_viewport; - out.layers = state_.layers; - out.measurement = state_.measurement; - out.active_tool = request.active_tool; - out.can_zoom_in = state_.can_zoom_in; - out.can_zoom_out = state_.can_zoom_out; - out.can_toggle_layers = state_.can_toggle_layers; - - ui::gps::GpsStatusSnapshot gps; - if (gps_source_.buildGpsStatusSnapshot(gps)) - { - out.self.valid = gps.fix_valid; - out.self.lat = gps.latitude; - out.self.lon = gps.longitude; - out.self.course_deg = gps.course_deg; - out.self.accuracy_m = gps.hdop; - out.can_center_on_self = gps.fix_valid; - copyStatusLine(gps, out); - } - else - { - ui::copyText(out.status_line, "GPS unavailable"); - } - - projectTeamSummary(team_store_, out.team); - return true; -} - -LegacyMapPresentationState& legacy_map_presentation_state() -{ - static LegacyMapPresentationState state; - return state; -} - -} // namespace ui::presentation_sources diff --git a/modules/ui_shared/src/ui/presentation_sources/legacy_mesh_status_source.cpp b/modules/ui_shared/src/ui/presentation_sources/legacy_mesh_status_source.cpp deleted file mode 100644 index e6bcfc36..00000000 --- a/modules/ui_shared/src/ui/presentation_sources/legacy_mesh_status_source.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "ui/presentation_sources/legacy_mesh_status_source.h" - -#include "ui/presentation_sources/runtime_mesh_status_source.h" - -namespace ui::presentation_sources -{ - -bool LegacyMeshStatusSource::buildMeshStatusSnapshot(ui::mesh::MeshStatusSnapshot& out) const -{ - return runtime_mesh_status_source().buildMeshStatusSnapshot(out); -} - -LegacyMeshStatusSource& legacy_mesh_status_source() -{ - static LegacyMeshStatusSource source; - return source; -} - -} // namespace ui::presentation_sources diff --git a/modules/ui_shared/src/ui/presentation_sources/legacy_settings_action_sink.cpp b/modules/ui_shared/src/ui/presentation_sources/legacy_settings_action_sink.cpp deleted file mode 100644 index 2ad5e2e0..00000000 --- a/modules/ui_shared/src/ui/presentation_sources/legacy_settings_action_sink.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "ui/presentation_sources/legacy_settings_action_sink.h" - -#include "ui/presentation_sources/runtime_settings_source.h" - -namespace ui::presentation_sources -{ - -ui::UiActionResult LegacySettingsActionSink::applySetting( - const ui::settings::SettingsPatchView& patch) -{ - return runtime_settings_action_sink().applySetting(patch); -} - -LegacySettingsActionSink& legacy_settings_action_sink() -{ - static LegacySettingsActionSink sink; - return sink; -} - -} // namespace ui::presentation_sources diff --git a/modules/ui_shared/src/ui/presentation_sources/legacy_settings_source.cpp b/modules/ui_shared/src/ui/presentation_sources/legacy_settings_source.cpp deleted file mode 100644 index 7b1598cd..00000000 --- a/modules/ui_shared/src/ui/presentation_sources/legacy_settings_source.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "ui/presentation_sources/legacy_settings_source.h" - -#include "ui/presentation_sources/runtime_settings_source.h" - -namespace ui::presentation_sources -{ - -bool LegacySettingsSource::buildSettingsSnapshot(ui::settings::SettingsSnapshot& out) const -{ - return runtime_settings_source().buildSettingsSnapshot(out); -} - -LegacySettingsSource& legacy_settings_source() -{ - static LegacySettingsSource source; - return source; -} - -} // namespace ui::presentation_sources diff --git a/modules/ui_shared/tests/test_chat_presentation_source.cpp b/modules/ui_shared/tests/test_chat_presentation_source.cpp index 76f44ff7..ea2dae0b 100644 --- a/modules/ui_shared/tests/test_chat_presentation_source.cpp +++ b/modules/ui_shared/tests/test_chat_presentation_source.cpp @@ -6,7 +6,7 @@ #include "chat/usecase/chat_service.h" #include "sys/clock.h" #include "ui/presentation_sources/chat_presentation_source.h" -#include "ui/presentation_sources/legacy_chat_action_sink.h" +#include "ui/presentation_sources/runtime_chat_action_sink.h" #include #include @@ -148,7 +148,7 @@ int main() ::chat::ChatService service(model, mesh, store); ::chat::delivery::ChatDeliveryReadModel delivery_read_model; - ui::presentation_sources::LegacyChatActionSink sink(service); + ui::presentation_sources::RuntimeChatActionSink sink(service); ui::presentation_sources::ChatPresentationSource source( service, nullptr, &delivery_read_model); diff --git a/modules/ui_shared/tests/test_legacy_map_presentation_adapters.cpp b/modules/ui_shared/tests/test_runtime_map_presentation_adapters.cpp similarity index 87% rename from modules/ui_shared/tests/test_legacy_map_presentation_adapters.cpp rename to modules/ui_shared/tests/test_runtime_map_presentation_adapters.cpp index 2a2a8cbe..5ef85944 100644 --- a/modules/ui_shared/tests/test_legacy_map_presentation_adapters.cpp +++ b/modules/ui_shared/tests/test_runtime_map_presentation_adapters.cpp @@ -1,7 +1,6 @@ #include "platform/ui/team_ui_snapshot_store.h" #include "sys/clock.h" -#include "ui/presentation_sources/legacy_map_action_sink.h" -#include "ui/presentation_sources/legacy_map_presentation_source.h" +#include "ui/presentation_sources/runtime_map_workspace_source.h" #include "ui_presentation/common/fixed_text.h" #include @@ -113,16 +112,16 @@ int main() team_store.snapshot.members.push_back(ada); team_store.snapshot.members.push_back(grace); - ui::presentation_sources::LegacyMapPresentationState state; + ui::presentation_sources::RuntimeMapWorkspaceState state; state.layers.osm = true; state.layers.contour = true; state.measurement.active = true; state.measurement.distance_m = 42.0f; - ui::presentation_sources::LegacyMapPresentationSource source(gps, - state, - &team_store); - ui::presentation_sources::LegacyMapActionSink sink(gps, state); + ui::presentation_sources::RuntimeMapWorkspaceSource source(gps, + state, + &team_store); + ui::presentation_sources::RuntimeMapActionSink sink(gps, state); ui::map::MapWorkspaceRequest request; request.requested_viewport = viewport(52.0, -1.0, 12); @@ -132,7 +131,10 @@ int main() assert(source.buildMapWorkspaceSnapshot(request, snapshot)); assert(snapshot.header.valid); assert(snapshot.header.version == 1); - assertViewport(snapshot.viewport, request.requested_viewport); + auto initial_viewport = request.requested_viewport; + initial_viewport.center_lat = gps.snapshot.latitude; + initial_viewport.center_lon = gps.snapshot.longitude; + assertViewport(snapshot.viewport, initial_viewport); assert(snapshot.active_tool == ui::map::MapToolKind::MeasureDistance); assert(snapshot.layers.osm); assert(snapshot.layers.contour); @@ -160,6 +162,9 @@ int main() const auto center = sink.centerOnSelf(); assert(center.ok); + assert(state.has_viewport); + assert(state.last_viewport.center_lat == gps.snapshot.latitude); + assert(state.last_viewport.center_lon == gps.snapshot.longitude); const auto updated_viewport = viewport(53.0, -2.0, 10); assert(sink.setViewport(updated_viewport).ok); diff --git a/platform/linux/uconsole/include/uconsole/uconsole_map_workspace_model.h b/platform/linux/uconsole/include/uconsole/uconsole_map_workspace_model.h index 3a57d77c..b4f50005 100644 --- a/platform/linux/uconsole/include/uconsole/uconsole_map_workspace_model.h +++ b/platform/linux/uconsole/include/uconsole/uconsole_map_workspace_model.h @@ -8,9 +8,8 @@ #include "platform/linux/map_contour_tile_generator.h" #include "platform/linux/map_tile_cache.h" -#include "ui/presentation_sources/legacy_gps_status_source.h" -#include "ui/presentation_sources/legacy_map_action_sink.h" -#include "ui/presentation_sources/legacy_map_presentation_source.h" +#include "ui/presentation_sources/runtime_gps_status_source.h" +#include "ui/presentation_sources/runtime_map_workspace_source.h" #include "ui_presentation/map/map_workspace_model.h" #include "ui_presentation/map/map_workspace_snapshot.h" @@ -168,12 +167,11 @@ class UConsoleMapWorkspaceModel final void clearPersistedManualCenter() const; linux_app::LinuxAppServices& services_; - mutable ::ui::presentation_sources::LegacyGpsStatusSource legacy_gps_source_{}; - mutable ::ui::presentation_sources::LegacyMapPresentationState - legacy_map_state_{}; - mutable ::ui::presentation_sources::LegacyMapPresentationSource - legacy_map_source_; - mutable ::ui::presentation_sources::LegacyMapActionSink legacy_map_sink_; + mutable ::ui::presentation_sources::RuntimeMapWorkspaceState + map_workspace_state_{}; + mutable ::ui::presentation_sources::RuntimeMapWorkspaceSource + map_workspace_source_; + mutable ::ui::presentation_sources::RuntimeMapActionSink map_action_sink_; mutable ::ui::map::MapWorkspaceModel presentation_model_; ::platform::linux_runtime::MapTileCache tile_cache_{}; ::platform::linux_runtime::MapContourTileStore contour_store_{}; diff --git a/platform/linux/uconsole/src/uconsole_map_workspace_model.cpp b/platform/linux/uconsole/src/uconsole_map_workspace_model.cpp index 87597c9e..3a50e9b8 100644 --- a/platform/linux/uconsole/src/uconsole_map_workspace_model.cpp +++ b/platform/linux/uconsole/src/uconsole_map_workspace_model.cpp @@ -251,11 +251,12 @@ void append_projected_node(MapWorkspaceSnapshot& out, UConsoleMapWorkspaceModel::UConsoleMapWorkspaceModel( linux_app::LinuxAppServices& services) : services_(services), - legacy_map_source_(legacy_gps_source_, - legacy_map_state_, - &::team::ui::team_ui_snapshot_store()), - legacy_map_sink_(legacy_gps_source_, legacy_map_state_), - presentation_model_(legacy_map_source_, legacy_map_sink_), + map_workspace_source_(::ui::presentation_sources::runtime_gps_status_source(), + map_workspace_state_, + &::team::ui::team_ui_snapshot_store()), + map_action_sink_(::ui::presentation_sources::runtime_gps_status_source(), + map_workspace_state_), + presentation_model_(map_workspace_source_, map_action_sink_), zoom_(std::clamp( platform::ui::settings_store::get_int(kMapNamespace, kZoomKey, 14), kMinZoom, @@ -308,7 +309,9 @@ MapWorkspaceSnapshot UConsoleMapWorkspaceModel::snapshot() const const bool has_external_source = external_gps_source_configured(); ::ui::gps::GpsStatusSnapshot gps; const bool has_gps_snapshot = - legacy_gps_source_.buildGpsStatusSnapshot(gps) && gps.header.valid; + ::ui::presentation_sources::runtime_gps_status_source() + .buildGpsStatusSnapshot(gps) && + gps.header.valid; out.has_fix = has_external_source && has_gps_snapshot && gps.fix_valid; out.has_center = out.has_fix; out.lat = gps.latitude; @@ -708,13 +711,13 @@ void UConsoleMapWorkspaceModel::syncPresentationWorkspace(double lat, int zoom) const { const auto map_source = source(); - legacy_map_state_.layers.osm = + map_workspace_state_.layers.osm = map_source == ::platform::linux_runtime::MapBaseSource::Osm; - legacy_map_state_.layers.terrain = + map_workspace_state_.layers.terrain = map_source == ::platform::linux_runtime::MapBaseSource::Terrain; - legacy_map_state_.layers.satellite = + map_workspace_state_.layers.satellite = map_source == ::platform::linux_runtime::MapBaseSource::Satellite; - legacy_map_state_.layers.contour = contourEnabled(); + map_workspace_state_.layers.contour = contourEnabled(); ::ui::map::MapViewport viewport; viewport.center_lat = lat; diff --git a/tools/architecture/KNOWN_PRODUCT_ARCHITECTURE_VIOLATIONS.md b/tools/architecture/KNOWN_PRODUCT_ARCHITECTURE_VIOLATIONS.md index 28d25000..323d37fd 100644 --- a/tools/architecture/KNOWN_PRODUCT_ARCHITECTURE_VIOLATIONS.md +++ b/tools/architecture/KNOWN_PRODUCT_ARCHITECTURE_VIOLATIONS.md @@ -196,7 +196,7 @@ Phase 5.6 introduced: - `ui_presentation` chat identity/snapshot/model - `chat_presentation_adapters` mapper - `ChatPresentationSource` -- `LegacyChatActionSink` +- `RuntimeChatActionSink` - partial `ChatUiController` integration Remaining legacy ownership: @@ -230,8 +230,8 @@ Status: known, bounded. Phase 5.7 introduced: - `ui_presentation/map` snapshot/source/sink/model. -- `LegacyMapPresentationSource`. -- `LegacyMapActionSink`. +- `RuntimeMapWorkspaceSource`. +- `RuntimeMapActionSink`. - compact LVGL map runtime consumption of `MapWorkspaceModel`. - uConsole `presentation_workspace` bridge. - ASCII/headless `MapWorkspaceSnapshot` probe. @@ -242,7 +242,7 @@ Migrated surfaces: compact LVGL map runtime. - Center-on-self action now flows through `MapWorkspaceModel` on the compact LVGL map runtime. -- uConsole map center fix projection now consumes `LegacyGpsStatusSource` +- uConsole map center fix projection now consumes `RuntimeGpsStatusSource` rather than including `platform/ui/gps_runtime.h` directly in the map model. - uConsole exposes portable `presentation_workspace` inside its legacy tile/cache map snapshot. diff --git a/tools/architecture/check_phase5_final_ready.py b/tools/architecture/check_phase5_final_ready.py index 2eb36bc2..ca367074 100644 --- a/tools/architecture/check_phase5_final_ready.py +++ b/tools/architecture/check_phase5_final_ready.py @@ -68,12 +68,11 @@ def check_known_domain_files() -> int: "modules/ui_presentation/include/ui_presentation/settings/settings_model.h", "modules/ui_presentation/include/ui_presentation/chat/chat_workspace_model.h", "modules/ui_shared/include/ui/presentation_sources/chat_presentation_source.h", - "modules/ui_shared/include/ui/presentation_sources/legacy_chat_action_sink.h", + "modules/ui_shared/include/ui/presentation_sources/runtime_chat_action_sink.h", "modules/ui_shared/include/ui/presentation_sources/team_chat_presentation_source.h", "modules/ui_shared/include/ui/presentation_sources/team_chat_action_sink.h", "modules/ui_presentation/include/ui_presentation/map/map_workspace_model.h", - "modules/ui_shared/include/ui/presentation_sources/legacy_map_presentation_source.h", - "modules/ui_shared/include/ui/presentation_sources/legacy_map_action_sink.h", + "modules/ui_shared/include/ui/presentation_sources/runtime_map_workspace_source.h", ] failures = 0 diff --git a/tools/architecture/check_phase5_ready.py b/tools/architecture/check_phase5_ready.py index 7cb1db6e..06edeeed 100644 --- a/tools/architecture/check_phase5_ready.py +++ b/tools/architecture/check_phase5_ready.py @@ -44,7 +44,8 @@ def check_required_files() -> int: "modules/ui_shared/include/ui/presentation_sources/chat_presentation_source.h", "modules/ui_shared/src/ui/presentation_sources/chat_presentation_source.cpp", "modules/ui_shared/tests/test_chat_presentation_source.cpp", - "modules/ui_shared/include/ui/presentation_sources/legacy_chat_action_sink.h", + "modules/ui_shared/include/ui/presentation_sources/runtime_chat_action_sink.h", + "modules/ui_shared/src/ui/presentation_sources/runtime_chat_action_sink.cpp", "modules/ui_shared/include/ui/presentation_sources/team_chat_presentation_source.h", "modules/ui_shared/include/ui/presentation_sources/team_chat_action_sink.h", "modules/ui_shared/src/ui/presentation_sources/team_chat_presentation_source.cpp", @@ -61,12 +62,9 @@ def check_required_files() -> int: "modules/ui_presentation/include/ui_presentation/map/map_workspace_model.h", "modules/ui_presentation/src/map/map_workspace_model.cpp", "modules/ui_presentation/tests/test_map_workspace_model.cpp", - "modules/ui_shared/include/ui/presentation_sources/legacy_map_presentation_state.h", - "modules/ui_shared/include/ui/presentation_sources/legacy_map_presentation_source.h", - "modules/ui_shared/include/ui/presentation_sources/legacy_map_action_sink.h", - "modules/ui_shared/src/ui/presentation_sources/legacy_map_presentation_source.cpp", - "modules/ui_shared/src/ui/presentation_sources/legacy_map_action_sink.cpp", - "modules/ui_shared/tests/test_legacy_map_presentation_adapters.cpp", + "modules/ui_shared/include/ui/presentation_sources/runtime_map_workspace_source.h", + "modules/ui_shared/src/ui/presentation_sources/runtime_map_workspace_source.cpp", + "modules/ui_shared/tests/test_runtime_map_presentation_adapters.cpp", "legacy/app_implementations/linux_sim/tests/map_workspace_ascii_probe.cpp", ] @@ -235,10 +233,8 @@ def check_map_presentation_sources_are_bounded() -> int: failures = 0 paths = [ - "modules/ui_shared/include/ui/presentation_sources/legacy_map_presentation_source.h", - "modules/ui_shared/include/ui/presentation_sources/legacy_map_action_sink.h", - "modules/ui_shared/src/ui/presentation_sources/legacy_map_presentation_source.cpp", - "modules/ui_shared/src/ui/presentation_sources/legacy_map_action_sink.cpp", + "modules/ui_shared/include/ui/presentation_sources/runtime_map_workspace_source.h", + "modules/ui_shared/src/ui/presentation_sources/runtime_map_workspace_source.cpp", ] for path in paths: if not exists(path): @@ -248,26 +244,30 @@ def check_map_presentation_sources_are_bounded() -> int: for token in forbidden_tokens: if token in code_text: failures += fail( - f"{path} contains forbidden legacy map adapter token {token}" + f"{path} contains forbidden runtime map adapter token {token}" ) - source = "modules/ui_shared/src/ui/presentation_sources/legacy_map_presentation_source.cpp" + source = "modules/ui_shared/src/ui/presentation_sources/runtime_map_workspace_source.cpp" if exists(source): text = read_text(source) - if "buildMapWorkspaceSnapshot" not in text: - failures += fail("LegacyMapPresentationSource does not build map snapshots") + sink_start = text.find("RuntimeMapActionSink::RuntimeMapActionSink") + source_text = text if sink_start == -1 else text[:sink_start] + if "buildMapWorkspaceSnapshot" not in source_text: + failures += fail("RuntimeMapWorkspaceSource does not build map snapshots") for token in ["setLayer(", "setViewport(", "setActiveTool(", "clearMeasurement("]: - if token in text: - failures += fail(f"LegacyMapPresentationSource contains action token {token}") + if token in source_text: + failures += fail(f"RuntimeMapWorkspaceSource contains action token {token}") - sink = "modules/ui_shared/src/ui/presentation_sources/legacy_map_action_sink.cpp" + sink = "modules/ui_shared/src/ui/presentation_sources/runtime_map_workspace_source.cpp" if exists(sink): text = read_text(sink) - if "MapWorkspaceSnapshot" in text: - failures += fail("LegacyMapActionSink builds or references MapWorkspaceSnapshot") + sink_start = text.find("RuntimeMapActionSink::RuntimeMapActionSink") + sink_text = "" if sink_start == -1 else text[sink_start:] + if "MapWorkspaceSnapshot" in sink_text: + failures += fail("RuntimeMapActionSink builds or references MapWorkspaceSnapshot") for token in ["buildMapWorkspaceSnapshot", "status_line", "TeamOverlaySummary"]: - if token in text: - failures += fail(f"LegacyMapActionSink contains projection token {token}") + if token in sink_text: + failures += fail(f"RuntimeMapActionSink contains projection token {token}") return failures @@ -281,8 +281,8 @@ def check_lvgl_map_surface_uses_workspace_model() -> int: failures = 0 for token in [ "ui_presentation/map/map_workspace_model.h", - "LegacyMapPresentationSource", - "LegacyMapActionSink", + "RuntimeMapWorkspaceSource", + "RuntimeMapActionSink", "map_workspace_model().snapshot()", "map_workspace_model().centerOnSelf()", ]: @@ -304,9 +304,9 @@ def check_uconsole_map_surface_uses_workspace_model() -> int: "ui_presentation/map/map_workspace_model.h", "presentation_workspace", "MapWorkspaceModel presentation_model_", - "LegacyMapPresentationSource", - "LegacyMapActionSink", - "LegacyGpsStatusSource", + "RuntimeMapWorkspaceSource", + "RuntimeMapActionSink", + "runtime_gps_status_source.h", ]: if token not in text: failures += fail(f"uConsole map header missing token: {token}") @@ -317,7 +317,8 @@ def check_uconsole_map_surface_uses_workspace_model() -> int: text = read_text(source) for token in [ "presentation_model_.snapshot()", - "legacy_gps_source_.buildGpsStatusSnapshot", + "runtime_gps_status_source()", + "buildGpsStatusSnapshot(gps)", "syncPresentationWorkspace", ]: if token not in text: diff --git a/tools/architecture/check_phase5_renderer_ready.py b/tools/architecture/check_phase5_renderer_ready.py index f2047003..d02502f8 100644 --- a/tools/architecture/check_phase5_renderer_ready.py +++ b/tools/architecture/check_phase5_renderer_ready.py @@ -159,9 +159,9 @@ def check_chat_presentation_adapters_are_renderer_free() -> int: paths = [ "modules/ui_shared/include/ui/presentation_sources/chat_presentation_source.h", - "modules/ui_shared/include/ui/presentation_sources/legacy_chat_action_sink.h", + "modules/ui_shared/include/ui/presentation_sources/runtime_chat_action_sink.h", "modules/ui_shared/src/ui/presentation_sources/chat_presentation_source.cpp", - "modules/ui_shared/src/ui/presentation_sources/legacy_chat_action_sink.cpp", + "modules/ui_shared/src/ui/presentation_sources/runtime_chat_action_sink.cpp", ] failures = 0 @@ -189,10 +189,8 @@ def check_map_presentation_adapters_are_renderer_free() -> int: ] paths = [ - "modules/ui_shared/include/ui/presentation_sources/legacy_map_presentation_source.h", - "modules/ui_shared/include/ui/presentation_sources/legacy_map_action_sink.h", - "modules/ui_shared/src/ui/presentation_sources/legacy_map_presentation_source.cpp", - "modules/ui_shared/src/ui/presentation_sources/legacy_map_action_sink.cpp", + "modules/ui_shared/include/ui/presentation_sources/runtime_map_workspace_source.h", + "modules/ui_shared/src/ui/presentation_sources/runtime_map_workspace_source.cpp", ] failures = 0 @@ -311,8 +309,8 @@ def check_migrated_map_path_is_locked() -> int: for token in [ "presentation_workspace", "MapWorkspaceModel presentation_model_", - "LegacyMapPresentationSource", - "LegacyMapActionSink", + "RuntimeMapWorkspaceSource", + "RuntimeMapActionSink", ]: if token not in text: failures += fail(f"uConsole map header missing migrated token: {token}") @@ -343,7 +341,7 @@ def check_migrated_dashboard_status_is_locked() -> int: failures = 0 for token in [ "ui_presentation/gps/gps_status_model.h", - "legacy_gps_status_source", + "runtime_gps_status_source", "dashboard_gps_status_model().snapshot()", "status_snapshot.fix_valid", "status_snapshot.fix_label", diff --git a/tools/architecture/check_phase6_composition_ready.py b/tools/architecture/check_phase6_composition_ready.py index 2c2f9bfd..76481376 100644 --- a/tools/architecture/check_phase6_composition_ready.py +++ b/tools/architecture/check_phase6_composition_ready.py @@ -297,7 +297,7 @@ def check_uconsole_root_shape() -> int: "app_services_.chat", "app_services_.contacts", "ChatPresentationSource", - "LegacyChatActionSink", + "RuntimeChatActionSink", "ChatWorkspaceModel", "presentation_.workspace.chat", "presentation_.workspace.map", diff --git a/tools/architecture/check_phase7_runtime_ownership_ready.py b/tools/architecture/check_phase7_runtime_ownership_ready.py index dc4c8b6b..46645b1a 100644 --- a/tools/architecture/check_phase7_runtime_ownership_ready.py +++ b/tools/architecture/check_phase7_runtime_ownership_ready.py @@ -4190,7 +4190,7 @@ def check_team_consumer_shadow_state_closeout() -> int: hostlink_header = "platform/esp/arduino_common/include/platform/esp/arduino_common/hostlink/hostlink_bridge_radio.h" hostlink_source = "platform/esp/arduino_common/src/hostlink/hostlink_bridge_radio.cpp" esp_gps_map = "platform/esp/arduino_common/src/ui/screens/gps/gps_page_map.cpp" - map_source = "modules/ui_shared/src/ui/presentation_sources/legacy_map_presentation_source.cpp" + map_source = "modules/ui_shared/src/ui/presentation_sources/runtime_map_workspace_source.cpp" app_events = "platform/esp/arduino_common/src/app_event_runtime_support.cpp" contacts_header = "modules/ui_shared/include/ui/screens/contacts/contacts_team_snapshot_source.h" contacts_source = "modules/ui_shared/src/ui/screens/contacts/contacts_team_snapshot_source.cpp" @@ -4256,9 +4256,9 @@ def check_team_consumer_shadow_state_closeout() -> int: "ITeamUiSnapshotStore", ]: if token not in text: - failures += fail(f"Legacy map presentation source missing Team presence token: {token}") + failures += fail(f"Runtime map workspace source missing Team presence token: {token}") if "member.online" in text: - failures += fail("Legacy map presentation source still infers liveness from member.online") + failures += fail("Runtime map workspace source still infers liveness from member.online") for path in [contacts_header, contacts_source]: if not exists(path): diff --git a/tools/architecture/phase6_composition_legacy_baseline.json b/tools/architecture/phase6_composition_legacy_baseline.json index 40683c6f..e85cc63c 100644 --- a/tools/architecture/phase6_composition_legacy_baseline.json +++ b/tools/architecture/phase6_composition_legacy_baseline.json @@ -53,30 +53,30 @@ "path": "modules/ui_shared/src/ui/screens/chat/chat_page_runtime.cpp", "allowed_tokens": [ "ChatPresentationSource", - "LegacyChatActionSink", + "RuntimeChatActionSink", "TeamChatPresentationSource", "TeamChatActionSink", "ChatWorkspaceModel" ], - "reason": "Chat page runtime still constructs presentation adapters until the LVGL shell has a full composition binding.", + "reason": "Chat page runtime still constructs runtime presentation adapters until the LVGL shell has a full composition binding.", "future_phase": "lvgl-chat-composition-root" }, { "id": "gps-page-runtime-presentation-bridge", "path": "modules/ui_shared/src/ui/screens/gps/gps_page_runtime.cpp", "allowed_tokens": [ - "LegacyMapPresentationSource", - "LegacyMapActionSink", + "RuntimeMapWorkspaceSource", + "RuntimeMapActionSink", "MapWorkspaceModel" ], - "reason": "GPS page runtime still constructs the map presentation bridge as a legacy renderer island.", + "reason": "GPS page runtime still constructs the map presentation bridge until the LVGL shell has a full composition binding.", "future_phase": "lvgl-map-composition-root" }, { "id": "dashboard-status-widget-bridge", "path": "modules/ui_shared/src/ui/menu/dashboard/dashboard_gps_widget.cpp", "allowed_tokens": [ - "LegacyGpsStatusSource", + "RuntimeGpsStatusSource", "GpsStatusModel" ], "reason": "Dashboard GPS widget is hardened through snapshots but still owns local bridge construction.",