mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-03-27 18:21:58 -04:00
8.2 KiB
8.2 KiB
Roadmap
Last updated: 2026-03-17
Forward-looking priorities for the Meshtastic KMP multi-target effort. For current state, see kmp-status.md. For the full gap analysis, see decisions/architecture-review-2026-03.md.
Architecture Health (Immediate)
These items address structural gaps identified in the March 2026 architecture review. They are prerequisites for safe multi-target expansion.
| Item | Impact | Effort | Status |
|---|---|---|---|
Purge java.util.Locale from commonMain (3 files) |
High | Low | ✅ |
Replace ConcurrentHashMap in commonMain (3 files) |
High | Low | ✅ |
Create core:testing shared test fixtures |
Medium | Low | ✅ |
Add feature module commonTest (settings, node, messaging) |
Medium | Medium | ✅ |
Desktop Koin checkModules() integration test |
Medium | Low | ✅ |
| Auto-wire Desktop ViewModels via K2 Compiler (eliminate manual wiring) | Medium | Low | ✅ |
| Migrate to JetBrains Compose Multiplatform dependencies | High | Low | ✅ |
| iOS CI gate (compile-only validation) | High | Medium | ✅ |
Active Work
Desktop Feature Completion (Phase 4)
Objective: Complete desktop wiring for all features and ensure full integration.
Current State (March 2026):
- ✅ Settings: ~35 screens with real configuration, including theme/about parity and desktop language picker support
- ✅ Nodes: Adaptive list-detail with node management
- ✅ Messaging: Adaptive contacts with message view + send
- ✅ Connections: Dynamic discovery of platform-supported transports (TCP, Serial/USB, BLE)
- ❌ Map: Placeholder only, needs MapLibre or alternative
- ⚠️ Firmware: Placeholder wired into nav graph; native DFU not applicable to desktop
- ⚠️ Intro: Onboarding flow (may not apply to desktop)
Implementation Steps:
- Tier 1: Core Wiring (Essential)
- Complete Map integration (MapLibre or equivalent)
- Verify all features accessible via navigation
- Test navigation flows end-to-end
- Tier 2: Polish (High Priority)
- Additional desktop-specific settings polish
- ✅ MenuBar integration and Keyboard shortcuts
- Window management
- State persistence
- Tier 3: Advanced (Nice-to-have)
- Performance optimization
- Advanced map features
- Theme customization
- Multi-window support
| Transport | Platform | Status |
|---|---|---|
| TCP | Desktop (JVM) | ✅ Done — shared StreamFrameCodec + TcpTransport in core:network |
| Serial/USB | Desktop (JVM) | ✅ Done — jSerialComm |
| MQTT | All (KMP) | ✅ Completed — KMQTT in commonMain |
| BLE | Android | ✅ Done — Kable |
| BLE | Desktop | ✅ Done — Kable (JVM) |
| BLE | iOS | ❌ Future — Kable/CoreBluetooth |
Desktop Feature Gaps
| Feature | Status |
|---|---|
| Settings | ✅ ~35 real screens (fully shared) + desktop locale picker with in-place recomposition |
| Node list | ✅ Adaptive list-detail with real NodeDetailContent |
| Messaging | ✅ Adaptive contacts with real message view + send |
| Connections | ✅ Unified shared UI with dynamic transport detection |
| Metrics logs | ✅ TracerouteLog, NeighborInfoLog, HostMetricsLog |
| Map | ❌ Needs MapLibre or equivalent |
| QR Generation | ✅ Pure KMP generation via qrcode-kotlin |
| Charts | ✅ Vico KMP charts wired in commonMain (Device, Environment, Signal, Power, Pax) |
| Debug Panel | ✅ Real screen (mesh log viewer via shared DebugViewModel) |
| Notifications | ✅ Desktop native notifications with system tray icon support |
| MenuBar | ✅ Done — Native application menu bar with File/View menus |
| About | ✅ Shared commonMain screen (AboutLibraries KMP produceLibraries + per-platform JSON) |
| Packaging | ✅ Done — Native distribution pipeline in CI (DMG, MSI, DEB) |
Near-Term Priorities (30 days)
- Evaluate KMP-native testing tools — ✅ Done: Fully evaluated and integrated
Mokkery,Turbine, andKotestacross the KMP modules.mockkhas been successfully replaced, enabling property-based and Flow testing incommonTestfor iOS readiness. - Desktop Map Integration — Address the major Desktop feature gap by implementing a raster map view using MapComposeMP.
- Implement a
MapComposeProviderfor Desktop. - Implement a Web Mercator Projection helper in
feature:map/commonMainto translate GPS coordinates to the 2D image plane. - Leverage the existing
BaseMapViewModelcontract.
- Implement a
- Unify
MapViewModel— Collapse the remaining Google and F-Droid specificMapViewModelclasses in the:appmodule into a singlecommonMainimplementation by isolating platform-specific settings (styles, tile sources) behind a repository interface. - iOS CI gate — ✅ Done: added
iosArm64()/iosSimulatorArm64()to convention plugins and CI.commonMainsuccessfully compiles on iOS.
Medium-Term Priorities (60 days)
- iOS proof target — ✅ Done (Stubbing): Stubbed iOS target implementations (
NoopStubs.ktequivalent) to successfully pass compile-time checks. Next: Setup an Xcode skeleton project and launch the iOS app. core:apicontract split — separate transport-neutral service contracts from the Android AIDL packaging to support iOS/Desktop service layers.- Decouple Firmware DFU —
feature:firmwarerelies on Android-only DFU libraries. Evaluate wrapping this in a shared KMP interface or extracting it to allow the corefeature:firmwaremodule to be utilized on desktop/iOS.
Longer-Term (90+ days)
- Platform-Native UI Interop —
- iOS Maps & Camera: Implement
MapLibreorMKMapViewvia Compose Multiplatform'sUIKitView. LeverageAVCaptureSessionwrapped inUIKitViewto fulfill theLocalBarcodeScannerProvidercontract. - Web (wasmJs) Integrations: Leverage
HtmlViewto embed raw DOM elements (e.g.,<video>,<iframe>, or canvas-based maps) directly into the Compose UI tree while binding the root app viaCanvasBasedWindow.
- iOS Maps & Camera: Implement
- Module maturity dashboard — living inventory of per-module KMP readiness.
- Shared UI vs Shared Logic split — If the iOS target utilizes native SwiftUI instead of Compose Multiplatform, evaluate splitting feature modules into pure
sharedLogic(business rules, ViewModels) andsharedUI(Compose Multiplatform) to prevent dragging Compose dependencies into pure native iOS apps.
Design Principles
- Solve in
commonMainfirst. If it doesn't need platform APIs, it belongs incommonMain. - Interfaces in
commonMain, implementations per-target. The repository pattern is established — extend it. Prefer dependency injection (Koin) with interfaces overexpect/actualdeclarations whenever possible to keep architecture decoupled and highly testable. - UI Interop Strategies. When a Compose Multiplatform equivalent doesn't exist (e.g., Maps, Camera), use standard interop APIs rather than extracting the entire screen to native code. Use
AndroidViewfor Android,UIKitViewfor iOS,SwingPanelfor JVM/Desktop, andHtmlViewfor Web (wasmJs). Always wrap these in a sharedcommonMaininterface contract (likeLocalBarcodeScannerProvider). - Stubs are a valid first implementation. Every target starts with no-op stubs, then graduates to real implementations.
- Feature modules stay target-agnostic in
commonMain. Platform UI goes in platform source sets. Keep the UI layer dumb and rely on shared ViewModels (Unidirectional Data Flow) to drive state. - Transport is a pluggable adapter. BLE, serial, TCP, MQTT all implement
RadioTransportand are orchestrated by a sharedRadioInterfaceService. - CI validates every target. If a module declares
jvm(), CI compiles it. No exceptions. Run tests on appropriate host runners (macOS for iOS, Linux for JVM/Android) to catch platform regressions. - Test in
commonTestfirst. ViewModel and business logic tests belong incommonTestso every target runs them. Use sharedcore:testingutilities to minimize duplication. - Zero Platform Leaks. Never import
java.*orandroid.*insidecommonMain. Use KMP-native alternatives likekotlinx-datetimeandOkio.