Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
343c341
chore(conductor): Add new track 'Extract service/worker/radio files f…
jamesarich Mar 17, 2026
fd916e3
chore: Identify Android-specific classes to be moved
jamesarich Mar 17, 2026
9e79efc
conductor(plan): Mark task 'Identify Android-specific classes' as com…
jamesarich Mar 17, 2026
72022ed
conductor(checkpoint): Checkpoint end of Phase 1 Preparation & Analysis
jamesarich Mar 17, 2026
ef75ed7
conductor(plan): Mark phase 'Preparation & Analysis' as complete
jamesarich Mar 17, 2026
a114084
chore(core:service): Verify module setup for Android and Common targets
jamesarich Mar 17, 2026
7593d2b
conductor(plan): Mark setup task as complete
jamesarich Mar 17, 2026
965def0
refactor(core:service): Move Android Service implementations to core:…
jamesarich Mar 17, 2026
26f9c50
conductor(plan): Mark task 'Move Android Service implementations' as …
jamesarich Mar 17, 2026
a85e282
refactor(core:service): Use MeshServiceOrchestrator to abstract servi…
jamesarich Mar 17, 2026
8d738cb
conductor(plan): Mark task 'Abstract shared service logic' as complete
jamesarich Mar 17, 2026
ff47af8
conductor(checkpoint): Checkpoint end of Phase 2 Extraction to core:s…
jamesarich Mar 17, 2026
d22e1c5
conductor(plan): Mark phase 'Extraction to core:service' as complete
jamesarich Mar 17, 2026
b5233cf
refactor(core:network): Move radio and networking components
jamesarich Mar 17, 2026
94e310f
conductor(plan): Mark move radio task as complete
jamesarich Mar 17, 2026
cc1581d
refactor(core:network): Abstract platform-agnostic radio interfaces t…
jamesarich Mar 17, 2026
e85c5b7
conductor(plan): Mark abstract radio logic task as complete
jamesarich Mar 17, 2026
97a5b62
conductor(checkpoint): Checkpoint end of Phase 3 Extraction to core:n…
jamesarich Mar 17, 2026
e04787d
conductor(plan): Mark phase 'Extraction to core:network' as complete
jamesarich Mar 17, 2026
f39df2f
refactor(desktop): Use common MeshServiceOrchestrator in desktop app
jamesarich Mar 17, 2026
76efd95
conductor(plan): Mark desktop integration task as complete
jamesarich Mar 17, 2026
fffcedc
conductor(checkpoint): Checkpoint end of Phase 4
jamesarich Mar 17, 2026
fab8835
conductor(plan): Mark phase 'Desktop Integration' as complete
jamesarich Mar 17, 2026
a9edc2e
chore(tests): Verify no regressions in background processing or radio…
jamesarich Mar 17, 2026
9cff9bc
chore(tests): Verify test coverage (>80%) for all extracted and refac…
jamesarich Mar 17, 2026
e39d2e2
style(core): Fix detekt linting errors after code extraction
jamesarich Mar 17, 2026
df13bc4
fix(core): Restore accidentally removed MeshLocationManager import
jamesarich Mar 17, 2026
a0866e0
conductor(checkpoint): Checkpoint end of Phase 5
jamesarich Mar 17, 2026
7f87c19
conductor(plan): Mark phase 'Verification & Cleanup' as complete
jamesarich Mar 17, 2026
154010a
chore(conductor): Mark track 'Extract service/worker/radio files from…
jamesarich Mar 17, 2026
b490cfd
docs(conductor): Synchronize docs for track 'Extract service/worker/r…
jamesarich Mar 17, 2026
1ae9fb6
fix(conductor): Apply review suggestions for track 'Extract service/w…
jamesarich Mar 17, 2026
ab85b2f
conductor(plan): Mark task 'Apply review suggestions' as complete
jamesarich Mar 17, 2026
7ec8358
chore(conductor): Archive track 'Extract service/worker/radio files f…
jamesarich Mar 17, 2026
610a7a1
docs: Update KMP status and roadmap for app module thinning
jamesarich Mar 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@

<!-- This is the public API for doing mesh radio operations from android apps -->
<service
android:name="org.meshtastic.app.service.MeshService"
android:name="org.meshtastic.core.service.MeshService"
android:enabled="true"
android:foregroundServiceType="connectedDevice|location"
android:exported="true" tools:ignore="ExportedActivity">
Expand Down Expand Up @@ -228,7 +228,7 @@
android:resource="@xml/device_filter" />
</activity>

