From 688edf49ecc42cba403463f7938eddd6cdafa066 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Mlynari=C4=8D?= Date: Tue, 2 Sep 2025 12:07:22 +0200 Subject: [PATCH 1/4] Add viewmodel screen for KMP --- kmp/shared/build.gradle.kts | 12 +++++++++--- .../com/example/kmp/snippets/MainScreen.kt | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 kmp/shared/src/androidMain/kotlin/com/example/kmp/snippets/MainScreen.kt diff --git a/kmp/shared/build.gradle.kts b/kmp/shared/build.gradle.kts index ed832cce..81a18a05 100644 --- a/kmp/shared/build.gradle.kts +++ b/kmp/shared/build.gradle.kts @@ -64,9 +64,15 @@ kotlin { androidMain { dependencies { - // Add Android-specific dependencies here. Note that this source set depends on - // commonMain by default and will correctly pull the Android artifacts of any KMP - // dependencies declared in commonMain. + val composeBom = project.dependencies.platform(libs.androidx.compose.bom) + implementation(composeBom) + implementation(libs.androidx.compose.runtime) + implementation(libs.androidx.compose.foundation) + implementation(libs.androidx.compose.foundation.layout) + implementation(libs.androidx.compose.ui.util) + implementation(libs.androidx.compose.material) + implementation(libs.androidx.lifecycle.runtime) + implementation(libs.androidx.lifecycle.viewModelCompose) } } diff --git a/kmp/shared/src/androidMain/kotlin/com/example/kmp/snippets/MainScreen.kt b/kmp/shared/src/androidMain/kotlin/com/example/kmp/snippets/MainScreen.kt new file mode 100644 index 00000000..9d83dade --- /dev/null +++ b/kmp/shared/src/androidMain/kotlin/com/example/kmp/snippets/MainScreen.kt @@ -0,0 +1,18 @@ +package com.example.kmp.snippets + +import androidx.compose.runtime.Composable +import androidx.lifecycle.viewmodel.compose.viewModel + + +// [START android_kmp_viewmodel_screen] +// androidApp/ui/MainScreen.kt + +@Composable +fun MainScreen( + viewModel: MainViewModel = viewModel( + factory = mainViewModelFactory, + ), +) { +// observe the viewModel state +} +// [END android_kmp_viewmodel_screen] From 5e31c077b1597114e2653877c8a43ad36c0b40c3 Mon Sep 17 00:00:00 2001 From: mlykotom <3973717+mlykotom@users.noreply.github.com> Date: Tue, 2 Sep 2025 10:10:04 +0000 Subject: [PATCH 2/4] Apply Spotless --- .../com/example/kmp/snippets/MainScreen.kt | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/kmp/shared/src/androidMain/kotlin/com/example/kmp/snippets/MainScreen.kt b/kmp/shared/src/androidMain/kotlin/com/example/kmp/snippets/MainScreen.kt index 9d83dade..e2757679 100644 --- a/kmp/shared/src/androidMain/kotlin/com/example/kmp/snippets/MainScreen.kt +++ b/kmp/shared/src/androidMain/kotlin/com/example/kmp/snippets/MainScreen.kt @@ -1,9 +1,24 @@ +/* + * Copyright 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.example.kmp.snippets import androidx.compose.runtime.Composable import androidx.lifecycle.viewmodel.compose.viewModel - // [START android_kmp_viewmodel_screen] // androidApp/ui/MainScreen.kt From dcdb45919aa33a79675fc334aa40488edbd71e71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Mlynari=C4=8D?= Date: Wed, 3 Sep 2025 10:07:39 +0200 Subject: [PATCH 3/4] Fix snippets by adding compose compiler --- kmp/shared/build.gradle.kts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kmp/shared/build.gradle.kts b/kmp/shared/build.gradle.kts index 81a18a05..6474fdd1 100644 --- a/kmp/shared/build.gradle.kts +++ b/kmp/shared/build.gradle.kts @@ -2,6 +2,7 @@ plugins { alias(libs.plugins.kotlin.multiplatform) alias(libs.plugins.android.kotlin.multiplatform.library) alias(libs.plugins.android.lint) + alias(libs.plugins.compose.compiler) } kotlin { @@ -67,6 +68,7 @@ kotlin { val composeBom = project.dependencies.platform(libs.androidx.compose.bom) implementation(composeBom) implementation(libs.androidx.compose.runtime) + implementation(libs.androidx.compose.ui) implementation(libs.androidx.compose.foundation) implementation(libs.androidx.compose.foundation.layout) implementation(libs.androidx.compose.ui.util) @@ -94,5 +96,4 @@ kotlin { } } } - } \ No newline at end of file From bb87b5bcf9317a7669ecaa47dd6ae9c77cbcc03f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Mlynari=C4=8D?= Date: Wed, 3 Sep 2025 10:35:38 +0200 Subject: [PATCH 4/4] Add androidApp to prevent Compose issue --- kmp/androidApp/.gitignore | 1 + kmp/androidApp/build.gradle.kts | 58 +++++++++++++++++++ kmp/androidApp/proguard-rules.pro | 21 +++++++ kmp/androidApp/src/main/AndroidManifest.xml | 2 + .../com/example/kmp/snippets/MainScreen.kt | 0 kmp/shared/build.gradle.kts | 21 ++----- settings.gradle.kts | 3 +- 7 files changed, 90 insertions(+), 16 deletions(-) create mode 100644 kmp/androidApp/.gitignore create mode 100644 kmp/androidApp/build.gradle.kts create mode 100644 kmp/androidApp/proguard-rules.pro create mode 100644 kmp/androidApp/src/main/AndroidManifest.xml rename kmp/{shared/src/androidMain => androidApp/src/main}/kotlin/com/example/kmp/snippets/MainScreen.kt (100%) diff --git a/kmp/androidApp/.gitignore b/kmp/androidApp/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/kmp/androidApp/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/kmp/androidApp/build.gradle.kts b/kmp/androidApp/build.gradle.kts new file mode 100644 index 00000000..eedb0b66 --- /dev/null +++ b/kmp/androidApp/build.gradle.kts @@ -0,0 +1,58 @@ +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.compose.compiler) +} + +android { + namespace = "com.example.kmp.snippets" + compileSdk = libs.versions.compileSdk.get().toInt() + + defaultConfig { + applicationId = "com.example.kmp.snippets" + minSdk = libs.versions.minSdk.get().toInt() + targetSdk = libs.versions.targetSdk.get().toInt() + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlin { + jvmToolchain(17) + } + + buildFeatures { + compose = true + } +} + +dependencies { + val composeBom = project.dependencies.platform(libs.androidx.compose.bom) + implementation(composeBom) + implementation(project(":kmp:shared")) + + implementation(libs.androidx.compose.runtime) + implementation(libs.androidx.compose.ui) + implementation(libs.androidx.compose.foundation) + implementation(libs.androidx.compose.foundation.layout) + implementation(libs.androidx.compose.ui.util) + implementation(libs.androidx.compose.material) + implementation(libs.androidx.lifecycle.runtime) + implementation(libs.androidx.lifecycle.viewModelCompose) +} \ No newline at end of file diff --git a/kmp/androidApp/proguard-rules.pro b/kmp/androidApp/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/kmp/androidApp/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/kmp/androidApp/src/main/AndroidManifest.xml b/kmp/androidApp/src/main/AndroidManifest.xml new file mode 100644 index 00000000..de749acb --- /dev/null +++ b/kmp/androidApp/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/kmp/shared/src/androidMain/kotlin/com/example/kmp/snippets/MainScreen.kt b/kmp/androidApp/src/main/kotlin/com/example/kmp/snippets/MainScreen.kt similarity index 100% rename from kmp/shared/src/androidMain/kotlin/com/example/kmp/snippets/MainScreen.kt rename to kmp/androidApp/src/main/kotlin/com/example/kmp/snippets/MainScreen.kt diff --git a/kmp/shared/build.gradle.kts b/kmp/shared/build.gradle.kts index 6474fdd1..2ef25a93 100644 --- a/kmp/shared/build.gradle.kts +++ b/kmp/shared/build.gradle.kts @@ -2,18 +2,16 @@ plugins { alias(libs.plugins.kotlin.multiplatform) alias(libs.plugins.android.kotlin.multiplatform.library) alias(libs.plugins.android.lint) - alias(libs.plugins.compose.compiler) } kotlin { - // Target declarations - add or remove as needed below. These define // which platforms this KMP module supports. // See: https://kotlinlang.org/docs/multiplatform-discover-project.html#targets androidLibrary { - namespace = "com.example.kmp.snippets" - compileSdk = 36 - minSdk = 24 + namespace = "com.example.kmp.snippets.shared" + compileSdk = libs.versions.compileSdk.get().toInt() + minSdk = libs.versions.minSdk.get().toInt() withHostTestBuilder { } @@ -25,6 +23,8 @@ kotlin { } } + jvmToolchain(17) + // For iOS targets, this is also where you should // configure native binary output. For more information, see: // https://kotlinlang.org/docs/multiplatform-build-native-binaries.html#build-xcframeworks @@ -65,16 +65,7 @@ kotlin { androidMain { dependencies { - val composeBom = project.dependencies.platform(libs.androidx.compose.bom) - implementation(composeBom) - implementation(libs.androidx.compose.runtime) - implementation(libs.androidx.compose.ui) - implementation(libs.androidx.compose.foundation) - implementation(libs.androidx.compose.foundation.layout) - implementation(libs.androidx.compose.ui.util) - implementation(libs.androidx.compose.material) - implementation(libs.androidx.lifecycle.runtime) - implementation(libs.androidx.lifecycle.viewModelCompose) + } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 111fd452..2a71512a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -39,5 +39,6 @@ include( ":identity:credentialmanager", ":xr", ":watchfacepush:validator", - ":kmp:shared", + ":kmp:androidApp", + ":kmp:shared" )