mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-05-30 09:37:13 -04:00
3.6 KiB
3.6 KiB
title, nav_order, last_updated, aliases
| title | nav_order | last_updated | aliases | |||
|---|---|---|---|---|---|---|
| Adding a Feature Module | 3 | 2026-05-13 |
|
Adding a Feature Module
Step-by-step guide for creating a new KMP feature module in the Meshtastic project.
1. Create the Module Directory
mkdir -p feature/my-feature/src/{commonMain,commonTest,androidMain,jvmMain,iosMain}/kotlin/org/meshtastic/feature/myfeature
2. Create build.gradle.kts
plugins {
alias(libs.plugins.meshtastic.kmp.feature)
alias(libs.plugins.meshtastic.kotlinx.serialization)
id("meshtastic.kmp.jvm.android")
}
kotlin {
android {
namespace = "org.meshtastic.feature.myfeature"
androidResources.enable = false
}
sourceSets {
commonMain.dependencies {
implementation(projects.core.common)
implementation(projects.core.navigation)
implementation(projects.core.resources)
implementation(projects.core.ui)
implementation(projects.core.di)
}
commonTest.dependencies {
implementation(libs.compose.multiplatform.ui.test)
}
jvmTest.dependencies {
implementation(compose.desktop.currentOs)
}
}
}
3. Register in settings.gradle.kts
Add your module to the main include() block:
include(
// ...existing modules...
":feature:my-feature",
)
4. Create the DI Module
src/commonMain/kotlin/org/meshtastic/feature/myfeature/di/FeatureMyFeatureModule.kt:
package org.meshtastic.feature.myfeature.di
import org.koin.core.annotation.ComponentScan
import org.koin.core.annotation.Module
@Module
@ComponentScan("org.meshtastic.feature.myfeature")
class FeatureMyFeatureModule
5. Register DI in App/Desktop
Add your module to:
app/src/main/kotlin/org/meshtastic/app/di/AppKoinModule.ktdesktop/src/main/kotlin/org/meshtastic/desktop/di/DesktopKoinModule.kt
6. Add Navigation Routes
In core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt:
@Serializable
sealed interface MyFeatureRoute : Route {
@Serializable data object MyFeatureGraph : MyFeatureRoute, Graph
@Serializable data object MyFeatureHome : MyFeatureRoute
}
7. Create Navigation Entries
src/commonMain/kotlin/org/meshtastic/feature/myfeature/navigation/MyFeatureNavigation.kt:
package org.meshtastic.feature.myfeature.navigation
import androidx.navigation3.runtime.EntryProviderScope
import org.meshtastic.core.navigation.MyFeatureRoute
fun EntryProviderScope<*>.myFeatureEntries() {
entry<MyFeatureRoute.MyFeatureHome> {
MyFeatureScreen()
}
}
8. Source Set Guidelines
| Source Set | Contains |
|---|---|
commonMain |
Models, ViewModels, shared UI, DI module, navigation |
androidMain |
Android-specific implementations (e.g., platform APIs) |
jvmMain |
Desktop-specific implementations |
iosMain |
iOS-specific implementations |
commonTest |
Shared unit tests |
9. Testing Expectations
Every feature module should have:
- Unit tests in
commonTestfor business logic - UI tests using
compose-multiplatform-ui-testwhere appropriate - No test dependency on other feature modules
10. Checklist
- Module directory created
build.gradle.ktswith correct plugins and dependencies- Added to
settings.gradle.kts - DI module created with
@ComponentScan - DI module registered in app and desktop roots
- Routes added to
Routes.kt - Navigation entries registered
./gradlew kmpSmokeCompilepasses./gradlew :feature:my-feature:allTestspasses