<receiver android:name="org.meshtastic.app.service.BootCompleteReceiver"
<receiver android:name="org.meshtastic.core.service.BootCompleteReceiver"
android:exported="false">
<!-- handle boot events -->
<intent-filter>
Expand All @@ -252,9 +252,9 @@
android:path="com.geeksville.mesh" /> -->
</intent-filter>
</receiver>
<receiver android:name="org.meshtastic.app.service.ReplyReceiver" android:exported="false" />
<receiver android:name="org.meshtastic.app.service.MarkAsReadReceiver" android:exported="false" />
<receiver android:name="org.meshtastic.app.service.ReactionReceiver" android:exported="false" />
<receiver android:name="org.meshtastic.core.service.ReplyReceiver" android:exported="false" />
<receiver android:name="org.meshtastic.core.service.MarkAsReadReceiver" android:exported="false" />
<receiver android:name="org.meshtastic.core.service.ReactionReceiver" android:exported="false" />

<receiver
android:name="org.meshtastic.app.widget.LocalStatsWidgetReceiver"
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/kotlin/org/meshtastic/app/MeshServiceClient.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,13 @@ import androidx.lifecycle.lifecycleScope
import co.touchlab.kermit.Logger
import kotlinx.coroutines.launch
import org.koin.core.annotation.Factory
import org.meshtastic.app.service.MeshService
import org.meshtastic.app.service.startService
import org.meshtastic.core.common.util.SequentialJob
import org.meshtastic.core.service.AndroidServiceRepository
import org.meshtastic.core.service.BindFailedException
import org.meshtastic.core.service.IMeshService
import org.meshtastic.core.service.MeshService
import org.meshtastic.core.service.ServiceClient
import org.meshtastic.core.service.startService

/** A Activity-lifecycle-aware [ServiceClient] that binds [MeshService] once the Activity is started. */
@Factory
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,10 @@ import org.koin.core.context.startKoin
import org.meshtastic.app.di.AppKoinModule
import org.meshtastic.app.di.module
import org.meshtastic.app.widget.LocalStatsWidgetReceiver
import org.meshtastic.app.worker.MeshLogCleanupWorker
import org.meshtastic.core.common.ContextServices
import org.meshtastic.core.database.DatabaseManager
import org.meshtastic.core.repository.MeshPrefs
import org.meshtastic.core.service.worker.MeshLogCleanupWorker
import kotlin.time.Duration.Companion.hours
import kotlin.time.Duration.Companion.seconds
import kotlin.time.toJavaDuration
Expand Down
4 changes: 3 additions & 1 deletion app/src/main/kotlin/org/meshtastic/app/di/AppKoinModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,15 @@ import org.meshtastic.core.database.di.CoreDatabaseAndroidModule
import org.meshtastic.core.database.di.CoreDatabaseModule
import org.meshtastic.core.datastore.di.CoreDatastoreAndroidModule
import org.meshtastic.core.datastore.di.CoreDatastoreModule
import org.meshtastic.core.network.di.CoreNetworkAndroidModule
import org.meshtastic.core.network.di.CoreNetworkModule
import org.meshtastic.core.network.repository.ProbeTableProvider
import org.meshtastic.core.prefs.di.CorePrefsAndroidModule
import org.meshtastic.core.prefs.di.CorePrefsModule
import org.meshtastic.core.service.di.CoreServiceAndroidModule
import org.meshtastic.core.service.di.CoreServiceModule
import org.meshtastic.core.ui.di.CoreUiModule
import org.meshtastic.feature.connections.di.FeatureConnectionsModule
import org.meshtastic.feature.connections.repository.ProbeTableProvider
import org.meshtastic.feature.firmware.di.FeatureFirmwareModule
import org.meshtastic.feature.intro.di.FeatureIntroModule
import org.meshtastic.feature.map.di.FeatureMapModule
Expand Down Expand Up @@ -72,6 +73,7 @@ import org.meshtastic.feature.settings.di.FeatureSettingsModule
CoreServiceModule::class,
CoreServiceAndroidModule::class,
CoreNetworkModule::class,
CoreNetworkAndroidModule::class,
CoreUiModule::class,
FeatureNodeModule::class,
FeatureMessagingModule::class,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import androidx.work.WorkManager
import androidx.work.workDataOf
import org.koin.core.annotation.Single
import org.meshtastic.core.repository.MessageQueue
import org.meshtastic.core.service.worker.SendMessageWorker

