Files
Meshtastic-Android/core/model
James Rich 4970e45e14 refactor: Consolidate contact-key parsing into ContactKey
Six call sites hand-rolled the same fragile contact-key parse
(`contactKey[0].digitToIntOrNull()` + `substring(1)`). Move that logic
into the ContactKey value class introduced with this branch:

- Add `channelOrNull: Int?` which preserves the semantically meaningful
  "no leading channel digit == legacy unprefixed DM" signal that the
  existing `channel: Int` collapses to 0. SendMessageUseCase relies on
  this distinction to classify direct messages, so the naive `channel`
  accessor would have been a regression.
- Make `addressString` respect it: returns the whole key when there is
  no channel prefix (matching the old defensive behaviour) instead of
  blindly dropping the first character.

Migrated SendMessageUseCase, BaseMapViewModel, ReplyReceiver, Message,
Contacts, and ContactItem onto the typed accessors. Added ContactKey
unit tests for the prefixed / unprefixed / empty cases.

Also removed a dead empty `companion object` left on DataPacket after
its constants moved to NodeAddress.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-29 09:31:07 -05:00
..

:core:model (Meshtastic Domain Models)

Overview

The :core:model module is a Kotlin Multiplatform (KMP) library containing the domain models and data classes used throughout the application and its API. These models are platform-agnostic and designed to be shared across Android, JVM, and future supported platforms.

Multiplatform Support

Models in this module use the CommonParcelable and CommonParcelize abstractions from :core:common. This allows them to maintain Android Parcelable compatibility (via @Parcelize) while residing in commonMain and remaining accessible to non-Android targets.

Key Models

  • DataPacket: Represents a mesh packet (text, telemetry, etc.).
  • NodeInfo: Contains detailed information about a node (position, SNR, battery, etc.).
  • DeviceHardware: Represents supported Meshtastic hardware devices and their capabilities.
  • Channel: Represents a mesh channel configuration.

Usage

This module is a core dependency of most feature modules.

// In commonMain
implementation(projects.core.model)

Structure

  • commonMain: Contains the majority of domain models and logic.
  • androidMain: Contains Android-specific utilities and implementations for expect declarations.
  • androidUnitTest: Contains unit tests that require Android-specific features (like Parcel testing via Robolectric).

Dependency Graph

graph TB
  :core:model[model]:::kmp-library
  :core:model --> :core:proto
  :core:model --> :core:common
  :core:model --> :core:resources
  :core:model -.-> :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;