diff --git a/build-logic/convention/src/main/kotlin/AndroidApplicationComposeConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidApplicationComposeConventionPlugin.kt index a8b1b1779..1cdc90393 100644 --- a/build-logic/convention/src/main/kotlin/AndroidApplicationComposeConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidApplicationComposeConventionPlugin.kt @@ -16,6 +16,8 @@ import com.android.build.api.dsl.ApplicationExtension import com.google.samples.apps.nowinandroid.configureAndroidCompose +import com.google.samples.apps.nowinandroid.getPlugin +import com.google.samples.apps.nowinandroid.libs import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.apply @@ -24,8 +26,8 @@ import org.gradle.kotlin.dsl.getByType class AndroidApplicationComposeConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { - apply(plugin = "com.android.application") - apply(plugin = "org.jetbrains.kotlin.plugin.compose") + apply(plugin = libs.getPlugin("android.application")) + apply(plugin = libs.getPlugin("compose")) val extension = extensions.getByType() configureAndroidCompose(extension) diff --git a/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt index f4d5bb0d0..964809206 100644 --- a/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt @@ -21,20 +21,21 @@ import com.google.samples.apps.nowinandroid.configureBadgingTasks import com.google.samples.apps.nowinandroid.configureGradleManagedDevices import com.google.samples.apps.nowinandroid.configureKotlinAndroid import com.google.samples.apps.nowinandroid.configurePrintApksTask +import com.google.samples.apps.nowinandroid.getPlugin +import com.google.samples.apps.nowinandroid.libs import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.getByType class AndroidApplicationConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { - with(pluginManager) { - apply("com.android.application") - apply("org.jetbrains.kotlin.android") - apply("nowinandroid.android.lint") - apply("com.dropbox.dependency-guard") - } + apply(plugin = libs.getPlugin("android.application")) + apply(plugin = libs.getPlugin("kotlin.android")) + apply(plugin = libs.getPlugin("nowinandroid.android.lint")) + apply(plugin = libs.getPlugin("dependencyGuard")) extensions.configure { configureKotlinAndroid(this) @@ -49,5 +50,4 @@ class AndroidApplicationConventionPlugin : Plugin { } } } - } diff --git a/build-logic/convention/src/main/kotlin/AndroidApplicationFirebaseConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidApplicationFirebaseConventionPlugin.kt index 422592b8a..edbf0ba0f 100644 --- a/build-logic/convention/src/main/kotlin/AndroidApplicationFirebaseConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidApplicationFirebaseConventionPlugin.kt @@ -16,20 +16,21 @@ import com.android.build.api.dsl.ApplicationExtension import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension +import com.google.samples.apps.nowinandroid.getPlugin import com.google.samples.apps.nowinandroid.libs import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.dependencies class AndroidApplicationFirebaseConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { - with(pluginManager) { - apply("com.google.gms.google-services") - apply("com.google.firebase.firebase-perf") - apply("com.google.firebase.crashlytics") - } + apply(plugin = libs.getPlugin("gms")) + apply(plugin = libs.getPlugin("firebase.perf")) + apply(plugin = libs.getPlugin("firebase.crashlytics")) + dependencies { val bom = libs.findLibrary("firebase-bom").get() diff --git a/build-logic/convention/src/main/kotlin/AndroidApplicationJacocoConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidApplicationJacocoConventionPlugin.kt index ac385b0d9..7f0468f22 100644 --- a/build-logic/convention/src/main/kotlin/AndroidApplicationJacocoConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidApplicationJacocoConventionPlugin.kt @@ -17,14 +17,17 @@ import com.android.build.api.variant.ApplicationAndroidComponentsExtension import com.android.build.gradle.internal.dsl.BaseAppModuleExtension import com.google.samples.apps.nowinandroid.configureJacoco +import com.google.samples.apps.nowinandroid.getPlugin +import com.google.samples.apps.nowinandroid.libs import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.getByType class AndroidApplicationJacocoConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { - pluginManager.apply("jacoco") + apply(plugin = libs.getPlugin("jacoco")) val androidExtension = extensions.getByType() androidExtension.buildTypes.configureEach { diff --git a/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt index 9110e7fa3..bebb0e6cd 100644 --- a/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt @@ -16,19 +16,20 @@ import com.android.build.gradle.LibraryExtension import com.google.samples.apps.nowinandroid.configureGradleManagedDevices +import com.google.samples.apps.nowinandroid.getPlugin import com.google.samples.apps.nowinandroid.libs import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.dependencies class AndroidFeatureConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { - pluginManager.apply { - apply("nowinandroid.android.library") - apply("nowinandroid.hilt") - } + apply(plugin = libs.getPlugin("nowinandroid.android.library")) + apply(plugin = libs.getPlugin("nowinandroid.hilt")) + extensions.configure { testOptions.animationsDisabled = true configureGradleManagedDevices(this) @@ -43,7 +44,10 @@ class AndroidFeatureConventionPlugin : Plugin { add("implementation", libs.findLibrary("androidx.lifecycle.viewModelCompose").get()) add("implementation", libs.findLibrary("androidx.tracing.ktx").get()) - add("androidTestImplementation", libs.findLibrary("androidx.lifecycle.runtimeTesting").get()) + add( + "androidTestImplementation", + libs.findLibrary("androidx.lifecycle.runtimeTesting").get(), + ) } } } diff --git a/build-logic/convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt index 19fabf549..118672a57 100644 --- a/build-logic/convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt @@ -16,6 +16,8 @@ import com.android.build.gradle.LibraryExtension import com.google.samples.apps.nowinandroid.configureAndroidCompose +import com.google.samples.apps.nowinandroid.getPlugin +import com.google.samples.apps.nowinandroid.libs import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.apply @@ -24,8 +26,8 @@ import org.gradle.kotlin.dsl.getByType class AndroidLibraryComposeConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { - apply(plugin = "com.android.library") - apply(plugin = "org.jetbrains.kotlin.plugin.compose") + apply(plugin = libs.getPlugin("android.library")) + apply(plugin = libs.getPlugin("compose")) val extension = extensions.getByType() configureAndroidCompose(extension) diff --git a/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt index 71d818c0c..fbe96da55 100644 --- a/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt @@ -21,9 +21,11 @@ import com.google.samples.apps.nowinandroid.configureGradleManagedDevices import com.google.samples.apps.nowinandroid.configureKotlinAndroid import com.google.samples.apps.nowinandroid.configurePrintApksTask import com.google.samples.apps.nowinandroid.disableUnnecessaryAndroidTests +import com.google.samples.apps.nowinandroid.getPlugin import com.google.samples.apps.nowinandroid.libs import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.dependencies import org.gradle.kotlin.dsl.kotlin @@ -31,11 +33,9 @@ import org.gradle.kotlin.dsl.kotlin class AndroidLibraryConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { - with(pluginManager) { - apply("com.android.library") - apply("org.jetbrains.kotlin.android") - apply("nowinandroid.android.lint") - } + apply(plugin = libs.getPlugin("android.library")) + apply(plugin = libs.getPlugin("kotlin.android")) + apply(plugin = libs.getPlugin("nowinandroid.android.lint")) extensions.configure { configureKotlinAndroid(this) @@ -46,7 +46,9 @@ class AndroidLibraryConventionPlugin : Plugin { configureGradleManagedDevices(this) // The resource prefix is derived from the module name, // so resources inside ":core:module1" must be prefixed with "core_module1_" - resourcePrefix = path.split("""\W""".toRegex()).drop(1).distinct().joinToString(separator = "_").lowercase() + "_" + resourcePrefix = + path.split("""\W""".toRegex()).drop(1).distinct().joinToString(separator = "_") + .lowercase() + "_" } extensions.configure { configurePrintApksTask(this) diff --git a/build-logic/convention/src/main/kotlin/AndroidLibraryJacocoConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidLibraryJacocoConventionPlugin.kt index 6f2ff60c5..3fecebadb 100644 --- a/build-logic/convention/src/main/kotlin/AndroidLibraryJacocoConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidLibraryJacocoConventionPlugin.kt @@ -15,17 +15,19 @@ */ import com.android.build.api.dsl.LibraryExtension -import com.android.build.api.variant.ApplicationAndroidComponentsExtension import com.android.build.api.variant.LibraryAndroidComponentsExtension import com.google.samples.apps.nowinandroid.configureJacoco +import com.google.samples.apps.nowinandroid.getPlugin +import com.google.samples.apps.nowinandroid.libs import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.getByType class AndroidLibraryJacocoConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { - pluginManager.apply("jacoco") + apply(plugin = libs.getPlugin("jacoco")) val androidExtension = extensions.getByType() androidExtension.buildTypes.configureEach { diff --git a/build-logic/convention/src/main/kotlin/AndroidRoomConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidRoomConventionPlugin.kt index dbca79a5e..5dece9797 100644 --- a/build-logic/convention/src/main/kotlin/AndroidRoomConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidRoomConventionPlugin.kt @@ -16,9 +16,11 @@ import androidx.room.gradle.RoomExtension import com.google.devtools.ksp.gradle.KspExtension +import com.google.samples.apps.nowinandroid.getPlugin import com.google.samples.apps.nowinandroid.libs import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.dependencies @@ -26,8 +28,8 @@ class AndroidRoomConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { - pluginManager.apply("androidx.room") - pluginManager.apply("com.google.devtools.ksp") + apply(plugin = libs.getPlugin("room")) + apply(plugin = libs.getPlugin("ksp")) extensions.configure { arg("room.generateKotlin", "true") @@ -47,4 +49,4 @@ class AndroidRoomConventionPlugin : Plugin { } } } -} \ No newline at end of file +} diff --git a/build-logic/convention/src/main/kotlin/AndroidTestConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidTestConventionPlugin.kt index e48d75757..893382dc1 100644 --- a/build-logic/convention/src/main/kotlin/AndroidTestConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidTestConventionPlugin.kt @@ -17,17 +17,18 @@ import com.android.build.gradle.TestExtension import com.google.samples.apps.nowinandroid.configureGradleManagedDevices import com.google.samples.apps.nowinandroid.configureKotlinAndroid +import com.google.samples.apps.nowinandroid.getPlugin +import com.google.samples.apps.nowinandroid.libs import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.configure class AndroidTestConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { - with(pluginManager) { - apply("com.android.test") - apply("org.jetbrains.kotlin.android") - } + apply(plugin = libs.getPlugin("android.test")) + apply(plugin = libs.getPlugin("kotlin.android")) extensions.configure { configureKotlinAndroid(this) @@ -36,5 +37,4 @@ class AndroidTestConventionPlugin : Plugin { } } } - } diff --git a/build-logic/convention/src/main/kotlin/HiltConventionPlugin.kt b/build-logic/convention/src/main/kotlin/HiltConventionPlugin.kt index a8228e5af..099610139 100644 --- a/build-logic/convention/src/main/kotlin/HiltConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/HiltConventionPlugin.kt @@ -15,15 +15,17 @@ */ import com.android.build.gradle.api.AndroidBasePlugin +import com.google.samples.apps.nowinandroid.getPlugin import com.google.samples.apps.nowinandroid.libs import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.dependencies class HiltConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { - pluginManager.apply("com.google.devtools.ksp") + apply(plugin = libs.getPlugin("ksp")) dependencies { add("ksp", libs.findLibrary("hilt.compiler").get()) add("implementation", libs.findLibrary("hilt.core").get()) @@ -31,7 +33,7 @@ class HiltConventionPlugin : Plugin { /** Add support for Android modules, based on [AndroidBasePlugin] */ pluginManager.withPlugin("com.android.base") { - pluginManager.apply("dagger.hilt.android.plugin") + apply(plugin = libs.getPlugin("hilt.plugin")) dependencies { add("implementation", libs.findLibrary("hilt.android").get()) } diff --git a/build-logic/convention/src/main/kotlin/JvmLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/JvmLibraryConventionPlugin.kt index 35932c835..30d6c20b8 100644 --- a/build-logic/convention/src/main/kotlin/JvmLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/JvmLibraryConventionPlugin.kt @@ -15,16 +15,17 @@ */ import com.google.samples.apps.nowinandroid.configureKotlinJvm +import com.google.samples.apps.nowinandroid.getPlugin +import com.google.samples.apps.nowinandroid.libs import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply class JvmLibraryConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { - with(pluginManager) { - apply("org.jetbrains.kotlin.jvm") - apply("nowinandroid.android.lint") - } + apply(plugin = libs.getPlugin("kotlin.jvm")) + apply(plugin = libs.getPlugin("nowinandroid.android.lint")) configureKotlinJvm() } } diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/VersionCatalogExtensions.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/VersionCatalogExtensions.kt new file mode 100644 index 000000000..8966e2a2c --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/VersionCatalogExtensions.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2024 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.google.samples.apps.nowinandroid + +import org.gradle.api.artifacts.VersionCatalog +import kotlin.jvm.optionals.getOrNull + +/** + * Get a Plugin from version catalog using an alias. + */ +internal fun VersionCatalog.getPlugin(alias: String): String = + findPlugin(alias).getOrNull()?.get()?.pluginId ?: "There is no [$alias] in the catalog" diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a2210bd4c..ce20bc41a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -171,6 +171,9 @@ firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = " firebase-perf = { id = "com.google.firebase.firebase-perf", version.ref = "firebasePerfPlugin" } gms = { id = "com.google.gms.google-services", version.ref = "gmsPlugin" } hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } +hilt-plugin = { id = "dagger.hilt.android.plugin", version.ref = "hilt"} +jacoco = { id = "jacoco", version.ref = "jacoco"} +kotlin-android = {id = "org.jetbrains.kotlin.android", version.ref = "kotlin"} kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }