Files
James Rich e8b8c4ce7c refactor: finish the Builder rewrite in the Android and flavor source sets
jvmTestClasses only compiles the JVM target, so androidMain, androidHostTest
and the google/fdroid flavor test source sets were never checked. They held
another 22 sites.

Three cases the mechanical pass could not get right on its own:

- AndroidMeshLocationManager constructs the proto through an import alias
  (Position as ProtoPosition), which the type check did not resolve.
- MapView had x?.copy(...), where the safe call covered the whole call. The
  rewrite left ?. guarding only newBuilder(), so .also ran on a nullable
  Builder. The safe calls now chain and the result stays nullable.
- MapNodeClusterItemsTest reads node.copy(user = node.user.copy(...)) where
  the outer receiver is core.model.Node, a hand-written data class, and only
  the inner one is a proto. Restored the outer copy().
2026-09-11 18:03:12 -05:00
..

:androidApp

Overview

The :androidApp module is the entry point for the Meshtastic Android application. It orchestrates the various feature modules, manages global state, and provides the main UI shell.

Key Components

1. MainActivity & Main.kt

The single Activity of the application. It hosts the shared MeshtasticNavDisplay navigation shell and manages the root UI structure (Navigation Bar, Rail, etc.).

2. MeshService

The core background service that manages long-running communication with the mesh radio. While it is declared in the :androidApp manifest for system visibility, its implementation resides in the :core:service module. It runs as a Foreground Service to ensure reliable communication even when the app is in the background.

3. Koin Application

MeshUtilApplication is the Koin entry point, providing the global dependency injection container.

Architecture

The module primarily serves as a "glue" layer, connecting:

  • core:* modules for shared logic.
  • feature:* modules for specific user-facing screens.

Module dependency graph

graph TB
  :androidApp[androidApp]:::android-application
  :androidApp -.-> :baselineprofile
  :androidApp -.-> :feature:map-maplibre
  :androidApp -.-> :feature:map-terrain
  :androidApp -.-> :core:ble
  :androidApp -.-> :core:common
  :androidApp -.-> :core:data
  :androidApp -.-> :core:database
  :androidApp -.-> :core:datastore
  :androidApp -.-> :core:di
  :androidApp -.-> :core:domain
  :androidApp -.-> :core:model
  :androidApp -.-> :core:navigation
  :androidApp -.-> :core:network
  :androidApp -.-> :core:nfc
  :androidApp -.-> :core:prefs
  :androidApp -.-> :core:service
  :androidApp -.-> :core:resources
  :androidApp -.-> :core:ui
  :androidApp -.-> :core:barcode
  :androidApp -.-> :core:takserver
  :androidApp -.-> :feature:intro
  :androidApp -.-> :feature:messaging
  :androidApp -.-> :feature:connections
  :androidApp -.-> :feature:map
  :androidApp -.-> :feature:node
  :androidApp -.-> :feature:settings
  :androidApp -.-> :feature:discovery
  :androidApp -.-> :feature:docs
  :androidApp -.-> :feature:firmware
  :androidApp -.-> :feature:wifi-provision
  :androidApp -.-> :feature:widget
  :androidApp -.-> :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;