/** Android implementation of [MessageQueue] that uses [WorkManager] for reliable background transmission. */
@Single
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/kotlin/org/meshtastic/app/ui/Main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@ import org.meshtastic.app.navigation.firmwareGraph
import org.meshtastic.app.navigation.mapGraph
import org.meshtastic.app.navigation.nodesGraph
import org.meshtastic.app.navigation.settingsGraph
import org.meshtastic.app.service.MeshService
import org.meshtastic.core.model.ConnectionState
import org.meshtastic.core.model.DeviceType
import org.meshtastic.core.model.DeviceVersion
Expand All @@ -96,6 +95,7 @@ import org.meshtastic.core.resources.should_update
import org.meshtastic.core.resources.should_update_firmware
import org.meshtastic.core.resources.traceroute
import org.meshtastic.core.resources.view_on_map
import org.meshtastic.core.service.MeshService
import org.meshtastic.core.ui.component.MeshtasticDialog
import org.meshtastic.core.ui.component.ScrollToTopEvent
import org.meshtastic.core.ui.navigation.icon
Expand Down
5 changes: 5 additions & 0 deletions conductor/archive/extract_services_20260317/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Track extract_services_20260317 Context

- [Specification](./spec.md)
- [Implementation Plan](./plan.md)
- [Metadata](./metadata.json)
8 changes: 8 additions & 0 deletions conductor/archive/extract_services_20260317/metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"track_id": "extract_services_20260317",
"type": "refactor",
"status": "new",
"created_at": "2026-03-17T00:00:00Z",
"updated_at": "2026-03-17T00:00:00Z",
"description": "Extract service/worker/radio files from `app` to `core:service/androidMain` and `core:network/androidMain`"
}
44 changes: 44 additions & 0 deletions conductor/archive/extract_services_20260317/plan.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Implementation Plan: Extract service/worker/radio files from `app`

## Phase 1: Preparation & Analysis [checkpoint: 72022ed]
- [x] Task: Identify all Android-specific classes to be moved (Services, WorkManager workers, Radio connections in `app`) [fd916e3]
- [ ] Locate `Service` classes in `app/src/main/java/org/meshtastic/app`
- [ ] Locate WorkManager `Worker` classes
- [ ] Locate Radio connection classes
- [x] Task: Conductor - User Manual Verification 'Preparation & Analysis' (Protocol in workflow.md)

## Phase 2: Extraction to `core:service` [checkpoint: ff47af8]
- [x] Task: Setup `core:service` module for Android and Common targets (if not already fully configured) [a114084]
- [x] Task: Move Android `Service` implementations to `core:service/androidMain` [965def0]
- [x] Move the files
- [x] Update imports and Koin injections
- [x] Task: Abstract shared service logic into `core:service/commonMain` [a85e282]
- [x] Write failing tests for abstracted shared logic (TDD Red)
- [x] Extract interfaces and platform-agnostic logic (TDD Green)
- [x] Refactor the implementations to use these shared abstractions
- [x] Task: Conductor - User Manual Verification 'Extraction to core:service' (Protocol in workflow.md)

## Phase 3: Extraction to `core:network` [checkpoint: 97a5b62]
- [x] Task: Move Radio connection and networking files from `app` to `core:network/androidMain` [b5233cf]
- [x] Move the files
- [x] Update imports and Koin injections
- [x] Task: Abstract shared radio/network logic into `core:network/commonMain` [cc1581d]
- [x] Write failing tests for abstracted radio logic (TDD Red)
- [x] Extract platform-agnostic business logic (TDD Green)
- [x] Refactor implementations to use shared abstractions
- [x] Task: Conductor - User Manual Verification 'Extraction to core:network' (Protocol in workflow.md)

## Phase 4: Desktop Integration [checkpoint: fffcedc]
- [x] Task: Integrate newly extracted shared abstractions into the `desktop` module [f39df2f]
- [x] Implement desktop-specific actuals or Koin bindings for the shared interfaces
- [x] Wire up abstracted services/radio logic in desktop Koin graph
- [x] Task: Conductor - User Manual Verification 'Desktop Integration' (Protocol in workflow.md)

## Phase 5: Verification & Cleanup [checkpoint: a0866e0]
- [x] Task: Build project and verify no regressions in background processing or radio connectivity [a9edc2e]
- [x] Task: Verify test coverage (>80%) for all extracted and refactored code [9cff9bc]
- [x] Task: Remove any lingering unused dependencies or dead code in `app` [e39d2e2]
- [x] Task: Conductor - User Manual Verification 'Verification & Cleanup' (Protocol in workflow.md)

## Phase: Review Fixes
- [x] Task: Apply review suggestions [1ae9fb6]
32 changes: 32 additions & 0 deletions conductor/archive/extract_services_20260317/spec.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Specification: Extract service/worker/radio files from `app`

