Files
James Rich 9f028279b9 fix(mirror): honour managed mode on the Debug Panel route
The Debug Panel is the one Settings route deliberately exempt from the
`connected && !isManaged` gate every sibling carries, justified by a comment
saying it "reads app-local logs only". The Mirror tab put an admin write
(set_display_mirror) and arbitrary input injection on that route, so managed
mode - which exists to lock a device out of configuration - was bypassed
entirely.

Enforced in the ViewModel, because the route will not do it: arming,
one-shot frame requests, key, character and touch sends are all refused while
managed. Disarming still goes through, so a stream already running is torn
down when managed mode arrives mid-session.

The UI gates on `active = connected && !managed` rather than offering controls
that silently do nothing, and the RadioConfig comment now says what the route
actually guarantees, since its old wording is what let this through.

MirrorHeaderRow is split out of DisplayMirrorContent, which was at detekt's
LongMethod limit and could not absorb another line.
2026-09-09 11:19:44 -05:00
..

:feature:settings

Overview

The :feature:settings module manages all application and radio-side configurations. This includes user preferences, channel configuration, and advanced radio settings.

Key Components

1. SettingsScreen

The main entry point for application-wide settings.

2. RadioConfigViewModel

Handles the complex logic of reading and writing configuration to the Meshtastic device over the radio link (BLE, USB, or TCP).

3. AboutScreen

Displays what Meshtastic is, a "Need Hardware?" row, version information, and project links.

4. AcknowledgementsScreen

Displays the open-source libraries the app is built on, with their licenses.

Validation Reference

Features

  • Channel Configuration: Manage encryption keys, channel names, and radio frequency settings.
  • Node Database Management: Options to clear or prune the local and remote node databases.
  • App Preferences: Theme selection, unit system (metric/imperial), and notification settings.

Dependency Graph

graph TB
  :feature:settings[settings]:::kmp-feature
  :feature:settings -.-> :core:barcode
  :feature:settings -.-> :core:nfc
  :feature:settings -.-> :core:common
  :feature:settings -.-> :core:data
  :feature:settings -.-> :core:database
  :feature:settings -.-> :core:datastore
  :feature:settings -.-> :core:domain
  :feature:settings -.-> :core:model
  :feature:settings -.-> :core:navigation
  :feature:settings -.-> :core:network
  :feature:settings -.-> :core:repository
  :feature:settings -.-> :core:service
  :feature:settings -.-> :core:resources
  :feature:settings -.-> :core:ui
  :feature:settings -.-> :core:di
  :feature:settings -.-> :core:takserver
  :feature:settings -.-> :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;