Manager: validate format (MONO_VLSB only) and geometry (width/height must describe exactly total_size bytes) so malformed device input can't reach aspectRatio and crash; unit tests for reassembly, drops, restarts. AdminController: setDisplayMirror/sendInputEvent become non-suspend immediate sends (teardown-safe, input never queues behind bulk admin) and gain requestDisplayFrame. Mirror tab: render each frame once into a 1:1 ImageBitmap scaled with FilterQuality.None (kills the fractional-scale seams), gate controls on connection state, reset the toggle on disconnect, stop the stream on tab dispose and ViewModel clear, add a one-shot Refresh, inject AdminController/ConnectionStateProvider instead of RadioController. Dispatch: display_frame test coverage incl. revoked-session. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
:core:service
Overview
Targets: Android · JVM (Desktop) · iOS
The :core:service module contains the abstractions and client-side logic for interacting with the main Meshtastic Android Service.
Key Components
1. MeshService
Android foreground service entry point that hosts the orchestrator lifecycle.
2. ServiceRepository
A high-level repository that wraps the service connection and exposes reactive Flows for connection status and data arrival.
3. ConnectionState
Represents the current state of the radio connection (Connected, Disconnected, DeviceSleep, etc.).
4. RadioControllerImpl
The in-process RadioController composition root (Desktop, iOS, and single-process Android). It assembles four focused sub-controllers — AdminControllerImpl, MessagingControllerImpl, NodeControllerImpl, QueryControllerImpl — via Kotlin interface delegation, and owns the cross-cutting concerns (connection state, packet-id, location, device-address switching). Commands are direct suspend calls to CommandSender; admin sends are fire-and-forget (the device is the source of truth). Config writes use the editSettings { } transaction.
Dependency Graph
graph TB
:core:service[service]:::kmp-library
:core:service --> :core:repository
:core:service -.-> :core:common
:core:service -.-> :core:data
:core:service -.-> :core:database
:core:service -.-> :core:di
:core:service -.-> :core:model
:core:service -.-> :core:navigation
:core:service -.-> :core:network
:core:service -.-> :core:ble
:core:service -.-> :core:prefs
:core:service -.-> :core:resources
:core:service -.-> :core:takserver
:core:service -.-> :core:testing
classDef android-application fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000;
classDef android-application-compose fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000;
classDef compose-desktop-application fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000;
classDef android-feature fill:#FFD6A5,stroke:#000,stroke-width:2px,color:#000;
classDef android-library fill:#9BF6FF,stroke:#000,stroke-width:2px,color:#000;
classDef android-library-compose fill:#9BF6FF,stroke:#000,stroke-width:2px,color:#000;
classDef android-test fill:#A0C4FF,stroke:#000,stroke-width:2px,color:#000;
classDef jvm-library fill:#BDB2FF,stroke:#000,stroke-width:2px,color:#000;
classDef kmp-feature fill:#FFD6A5,stroke:#000,stroke-width:2px,color:#000;
classDef kmp-library-compose fill:#FFC1CC,stroke:#000,stroke-width:2px,color:#000;
classDef kmp-library fill:#FFC1CC,stroke:#000,stroke-width:2px,color:#000;
classDef unknown fill:#FFADAD,stroke:#000,stroke-width:2px,color:#000;