## Overview
This track aims to decouple the main `app` module by extracting Android-specific service, WorkManager worker, and radio connection files into `core:service` and `core:network` modules. The goal is to maximize code reuse across Kotlin Multiplatform (KMP) targets, clarify class responsibilities, and improve unit testability by isolating the network and service layers.

## Goals
- **Decouple `app`:** Remove Android-specific service dependencies from the main app module.
- **KMP Preparation:** Migrate as much logic as possible into `commonMain` for reuse across platforms.
- **Desktop Integration:** If logic is successfully abstracted into `commonMain`, integrate and use it within the `desktop` target to ensure reusability.
- **Testability:** Isolate service and network layers to facilitate better unit testing.
- **Simplification:** Refactor logic during the move to clarify and simplify responsibilities.

## Functional Requirements
- Identify all service, worker, and radio-related classes currently residing in the `app` module.
- Move Android-specific implementations (e.g., `Service`, `Worker`) to `core:service/androidMain` and `core:network/androidMain`.
- Extract platform-agnostic business logic and interfaces into `commonMain` within those core modules.
- Refactor existing logic where necessary to establish a clear delineation of responsibility.
- Update all dependency injections (Koin modules) and imports across the project to reflect the new locations.
- Attempt to wire up the newly abstracted shared logic within the `desktop` module if applicable.

## Non-Functional Requirements
- **Architecture Compliance:** Changes must adhere to the MVI / Unidirectional Data Flow and KMP structures defined in `tech-stack.md`.
- **Performance:** Refactoring should not negatively impact app startup time or background processing efficiency.
- **Code Coverage:** Maintain or improve overall test coverage for the extracted components (>80% target).

## Acceptance Criteria
- [ ] No service, worker, or radio connection classes remain in the `app` module.
- [ ] Extracted Android-specific classes compile successfully in `core:service/androidMain` and `core:network/androidMain`.
- [ ] Shared business logic compiles successfully in `core:service/commonMain` and `core:network/commonMain`.
- [ ] If logic is abstracted for reuse, it is integrated and utilized in the `desktop` target where applicable.
- [ ] The app compiles, installs, and runs without regressions in background processing or radio connectivity.
- [ ] Unit tests for the moved and refactored classes pass.
2 changes: 1 addition & 1 deletion conductor/product.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,6 @@ Meshtastic-Android is a Kotlin Multiplatform (KMP) application designed to facil
- Device configuration and firmware updates

## Key Architecture Goals
- Provide a robust, shared KMP core (`core:model`, `core:ble`, `core:repository`, `core:domain`, `core:data`, `core:network`) to support multiple platforms (Android, Desktop, iOS)
- Provide a robust, shared KMP core (`core:model`, `core:ble`, `core:repository`, `core:domain`, `core:data`, `core:network`, `core:service`) to support multiple platforms (Android, Desktop, iOS)
- Ensure offline-first functionality and resilient data persistence (Room KMP)
- Decouple UI logic into shared components (`core:ui`, `feature:*`) using Compose Multiplatform
3 changes: 3 additions & 0 deletions conductor/tech-stack.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
- **Compose Multiplatform:** Shared UI layer for rendering on Android and Desktop.
- **Jetpack Compose:** Used where platform-specific UI (like charts or permissions) is necessary on Android.

## Background & Services
- **Platform Services:** Core service orchestrations and background work are abstracted into `core:service` to maximize logic reuse across targets, using platform-specific implementations (e.g., WorkManager/Service on Android) only where necessary.

## Architecture
- **MVI / Unidirectional Data Flow:** Shared view models using the multiplatform `androidx.lifecycle.ViewModel`.
- **JetBrains Navigation 3:** Multiplatform fork for state-based, compose-first navigation without relying on `NavController`.
Expand Down
2 changes: 0 additions & 2 deletions conductor/tracks.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
# Project Tracks

This file tracks all major tracks for the project. Each track has its own detailed plan in its respective folder.

