Skip to content

Commit 4fb78f2

Browse files
arrange cmp-example to have shared data module
1 parent 2367b25 commit 4fb78f2

12 files changed

Lines changed: 134 additions & 25 deletions

File tree

example-cmp/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
plugins {
22
alias(libs.plugins.jetbrainsCompose) apply false
33
alias(libs.plugins.androidApplication) apply false
4+
alias(libs.plugins.androidLibrary) apply false
45
alias(libs.plugins.kotlinMultiplatform) apply false
56
alias(libs.plugins.kotlinComposeCompiler) apply false
67
alias(libs.plugins.kotlinxSerialization) apply false

example-cmp/composeApp/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ kotlin {
4444
implementation(libs.ktor.client.darwin)
4545
}
4646
commonMain.dependencies {
47+
api(project(":data"))
4748
implementation(compose.runtime)
4849
implementation(compose.foundation)
4950
implementation(compose.material)

example-cmp/composeApp/src/commonMain/kotlin/com/jetbrains/kmpapp/di/Modules.kt

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,11 @@ package com.jetbrains.kmpapp.di
33
import com.jetbrains.kmpapp.native.PlatformComponentB
44
import com.jetbrains.kmpapp.native.PlatformComponentD
55
import com.jetbrains.kmpapp.screens.ViewModelModule
6-
import io.ktor.client.HttpClient
7-
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
8-
import io.ktor.http.ContentType
9-
import io.ktor.serialization.kotlinx.json.json
10-
import kotlinx.serialization.json.Json
116
import org.koin.core.annotation.ComponentScan
127
import org.koin.core.annotation.Factory
138
import org.koin.core.annotation.Module
14-
import org.koin.core.annotation.Single
159
import org.koin.core.scope.Scope
1610

17-
@Module
18-
@ComponentScan("com.jetbrains.kmpapp.data")
19-
class DataModule {
20-
21-
@Single
22-
fun json() = Json { ignoreUnknownKeys = true }
23-
24-
@Single
25-
fun httpClient(json : Json) = HttpClient {
26-
install(ContentNegotiation) {
27-
json(json, contentType = ContentType.Any)
28-
}
29-
}
30-
}
31-
3211
@Module(includes = [DataModule::class,ViewModelModule::class, NativeModuleA::class, NativeModuleB::class, NativeModuleC::class, NativeModuleD::class])
3312
class AppModule
3413

example-cmp/data/build.gradle.kts

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
2+
3+
plugins {
4+
alias(libs.plugins.kotlinMultiplatform)
5+
alias(libs.plugins.androidLibrary)
6+
alias(libs.plugins.kotlinxSerialization)
7+
alias(libs.plugins.ksp)
8+
}
9+
10+
kotlin {
11+
androidTarget {
12+
compilations.all {
13+
kotlinOptions {
14+
jvmTarget = "11"
15+
}
16+
}
17+
}
18+
19+
compilerOptions {
20+
freeCompilerArgs.add("-Xexpect-actual-classes")
21+
}
22+
23+
listOf(
24+
iosX64(),
25+
iosArm64(),
26+
iosSimulatorArm64()
27+
).forEach { iosTarget ->
28+
iosTarget.binaries.framework {
29+
baseName = "ComposeApp"
30+
isStatic = true
31+
}
32+
}
33+
34+
sourceSets {
35+
commonMain.dependencies {
36+
implementation(libs.ktor.client.core)
37+
implementation(libs.ktor.client.content.negotiation)
38+
implementation(libs.ktor.serialization.kotlinx.json)
39+
40+
implementation(libs.koin.core)
41+
api(libs.koin.annotations)
42+
}
43+
}
44+
45+
// KSP Common sourceSet
46+
sourceSets.named("commonMain").configure {
47+
kotlin.srcDir("build/generated/ksp/metadata/commonMain/kotlin")
48+
}
49+
}
50+
51+
// KSP Tasks
52+
dependencies {
53+
add("kspCommonMainMetadata", libs.koin.ksp.compiler)
54+
add("kspAndroid", libs.koin.ksp.compiler)
55+
add("kspIosX64", libs.koin.ksp.compiler)
56+
add("kspIosArm64", libs.koin.ksp.compiler)
57+
add("kspIosSimulatorArm64", libs.koin.ksp.compiler)
58+
}
59+
60+
// KSP Metadata Trigger
61+
project.tasks.withType(KotlinCompilationTask::class.java).configureEach {
62+
if(name != "kspCommonMainKotlinMetadata") {
63+
dependsOn("kspCommonMainKotlinMetadata")
64+
}
65+
}
66+
67+
ksp {
68+
arg("KOIN_CONFIG_CHECK","true")
69+
arg("KOIN_LOG_TIMES","true")
70+
}
71+
72+
android {
73+
namespace = "com.jetbrains.kmpapp.data"
74+
compileSdk = 34
75+
76+
sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
77+
sourceSets["main"].res.srcDirs("src/androidMain/res")
78+
sourceSets["main"].resources.srcDirs("src/commonMain/resources")
79+
80+
defaultConfig {
81+
minSdk = 24
82+
targetSdk = 34
83+
}
84+
packaging {
85+
resources {
86+
excludes += "/META-INF/{AL2.0,LGPL2.1}"
87+
}
88+
}
89+
buildTypes {
90+
getByName("release") {
91+
isMinifyEnabled = false
92+
}
93+
}
94+
compileOptions {
95+
sourceCompatibility = JavaVersion.VERSION_11
96+
targetCompatibility = JavaVersion.VERSION_11
97+
}
98+
dependencies {
99+
debugImplementation(libs.androidx.compose.ui.tooling)
100+
}
101+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
3+
4+
</manifest>

example-cmp/composeApp/src/commonMain/kotlin/com/jetbrains/kmpapp/data/MuseumApi.kt renamed to example-cmp/data/src/commonMain/kotlin/com/jetbrains/kmpapp/data/MuseumApi.kt

File renamed without changes.

example-cmp/composeApp/src/commonMain/kotlin/com/jetbrains/kmpapp/data/MuseumObject.kt renamed to example-cmp/data/src/commonMain/kotlin/com/jetbrains/kmpapp/data/MuseumObject.kt

File renamed without changes.

example-cmp/composeApp/src/commonMain/kotlin/com/jetbrains/kmpapp/data/MuseumRepository.kt renamed to example-cmp/data/src/commonMain/kotlin/com/jetbrains/kmpapp/data/MuseumRepository.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.jetbrains.kmpapp.data
22

3-
import com.jetbrains.kmpapp.native.PlatformComponentA
43
import kotlinx.coroutines.CoroutineScope
54
import kotlinx.coroutines.SupervisorJob
65
import kotlinx.coroutines.flow.Flow
@@ -11,13 +10,11 @@ import org.koin.core.annotation.Single
1110
class MuseumRepository(
1211
private val museumApi: MuseumApi,
1312
private val museumStorage: MuseumStorage,
14-
private val component : PlatformComponentA
1513
) {
1614
private val scope = CoroutineScope(SupervisorJob())
1715

1816
init {
1917
initialize()
20-
component.sayHello()
2118
}
2219

2320
fun initialize() {

example-cmp/composeApp/src/commonMain/kotlin/com/jetbrains/kmpapp/data/MuseumStorage.kt renamed to example-cmp/data/src/commonMain/kotlin/com/jetbrains/kmpapp/data/MuseumStorage.kt

File renamed without changes.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.jetbrains.kmpapp.di
2+
3+
import io.ktor.client.HttpClient
4+
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
5+
import io.ktor.http.ContentType
6+
import io.ktor.serialization.kotlinx.json.json
7+
import kotlinx.serialization.json.Json
8+
import org.koin.core.annotation.ComponentScan
9+
import org.koin.core.annotation.Module
10+
import org.koin.core.annotation.Single
11+
12+
@Module
13+
@ComponentScan("com.jetbrains.kmpapp.data")
14+
class DataModule {
15+
16+
@Single
17+
fun json() = Json { ignoreUnknownKeys = true }
18+
19+
@Single
20+
fun httpClient(json: Json) = HttpClient {
21+
install(ContentNegotiation) {
22+
json(json, contentType = ContentType.Any)
23+
}
24+
}
25+
}

0 commit comments

Comments
 (0)