From 42a71a431ea848c8bdc57ea4754fef95e659ab02 Mon Sep 17 00:00:00 2001 From: alobynya Date: Mon, 29 Sep 2025 18:14:17 +0700 Subject: [PATCH 01/42] not working --- gradle/moko.versions.toml | 2 +- resources-generator/build.gradle.kts | 19 +++++ samples/android-mpp-app/app/build.gradle.kts | 19 ++++- .../kotlin/com/icerockdev/library/TestRes.kt | 3 + samples/android-mpp-app/build.gradle.kts | 7 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../android-mpp-app/library/build.gradle.kts | 85 +++++++++++++++++++ .../src/androidMain/AndroidManifest.xml | 8 ++ .../com/icerockdev/mpplibrary/TestRes.kt | 11 +++ .../moko-resources/base/strings.xml | 4 + .../commonMain/moko-resources/it/strings.xml | 4 + samples/android-mpp-app/settings.gradle.kts | 3 +- 12 files changed, 160 insertions(+), 7 deletions(-) create mode 100644 samples/android-mpp-app/library/build.gradle.kts create mode 100755 samples/android-mpp-app/library/src/androidMain/AndroidManifest.xml create mode 100644 samples/android-mpp-app/library/src/commonMain/kotlin/com/icerockdev/mpplibrary/TestRes.kt create mode 100644 samples/android-mpp-app/library/src/commonMain/moko-resources/base/strings.xml create mode 100644 samples/android-mpp-app/library/src/commonMain/moko-resources/it/strings.xml diff --git a/gradle/moko.versions.toml b/gradle/moko.versions.toml index c5b145c65..0e6ef849b 100644 --- a/gradle/moko.versions.toml +++ b/gradle/moko.versions.toml @@ -1,5 +1,5 @@ [versions] -resourcesVersion = "0.25.0" +resourcesVersion = "0.26.0" [libraries] resources = { module = "dev.icerock.moko:resources", version.ref = "resourcesVersion" } diff --git a/resources-generator/build.gradle.kts b/resources-generator/build.gradle.kts index fa995aaa2..8f510ddce 100644 --- a/resources-generator/build.gradle.kts +++ b/resources-generator/build.gradle.kts @@ -64,3 +64,22 @@ gradlePlugin { website.set("https://github.com/icerockdev/moko-resources") vcsUrl.set("https://github.com/icerockdev/moko-resources") } + +project.plugins.withId("com.android.kotlin.multiplatform.library") { + val androidComponents = project.extensions.getByType( + com.android.build.api.variant.AndroidComponentsExtension::class.java + ) + + androidComponents.onVariants { variant -> + val capName = variant.name.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } + + // задача генерации создаётся библиотекой/плагином + val generateTask = project.tasks.named("generateMRandroidMain") + + // связываем упаковку ресурсов конкретного варианта с генерацией + project.tasks.matching { it.name == "package${capName}Resources" } + .configureEach { + dependsOn(generateTask) + } + } +} \ No newline at end of file diff --git a/samples/android-mpp-app/app/build.gradle.kts b/samples/android-mpp-app/app/build.gradle.kts index 0ef351c3a..02dafa97e 100644 --- a/samples/android-mpp-app/app/build.gradle.kts +++ b/samples/android-mpp-app/app/build.gradle.kts @@ -13,6 +13,8 @@ android { compileSdk = 33 + flavorDimensions += "type1" // Используйте то же имя измерения, что и в ваших flavors + defaultConfig { minSdk = 16 targetSdk = 33 @@ -25,11 +27,21 @@ android { versionName = "0.1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + + missingDimensionStrategy("type1", "dev") // Если :app собирает dev, и зависимость не имеет type1, используй 'dev' из type1 } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } + productFlavors { + create("dev") { + dimension = "type1" + } + create("prod") { + dimension = "type1" + } + } } kotlin { @@ -38,10 +50,15 @@ kotlin { dependencies { implementation("androidx.appcompat:appcompat:1.6.1") - + implementation(project(":library")) commonMainImplementation(moko.resources) } multiplatformResources { resourcesPackage.set("com.icerockdev.library") } + +tasks.matching { it.name == "packageAndroidMainResources" } + .configureEach { + dependsOn(tasks.named("generateMRandroidMain")) + } \ No newline at end of file diff --git a/samples/android-mpp-app/app/src/commonMain/kotlin/com/icerockdev/library/TestRes.kt b/samples/android-mpp-app/app/src/commonMain/kotlin/com/icerockdev/library/TestRes.kt index 07b1de217..b63c22173 100644 --- a/samples/android-mpp-app/app/src/commonMain/kotlin/com/icerockdev/library/TestRes.kt +++ b/samples/android-mpp-app/app/src/commonMain/kotlin/com/icerockdev/library/TestRes.kt @@ -4,8 +4,11 @@ package com.icerockdev.library +import com.icerockdev.mpplibrary.TestResSecond + object TestRes { fun test() { println(MR.strings.common_name) + TestResSecond.test() } } diff --git a/samples/android-mpp-app/build.gradle.kts b/samples/android-mpp-app/build.gradle.kts index 32282e78f..50538c5ac 100644 --- a/samples/android-mpp-app/build.gradle.kts +++ b/samples/android-mpp-app/build.gradle.kts @@ -4,14 +4,15 @@ buildscript { repositories { + mavenLocal() mavenCentral() google() gradlePluginPortal() - mavenLocal() } dependencies { classpath(moko.resourcesGradlePlugin) - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.25") - classpath("com.android.tools.build:gradle:8.1.0") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:2.1.10") + classpath("com.android.tools.build:gradle:8.11.1") + } } diff --git a/samples/android-mpp-app/gradle/wrapper/gradle-wrapper.properties b/samples/android-mpp-app/gradle/wrapper/gradle-wrapper.properties index 00affbfde..9673b65f2 100755 --- a/samples/android-mpp-app/gradle/wrapper/gradle-wrapper.properties +++ b/samples/android-mpp-app/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ #Wed May 08 12:37:24 KRAT 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/samples/android-mpp-app/library/build.gradle.kts b/samples/android-mpp-app/library/build.gradle.kts new file mode 100644 index 000000000..9ff4ae100 --- /dev/null +++ b/samples/android-mpp-app/library/build.gradle.kts @@ -0,0 +1,85 @@ +import com.android.build.api.variant.AndroidComponentsExtension +import com.android.build.api.variant.KotlinMultiplatformAndroidComponentsExtension +import dev.icerock.gradle.tasks.GenerateMultiplatformResourcesTask + + +/* + * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +plugins { + id("com.android.kotlin.multiplatform.library") + id("org.jetbrains.kotlin.multiplatform") + id("dev.icerock.mobile.multiplatform-resources") +} + +kotlin { + androidLibrary { + namespace = "com.icerockdev.mpplibrary" + compileSdk = 33 + minSdk = 16 + androidResources.enable = true + + withJava() // enable java compilation support + } + + listOf( + iosX64(), + iosArm64(), + iosSimulatorArm64() + ).forEach { iosTarget -> + iosTarget.binaries.framework { + baseName = "Shared" + isStatic = true + } + } +} + +dependencies { + commonMainImplementation(moko.resources) +} + +multiplatformResources { + resourcesPackage.set("com.icerockdev.mpplibrary") +} + +//plugins.withId("com.android.kotlin.multiplatform.library") { +// // Это есть у вас: KotlinMultiplatformAndroidComponentsExtension +// val kmpAndroid = extensions.getByType() +// +// androidComponents.onVariants { variant -> +// val capName = variant.name.replaceFirstChar { +// if (it.isLowerCase()) it.titlecase() else it.toString() +// } +// +// val generateTask = project.tasks.named("generateMR${variant.name}") +// +// // Provider — не разворачиваем +// val resDir: Provider = generateTask.flatMap { +// (it as dev.icerock.gradle.tasks.GenerateMultiplatformResourcesTask).outputResourcesDir +// } +// +// // addStaticSourceDirectory(String) — подаём Provider +// val resPath: Provider = resDir.map { it.asFile.absolutePath } +// variant.sources.res?.addStaticSourceDirectory(resPath.a) +// +// // Связь тасок — провайдер не разворачиваем +// project.tasks.named("merge${capName}Resources").configure { +// dependsOn(generateTask) +// inputs.dir(resDir) // ок, Provider +// } +// project.tasks.matching { it.name == "package${capName}Resources" }.configureEach { +// dependsOn(generateTask) +// inputs.dir(resDir) +// } +// } +//} + +tasks.matching { it.name == "packageAndroidMainResources" } + .configureEach { + dependsOn(tasks.named("generateMRandroidMain")) + } +tasks.matching { it.name == "mergeAndroidMainAssets" } + .configureEach { + dependsOn(tasks.named("generateMRandroidMain")) + } \ No newline at end of file diff --git a/samples/android-mpp-app/library/src/androidMain/AndroidManifest.xml b/samples/android-mpp-app/library/src/androidMain/AndroidManifest.xml new file mode 100755 index 000000000..34d60dfa5 --- /dev/null +++ b/samples/android-mpp-app/library/src/androidMain/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + + + + diff --git a/samples/android-mpp-app/library/src/commonMain/kotlin/com/icerockdev/mpplibrary/TestRes.kt b/samples/android-mpp-app/library/src/commonMain/kotlin/com/icerockdev/mpplibrary/TestRes.kt new file mode 100644 index 000000000..bf4b03362 --- /dev/null +++ b/samples/android-mpp-app/library/src/commonMain/kotlin/com/icerockdev/mpplibrary/TestRes.kt @@ -0,0 +1,11 @@ +/* + * Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +package com.icerockdev.mpplibrary + +object TestResSecond { + fun test() { + println(MR.strings.common_name_new) + } +} diff --git a/samples/android-mpp-app/library/src/commonMain/moko-resources/base/strings.xml b/samples/android-mpp-app/library/src/commonMain/moko-resources/base/strings.xml new file mode 100644 index 000000000..aa9c614d5 --- /dev/null +++ b/samples/android-mpp-app/library/src/commonMain/moko-resources/base/strings.xml @@ -0,0 +1,4 @@ + + + Test Project + \ No newline at end of file diff --git a/samples/android-mpp-app/library/src/commonMain/moko-resources/it/strings.xml b/samples/android-mpp-app/library/src/commonMain/moko-resources/it/strings.xml new file mode 100644 index 000000000..d1b7e2c37 --- /dev/null +++ b/samples/android-mpp-app/library/src/commonMain/moko-resources/it/strings.xml @@ -0,0 +1,4 @@ + + + Old String + \ No newline at end of file diff --git a/samples/android-mpp-app/settings.gradle.kts b/samples/android-mpp-app/settings.gradle.kts index f11d63020..98df174f9 100644 --- a/samples/android-mpp-app/settings.gradle.kts +++ b/samples/android-mpp-app/settings.gradle.kts @@ -4,9 +4,9 @@ dependencyResolutionManagement { repositories { + mavenLocal() mavenCentral() google() - mavenLocal() } versionCatalogs { create("moko") { @@ -16,3 +16,4 @@ dependencyResolutionManagement { } include(":app") +include(":library") From aab9cff88a0d6590bc8c4a7125188f70ffcde91e Mon Sep 17 00:00:00 2001 From: alobynya Date: Wed, 15 Oct 2025 14:04:53 +0700 Subject: [PATCH 02/42] MOKO-1958 add KotlinMultiplatformAndroidLibraryTarget --- gradle.properties | 2 +- gradle/libs.versions.toml | 7 +- gradle/wrapper/gradle-wrapper.properties | 2 +- resources-compose/build.gradle.kts | 1 + .../gradle/MultiplatformResourcesPlugin.kt | 10 +- .../gradle/extra/mokoResourcesGenTask.kt | 6 +- .../platform/android/SetupAndroidUtils.kt | 102 +++++++++++++----- .../dev/icerock/gradle/utils/ProjectExt.kt | 23 +++- samples/android-mpp-app/app/build.gradle.kts | 8 +- .../kotlin/com/icerockdev/mpp/MainActivity.kt | 6 +- .../kotlin/com/icerockdev/library/TestRes.kt | 2 +- .../android-mpp-app/library/build.gradle.kts | 67 ++++-------- .../src/androidMain/AndroidManifest.xml | 5 +- .../src/androidMain/res/values/strings.xml | 8 ++ 14 files changed, 157 insertions(+), 92 deletions(-) create mode 100644 samples/android-mpp-app/library/src/androidMain/res/values/strings.xml diff --git a/gradle.properties b/gradle.properties index 8ee9c08ce..330767056 100755 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ org.gradle.jvmargs=-Xmx12g org.gradle.parallel=true -org.gradle.caching=true +org.gradle.caching=false kotlin.code.style=official diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6139bb42c..6d0185ab4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] -kotlinVersion = "1.9.25" -androidGradleVersion = "8.1.4" +kotlinVersion = "2.2.10" +androidGradleVersion = "8.12.0" androidSdkCommonVersion = "31.1.2" # kotlinx @@ -63,3 +63,6 @@ detektGradlePlugin = { module = "io.gitlab.arturbosch.detekt:detekt-gradle-plugi mokoMultiplatformPlugin = { module = "dev.icerock:mobile-multiplatform", version.ref = "mokoMultiplatformPluginVersion" } composeJetBrainsPlugin = { module = "org.jetbrains.compose:compose-gradle-plugin", version.ref = "composeJetbrainsVersion" } nexusPublishing = { module = "io.github.gradle-nexus:publish-plugin", version = "2.0.0" } + +[plugins] +composeCompiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlinVersion" } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d99d8671b..4dba919db 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ #Tue Jul 25 10:40:31 NOVT 2023 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/resources-compose/build.gradle.kts b/resources-compose/build.gradle.kts index 58aa3c595..2f60d621d 100644 --- a/resources-compose/build.gradle.kts +++ b/resources-compose/build.gradle.kts @@ -13,6 +13,7 @@ plugins { id("org.jetbrains.compose") id("javadoc-stub-convention") id("publication-convention") + alias(libs.plugins.composeCompiler) } android { diff --git a/resources-generator/src/main/kotlin/dev/icerock/gradle/MultiplatformResourcesPlugin.kt b/resources-generator/src/main/kotlin/dev/icerock/gradle/MultiplatformResourcesPlugin.kt index 05388001d..af86638e4 100644 --- a/resources-generator/src/main/kotlin/dev/icerock/gradle/MultiplatformResourcesPlugin.kt +++ b/resources-generator/src/main/kotlin/dev/icerock/gradle/MultiplatformResourcesPlugin.kt @@ -5,6 +5,7 @@ package dev.icerock.gradle import com.android.build.api.dsl.AndroidSourceSet +import com.android.build.api.dsl.KotlinMultiplatformAndroidLibraryTarget import dev.icerock.gradle.extra.getOrRegisterGenerateResourcesTask import dev.icerock.gradle.generator.platform.android.getAndroidSourceSetOrNull import dev.icerock.gradle.generator.platform.android.setupAndroidTasks @@ -34,6 +35,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget +import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile @@ -96,7 +98,7 @@ open class MultiplatformResourcesPlugin : Plugin { sourceSet.getOrRegisterGenerateResourcesTask(mrExtension) genTaskProvider.configure { - it.platformType.set(target.platformType.name) + it.platformType.set(target.getPlatformType()) if (target is KotlinNativeTarget) { it.konanTarget.set(target.konanTarget.name) @@ -205,3 +207,9 @@ open class MultiplatformResourcesPlugin : Plugin { } } } + +fun KotlinTarget.getPlatformType(): String = if (this is KotlinMultiplatformAndroidLibraryTarget){ + KotlinPlatformType.androidJvm.name +} else { + platformType.name +} \ No newline at end of file diff --git a/resources-generator/src/main/kotlin/dev/icerock/gradle/extra/mokoResourcesGenTask.kt b/resources-generator/src/main/kotlin/dev/icerock/gradle/extra/mokoResourcesGenTask.kt index 6b324abc1..8e4e0931c 100644 --- a/resources-generator/src/main/kotlin/dev/icerock/gradle/extra/mokoResourcesGenTask.kt +++ b/resources-generator/src/main/kotlin/dev/icerock/gradle/extra/mokoResourcesGenTask.kt @@ -112,9 +112,13 @@ private fun registerGenerateTask( val platform: String = task.platformType.get() if (platform != KotlinPlatformType.androidJvm.name) return@onlyIf true - + try { val flavor: String = task.androidSourceSetName.get() flavor in listOf("main", "test", "androidTest") + } catch (exception: Exception){ + project.logger.warn(" flavor check error $exception") + true + } } } diff --git a/resources-generator/src/main/kotlin/dev/icerock/gradle/generator/platform/android/SetupAndroidUtils.kt b/resources-generator/src/main/kotlin/dev/icerock/gradle/generator/platform/android/SetupAndroidUtils.kt index 7ce37a4d1..0ce8fd1bc 100644 --- a/resources-generator/src/main/kotlin/dev/icerock/gradle/generator/platform/android/SetupAndroidUtils.kt +++ b/resources-generator/src/main/kotlin/dev/icerock/gradle/generator/platform/android/SetupAndroidUtils.kt @@ -5,8 +5,11 @@ package dev.icerock.gradle.generator.platform.android import com.android.build.api.dsl.AndroidSourceSet +import com.android.build.api.dsl.KotlinMultiplatformAndroidLibraryTarget +import com.android.build.api.extension.impl.CurrentAndroidGradlePluginVersion import com.android.build.api.variant.AndroidComponentsExtension import com.android.build.api.variant.ApplicationAndroidComponentsExtension +import com.android.build.api.variant.KotlinMultiplatformAndroidComponentsExtension import com.android.build.api.variant.LibraryAndroidComponentsExtension import com.android.build.api.variant.Sources import com.android.build.api.variant.Variant @@ -19,13 +22,17 @@ import org.gradle.api.tasks.TaskProvider import org.gradle.kotlin.dsl.extra import org.gradle.kotlin.dsl.findByType import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi +import org.jetbrains.kotlin.gradle.InternalKotlinGradlePluginApi +import org.jetbrains.kotlin.gradle.plugin.AndroidGradlePluginVersion import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation import org.jetbrains.kotlin.gradle.plugin.sources.android.androidSourceSetInfoOrNull import org.jetbrains.kotlin.gradle.plugin.sources.android.findAndroidSourceSet +import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget private const val VARIANTS_EXTRA_NAME = "dev.icerock.moko.resources.android-variants" @@ -36,40 +43,73 @@ internal fun setupAndroidTasks( genTaskProvider: TaskProvider, compilation: KotlinCompilation<*>, ) { - if (target !is KotlinAndroidTarget) return + if (target is KotlinAndroidTarget) { + compilation as KotlinJvmAndroidCompilation - compilation as KotlinJvmAndroidCompilation + val project: Project = target.project - val project: Project = target.project + val androidSourceSet: AndroidSourceSet = project.findAndroidSourceSet(sourceSet) + ?: throw GradleException("can't find android source set for $sourceSet") - val androidSourceSet: AndroidSourceSet = project.findAndroidSourceSet(sourceSet) - ?: throw GradleException("can't find android source set for $sourceSet") + // save android sourceSet name to skip build type specific tasks + @Suppress("UnstableApiUsage") + genTaskProvider.configure { it.androidSourceSetName.set(androidSourceSet.name) } - // save android sourceSet name to skip build type specific tasks - @Suppress("UnstableApiUsage") - genTaskProvider.configure { it.androidSourceSetName.set(androidSourceSet.name) } + // connect generateMR task with android tasks + val androidVariants: NamedDomainObjectContainer = project.extra + .get(VARIANTS_EXTRA_NAME) as NamedDomainObjectContainer - // connect generateMR task with android tasks - val androidVariants: NamedDomainObjectContainer = project.extra - .get(VARIANTS_EXTRA_NAME) as NamedDomainObjectContainer + androidVariants + .configureEach { variant -> + if (variant.name == compilation.name) { + variant.sources.addGenerationTaskDependency(genTaskProvider) + } - androidVariants - .configureEach { variant -> - if (variant.name == compilation.name) { - variant.sources.addGenerationTaskDependency(genTaskProvider) + variant.nestedComponents.forEach { component -> + if (component.name == compilation.name) { + component.sources.addGenerationTaskDependency(genTaskProvider) + } + } } - variant.nestedComponents.forEach { component -> - if (component.name == compilation.name) { - component.sources.addGenerationTaskDependency(genTaskProvider) - } + // to fix issues with android lint - depends on preBuild + project.tasks + .matching { it.name == "preBuild" } + .configureEach { it.dependsOn(genTaskProvider) } + } + if (target is KotlinMultiplatformAndroidLibraryTarget) { + val project: Project = target.project + project.isAgpVersionGreaterOrEqual(1, 10) + project.extensions.extensionsSchema.forEach { + project.logger.warn("project.extensions name=${it.name}") + } + val componentsExtension = + project.extensions.findByType() + val androidExtension = + project.extensions.getByName("androidComponents") as KotlinMultiplatformAndroidComponentsExtension + project.logger.warn("componentsExtension: $componentsExtension") + androidExtension.onVariants { variant -> + project.logger.warn("componentsExtension.onVariants: ${variant.name}") + + // 3. У варианта есть доступ к его source-set'ам! + // variant.sources - это объект типа Sources, который нам и нужен. + val androidSources = variant.sources + androidSources.addGenerationTaskDependency(genTaskProvider) + project.logger.warn("nestedComponents size: ${ variant.nestedComponents.size}") + variant.sources.addGenerationTaskDependency(genTaskProvider) + try { + // Используем имя варианта, оно совпадает с именем sourceSet + genTaskProvider.configure { it.androidSourceSetName.set(variant.name) } + project.logger.warn("genTaskProvider.configure: ${variant.name}") + } catch (exception: Exception) { + target.project.logger.warn("androidJvm: error configure genTaskProvider $exception") } } - - // to fix issues with android lint - depends on preBuild - project.tasks - .matching { it.name == "preBuild" } - .configureEach { it.dependsOn(genTaskProvider) } + // to fix issues with android lint - depends on preBuild + project.tasks + .matching { it.name == "preBuild" } + .configureEach { it.dependsOn(genTaskProvider) } + } } internal fun Sources.addGenerationTaskDependency(provider: TaskProvider) { @@ -97,7 +137,8 @@ internal fun Sources.addGenerationTaskDependency(provider: TaskProvider = @@ -108,6 +149,7 @@ internal fun setupAndroidVariantsSync(project: Project) { val componentsExtension: AndroidComponentsExtension<*, *, *> = project.extensions .findByType() ?: project.extensions.findByType() + ?: project.extensions.findByType(AndroidComponentsExtension::class.java) ?: error("can't find AndroidComponentsExtension") componentsExtension.onVariants { variant: Variant -> @@ -128,3 +170,13 @@ internal fun Project.getAndroidSourceSetOrNull(kotlinSourceSet: KotlinSourceSet) val android = extensions.findByType() ?: return null return android.sourceSets.getByName(androidSourceSetInfo.androidSourceSetName) } + +// Можно добавить этот код в конец файла SetupAndroidUtils.kt + +// В файле SetupAndroidUtils.kt + +private fun Project.isAgpVersionGreaterOrEqual(major: Int, minor: Int): Boolean { + var agpVersion: String? = null + logger.warn("MokoResources: AndroidGradlePluginVersion ${CurrentAndroidGradlePluginVersion.CURRENT_AGP_VERSION}") + return true +} diff --git a/resources-generator/src/main/kotlin/dev/icerock/gradle/utils/ProjectExt.kt b/resources-generator/src/main/kotlin/dev/icerock/gradle/utils/ProjectExt.kt index 9e43361e2..8768fa810 100644 --- a/resources-generator/src/main/kotlin/dev/icerock/gradle/utils/ProjectExt.kt +++ b/resources-generator/src/main/kotlin/dev/icerock/gradle/utils/ProjectExt.kt @@ -4,12 +4,16 @@ package dev.icerock.gradle.utils +import com.android.build.api.dsl.KotlinMultiplatformAndroidLibraryExtension +import com.android.build.api.variant.AndroidComponents +import com.android.build.api.variant.AndroidComponentsExtension import com.android.build.gradle.BaseExtension import com.android.build.gradle.api.AndroidSourceSet import org.gradle.api.Project import org.gradle.api.provider.Provider import org.gradle.api.tasks.SourceSet import org.gradle.kotlin.dsl.findByType +import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension import org.w3c.dom.Document import org.w3c.dom.Node import org.w3c.dom.NodeList @@ -23,12 +27,23 @@ internal fun Project.getAndroidRClassPackage(): Provider { // it's required to support gradle projects without android target val isAndroidEnabled = listOf( "com.android.library", - "com.android.application" + "com.android.application", + "com.android.kotlin.multiplatform.library" ).any { project.plugins.findPlugin(it) != null } - if (!isAndroidEnabled) return@provider null - + if (!isAndroidEnabled) return@provider "android not enabled" + // TODO ADD IF ELSE + val newAndroidExtension: KotlinProjectExtension? = + project.extensions.findByType() + project.logger.warn("newAndroidExtension name=${newAndroidExtension}") + val newExtension: KotlinMultiplatformAndroidLibraryExtension? = + newAndroidExtension?.extensions?.findByType() + project.logger.warn("newAndroidExtension name=${newExtension?.namespace}") + if(newExtension!=null){ + return@provider newExtension.namespace + } val androidExt: BaseExtension = project.extensions.findByType() - ?: return@provider null + ?: return@provider "androidExt not found" + androidExt.namespace ?: getAndroidPackage(androidExt.mainSourceSet.manifest.srcFile) } } diff --git a/samples/android-mpp-app/app/build.gradle.kts b/samples/android-mpp-app/app/build.gradle.kts index 02dafa97e..1ecaa5abe 100644 --- a/samples/android-mpp-app/app/build.gradle.kts +++ b/samples/android-mpp-app/app/build.gradle.kts @@ -5,7 +5,7 @@ plugins { id("com.android.application") id("org.jetbrains.kotlin.multiplatform") - id("dev.icerock.mobile.multiplatform-resources") + // id("dev.icerock.mobile.multiplatform-resources") } android { @@ -54,9 +54,9 @@ dependencies { commonMainImplementation(moko.resources) } -multiplatformResources { - resourcesPackage.set("com.icerockdev.library") -} +//multiplatformResources { +// resourcesPackage.set("com.icerockdev.library") +//} tasks.matching { it.name == "packageAndroidMainResources" } .configureEach { diff --git a/samples/android-mpp-app/app/src/androidMain/kotlin/com/icerockdev/mpp/MainActivity.kt b/samples/android-mpp-app/app/src/androidMain/kotlin/com/icerockdev/mpp/MainActivity.kt index 5ce14f92c..4f9c43e8d 100755 --- a/samples/android-mpp-app/app/src/androidMain/kotlin/com/icerockdev/mpp/MainActivity.kt +++ b/samples/android-mpp-app/app/src/androidMain/kotlin/com/icerockdev/mpp/MainActivity.kt @@ -6,13 +6,13 @@ package com.icerockdev.mpp import android.os.Bundle import androidx.appcompat.app.AppCompatActivity -import com.icerockdev.library.TestRes +import com.icerockdev.mpplibrary.R class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - - TestRes.test() + val text = R.string.app_test + // TestRes.test() } } diff --git a/samples/android-mpp-app/app/src/commonMain/kotlin/com/icerockdev/library/TestRes.kt b/samples/android-mpp-app/app/src/commonMain/kotlin/com/icerockdev/library/TestRes.kt index b63c22173..877090862 100644 --- a/samples/android-mpp-app/app/src/commonMain/kotlin/com/icerockdev/library/TestRes.kt +++ b/samples/android-mpp-app/app/src/commonMain/kotlin/com/icerockdev/library/TestRes.kt @@ -8,7 +8,7 @@ import com.icerockdev.mpplibrary.TestResSecond object TestRes { fun test() { - println(MR.strings.common_name) + // println(MR.strings.common_name) TestResSecond.test() } } diff --git a/samples/android-mpp-app/library/build.gradle.kts b/samples/android-mpp-app/library/build.gradle.kts index 9ff4ae100..f742a6704 100644 --- a/samples/android-mpp-app/library/build.gradle.kts +++ b/samples/android-mpp-app/library/build.gradle.kts @@ -1,26 +1,42 @@ -import com.android.build.api.variant.AndroidComponentsExtension import com.android.build.api.variant.KotlinMultiplatformAndroidComponentsExtension -import dev.icerock.gradle.tasks.GenerateMultiplatformResourcesTask - /* * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. */ plugins { + // id("com.android.library") id("com.android.kotlin.multiplatform.library") id("org.jetbrains.kotlin.multiplatform") id("dev.icerock.mobile.multiplatform-resources") } +//android { +// namespace = "com.icerockdev.mpplibrary" +// +// compileSdk = 33 +// +// defaultConfig { +// minSdk = 16 +// targetSdk = 33 +// } +// +// compileOptions { +// sourceCompatibility = JavaVersion.VERSION_17 +// targetCompatibility = JavaVersion.VERSION_17 +// } +//} + + kotlin { + // androidTarget() + jvm() + androidLibrary { namespace = "com.icerockdev.mpplibrary" compileSdk = 33 minSdk = 16 androidResources.enable = true - - withJava() // enable java compilation support } listOf( @@ -42,44 +58,3 @@ dependencies { multiplatformResources { resourcesPackage.set("com.icerockdev.mpplibrary") } - -//plugins.withId("com.android.kotlin.multiplatform.library") { -// // Это есть у вас: KotlinMultiplatformAndroidComponentsExtension -// val kmpAndroid = extensions.getByType() -// -// androidComponents.onVariants { variant -> -// val capName = variant.name.replaceFirstChar { -// if (it.isLowerCase()) it.titlecase() else it.toString() -// } -// -// val generateTask = project.tasks.named("generateMR${variant.name}") -// -// // Provider — не разворачиваем -// val resDir: Provider = generateTask.flatMap { -// (it as dev.icerock.gradle.tasks.GenerateMultiplatformResourcesTask).outputResourcesDir -// } -// -// // addStaticSourceDirectory(String) — подаём Provider -// val resPath: Provider = resDir.map { it.asFile.absolutePath } -// variant.sources.res?.addStaticSourceDirectory(resPath.a) -// -// // Связь тасок — провайдер не разворачиваем -// project.tasks.named("merge${capName}Resources").configure { -// dependsOn(generateTask) -// inputs.dir(resDir) // ок, Provider -// } -// project.tasks.matching { it.name == "package${capName}Resources" }.configureEach { -// dependsOn(generateTask) -// inputs.dir(resDir) -// } -// } -//} - -tasks.matching { it.name == "packageAndroidMainResources" } - .configureEach { - dependsOn(tasks.named("generateMRandroidMain")) - } -tasks.matching { it.name == "mergeAndroidMainAssets" } - .configureEach { - dependsOn(tasks.named("generateMRandroidMain")) - } \ No newline at end of file diff --git a/samples/android-mpp-app/library/src/androidMain/AndroidManifest.xml b/samples/android-mpp-app/library/src/androidMain/AndroidManifest.xml index 34d60dfa5..36685298a 100755 --- a/samples/android-mpp-app/library/src/androidMain/AndroidManifest.xml +++ b/samples/android-mpp-app/library/src/androidMain/AndroidManifest.xml @@ -1,8 +1,7 @@ + xmlns:tools="http://schemas.android.com/tools" + package="com.icerockdev.mpplibrary"> - - diff --git a/samples/android-mpp-app/library/src/androidMain/res/values/strings.xml b/samples/android-mpp-app/library/src/androidMain/res/values/strings.xml new file mode 100644 index 000000000..c806b2fa6 --- /dev/null +++ b/samples/android-mpp-app/library/src/androidMain/res/values/strings.xml @@ -0,0 +1,8 @@ + + + + + app_test + \ No newline at end of file From 5fcc7b3f831ee8539c1cbe5b317d886af3634d45 Mon Sep 17 00:00:00 2001 From: Kolchurin Konstantin Date: Thu, 4 Dec 2025 11:21:02 +0700 Subject: [PATCH 03/42] #843 added gradle and agp 9+ sample --- local-samples-check.sh | 1 + samples/gradle-agp-9-sample/.gitignore | 11 + samples/gradle-agp-9-sample/README.md | 6 + .../androidApp/build.gradle.kts | 41 ++ .../androidApp/src/main/AndroidManifest.xml | 17 + .../kotlin2sample/android/MainActivity.kt | 49 +++ .../android/MyApplicationTheme.kt | 55 +++ .../androidApp/src/main/res/values/styles.xml | 3 + samples/gradle-agp-9-sample/build.gradle.kts | 6 + samples/gradle-agp-9-sample/gradle.properties | 14 + .../gradle/libs.versions.toml | 23 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + samples/gradle-agp-9-sample/gradlew | 185 ++++++++ samples/gradle-agp-9-sample/gradlew.bat | 89 ++++ .../iosApp/iosApp.xcodeproj/project.pbxproj | 411 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 98 +++++ .../iosApp/Assets.xcassets/Contents.json | 6 + .../iosApp/iosApp/ContentView.swift | 16 + .../iosApp/iosApp/Info.plist | 48 ++ .../Preview Assets.xcassets/Contents.json | 6 + .../iosApp/iosApp/iOSApp.swift | 10 + samples/gradle-agp-9-sample/local-check.sh | 30 ++ .../gradle-agp-9-sample/settings.gradle.kts | 29 ++ .../shared/build.gradle.kts | 49 +++ .../app/kotlin2sample/Platform.android.kt | 7 + .../kotlin/app/kotlin2sample/Greeting.kt | 17 + .../kotlin/app/kotlin2sample/Platform.kt | 7 + .../additionalDir/second_inner_text_file.txt | 1 + .../moko-resources/assets/some_asset.txt | 1 + .../moko-resources/base/plurals.xml | 9 + .../moko-resources/base/strings.xml | 5 + .../moko-resources/colors/colors.xml | 7 + .../moko-resources/files/some_file.txt | 1 + .../moko-resources/fonts/cormorant-italic.otf | Bin 0 -> 172260 bytes .../moko-resources/images/car_black.svg | 30 ++ .../moko-resources/images/moko_logo@1x.png | Bin 0 -> 10191 bytes .../moko-resources/images/moko_logo@2x.png | Bin 0 -> 20630 bytes .../moko-resources/images/moko_logo@3x.png | Bin 0 -> 15522 bytes .../commonMain/moko-resources/ru/plurals.xml | 10 + .../commonMain/moko-resources/ru/strings.xml | 5 + .../kotlin/app/kotlin2sample/Platform.ios.kt | 9 + .../iosMain/moko-resources/base/strings.xml | 4 + .../src/iosMain/moko-resources/ru/strings.xml | 4 + .../moko-resources/base/strings.xml | 5 + 47 files changed, 1350 insertions(+) create mode 100644 samples/gradle-agp-9-sample/.gitignore create mode 100644 samples/gradle-agp-9-sample/README.md create mode 100644 samples/gradle-agp-9-sample/androidApp/build.gradle.kts create mode 100644 samples/gradle-agp-9-sample/androidApp/src/main/AndroidManifest.xml create mode 100644 samples/gradle-agp-9-sample/androidApp/src/main/java/app/thirtyninth/compose/navigation/kotlin2sample/android/MainActivity.kt create mode 100644 samples/gradle-agp-9-sample/androidApp/src/main/java/app/thirtyninth/compose/navigation/kotlin2sample/android/MyApplicationTheme.kt create mode 100644 samples/gradle-agp-9-sample/androidApp/src/main/res/values/styles.xml create mode 100644 samples/gradle-agp-9-sample/build.gradle.kts create mode 100644 samples/gradle-agp-9-sample/gradle.properties create mode 100644 samples/gradle-agp-9-sample/gradle/libs.versions.toml create mode 100644 samples/gradle-agp-9-sample/gradle/wrapper/gradle-wrapper.jar create mode 100644 samples/gradle-agp-9-sample/gradle/wrapper/gradle-wrapper.properties create mode 100755 samples/gradle-agp-9-sample/gradlew create mode 100644 samples/gradle-agp-9-sample/gradlew.bat create mode 100644 samples/gradle-agp-9-sample/iosApp/iosApp.xcodeproj/project.pbxproj create mode 100644 samples/gradle-agp-9-sample/iosApp/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 samples/gradle-agp-9-sample/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 samples/gradle-agp-9-sample/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 samples/gradle-agp-9-sample/iosApp/iosApp/Assets.xcassets/Contents.json create mode 100644 samples/gradle-agp-9-sample/iosApp/iosApp/ContentView.swift create mode 100644 samples/gradle-agp-9-sample/iosApp/iosApp/Info.plist create mode 100644 samples/gradle-agp-9-sample/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 samples/gradle-agp-9-sample/iosApp/iosApp/iOSApp.swift create mode 100755 samples/gradle-agp-9-sample/local-check.sh create mode 100644 samples/gradle-agp-9-sample/settings.gradle.kts create mode 100644 samples/gradle-agp-9-sample/shared/build.gradle.kts create mode 100644 samples/gradle-agp-9-sample/shared/src/androidMain/kotlin/app/kotlin2sample/Platform.android.kt create mode 100644 samples/gradle-agp-9-sample/shared/src/commonMain/kotlin/app/kotlin2sample/Greeting.kt create mode 100644 samples/gradle-agp-9-sample/shared/src/commonMain/kotlin/app/kotlin2sample/Platform.kt create mode 100644 samples/gradle-agp-9-sample/shared/src/commonMain/moko-resources/assets/additionalDir/second_inner_text_file.txt create mode 100644 samples/gradle-agp-9-sample/shared/src/commonMain/moko-resources/assets/some_asset.txt create mode 100644 samples/gradle-agp-9-sample/shared/src/commonMain/moko-resources/base/plurals.xml create mode 100644 samples/gradle-agp-9-sample/shared/src/commonMain/moko-resources/base/strings.xml create mode 100644 samples/gradle-agp-9-sample/shared/src/commonMain/moko-resources/colors/colors.xml create mode 100644 samples/gradle-agp-9-sample/shared/src/commonMain/moko-resources/files/some_file.txt create mode 100644 samples/gradle-agp-9-sample/shared/src/commonMain/moko-resources/fonts/cormorant-italic.otf create mode 100644 samples/gradle-agp-9-sample/shared/src/commonMain/moko-resources/images/car_black.svg create mode 100644 samples/gradle-agp-9-sample/shared/src/commonMain/moko-resources/images/moko_logo@1x.png create mode 100644 samples/gradle-agp-9-sample/shared/src/commonMain/moko-resources/images/moko_logo@2x.png create mode 100644 samples/gradle-agp-9-sample/shared/src/commonMain/moko-resources/images/moko_logo@3x.png create mode 100644 samples/gradle-agp-9-sample/shared/src/commonMain/moko-resources/ru/plurals.xml create mode 100644 samples/gradle-agp-9-sample/shared/src/commonMain/moko-resources/ru/strings.xml create mode 100644 samples/gradle-agp-9-sample/shared/src/iosMain/kotlin/app/kotlin2sample/Platform.ios.kt create mode 100644 samples/gradle-agp-9-sample/shared/src/iosMain/moko-resources/base/strings.xml create mode 100644 samples/gradle-agp-9-sample/shared/src/iosMain/moko-resources/ru/strings.xml create mode 100644 samples/gradle-agp-9-sample/shared/src/iosSimulatorArm64Main/moko-resources/base/strings.xml diff --git a/local-samples-check.sh b/local-samples-check.sh index 332161df9..368045993 100755 --- a/local-samples-check.sh +++ b/local-samples-check.sh @@ -17,3 +17,4 @@ set -e (cd samples/kotlin-2-dynamic-sample && ./local-check.sh) (cd samples/kotlin-2-tests && ./local-check.sh) (cd samples/cm-resources-sample && ./local-check.sh) +(cd samples/gradle-agp-9-sample && ./local-check.sh) diff --git a/samples/gradle-agp-9-sample/.gitignore b/samples/gradle-agp-9-sample/.gitignore new file mode 100644 index 000000000..fdbf6bc0d --- /dev/null +++ b/samples/gradle-agp-9-sample/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +.idea +.DS_Store +.kotlin +build +captures +.externalNativeBuild +.cxx +local.properties +xcuserdata \ No newline at end of file diff --git a/samples/gradle-agp-9-sample/README.md b/samples/gradle-agp-9-sample/README.md new file mode 100644 index 000000000..c095b4155 --- /dev/null +++ b/samples/gradle-agp-9-sample/README.md @@ -0,0 +1,6 @@ +# Sample of project with Gradle and Android Gradle Plugin 9+ + +## Build + +1. publish moko-resources to local maven - `./gradlew publishToMavenLocal` in `moko-resources` root +2. build sample (in IDE or by `./gradlew build`) diff --git a/samples/gradle-agp-9-sample/androidApp/build.gradle.kts b/samples/gradle-agp-9-sample/androidApp/build.gradle.kts new file mode 100644 index 000000000..46d639b07 --- /dev/null +++ b/samples/gradle-agp-9-sample/androidApp/build.gradle.kts @@ -0,0 +1,41 @@ +plugins { + alias(libs.plugins.androidApplication) + alias(libs.plugins.compose.compiler) +} + +android { + namespace = "app.gradle9.android" + compileSdk = 36 + + defaultConfig { + applicationId = "app.gradle9.android" + minSdk = 26 + targetSdk = 36 + versionCode = 1 + versionName = "1.0" + } + + buildFeatures { + compose = true + } + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } + buildTypes { + getByName("release") { + isMinifyEnabled = false + } + } +} + +dependencies { + implementation(projects.shared) + implementation(libs.compose.ui) + implementation(libs.compose.ui.tooling.preview) + implementation(libs.compose.material3) + implementation(libs.androidx.activity.compose) + implementation(moko.resourcesCompose) + debugImplementation(libs.compose.ui.tooling) +} \ No newline at end of file diff --git a/samples/gradle-agp-9-sample/androidApp/src/main/AndroidManifest.xml b/samples/gradle-agp-9-sample/androidApp/src/main/AndroidManifest.xml new file mode 100644 index 000000000..afe828631 --- /dev/null +++ b/samples/gradle-agp-9-sample/androidApp/src/main/AndroidManifest.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/gradle-agp-9-sample/androidApp/src/main/java/app/thirtyninth/compose/navigation/kotlin2sample/android/MainActivity.kt b/samples/gradle-agp-9-sample/androidApp/src/main/java/app/thirtyninth/compose/navigation/kotlin2sample/android/MainActivity.kt new file mode 100644 index 000000000..1cfbf627d --- /dev/null +++ b/samples/gradle-agp-9-sample/androidApp/src/main/java/app/thirtyninth/compose/navigation/kotlin2sample/android/MainActivity.kt @@ -0,0 +1,49 @@ +package app.thirtyninth.compose.navigation.kotlin2sample.android + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import app.kotlin2sample.Greeting +import dev.icerock.moko.resources.compose.localized + +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + MyApplicationTheme { + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background + ) { + Column { + GreetingView(Greeting().greet()) + Text(text = Greeting().getMR().localized()) + Text(text = stringResource(id = app.kotlin2sample.R.string.hello_world)) + } + } + } + } + } +} + +@Composable +fun GreetingView(text: String) { + Text(text = text) +} + +@Preview +@Composable +fun DefaultPreview() { + MyApplicationTheme { + GreetingView("Hello, Android!") + } +} diff --git a/samples/gradle-agp-9-sample/androidApp/src/main/java/app/thirtyninth/compose/navigation/kotlin2sample/android/MyApplicationTheme.kt b/samples/gradle-agp-9-sample/androidApp/src/main/java/app/thirtyninth/compose/navigation/kotlin2sample/android/MyApplicationTheme.kt new file mode 100644 index 000000000..b453dcf0b --- /dev/null +++ b/samples/gradle-agp-9-sample/androidApp/src/main/java/app/thirtyninth/compose/navigation/kotlin2sample/android/MyApplicationTheme.kt @@ -0,0 +1,55 @@ +package app.thirtyninth.compose.navigation.kotlin2sample.android + +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Shapes +import androidx.compose.material3.Typography +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp + +@Composable +fun MyApplicationTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + content: @Composable () -> Unit +) { + val colors = if (darkTheme) { + darkColorScheme( + primary = Color(0xFFBB86FC), + secondary = Color(0xFF03DAC5), + tertiary = Color(0xFF3700B3) + ) + } else { + lightColorScheme( + primary = Color(0xFF6200EE), + secondary = Color(0xFF03DAC5), + tertiary = Color(0xFF3700B3) + ) + } + val typography = Typography( + bodyMedium = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp + ) + ) + val shapes = Shapes( + small = RoundedCornerShape(4.dp), + medium = RoundedCornerShape(4.dp), + large = RoundedCornerShape(0.dp) + ) + + MaterialTheme( + colorScheme = colors, + typography = typography, + shapes = shapes, + content = content + ) +} diff --git a/samples/gradle-agp-9-sample/androidApp/src/main/res/values/styles.xml b/samples/gradle-agp-9-sample/androidApp/src/main/res/values/styles.xml new file mode 100644 index 000000000..6b4fa3d08 --- /dev/null +++ b/samples/gradle-agp-9-sample/androidApp/src/main/res/values/styles.xml @@ -0,0 +1,3 @@ + +