From 29d63a879ebb49376a346596372b089c8cfa60aa Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Fri, 10 Jun 2022 13:18:52 +0530 Subject: [PATCH] build-logic: rewrite everything to use full Gradle plugins --- .../msfjarvis/claw/android/ui/LobstersApp.kt | 12 +++- build-logic/android-plugins/build.gradle.kts | 22 ++++++- ...jarvis.claw.android-application.gradle.kts | 33 ---------- ...v.msfjarvis.claw.android-common.gradle.kts | 57 ----------------- ....msfjarvis.claw.android-library.gradle.kts | 11 ---- ...msfjarvis.claw.rename-artifacts.gradle.kts | 22 ------- .../dev/msfjarvis/aps/gradle/AndroidCommon.kt | 44 +++++++++++++ .../msfjarvis/aps/gradle/ApplicationPlugin.kt | 61 +++++++++++++++++++ .../dev/msfjarvis/aps/gradle/LibraryPlugin.kt | 15 +++++ .../aps/gradle/RenameArtifactsPlugin.kt | 37 +++++++++++ .../aps/gradle}/artifacts/CollectApksTask.kt | 2 +- .../gradle}/artifacts/CollectBundleTask.kt | 2 +- .../aps/gradle}/signing/AppSigning.kt | 3 +- build-logic/kotlin-plugins/build.gradle.kts | 32 +++++++++- ...v.msfjarvis.claw.kotlin-android.gradle.kts | 9 --- ...ev.msfjarvis.claw.kotlin-common.gradle.kts | 39 ------------ .../dev.msfjarvis.claw.kotlin-kapt.gradle.kts | 43 ------------- ...v.msfjarvis.claw.kotlin-library.gradle.kts | 6 -- .../dev.msfjarvis.claw.spotless.gradle.kts | 28 --------- .../dev.msfjarvis.claw.versions.gradle.kts | 37 ----------- .../aps/gradle/KotlinAndroidPlugin.kt | 22 +++++++ .../aps/gradle/KotlinCommonPlugin.kt | 50 +++++++++++++++ .../msfjarvis/aps/gradle/KotlinKaptPlugin.kt | 55 +++++++++++++++++ .../aps/gradle/KotlinLibraryPlugin.kt | 18 ++++++ .../msfjarvis/aps/gradle/SpotlessPlugin.kt | 44 +++++++++++++ build.gradle.kts | 2 +- .../claw/common/comments/CommentEntry.kt | 4 +- .../claw/common/posts/LobstersCard.kt | 4 +- gradle/libs.versions.toml | 2 - 29 files changed, 415 insertions(+), 301 deletions(-) delete mode 100644 build-logic/android-plugins/src/main/kotlin/dev.msfjarvis.claw.android-application.gradle.kts delete mode 100644 build-logic/android-plugins/src/main/kotlin/dev.msfjarvis.claw.android-common.gradle.kts delete mode 100644 build-logic/android-plugins/src/main/kotlin/dev.msfjarvis.claw.android-library.gradle.kts delete mode 100644 build-logic/android-plugins/src/main/kotlin/dev.msfjarvis.claw.rename-artifacts.gradle.kts create mode 100644 build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/AndroidCommon.kt create mode 100644 build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/ApplicationPlugin.kt create mode 100644 build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/LibraryPlugin.kt create mode 100644 build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/RenameArtifactsPlugin.kt rename build-logic/android-plugins/src/main/kotlin/{ => dev/msfjarvis/aps/gradle}/artifacts/CollectApksTask.kt (97%) rename build-logic/android-plugins/src/main/kotlin/{ => dev/msfjarvis/aps/gradle}/artifacts/CollectBundleTask.kt (95%) rename build-logic/android-plugins/src/main/kotlin/{ => dev/msfjarvis/aps/gradle}/signing/AppSigning.kt (95%) delete mode 100644 build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.kotlin-android.gradle.kts delete mode 100644 build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.kotlin-common.gradle.kts delete mode 100644 build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.kotlin-kapt.gradle.kts delete mode 100644 build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.kotlin-library.gradle.kts delete mode 100644 build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.spotless.gradle.kts delete mode 100644 build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.versions.gradle.kts create mode 100644 build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/KotlinAndroidPlugin.kt create mode 100644 build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/KotlinCommonPlugin.kt create mode 100644 build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/KotlinKaptPlugin.kt create mode 100644 build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/KotlinLibraryPlugin.kt create mode 100644 build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/SpotlessPlugin.kt diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt index de86cd92..11e5b401 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt @@ -89,17 +89,23 @@ fun LobstersApp( label = "Hottest", route = Destinations.Hottest.getRoute(), icon = ClawIcons.Flame, - ) { coroutineScope.launch { hottestListState.animateScrollToItem(index = 0) } }, + ) { + coroutineScope.launch { hottestListState.animateScrollToItem(index = 0) } + }, NavigationItem( label = "Newest", route = Destinations.Newest.getRoute(), icon = ClawIcons.New, - ) { coroutineScope.launch { newestListState.animateScrollToItem(index = 0) } }, + ) { + coroutineScope.launch { newestListState.animateScrollToItem(index = 0) } + }, NavigationItem( label = "Saved", route = Destinations.Saved.getRoute(), icon = ClawIcons.HeartBorder, - ) { coroutineScope.launch { savedListState.animateScrollToItem(index = 0) } }, + ) { + coroutineScope.launch { savedListState.animateScrollToItem(index = 0) } + }, ) SideEffect { systemUiController.setStatusBarColor(color = systemBarsColor) } diff --git a/build-logic/android-plugins/build.gradle.kts b/build-logic/android-plugins/build.gradle.kts index 22f54e17..64ea3f66 100644 --- a/build-logic/android-plugins/build.gradle.kts +++ b/build-logic/android-plugins/build.gradle.kts @@ -17,7 +17,27 @@ afterEvaluate { } tasks.withType().configureEach { - kotlinOptions { jvmTarget = JavaVersion.VERSION_11.toString() } + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + freeCompilerArgs = freeCompilerArgs + "-Xsam-conversions=class" + } + } +} + +gradlePlugin { + plugins { + register("android-application") { + id = "dev.msfjarvis.claw.android-application" + implementationClass = "dev.msfjarvis.aps.gradle.ApplicationPlugin" + } + register("android-library") { + id = "dev.msfjarvis.claw.android-library" + implementationClass = "dev.msfjarvis.aps.gradle.LibraryPlugin" + } + register("rename-artifacts") { + id = "dev.msfjarvis.claw.rename-artifacts" + implementationClass = "dev.msfjarvis.aps.gradle.RenameArtifactsPlugin" + } } } diff --git a/build-logic/android-plugins/src/main/kotlin/dev.msfjarvis.claw.android-application.gradle.kts b/build-logic/android-plugins/src/main/kotlin/dev.msfjarvis.claw.android-application.gradle.kts deleted file mode 100644 index 8cca92c8..00000000 --- a/build-logic/android-plugins/src/main/kotlin/dev.msfjarvis.claw.android-application.gradle.kts +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved. - * SPDX-License-Identifier: GPL-3.0-only - */ -@file:Suppress("UnstableApiUsage") - -import signing.configureBuildSigning - -plugins { - id("com.android.application") - id("dev.msfjarvis.claw.android-common") -} - -android { - adbOptions.installOptions("--user 0") - - dependenciesInfo { - includeInBundle = false - includeInApk = false - } - - buildFeatures { buildConfig = true } - - buildTypes { - named("release") { isMinifyEnabled = false } - named("debug") { - applicationIdSuffix = ".debug" - versionNameSuffix = "-debug" - isMinifyEnabled = false - } - } - project.configureBuildSigning() -} diff --git a/build-logic/android-plugins/src/main/kotlin/dev.msfjarvis.claw.android-common.gradle.kts b/build-logic/android-plugins/src/main/kotlin/dev.msfjarvis.claw.android-common.gradle.kts deleted file mode 100644 index 9911c54c..00000000 --- a/build-logic/android-plugins/src/main/kotlin/dev.msfjarvis.claw.android-common.gradle.kts +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved. - * SPDX-License-Identifier: GPL-3.0-only - */ -@file:Suppress("UnstableApiUsage") - -import com.android.build.api.variant.ApplicationAndroidComponentsExtension -import com.android.build.api.variant.LibraryAndroidComponentsExtension -import com.android.build.gradle.TestedExtension -import org.gradle.kotlin.dsl.findByType - -extensions.configure { - setCompileSdkVersion(31) - defaultConfig { - minSdk = 26 - targetSdk = 31 - } - - extensions.findByType()?.run { - beforeVariants(selector().withBuildType("release")) { - it.enableUnitTest = false - it.enableAndroidTest = false - } - } - - extensions.findByType()?.run { - beforeVariants(selector().withBuildType("release")) { - it.enableUnitTest = false - it.enableAndroidTest = false - } - } - - sourceSets { - named("main") { java.srcDirs("src/main/kotlin") } - named("test") { java.srcDirs("src/test/kotlin") } - named("androidTest") { java.srcDirs("src/androidTest/kotlin") } - } - - packagingOptions { - resources.excludes.add("**/*.version") - resources.excludes.add("**/*.txt") - resources.excludes.add("**/*.kotlin_module") - resources.excludes.add("**/plugin.properties") - resources.excludes.add("**/META-INF/AL2.0") - resources.excludes.add("**/META-INF/LGPL2.1") - } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } - - testOptions { - animationsDisabled = true - unitTests.isReturnDefaultValues = true - } -} diff --git a/build-logic/android-plugins/src/main/kotlin/dev.msfjarvis.claw.android-library.gradle.kts b/build-logic/android-plugins/src/main/kotlin/dev.msfjarvis.claw.android-library.gradle.kts deleted file mode 100644 index 4181f556..00000000 --- a/build-logic/android-plugins/src/main/kotlin/dev.msfjarvis.claw.android-library.gradle.kts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved. - * SPDX-License-Identifier: GPL-3.0-only - */ - -plugins { - id("com.android.library") - id("dev.msfjarvis.claw.android-common") -} - -android { defaultConfig { consumerProguardFiles("consumer-rules.pro") } } diff --git a/build-logic/android-plugins/src/main/kotlin/dev.msfjarvis.claw.rename-artifacts.gradle.kts b/build-logic/android-plugins/src/main/kotlin/dev.msfjarvis.claw.rename-artifacts.gradle.kts deleted file mode 100644 index 9c74c360..00000000 --- a/build-logic/android-plugins/src/main/kotlin/dev.msfjarvis.claw.rename-artifacts.gradle.kts +++ /dev/null @@ -1,22 +0,0 @@ -import artifacts.CollectApksTask -import artifacts.CollectBundleTask -import com.android.build.api.artifact.SingleArtifact - -plugins { id("com.android.application") } - -androidComponents { - onVariants { variant -> - project.tasks.register("collect${variant.name.capitalize()}Apks") { - variantName.set(variant.name) - apkFolder.set(variant.artifacts.get(SingleArtifact.APK)) - builtArtifactsLoader.set(variant.artifacts.getBuiltArtifactsLoader()) - outputDirectory.set(project.layout.projectDirectory.dir("outputs")) - } - project.tasks.register("collect${variant.name.capitalize()}Bundle") { - variantName.set(variant.name) - versionName.set(android.defaultConfig.versionName) - bundleFile.set(variant.artifacts.get(SingleArtifact.BUNDLE)) - outputDirectory.set(project.layout.projectDirectory.dir("outputs")) - } - } -} diff --git a/build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/AndroidCommon.kt b/build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/AndroidCommon.kt new file mode 100644 index 00000000..4eb47138 --- /dev/null +++ b/build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/AndroidCommon.kt @@ -0,0 +1,44 @@ +package dev.msfjarvis.aps.gradle + +import com.android.build.gradle.TestedExtension +import org.gradle.api.JavaVersion +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure + +@Suppress("UnstableApiUsage") +object AndroidCommon { + fun configure(project: Project) { + project.extensions.configure { + setCompileSdkVersion(31) + defaultConfig { + minSdk = 26 + targetSdk = 31 + } + + sourceSets { + named("main") { java.srcDirs("src/main/kotlin") } + named("test") { java.srcDirs("src/test/kotlin") } + named("androidTest") { java.srcDirs("src/androidTest/kotlin") } + } + + packagingOptions { + resources.excludes.add("**/*.version") + resources.excludes.add("**/*.txt") + resources.excludes.add("**/*.kotlin_module") + resources.excludes.add("**/plugin.properties") + resources.excludes.add("**/META-INF/AL2.0") + resources.excludes.add("**/META-INF/LGPL2.1") + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + testOptions { + animationsDisabled = true + unitTests.isReturnDefaultValues = true + } + } + } +} diff --git a/build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/ApplicationPlugin.kt b/build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/ApplicationPlugin.kt new file mode 100644 index 00000000..65a1f874 --- /dev/null +++ b/build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/ApplicationPlugin.kt @@ -0,0 +1,61 @@ +@file:Suppress("UnstableApiUsage") + +package dev.msfjarvis.aps.gradle + +import com.android.build.gradle.AppPlugin +import com.android.build.gradle.internal.dsl.BaseAppModuleExtension +import dev.msfjarvis.aps.gradle.signing.configureBuildSigning +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.getByType + +@Suppress("Unused") +class ApplicationPlugin : Plugin { + + override fun apply(project: Project) { + project.pluginManager.apply(AppPlugin::class) + AndroidCommon.configure(project) + project.extensions.getByType().run { + adbOptions.installOptions("--user 0") + + dependenciesInfo { + includeInBundle = false + includeInApk = false + } + + buildFeatures { + viewBinding = true + buildConfig = true + } + + buildTypes { + named("release") { + isMinifyEnabled = false + setProguardFiles( + listOf( + "proguard-android-optimize.txt", + "proguard-rules.pro", + "proguard-rules-missing-classes.pro", + ) + ) + } + named("debug") { + applicationIdSuffix = ".debug" + versionNameSuffix = "-debug" + isMinifyEnabled = false + } + } + + project.configureBuildSigning() + } + } + + private fun Project.isSnapshot(): Boolean { + with(project.providers) { + val workflow = environmentVariable("GITHUB_WORKFLOW") + val snapshot = environmentVariable("SNAPSHOT") + return workflow.isPresent || snapshot.isPresent + } + } +} diff --git a/build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/LibraryPlugin.kt b/build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/LibraryPlugin.kt new file mode 100644 index 00000000..4d2c7ee3 --- /dev/null +++ b/build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/LibraryPlugin.kt @@ -0,0 +1,15 @@ +package dev.msfjarvis.aps.gradle + +import com.android.build.gradle.LibraryPlugin +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply + +@Suppress("Unused") +class LibraryPlugin : Plugin { + + override fun apply(project: Project) { + project.pluginManager.apply(LibraryPlugin::class) + AndroidCommon.configure(project) + } +} diff --git a/build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/RenameArtifactsPlugin.kt b/build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/RenameArtifactsPlugin.kt new file mode 100644 index 00000000..971e3245 --- /dev/null +++ b/build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/RenameArtifactsPlugin.kt @@ -0,0 +1,37 @@ +package dev.msfjarvis.aps.gradle + +import com.android.build.api.artifact.SingleArtifact +import com.android.build.api.variant.ApplicationAndroidComponentsExtension +import com.android.build.gradle.internal.dsl.BaseAppModuleExtension +import dev.msfjarvis.aps.gradle.artifacts.CollectApksTask +import dev.msfjarvis.aps.gradle.artifacts.CollectBundleTask +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.getByType +import org.gradle.kotlin.dsl.register + +@Suppress("Unused") +class RenameArtifactsPlugin : Plugin { + + override fun apply(project: Project) { + project.pluginManager.withPlugin("com.android.application") { + val android = project.extensions.getByType() + project.extensions.getByType().run { + onVariants { variant -> + project.tasks.register("collect${variant.name.capitalize()}Apks") { + variantName.set(variant.name) + apkFolder.set(variant.artifacts.get(SingleArtifact.APK)) + builtArtifactsLoader.set(variant.artifacts.getBuiltArtifactsLoader()) + outputDirectory.set(project.layout.projectDirectory.dir("outputs")) + } + project.tasks.register("collect${variant.name.capitalize()}Bundle") { + variantName.set(variant.name) + versionName.set(android.defaultConfig.versionName) + bundleFile.set(variant.artifacts.get(SingleArtifact.BUNDLE)) + outputDirectory.set(project.layout.projectDirectory.dir("outputs")) + } + } + } + } + } +} diff --git a/build-logic/android-plugins/src/main/kotlin/artifacts/CollectApksTask.kt b/build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/artifacts/CollectApksTask.kt similarity index 97% rename from build-logic/android-plugins/src/main/kotlin/artifacts/CollectApksTask.kt rename to build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/artifacts/CollectApksTask.kt index a3da21e4..7d71671d 100644 --- a/build-logic/android-plugins/src/main/kotlin/artifacts/CollectApksTask.kt +++ b/build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/artifacts/CollectApksTask.kt @@ -1,4 +1,4 @@ -package artifacts +package dev.msfjarvis.aps.gradle.artifacts import com.android.build.api.variant.BuiltArtifactsLoader import java.nio.file.Files diff --git a/build-logic/android-plugins/src/main/kotlin/artifacts/CollectBundleTask.kt b/build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/artifacts/CollectBundleTask.kt similarity index 95% rename from build-logic/android-plugins/src/main/kotlin/artifacts/CollectBundleTask.kt rename to build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/artifacts/CollectBundleTask.kt index 8789e94e..0a516a18 100644 --- a/build-logic/android-plugins/src/main/kotlin/artifacts/CollectBundleTask.kt +++ b/build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/artifacts/CollectBundleTask.kt @@ -1,4 +1,4 @@ -package artifacts +package dev.msfjarvis.aps.gradle.artifacts import java.nio.file.Files import java.nio.file.StandardCopyOption diff --git a/build-logic/android-plugins/src/main/kotlin/signing/AppSigning.kt b/build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/signing/AppSigning.kt similarity index 95% rename from build-logic/android-plugins/src/main/kotlin/signing/AppSigning.kt rename to build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/signing/AppSigning.kt index 115f0f56..8da96230 100644 --- a/build-logic/android-plugins/src/main/kotlin/signing/AppSigning.kt +++ b/build-logic/android-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/signing/AppSigning.kt @@ -3,13 +3,12 @@ * SPDX-License-Identifier: GPL-3.0-only */ -package signing +package dev.msfjarvis.aps.gradle.signing import com.android.build.gradle.internal.dsl.BaseAppModuleExtension import java.util.Properties import org.gradle.api.Project import org.gradle.kotlin.dsl.configure -import org.gradle.kotlin.dsl.provideDelegate private const val KEYSTORE_CONFIG_PATH = "keystore.properties" diff --git a/build-logic/kotlin-plugins/build.gradle.kts b/build-logic/kotlin-plugins/build.gradle.kts index 79de4742..b3a38d28 100644 --- a/build-logic/kotlin-plugins/build.gradle.kts +++ b/build-logic/kotlin-plugins/build.gradle.kts @@ -17,7 +17,35 @@ afterEvaluate { } tasks.withType().configureEach { - kotlinOptions { jvmTarget = JavaVersion.VERSION_11.toString() } + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + freeCompilerArgs = freeCompilerArgs + "-Xsam-conversions=class" + } + } +} + +gradlePlugin { + plugins { + register("kotlin-android") { + id = "dev.msfjarvis.claw.kotlin-android" + implementationClass = "dev.msfjarvis.aps.gradle.KotlinAndroidPlugin" + } + register("kotlin-common") { + id = "dev.msfjarvis.claw.kotlin-common" + implementationClass = "dev.msfjarvis.aps.gradle.KotlinCommonPlugin" + } + register("kotlin-kapt") { + id = "dev.msfjarvis.claw.kotlin-kapt" + implementationClass = "dev.msfjarvis.aps.gradle.KotlinKaptPlugin" + } + register("kotlin-library") { + id = "dev.msfjarvis.claw.kotlin-library" + implementationClass = "dev.msfjarvis.aps.gradle.KotlinLibraryPlugin" + } + register("spotless") { + id = "dev.msfjarvis.claw.spotless" + implementationClass = "dev.msfjarvis.aps.gradle.SpotlessPlugin" + } } } @@ -26,6 +54,4 @@ dependencies { implementation(libs.build.kotlin.gradle) implementation(libs.build.kotlin.serialization) implementation(libs.build.spotless) - implementation(libs.build.vcu) - implementation(libs.build.versions) } diff --git a/build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.kotlin-android.gradle.kts b/build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.kotlin-android.gradle.kts deleted file mode 100644 index 1f578be4..00000000 --- a/build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.kotlin-android.gradle.kts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved. - * SPDX-License-Identifier: GPL-3.0-only - */ - -plugins { - kotlin("android") - id("dev.msfjarvis.claw.kotlin-common") -} diff --git a/build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.kotlin-common.gradle.kts b/build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.kotlin-common.gradle.kts deleted file mode 100644 index 178a1a02..00000000 --- a/build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.kotlin-common.gradle.kts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved. - * SPDX-License-Identifier: GPL-3.0-only - */ - -import org.gradle.api.JavaVersion -import org.gradle.api.tasks.compile.JavaCompile -import org.gradle.api.tasks.testing.Test -import org.gradle.api.tasks.testing.logging.TestLogEvent -import org.gradle.kotlin.dsl.withType -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile - -val additionalCompilerArgs = - listOf( - "-Xopt-in=kotlin.RequiresOptIn", - "-P", - "plugin:androidx.compose.compiler.plugins.kotlin:suppressKotlinVersionCompatibilityCheck=true", - ) - -tasks.withType().configureEach { - sourceCompatibility = JavaVersion.VERSION_11.toString() - targetCompatibility = JavaVersion.VERSION_11.toString() -} - -tasks.withType().configureEach { - kotlinOptions { - // TODO: Re-enable once warnings from Aurora-generated code are fixed - allWarningsAsErrors = false - jvmTarget = JavaVersion.VERSION_11.toString() - freeCompilerArgs = freeCompilerArgs + additionalCompilerArgs - languageVersion = "1.5" - } -} - -tasks.withType().configureEach { - maxParallelForks = Runtime.getRuntime().availableProcessors() * 2 - testLogging { events(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED) } - doNotTrackState("We want tests to always run even if Gradle thinks otherwise") -} diff --git a/build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.kotlin-kapt.gradle.kts b/build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.kotlin-kapt.gradle.kts deleted file mode 100644 index ac0f5337..00000000 --- a/build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.kotlin-kapt.gradle.kts +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved. - * SPDX-License-Identifier: GPL-3.0-only - */ - -import org.gradle.api.Project - -plugins { - kotlin("android") - kotlin("kapt") -} - -afterEvaluate { - kapt { - javacOptions { - if (hasDaggerCompilerDependency()) { - // https://dagger.dev/dev-guide/compiler-options#fastinit-mode - option("-Adagger.fastInit=enabled") - // Enable the better, experimental error messages - // https://github.com/google/dagger/commit/0d2505a727b54f47b8677f42dd4fc5c1924e37f5 - option("-Adagger.experimentalDaggerErrorMessages=enabled") - // Share test components for when we start leveraging Hilt for tests - // https://github.com/google/dagger/releases/tag/dagger-2.34 - option("-Adagger.hilt.shareTestComponents=true") - // KAPT nests errors causing real issues to be suppressed in CI logs - option("-Xmaxerrs", 500) - // Enables per-module validation for faster error detection - // https://github.com/google/dagger/commit/325b516ac6a53d3fc973d247b5231fafda9870a2 - option("-Adagger.moduleBindingValidation=ERROR") - } - } - } -} -// disable kapt tasks for unit tests -tasks - .matching { it.name.startsWith("kapt") && it.name.endsWith("UnitTestKotlin") } - .configureEach { enabled = false } - -fun Project.hasDaggerCompilerDependency(): Boolean { - return configurations.any { - it.dependencies.any { dependency -> dependency.name == "hilt-compiler" } - } -} diff --git a/build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.kotlin-library.gradle.kts b/build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.kotlin-library.gradle.kts deleted file mode 100644 index 10f7ae44..00000000 --- a/build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.kotlin-library.gradle.kts +++ /dev/null @@ -1,6 +0,0 @@ -/* - * Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved. - * SPDX-License-Identifier: GPL-3.0-only - */ - -plugins { id("dev.msfjarvis.claw.kotlin-common") } diff --git a/build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.spotless.gradle.kts b/build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.spotless.gradle.kts deleted file mode 100644 index 33aa4bc6..00000000 --- a/build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.spotless.gradle.kts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved. - * SPDX-License-Identifier: GPL-3.0-only - */ - -plugins { id("com.diffplug.spotless") } - -val KTFMT_VERSION = "0.37" - -spotless { - kotlin { - ktfmt(KTFMT_VERSION).googleStyle() - target("**/*.kt") - targetExclude("**/build/", "**/gen/") - } - kotlinGradle { - ktfmt(KTFMT_VERSION).googleStyle() - target("**/*.kts") - targetExclude("**/build/") - } - format("xml") { - target("**/*.xml") - targetExclude("**/build/", ".idea/") - trimTrailingWhitespace() - indentWithSpaces() - endWithNewline() - } -} diff --git a/build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.versions.gradle.kts b/build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.versions.gradle.kts deleted file mode 100644 index 43070633..00000000 --- a/build-logic/kotlin-plugins/src/main/kotlin/dev.msfjarvis.claw.versions.gradle.kts +++ /dev/null @@ -1,37 +0,0 @@ -import com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask - -plugins { - id("com.github.ben-manes.versions") - id("nl.littlerobots.version-catalog-update") -} - -versionCatalogUpdate { - keep { - // This clears out build-logic specific dependencies - keepUnusedLibraries.set(true) - } -} - -fun isNonStable(version: String): Boolean { - val stableKeyword = listOf("RELEASE", "FINAL", "GA").any { version.toUpperCase().contains(it) } - val regex = "^[0-9,.v-]+(-r)?$".toRegex() - val isStable = stableKeyword || regex.matches(version) - return isStable.not() -} - -tasks.withType().configureEach { - rejectVersionIf { - when (candidate.group) { - "com.android.application", - "com.android.library", - "com.google.accompanist", - "org.jetbrains.kotlin" -> true - else -> isNonStable(candidate.version) && !isNonStable(currentVersion) - } - } - checkForGradleUpdate = false - checkBuildEnvironmentConstraints = true - outputFormatter = "json" - outputDir = "build/dependencyUpdates" - reportfileName = "report" -} diff --git a/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/KotlinAndroidPlugin.kt b/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/KotlinAndroidPlugin.kt new file mode 100644 index 00000000..f874c137 --- /dev/null +++ b/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/KotlinAndroidPlugin.kt @@ -0,0 +1,22 @@ +/* + * Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved. + * SPDX-License-Identifier: GPL-3.0-only + */ + +package dev.msfjarvis.aps.gradle + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply +import org.jetbrains.kotlin.gradle.plugin.KotlinAndroidPluginWrapper + +@Suppress("Unused") +class KotlinAndroidPlugin : Plugin { + + override fun apply(project: Project) { + project.pluginManager.run { + apply(KotlinAndroidPluginWrapper::class) + apply(KotlinCommonPlugin::class) + } + } +} diff --git a/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/KotlinCommonPlugin.kt b/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/KotlinCommonPlugin.kt new file mode 100644 index 00000000..65671fdc --- /dev/null +++ b/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/KotlinCommonPlugin.kt @@ -0,0 +1,50 @@ +/* + * Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved. + * SPDX-License-Identifier: GPL-3.0-only + */ + +package dev.msfjarvis.aps.gradle + +import org.gradle.api.JavaVersion +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.tasks.compile.JavaCompile +import org.gradle.api.tasks.testing.Test +import org.gradle.api.tasks.testing.logging.TestLogEvent +import org.gradle.kotlin.dsl.withType +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +@Suppress("Unused") +class KotlinCommonPlugin : Plugin { + + override fun apply(project: Project) { + project.tasks.run { + withType().configureEach { + sourceCompatibility = JavaVersion.VERSION_11.toString() + targetCompatibility = JavaVersion.VERSION_11.toString() + } + withType().configureEach { + kotlinOptions { + allWarningsAsErrors = false + jvmTarget = JavaVersion.VERSION_11.toString() + freeCompilerArgs = freeCompilerArgs + ADDITIONAL_COMPILER_ARGS + languageVersion = "1.5" + } + } + withType().configureEach { + maxParallelForks = Runtime.getRuntime().availableProcessors() * 2 + testLogging { events(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED) } + doNotTrackState("We want tests to always run even if Gradle thinks otherwise") + } + } + } + + private companion object { + private val ADDITIONAL_COMPILER_ARGS = + listOf( + "-opt-in=kotlin.RequiresOptIn", + "-P", + "plugin:androidx.compose.compiler.plugins.kotlin:suppressKotlinVersionCompatibilityCheck=true", + ) + } +} diff --git a/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/KotlinKaptPlugin.kt b/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/KotlinKaptPlugin.kt new file mode 100644 index 00000000..f057fbb3 --- /dev/null +++ b/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/KotlinKaptPlugin.kt @@ -0,0 +1,55 @@ +/* + * Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved. + * SPDX-License-Identifier: GPL-3.0-only + */ + +package dev.msfjarvis.aps.gradle + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.getByType +import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin +import org.jetbrains.kotlin.gradle.plugin.KaptExtension +import org.jetbrains.kotlin.gradle.plugin.KotlinAndroidPluginWrapper + +@Suppress("Unused") +class KotlinKaptPlugin : Plugin { + + override fun apply(project: Project) { + project.pluginManager.run { + apply(KotlinAndroidPluginWrapper::class) + apply(Kapt3GradleSubplugin::class) + } + project.afterEvaluate { + project.extensions.getByType().run { + javacOptions { + if (hasDaggerCompilerDependency()) { + // https://dagger.dev/dev-guide/compiler-options#fastinit-mode + option("-Adagger.fastInit=enabled") + // Enable the better, experimental error messages + // https://github.com/google/dagger/commit/0d2505a727b54f47b8677f42dd4fc5c1924e37f5 + option("-Adagger.experimentalDaggerErrorMessages=enabled") + // Share test components for when we start leveraging Hilt for tests + // https://github.com/google/dagger/releases/tag/dagger-2.34 + option("-Adagger.hilt.shareTestComponents=true") + // KAPT nests errors causing real issues to be suppressed in CI logs + option("-Xmaxerrs", 500) + // Enables per-module validation for faster error detection + // https://github.com/google/dagger/commit/325b516ac6a53d3fc973d247b5231fafda9870a2 + option("-Adagger.moduleBindingValidation=ERROR") + } + } + } + } + project.tasks + .matching { it.name.startsWith("kapt") && it.name.endsWith("UnitTestKotlin") } + .configureEach { enabled = false } + } + + private fun Project.hasDaggerCompilerDependency(): Boolean { + return configurations.any { + it.dependencies.any { dependency -> dependency.name == "hilt-compiler" } + } + } +} diff --git a/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/KotlinLibraryPlugin.kt b/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/KotlinLibraryPlugin.kt new file mode 100644 index 00000000..f9c62a8f --- /dev/null +++ b/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/KotlinLibraryPlugin.kt @@ -0,0 +1,18 @@ +/* + * Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved. + * SPDX-License-Identifier: GPL-3.0-only + */ + +package dev.msfjarvis.aps.gradle + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply + +@Suppress("Unused") +class KotlinLibraryPlugin : Plugin { + + override fun apply(project: Project) { + project.pluginManager.apply(KotlinCommonPlugin::class) + } +} diff --git a/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/SpotlessPlugin.kt b/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/SpotlessPlugin.kt new file mode 100644 index 00000000..b460fc1f --- /dev/null +++ b/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/SpotlessPlugin.kt @@ -0,0 +1,44 @@ +/* + * Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved. + * SPDX-License-Identifier: GPL-3.0-only + */ + +package dev.msfjarvis.aps.gradle + +import com.diffplug.gradle.spotless.SpotlessExtension +import com.diffplug.gradle.spotless.SpotlessPlugin +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.getByType + +@Suppress("Unused") +class SpotlessPlugin : Plugin { + + override fun apply(project: Project) { + project.pluginManager.apply(SpotlessPlugin::class) + project.extensions.getByType().run { + kotlin { + ktfmt(KTFMT_VERSION).googleStyle() + target("**/*.kt") + targetExclude("**/build/", "**/gen/") + } + kotlinGradle { + ktfmt(KTFMT_VERSION).googleStyle() + target("**/*.kts") + targetExclude("**/build/") + } + format("xml") { + target("**/*.xml") + targetExclude("**/build/", ".idea/") + trimTrailingWhitespace() + indentWithSpaces() + endWithNewline() + } + } + } + + private companion object { + private const val KTFMT_VERSION = "0.38" + } +} diff --git a/build.gradle.kts b/build.gradle.kts index bbacbf96..c85cdc8f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,7 +2,7 @@ plugins { id("dev.msfjarvis.claw.spotless") - id("dev.msfjarvis.claw.versions") + // id("dev.msfjarvis.claw.versions") id("dev.msfjarvis.claw.kotlin-common") alias(libs.plugins.hilt) apply false } diff --git a/common/src/commonMain/kotlin/dev/msfjarvis/claw/common/comments/CommentEntry.kt b/common/src/commonMain/kotlin/dev/msfjarvis/claw/common/comments/CommentEntry.kt index 25740bf4..90c25fe6 100644 --- a/common/src/commonMain/kotlin/dev/msfjarvis/claw/common/comments/CommentEntry.kt +++ b/common/src/commonMain/kotlin/dev/msfjarvis/claw/common/comments/CommentEntry.kt @@ -48,7 +48,9 @@ fun ThemedRichText( CompositionLocalProvider( LocalTextStyle provides MaterialTheme.typography.bodyLarge, LocalContentColor provides MaterialTheme.colorScheme.onBackground, - ) { MaterialRichText(modifier) { content() } } + ) { + MaterialRichText(modifier) { content() } + } } @Composable diff --git a/common/src/commonMain/kotlin/dev/msfjarvis/claw/common/posts/LobstersCard.kt b/common/src/commonMain/kotlin/dev/msfjarvis/claw/common/posts/LobstersCard.kt index 5cdd4519..0ae760c1 100644 --- a/common/src/commonMain/kotlin/dev/msfjarvis/claw/common/posts/LobstersCard.kt +++ b/common/src/commonMain/kotlin/dev/msfjarvis/claw/common/posts/LobstersCard.kt @@ -207,7 +207,9 @@ fun TagRow( modifier = modifier, mainAxisSpacing = 8.dp, crossAxisSpacing = 8.dp, - ) { tags.forEach { tag -> TagText(tag) } } + ) { + tags.forEach { tag -> TagText(tag) } + } } @Composable diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4847699d..1e00c3ea 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -34,8 +34,6 @@ build-agp = "com.android.tools.build:gradle:7.4.0-alpha02" build-kotlin-gradle = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } build-kotlin-serialization = { module = "org.jetbrains.kotlin:kotlin-serialization", version.ref = "kotlin" } build-spotless = "com.diffplug.spotless:spotless-plugin-gradle:6.7.0" -build-vcu = "nl.littlerobots.version-catalog-update:nl.littlerobots.version-catalog-update.gradle.plugin:0.4.0" -build-versions = "com.github.ben-manes:gradle-versions-plugin:0.42.0" coil = { module = "io.coil-kt:coil", version.ref = "coil" } coil-compose = { module = "io.coil-kt:coil-compose", version.ref = "coil" } compose-richtext-markdown = { module = "com.halilibo.compose-richtext:richtext-commonmark", version.ref = "richtext" }