From 555c4b4855f3f190bd218889d65acbc86532af82 Mon Sep 17 00:00:00 2001 From: satyan Date: Sun, 15 May 2022 11:37:00 +0200 Subject: [PATCH 01/53] Replace gradle script with explicit convention plugins --- build-logic/convention/build.gradle.kts | 41 +++++++++++++ ...droidApplicationComposeConventionPlugin.kt | 17 ++++++ .../AndroidApplicationConventionPlugin.kt | 22 +++++++ ...ndroidApplicationJacocoConventionPlugin.kt | 18 ++++++ .../kotlin/AndroidFeatureConventionPlugin.kt | 56 ++++++++++++++++++ .../AndroidLibraryComposeConventionPlugin.kt | 17 ++++++ .../kotlin/AndroidLibraryConventionPlugin.kt | 36 +++++++++++ .../AndroidLibraryJacocoConventionPlugin.kt | 18 ++++++ .../kotlin/AndroidTestConventionPlugin.kt | 22 +++++++ .../main/kotlin/SpotlessConventionPlugin.kt | 37 ++++++++++++ .../apps/nowinandroid/AndroidCompose.kt | 1 + ...oid.android.application.compose.gradle.kts | 25 -------- ...owinandroid.android.application.gradle.kts | 30 ---------- ...roid.android.application.jacoco.gradle.kts | 28 --------- .../nowinandroid.android.feature.gradle.kts | 59 ------------------- ...android.android.library.compose.gradle.kts | 25 -------- .../nowinandroid.android.library.gradle.kts | 43 -------------- ...nandroid.android.library.jacoco.gradle.kts | 28 --------- .../nowinandroid.android.test.gradle.kts | 30 ---------- .../kotlin/nowinandroid.spotless.gradle.kts | 42 ------------- 20 files changed, 285 insertions(+), 310 deletions(-) create mode 100644 build-logic/convention/src/main/kotlin/AndroidApplicationComposeConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/AndroidApplicationJacocoConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/AndroidLibraryJacocoConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/AndroidTestConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/SpotlessConventionPlugin.kt delete mode 100644 build-logic/convention/src/main/kotlin/nowinandroid.android.application.compose.gradle.kts delete mode 100644 build-logic/convention/src/main/kotlin/nowinandroid.android.application.gradle.kts delete mode 100644 build-logic/convention/src/main/kotlin/nowinandroid.android.application.jacoco.gradle.kts delete mode 100644 build-logic/convention/src/main/kotlin/nowinandroid.android.feature.gradle.kts delete mode 100644 build-logic/convention/src/main/kotlin/nowinandroid.android.library.compose.gradle.kts delete mode 100644 build-logic/convention/src/main/kotlin/nowinandroid.android.library.gradle.kts delete mode 100644 build-logic/convention/src/main/kotlin/nowinandroid.android.library.jacoco.gradle.kts delete mode 100644 build-logic/convention/src/main/kotlin/nowinandroid.android.test.gradle.kts delete mode 100644 build-logic/convention/src/main/kotlin/nowinandroid.spotless.gradle.kts diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index ab9e700ec..9a5baaa41 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -30,3 +30,44 @@ dependencies { implementation(libs.kotlin.gradlePlugin) implementation(libs.spotless.gradlePlugin) } + +gradlePlugin { + plugins { + register("androidApplicationCompose") { + id = "nowinandroid.android.application.compose" + implementationClass = "AndroidApplicationComposeConventionPlugin" + } + register("androidApplication") { + id = "nowinandroid.android.application" + implementationClass = "AndroidApplicationConventionPlugin" + } + register("androidApplicationJacoco") { + id = "nowinandroid.android.application.jacoco" + implementationClass = "AndroidApplicationJacocoConventionPlugin" + } + register("androidLibraryCompose") { + id = "nowinandroid.android.library.compose" + implementationClass = "AndroidLibraryComposeConventionPlugin" + } + register("androidLibrary") { + id = "nowinandroid.android.library" + implementationClass = "AndroidLibraryConventionPlugin" + } + register("androidFeature") { + id = "nowinandroid.android.feature" + implementationClass = "AndroidFeatureConventionPlugin" + } + register("androidLibraryJacoco") { + id = "nowinandroid.android.library.jacoco" + implementationClass = "AndroidLibraryJacocoConventionPlugin" + } + register("androidTest") { + id = "nowinandroid.android.test" + implementationClass = "AndroidTestConventionPlugin" + } + register("spotless") { + id = "nowinandroid.spotless" + implementationClass = "SpotlessConventionPlugin" + } + } +} diff --git a/build-logic/convention/src/main/kotlin/AndroidApplicationComposeConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidApplicationComposeConventionPlugin.kt new file mode 100644 index 000000000..90a5b303c --- /dev/null +++ b/build-logic/convention/src/main/kotlin/AndroidApplicationComposeConventionPlugin.kt @@ -0,0 +1,17 @@ +import com.android.build.gradle.internal.dsl.BaseAppModuleExtension +import com.google.samples.apps.nowinandroid.configureAndroidCompose +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.getByType + +class AndroidApplicationComposeConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + pluginManager.withPlugin("com.android.application") { + val extension = extensions.getByType() + configureAndroidCompose(extension) + } + } + } + +} \ No newline at end of file diff --git a/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt new file mode 100644 index 000000000..4dd91eb86 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt @@ -0,0 +1,22 @@ +import com.android.build.gradle.internal.dsl.BaseAppModuleExtension +import com.google.samples.apps.nowinandroid.configureKotlinAndroid +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure + +class AndroidApplicationConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + with(pluginManager) { + apply("com.android.application") + apply("org.jetbrains.kotlin.android") + } + + extensions.configure { + configureKotlinAndroid(this) + defaultConfig.targetSdk = 32 + } + } + } + +} \ No newline at end of file diff --git a/build-logic/convention/src/main/kotlin/AndroidApplicationJacocoConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidApplicationJacocoConventionPlugin.kt new file mode 100644 index 000000000..77c9f2d18 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/AndroidApplicationJacocoConventionPlugin.kt @@ -0,0 +1,18 @@ +import com.android.build.api.variant.ApplicationAndroidComponentsExtension +import com.google.samples.apps.nowinandroid.configureJacoco +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.getByType + +class AndroidApplicationJacocoConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + pluginManager.withPlugin("com.android.application") { + pluginManager.apply("org.gradle.jacoco") + val extension = extensions.getByType() + configureJacoco(extension) + } + } + } + +} \ No newline at end of file diff --git a/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt new file mode 100644 index 000000000..cea79078a --- /dev/null +++ b/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt @@ -0,0 +1,56 @@ +import com.android.build.gradle.LibraryExtension +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.artifacts.VersionCatalogsExtension +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.getByType + +class AndroidFeatureConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + pluginManager.apply { + apply("com.android.library") + apply("org.jetbrains.kotlin.android") + apply("org.jetbrains.kotlin.kapt") + } + extensions.configure { + defaultConfig { + testInstrumentationRunner = + "com.google.samples.apps.nowinandroid.core.testing.NiaTestRunner" + } + } + + val libs = extensions.getByType().named("libs") + + dependencies { + add("implementation", project(":core-model")) + add("implementation", project(":core-ui")) + add("implementation", project(":core-data")) + add("implementation", project(":core-common")) + add("implementation", project(":core-navigation")) + + add("testImplementation", project(":core-testing")) + add("androidTestImplementation", project(":core-testing")) + + add("implementation", libs.findLibrary("coil.kt").get()) + add("implementation", libs.findLibrary("coil.kt.compose").get()) + + add("implementation", libs.findLibrary("androidx.hilt.navigation.compose").get()) + add("implementation", libs.findLibrary("androidx.lifecycle.viewModelCompose").get()) + + add("implementation", libs.findLibrary("kotlinx.coroutines.android").get()) + + add("implementation", libs.findLibrary("hilt.android").get()) + add("kapt", libs.findLibrary("hilt.compiler").get()) + + // TODO : Remove this dependency once we upgrade to Android Studio Dolphin b/228889042 + // These dependencies are currently necessary to render Compose previews + add( + "debugImplementation", + libs.findLibrary("androidx.customview.poolingcontainer").get() + ) + } + } + } +} \ No newline at end of file diff --git a/build-logic/convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt new file mode 100644 index 000000000..84d87480a --- /dev/null +++ b/build-logic/convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt @@ -0,0 +1,17 @@ +import com.android.build.gradle.LibraryExtension +import com.google.samples.apps.nowinandroid.configureAndroidCompose +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.getByType + +class AndroidLibraryComposeConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + pluginManager.withPlugin("com.android.library") { + val extension = extensions.getByType() + configureAndroidCompose(extension) + } + } + } + +} \ No newline at end of file diff --git a/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt new file mode 100644 index 000000000..8dbb83c29 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt @@ -0,0 +1,36 @@ +import com.android.build.gradle.LibraryExtension +import com.google.samples.apps.nowinandroid.configureKotlinAndroid +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.artifacts.VersionCatalogsExtension +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.getByType + +class AndroidLibraryConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + with(pluginManager) { + apply("com.android.library") + apply("org.jetbrains.kotlin.android") + } + + extensions.configure { + configureKotlinAndroid(this) + defaultConfig.targetSdk = 32 + } + + val libs = extensions.getByType().named("libs") + dependencies { + configurations.configureEach { + resolutionStrategy { + force(libs.findLibrary("junit4").get()) + // Temporary workaround for https://issuetracker.google.com/174733673 + force("org.objenesis:objenesis:2.6") + } + } + } + } + } + +} \ No newline at end of file diff --git a/build-logic/convention/src/main/kotlin/AndroidLibraryJacocoConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidLibraryJacocoConventionPlugin.kt new file mode 100644 index 000000000..66dad8ae5 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/AndroidLibraryJacocoConventionPlugin.kt @@ -0,0 +1,18 @@ +import com.android.build.api.variant.LibraryAndroidComponentsExtension +import com.google.samples.apps.nowinandroid.configureJacoco +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.getByType + +class AndroidLibraryJacocoConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + pluginManager.withPlugin("com.android.library") { + pluginManager.apply("org.gradle.jacoco") + val extension = extensions.getByType() + configureJacoco(extension) + } + } + } + +} \ 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 new file mode 100644 index 000000000..fe631f59e --- /dev/null +++ b/build-logic/convention/src/main/kotlin/AndroidTestConventionPlugin.kt @@ -0,0 +1,22 @@ +import com.android.build.gradle.TestExtension +import com.google.samples.apps.nowinandroid.configureKotlinAndroid +import org.gradle.api.Plugin +import org.gradle.api.Project +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") + } + + extensions.configure { + configureKotlinAndroid(this) + defaultConfig.targetSdk = 32 + } + } + } + +} \ No newline at end of file diff --git a/build-logic/convention/src/main/kotlin/SpotlessConventionPlugin.kt b/build-logic/convention/src/main/kotlin/SpotlessConventionPlugin.kt new file mode 100644 index 000000000..11ad1d622 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/SpotlessConventionPlugin.kt @@ -0,0 +1,37 @@ +import com.diffplug.gradle.spotless.SpotlessExtension +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.artifacts.VersionCatalogsExtension +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.getByType + +class SpotlessConventionPlugin : Plugin { + override fun apply(target: Project) { + with (target) { + pluginManager.apply("com.diffplug.spotless") + val libs = extensions.getByType().named("libs") + + extensions.configure { + kotlin { + target("**/*.kt") + targetExclude("**/build/**/*.kt") + ktlint(libs.findVersion("ktlint").get().toString()).userData(mapOf("android" to "true")) + licenseHeaderFile(rootProject.file("spotless/copyright.kt")) + } + format("kts") { + target("**/*.kts") + targetExclude("**/build/**/*.kts") + // Look for the first line that doesn't have a block comment (assumed to be the license) + licenseHeaderFile(rootProject.file("spotless/copyright.kts"), "(^(?![\\/ ]\\*).*$)") + } + format("xml") { + target("**/*.xml") + targetExclude("**/build/**/*.xml") + // Look for the first XML tag that isn't a comment (