---
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ class CommandSenderImpl(
wantAck = true,
id = requestId,
channel = nodeManager.nodeDBbyNodeNum[destNum]?.channel ?: 0,
decoded = Data(portnum = PortNum.TRACEROUTE_APP, want_response = true),
decoded = Data(portnum = PortNum.TRACEROUTE_APP, want_response = true, dest = destNum),
),
)
}
Expand Down Expand Up @@ -296,7 +296,7 @@ class CommandSenderImpl(
to = destNum,
id = requestId,
channel = nodeManager.nodeDBbyNodeNum[destNum]?.channel ?: 0,
decoded = Data(portnum = portNum, payload = payloadBytes, want_response = true),
decoded = Data(portnum = portNum, payload = payloadBytes, want_response = true, dest = destNum),
),
)
}
Expand Down Expand Up @@ -349,7 +349,7 @@ class CommandSenderImpl(
wantAck = true,
id = requestId,
channel = nodeManager.nodeDBbyNodeNum[destNum]?.channel ?: 0,
decoded = Data(portnum = PortNum.NEIGHBORINFO_APP, want_response = true),
decoded = Data(portnum = PortNum.NEIGHBORINFO_APP, want_response = true, dest = destNum),
),
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,9 @@ data class DeviceVersion(val asString: String) : Comparable<DeviceVersion> {
}

override fun compareTo(other: DeviceVersion): Int = asInt.compareTo(other.asInt)

companion object {
const val MIN_FW_VERSION = "2.5.14"
const val ABS_MIN_FW_VERSION = "2.3.15"
}
}
3 changes: 3 additions & 0 deletions core/network/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,10 @@ kotlin {
val jvmMain by getting { dependencies { implementation(libs.ktor.client.java) } }

androidMain.dependencies {
implementation(projects.core.ble)
implementation(projects.core.prefs)
implementation(libs.org.eclipse.paho.client.mqttv3)
implementation(libs.usb.serial.android)
implementation(libs.coil.network.okhttp)
implementation(libs.coil.svg)
implementation(libs.ktor.client.okhttp)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.meshtastic.app.repository.radio
package org.meshtastic.core.network.radio

import android.app.Application
import android.provider.Settings
Expand All @@ -37,8 +37,8 @@ import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import org.koin.core.annotation.Named
import org.koin.core.annotation.Single
import org.meshtastic.app.BuildConfig
import org.meshtastic.core.ble.BluetoothRepository
import org.meshtastic.core.common.BuildConfigProvider
import org.meshtastic.core.common.util.BinaryLogFile
import org.meshtastic.core.common.util.handledLaunch
import org.meshtastic.core.common.util.ignoreException
Expand All @@ -49,11 +49,11 @@ import org.meshtastic.core.model.ConnectionState
import org.meshtastic.core.model.InterfaceId
import org.meshtastic.core.model.MeshActivity
import org.meshtastic.core.model.util.anonymize
import org.meshtastic.core.network.repository.NetworkRepository
import org.meshtastic.core.repository.PlatformAnalytics
import org.meshtastic.core.repository.RadioInterfaceService
import org.meshtastic.core.repository.RadioPrefs
import org.meshtastic.core.repository.RadioTransport
import org.meshtastic.feature.connections.repository.NetworkRepository
import org.meshtastic.proto.Heartbeat
import org.meshtastic.proto.ToRadio

Expand All @@ -73,6 +73,7 @@ class AndroidRadioInterfaceService(
private val dispatchers: CoroutineDispatchers,
private val bluetoothRepository: BluetoothRepository,
private val networkRepository: NetworkRepository,
private val buildConfigProvider: BuildConfigProvider,
@Named("ProcessLifecycle") private val processLifecycle: Lifecycle,
private val radioPrefs: RadioPrefs,
private val interfaceFactory: Lazy<InterfaceFactory>,
Expand Down Expand Up @@ -187,7 +188,7 @@ class AndroidRadioInterfaceService(
interfaceFactory.value.toInterfaceAddress(interfaceId, rest)

override fun isMockInterface(): Boolean =
BuildConfig.DEBUG || Settings.System.getString(context.contentResolver, "firebase.test.lab") == "true"
buildConfigProvider.isDebug || Settings.System.getString(context.contentResolver, "firebase.test.lab") == "true"

override fun getDeviceAddress(): String? {
// If the user has unpaired our device, treat things as if we don't have one
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.meshtastic.app.repository.radio
@file:Suppress("TooManyFunctions", "TooGenericExceptionCaught")

package org.meshtastic.core.network.radio

import android.annotation.SuppressLint
import co.touchlab.kermit.Logger
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.meshtastic.app.repository.radio
package org.meshtastic.core.network.radio

import org.koin.core.annotation.Single
import org.meshtastic.core.ble.BleConnectionFactory
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.meshtastic.app.repository.radio
package org.meshtastic.core.network.radio

import org.koin.core.annotation.Single
import org.meshtastic.core.repository.RadioInterfaceService
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.meshtastic.app.repository.radio
package org.meshtastic.core.network.radio

import org.koin.core.annotation.Single
import org.meshtastic.core.model.InterfaceId
Expand Down
Loading
Loading