From a7d93ae7517b82eb7d2d85c1a384eeb76b684182 Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Sun, 22 Mar 2026 01:34:45 +0600 Subject: [PATCH] Cleanup and rework build logic (#3113) # Conflicts: # app/build.gradle.kts # app/shortcuts.xml # app/src/main/res/xml/shortcuts.xml # app/src/main/shortcuts.xml # build.gradle.kts # buildSrc/src/main/kotlin/mihon/buildlogic/AndroidConfig.kt # core/archive/build.gradle.kts # core/common/build.gradle.kts # gradle/build-logic/src/main/kotlin/mihon/gradle/BuildConfig.kt # settings.gradle.kts # source-api/build.gradle.kts # source-local/build.gradle.kts # telemetry/build.gradle.kts --- app/build.gradle.kts | 96 +++++++++++-------- app/src/main/{res/xml => }/shortcuts.xml | 16 ++-- build.gradle.kts | 18 +++- buildSrc/build.gradle.kts | 19 ---- buildSrc/settings.gradle.kts | 9 -- ...hon.android.application.compose.gradle.kts | 12 --- .../mihon.android.application.gradle.kts | 18 ---- .../main/kotlin/mihon.benchmark.gradle.kts | 14 --- .../main/kotlin/mihon.code.lint.gradle.kts | 35 ------- .../kotlin/mihon.library.compose.gradle.kts | 11 --- .../src/main/kotlin/mihon.library.gradle.kts | 13 --- .../kotlin/mihon/buildlogic/AndroidConfig.kt | 14 --- .../mihon/buildlogic/ProjectExtensions.kt | 95 ------------------ .../buildlogic/tasks/LocalesConfigTask.kt | 36 ------- core-metadata/build.gradle.kts | 12 +-- core-metadata/consumer-rules.pro | 0 core-metadata/proguard-rules.pro | 21 ---- core/common/build.gradle.kts | 8 +- data/build.gradle.kts | 11 +-- data/consumer-rules.pro | 0 data/proguard-rules.pro | 21 ---- domain/build.gradle.kts | 12 +-- domain/consumer-rules.pro | 0 domain/proguard-rules.pro | 21 ---- gradle/build-logic/build.gradle.kts | 75 +++++++++++++++ gradle/build-logic/settings.gradle.kts | 18 ++++ .../main/kotlin/PluginAndroidApplication.kt | 16 ++++ .../src/main/kotlin/PluginAndroidBase.kt | 21 ++++ .../src/main/kotlin/PluginAndroidLibrary.kt | 16 ++++ .../src/main/kotlin/PluginAndroidTest.kt | 16 ++++ .../src/main/kotlin/PluginComposeAndroid.kt | 33 +++++++ .../main/kotlin/PluginKotlinMultiplatform.kt | 36 +++++++ .../src/main/kotlin/PluginSpotless.kt | 44 +++++++++ .../src/main/kotlin/mihon/gradle}/Commands.kt | 20 ++-- .../mihon/gradle/configurations/Android.kt | 32 +++++++ .../mihon/gradle/configurations/Kotlin.kt | 27 ++++++ .../extensions/DependencyHandlerScope.kt | 32 +++++++ .../mihon/gradle/extensions/PluginManager.kt | 9 ++ .../kotlin/mihon/gradle/extensions/Project.kt | 35 +++++++ .../gradle/tasks/GenerateLocalesConfigTask.kt | 46 +++++++++ .../tasks/ReplaceShortcutsPlaceholderTask.kt | 34 +++++++ gradle/libs.versions.toml | 11 ++- gradle/mihon.versions.toml | 16 ++++ i18n-sy/build.gradle.kts | 49 +++++----- i18n/build.gradle.kts | 51 ++++------ .../commonMain/moko-resources/he/plurals.xml | 2 +- .../commonMain/moko-resources/kk/plurals.xml | 2 +- .../commonMain/moko-resources/pl/plurals.xml | 2 +- .../commonMain/moko-resources/sa/plurals.xml | 2 +- .../commonMain/moko-resources/sc/plurals.xml | 2 +- .../commonMain/moko-resources/tt/strings.xml | 2 +- macrobenchmark/build.gradle.kts | 2 +- presentation-core/build.gradle.kts | 12 +-- presentation-core/consumer-rules.pro | 0 presentation-core/proguard-rules.pro | 21 ---- presentation-widget/build.gradle.kts | 12 +-- presentation-widget/consumer-rules.pro | 0 presentation-widget/proguard-rules.pro | 21 ---- settings.gradle.kts | 16 ++-- source-api/build.gradle.kts | 63 ++++++------ source-local/build.gradle.kts | 43 ++++----- source-local/consumer-rules.pro | 0 source-local/proguard-rules.pro | 21 ---- 63 files changed, 733 insertions(+), 639 deletions(-) rename app/src/main/{res/xml => }/shortcuts.xml (87%) delete mode 100644 buildSrc/build.gradle.kts delete mode 100644 buildSrc/settings.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/mihon.android.application.compose.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/mihon.android.application.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/mihon.benchmark.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/mihon.code.lint.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/mihon.library.compose.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/mihon.library.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/mihon/buildlogic/AndroidConfig.kt delete mode 100644 buildSrc/src/main/kotlin/mihon/buildlogic/ProjectExtensions.kt delete mode 100644 buildSrc/src/main/kotlin/mihon/buildlogic/tasks/LocalesConfigTask.kt delete mode 100644 core-metadata/consumer-rules.pro delete mode 100644 core-metadata/proguard-rules.pro delete mode 100644 data/consumer-rules.pro delete mode 100644 data/proguard-rules.pro delete mode 100644 domain/consumer-rules.pro delete mode 100644 domain/proguard-rules.pro create mode 100644 gradle/build-logic/build.gradle.kts create mode 100644 gradle/build-logic/settings.gradle.kts create mode 100644 gradle/build-logic/src/main/kotlin/PluginAndroidApplication.kt create mode 100644 gradle/build-logic/src/main/kotlin/PluginAndroidBase.kt create mode 100644 gradle/build-logic/src/main/kotlin/PluginAndroidLibrary.kt create mode 100644 gradle/build-logic/src/main/kotlin/PluginAndroidTest.kt create mode 100644 gradle/build-logic/src/main/kotlin/PluginComposeAndroid.kt create mode 100644 gradle/build-logic/src/main/kotlin/PluginKotlinMultiplatform.kt create mode 100644 gradle/build-logic/src/main/kotlin/PluginSpotless.kt rename {buildSrc/src/main/kotlin/mihon/buildlogic => gradle/build-logic/src/main/kotlin/mihon/gradle}/Commands.kt (64%) create mode 100644 gradle/build-logic/src/main/kotlin/mihon/gradle/configurations/Android.kt create mode 100644 gradle/build-logic/src/main/kotlin/mihon/gradle/configurations/Kotlin.kt create mode 100644 gradle/build-logic/src/main/kotlin/mihon/gradle/extensions/DependencyHandlerScope.kt create mode 100644 gradle/build-logic/src/main/kotlin/mihon/gradle/extensions/PluginManager.kt create mode 100644 gradle/build-logic/src/main/kotlin/mihon/gradle/extensions/Project.kt create mode 100644 gradle/build-logic/src/main/kotlin/mihon/gradle/tasks/GenerateLocalesConfigTask.kt create mode 100644 gradle/build-logic/src/main/kotlin/mihon/gradle/tasks/ReplaceShortcutsPlaceholderTask.kt create mode 100644 gradle/mihon.versions.toml delete mode 100644 presentation-core/consumer-rules.pro delete mode 100644 presentation-core/proguard-rules.pro delete mode 100644 presentation-widget/consumer-rules.pro delete mode 100644 presentation-widget/proguard-rules.pro delete mode 100644 source-local/consumer-rules.pro delete mode 100644 source-local/proguard-rules.pro diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b1f186d64..7614b82b0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,16 +1,19 @@ -@file:Suppress("ChromeOsAbiSupport") -import mihon.buildlogic.getBuildTime -import mihon.buildlogic.getCommitCount -import mihon.buildlogic.getGitSha +import mihon.gradle.getBuildTime +import mihon.gradle.getLatestCommitCount +import mihon.gradle.getLatestCommitSha +import mihon.gradle.tasks.ReplaceShortcutsPlaceholderTask plugins { - id("mihon.android.application") - id("mihon.android.application.compose") + alias(mihonx.plugins.android.application) + alias(mihonx.plugins.compose) + alias(mihonx.plugins.spotless) + kotlin("plugin.parcelize") - kotlin("plugin.serialization") - // id("com.github.zellius.shortcut-helper") + alias(libs.plugins.aboutLibraries) + alias(libs.plugins.kotlin.serialization) + id("com.github.ben-manes.versions") } @@ -21,10 +24,6 @@ if (gradle.startParameter.taskRequests.toString().contains("Standard")) { } } -// shortcutHelper.setFilePath("./shortcuts.xml") - -val supportedAbis = setOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64") - android { namespace = "eu.kanade.tachiyomi" @@ -34,29 +33,17 @@ android { versionCode = 77 versionName = "1.12.0" - buildConfigField("String", "COMMIT_COUNT", "\"${getCommitCount()}\"") - buildConfigField("String", "COMMIT_SHA", "\"${getGitSha()}\"") - buildConfigField("String", "BUILD_TIME", "\"${getBuildTime(useLastCommitTime = false)}\"") + buildConfigField("String", "COMMIT_COUNT", "\"${getLatestCommitCount()}\"") + buildConfigField("String", "COMMIT_SHA", "\"${getLatestCommitSha()}\"") + buildConfigField("String", "BUILD_TIME", "\"${getBuildTime(useLatestCommitTime = false)}\"") buildConfigField("boolean", "INCLUDE_UPDATER", "false") - ndk { - abiFilters += supportedAbis - } testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - splits { - abi { - isEnable = true - reset() - include(*supportedAbis.toTypedArray()) - isUniversalApk = true - } - } - buildTypes { named("debug") { - versionNameSuffix = "-${getCommitCount()}" + versionNameSuffix = "-${getLatestCommitCount()}" applicationIdSuffix = ".debug" isPseudoLocalesEnabled = true } @@ -72,7 +59,7 @@ android { isShrinkResources = true setProguardFiles(listOf(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")) - buildConfigField("String", "BUILD_TIME", "\"${getBuildTime(useLastCommitTime = true)}\"") + buildConfigField("String", "BUILD_TIME", "\"${getBuildTime(useLatestCommitTime = true)}\"") } create("benchmark") { initWith(getByName("release")) @@ -90,6 +77,15 @@ android { getByName("benchmark").res.srcDirs("src/debug/res") } + splits { + abi { + isEnable = true + isUniversalApk = true + reset() + include("armeabi-v7a", "arm64-v8a", "x86", "x86_64") + } + } + flavorDimensions.add("default") productFlavors { @@ -106,20 +102,31 @@ android { } packaging { - resources.excludes.addAll( - listOf( + jniLibs { + keepDebugSymbols += listOf( + "libandroidx.graphics.path", + "libarchive-jni", + "libconscrypt_jni", + "libimagedecoder", + "libquickjs", + "libsqlite3x", + ) + .map { "**/$it.so" } + } + resources { + excludes += setOf( "kotlin-tooling-metadata.json", - "META-INF/DEPENDENCIES", "LICENSE.txt", - "META-INF/LICENSE", + "META-INF/**/*.properties", "META-INF/**/LICENSE.txt", "META-INF/*.properties", - "META-INF/**/*.properties", - "META-INF/README.md", - "META-INF/NOTICE", "META-INF/*.version", - ), - ) + "META-INF/DEPENDENCIES", + "META-INF/LICENSE", + "META-INF/NOTICE", + "META-INF/README.md", + ) + } } dependenciesInfo { @@ -318,6 +325,19 @@ dependencies { } androidComponents { + onVariants { variant -> + val resSource = variant.sources.res ?: return@onVariants + + val variantName = variant.name.replaceFirstChar { it.uppercase() } + val replaceShortcutsPlaceholderTask = tasks.register( + "replace${variantName}ShortcutPlaceholder", + ) { + applicationId.set(variant.applicationId) + shortcutsFile.set(projectDir.resolve("src/main/shortcuts.xml")) + } + resSource.addGeneratedSourceDirectory(replaceShortcutsPlaceholderTask) { it.outputDir } + } + onVariants(selector().withFlavor("default" to "standard")) { // Only excluding in standard flavor because this breaks // Layout Inspector's Compose tree diff --git a/app/src/main/res/xml/shortcuts.xml b/app/src/main/shortcuts.xml similarity index 87% rename from app/src/main/res/xml/shortcuts.xml rename to app/src/main/shortcuts.xml index 78cc10c6f..cf3c196ae 100644 --- a/app/src/main/res/xml/shortcuts.xml +++ b/app/src/main/shortcuts.xml @@ -8,8 +8,8 @@ android:shortcutShortLabel="@string/label_library"> + android:targetClass="eu.kanade.tachiyomi.ui.main.MainActivity" + android:targetPackage="${applicationId}" /> + android:targetClass="eu.kanade.tachiyomi.ui.main.MainActivity" + android:targetPackage="${applicationId}" /> + android:targetClass="eu.kanade.tachiyomi.ui.main.MainActivity" + android:targetPackage="${applicationId}" /> + android:targetClass="eu.kanade.tachiyomi.ui.main.MainActivity" + android:targetPackage="${applicationId}" /> diff --git a/build.gradle.kts b/build.gradle.kts index 5e7019c2e..1a9c18b75 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,19 +1,29 @@ buildscript { dependencies { - // classpath(libs.android.shortcut.gradle) classpath(sylibs.versionsx) } } plugins { - alias(libs.plugins.kotlin.serialization) apply false alias(libs.plugins.aboutLibraries) apply false + alias(libs.plugins.android.application) apply false + alias(libs.plugins.android.library) apply false + alias(libs.plugins.android.test) apply false alias(libs.plugins.firebase.crashlytics) apply false alias(libs.plugins.google.services) apply false + alias(libs.plugins.kotlin.compose.compiler) apply false + alias(libs.plugins.kotlin.serialization) apply false alias(libs.plugins.moko.resources) apply false alias(libs.plugins.sqldelight) apply false + + alias(mihonx.plugins.spotless) } -tasks.register("clean") { - delete(rootProject.layout.buildDirectory) +val buildLogic: IncludedBuild = gradle.includedBuild("build-logic") +tasks { + listOf("clean", "spotlessApply", "spotlessCheck").forEach { task -> + named(task) { + dependsOn(buildLogic.task(":$task")) + } + } } diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts deleted file mode 100644 index 9b565a5d4..000000000 --- a/buildSrc/build.gradle.kts +++ /dev/null @@ -1,19 +0,0 @@ -plugins { - `kotlin-dsl` -} - -dependencies { - implementation(libs.android.gradle) - implementation(libs.kotlin.gradle) - implementation(libs.kotlin.compose.compiler.gradle) - implementation(libs.spotless.gradle) - implementation(gradleApi()) - - implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location)) -} - -repositories { - gradlePluginPortal() - mavenCentral() - google() -} diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts deleted file mode 100644 index 5a4234bad..000000000 --- a/buildSrc/settings.gradle.kts +++ /dev/null @@ -1,9 +0,0 @@ -dependencyResolutionManagement { - versionCatalogs { - create("libs") { - from(files("../gradle/libs.versions.toml")) - } - } -} - -rootProject.name = "mihon-buildSrc" diff --git a/buildSrc/src/main/kotlin/mihon.android.application.compose.gradle.kts b/buildSrc/src/main/kotlin/mihon.android.application.compose.gradle.kts deleted file mode 100644 index 767f758cb..000000000 --- a/buildSrc/src/main/kotlin/mihon.android.application.compose.gradle.kts +++ /dev/null @@ -1,12 +0,0 @@ -import mihon.buildlogic.configureCompose - -plugins { - id("com.android.application") - kotlin("android") - - id("mihon.code.lint") -} - -android { - configureCompose(this) -} diff --git a/buildSrc/src/main/kotlin/mihon.android.application.gradle.kts b/buildSrc/src/main/kotlin/mihon.android.application.gradle.kts deleted file mode 100644 index 080f9ca64..000000000 --- a/buildSrc/src/main/kotlin/mihon.android.application.gradle.kts +++ /dev/null @@ -1,18 +0,0 @@ -import mihon.buildlogic.AndroidConfig -import mihon.buildlogic.configureAndroid -import mihon.buildlogic.configureTest - -plugins { - id("com.android.application") - kotlin("android") - - id("mihon.code.lint") -} - -android { - defaultConfig { - targetSdk = AndroidConfig.TARGET_SDK - } - configureAndroid(this) - configureTest() -} diff --git a/buildSrc/src/main/kotlin/mihon.benchmark.gradle.kts b/buildSrc/src/main/kotlin/mihon.benchmark.gradle.kts deleted file mode 100644 index 50c47f280..000000000 --- a/buildSrc/src/main/kotlin/mihon.benchmark.gradle.kts +++ /dev/null @@ -1,14 +0,0 @@ -import mihon.buildlogic.configureAndroid -import mihon.buildlogic.configureTest - -plugins { - id("com.android.test") - kotlin("android") - - id("mihon.code.lint") -} - -android { - configureAndroid(this) - configureTest() -} diff --git a/buildSrc/src/main/kotlin/mihon.code.lint.gradle.kts b/buildSrc/src/main/kotlin/mihon.code.lint.gradle.kts deleted file mode 100644 index ad36c0334..000000000 --- a/buildSrc/src/main/kotlin/mihon.code.lint.gradle.kts +++ /dev/null @@ -1,35 +0,0 @@ -import org.gradle.accessors.dm.LibrariesForLibs - -plugins { - id("com.diffplug.spotless") -} - -val libs = the() - -val xmlFormatExclude = buildList(2) { - add("**/build/**/*.xml") - - projectDir - .resolve("src/commonMain/moko-resources") - .takeIf { it.isDirectory } - ?.let(::fileTree) - ?.matching { exclude("/base/**") } - ?.let(::add) -} - .toTypedArray() - -spotless { - kotlin { - target("**/*.kt", "**/*.kts") - targetExclude("**/build/**/*.kt") - ktlint(libs.ktlint.bom.get().version) - trimTrailingWhitespace() - endWithNewline() - } - format("xml") { - target("**/*.xml") - targetExclude(*xmlFormatExclude) - trimTrailingWhitespace() - endWithNewline() - } -} diff --git a/buildSrc/src/main/kotlin/mihon.library.compose.gradle.kts b/buildSrc/src/main/kotlin/mihon.library.compose.gradle.kts deleted file mode 100644 index 7b377ce4c..000000000 --- a/buildSrc/src/main/kotlin/mihon.library.compose.gradle.kts +++ /dev/null @@ -1,11 +0,0 @@ -import mihon.buildlogic.configureCompose - -plugins { - id("com.android.library") - - id("mihon.code.lint") -} - -android { - configureCompose(this) -} diff --git a/buildSrc/src/main/kotlin/mihon.library.gradle.kts b/buildSrc/src/main/kotlin/mihon.library.gradle.kts deleted file mode 100644 index 4cf5f6efc..000000000 --- a/buildSrc/src/main/kotlin/mihon.library.gradle.kts +++ /dev/null @@ -1,13 +0,0 @@ -import mihon.buildlogic.configureAndroid -import mihon.buildlogic.configureTest - -plugins { - id("com.android.library") - - id("mihon.code.lint") -} - -android { - configureAndroid(this) - configureTest() -} diff --git a/buildSrc/src/main/kotlin/mihon/buildlogic/AndroidConfig.kt b/buildSrc/src/main/kotlin/mihon/buildlogic/AndroidConfig.kt deleted file mode 100644 index faab825b8..000000000 --- a/buildSrc/src/main/kotlin/mihon/buildlogic/AndroidConfig.kt +++ /dev/null @@ -1,14 +0,0 @@ -package mihon.buildlogic - -import org.gradle.api.JavaVersion as GradleJavaVersion -import org.jetbrains.kotlin.gradle.dsl.JvmTarget as KotlinJvmTarget - -object AndroidConfig { - const val COMPILE_SDK = 36 - const val TARGET_SDK = 36 - const val MIN_SDK = 23 - - // https://youtrack.jetbrains.com/issue/KT-66995/JvmTarget-and-JavaVersion-compatibility-for-easier-JVM-version-setup - val JavaVersion = GradleJavaVersion.VERSION_17 - val JvmTarget = KotlinJvmTarget.JVM_17 -} diff --git a/buildSrc/src/main/kotlin/mihon/buildlogic/ProjectExtensions.kt b/buildSrc/src/main/kotlin/mihon/buildlogic/ProjectExtensions.kt deleted file mode 100644 index 572936bd0..000000000 --- a/buildSrc/src/main/kotlin/mihon/buildlogic/ProjectExtensions.kt +++ /dev/null @@ -1,95 +0,0 @@ -package mihon.buildlogic - -import com.android.build.api.dsl.CommonExtension -import org.gradle.accessors.dm.LibrariesForLibs -import org.gradle.api.Project -import org.gradle.api.tasks.testing.Test -import org.gradle.api.tasks.testing.logging.TestLogEvent -import org.gradle.kotlin.dsl.configure -import org.gradle.kotlin.dsl.dependencies -import org.gradle.kotlin.dsl.provideDelegate -import org.gradle.kotlin.dsl.the -import org.gradle.kotlin.dsl.withType -import org.jetbrains.kotlin.compose.compiler.gradle.ComposeCompilerGradlePluginExtension -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import java.io.File - -val Project.libs get() = the() - -internal fun Project.configureAndroid(commonExtension: CommonExtension<*, *, *, *, *, *>) { - commonExtension.apply { - compileSdk = AndroidConfig.COMPILE_SDK - - defaultConfig { - minSdk = AndroidConfig.MIN_SDK - } - - compileOptions { - sourceCompatibility = AndroidConfig.JavaVersion - targetCompatibility = AndroidConfig.JavaVersion - isCoreLibraryDesugaringEnabled = true - } - } - - tasks.withType().configureEach { - compilerOptions { - jvmTarget.set(AndroidConfig.JvmTarget) - freeCompilerArgs.addAll( - "-Xcontext-parameters", - "-opt-in=kotlin.RequiresOptIn", - ) - - // Treat all Kotlin warnings as errors (disabled by default) - // Override by setting warningsAsErrors=true in your ~/.gradle/gradle.properties - val warningsAsErrors: String? by project - allWarningsAsErrors.set(warningsAsErrors.toBoolean()) - - } - } - - dependencies { - "coreLibraryDesugaring"(libs.android.desugar) - } -} - -internal fun Project.configureCompose(commonExtension: CommonExtension<*, *, *, *, *, *>) { - pluginManager.apply(libs.plugins.kotlin.compose.compiler.get().pluginId) - - commonExtension.apply { - buildFeatures { - compose = true - } - - dependencies { - "implementation"(platform(libs.androidx.compose.bom)) - } - } - - extensions.configure { - val enableMetrics = project.providers.gradleProperty("enableComposeCompilerMetrics").orNull.toBoolean() - val enableReports = project.providers.gradleProperty("enableComposeCompilerReports").orNull.toBoolean() - - val rootBuildDir = rootProject.layout.buildDirectory.asFile.get() - val relativePath = projectDir.relativeTo(rootDir) - - if (enableMetrics) { - rootBuildDir.resolve("compose-metrics").resolve(relativePath).let(metricsDestination::set) - } - - if (enableReports) { - rootBuildDir.resolve("compose-reports").resolve(relativePath).let(reportsDestination::set) - } - } - -} - -internal fun Project.configureTest() { - tasks.withType { - useJUnitPlatform() - testLogging { - events(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED) - } - } -} - -val Project.generatedBuildDir: File get() = project.layout.buildDirectory.asFile.get().resolve("generated/mihon") diff --git a/buildSrc/src/main/kotlin/mihon/buildlogic/tasks/LocalesConfigTask.kt b/buildSrc/src/main/kotlin/mihon/buildlogic/tasks/LocalesConfigTask.kt deleted file mode 100644 index 329e4a769..000000000 --- a/buildSrc/src/main/kotlin/mihon/buildlogic/tasks/LocalesConfigTask.kt +++ /dev/null @@ -1,36 +0,0 @@ -package mihon.buildlogic.tasks - -import org.gradle.api.Project -import org.gradle.api.Task -import org.gradle.api.tasks.TaskProvider -import java.io.File - -private val emptyResourcesElement = "\\s*|".toRegex() - -fun Project.getLocalesConfigTask(outputResourceDir: File): TaskProvider { - return tasks.register("generateLocalesConfig") { - val locales = fileTree("$projectDir/src/commonMain/moko-resources/") - .matching { include("**/strings.xml") } - .filterNot { it.readText().contains(emptyResourcesElement) } - .map { - it.parentFile.name - .replace("base", "en") - .replace("-r", "-") - .replace("+", "-") - } - .sorted() - .joinToString("\n") { "| " } - - val content = """ - | - | - $locales - | - """.trimMargin() - - outputResourceDir.resolve("xml/locales_config.xml").apply { - parentFile.mkdirs() - writeText(content) - } - } -} diff --git a/core-metadata/build.gradle.kts b/core-metadata/build.gradle.kts index 358d4f6d0..2c528e5a5 100644 --- a/core-metadata/build.gradle.kts +++ b/core-metadata/build.gradle.kts @@ -1,16 +1,12 @@ plugins { - id("mihon.library") - kotlin("android") - kotlin("plugin.serialization") + alias(mihonx.plugins.android.library) + alias(mihonx.plugins.spotless) + + alias(libs.plugins.kotlin.serialization) } android { namespace = "tachiyomi.core.metadata" - - defaultConfig { - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } } dependencies { diff --git a/core-metadata/consumer-rules.pro b/core-metadata/consumer-rules.pro deleted file mode 100644 index e69de29bb..000000000 diff --git a/core-metadata/proguard-rules.pro b/core-metadata/proguard-rules.pro deleted file mode 100644 index 481bb4348..000000000 --- a/core-metadata/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts index ea4b3c300..2d06f5c43 100644 --- a/core/common/build.gradle.kts +++ b/core/common/build.gradle.kts @@ -1,7 +1,9 @@ plugins { - id("mihon.library") - kotlin("android") - kotlin("plugin.serialization") + alias(mihonx.plugins.android.library) + alias(mihonx.plugins.spotless) + + alias(libs.plugins.kotlin.serialization) + id("com.github.ben-manes.versions") } diff --git a/data/build.gradle.kts b/data/build.gradle.kts index 3e4abe5f8..38386f7c3 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -1,17 +1,14 @@ plugins { - id("mihon.library") - kotlin("android") - kotlin("plugin.serialization") + alias(mihonx.plugins.android.library) + alias(mihonx.plugins.spotless) + + alias(libs.plugins.kotlin.serialization) alias(libs.plugins.sqldelight) } android { namespace = "tachiyomi.data" - defaultConfig { - consumerProguardFiles("consumer-rules.pro") - } - sqldelight { databases { create("Database") { diff --git a/data/consumer-rules.pro b/data/consumer-rules.pro deleted file mode 100644 index e69de29bb..000000000 diff --git a/data/proguard-rules.pro b/data/proguard-rules.pro deleted file mode 100644 index 481bb4348..000000000 --- a/data/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index 8caca3222..235725529 100644 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -1,16 +1,12 @@ plugins { - id("mihon.library") - kotlin("android") - kotlin("plugin.serialization") + alias(mihonx.plugins.android.library) + alias(mihonx.plugins.spotless) + + alias(libs.plugins.kotlin.serialization) } android { namespace = "tachiyomi.domain" - - defaultConfig { - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } } kotlin { diff --git a/domain/consumer-rules.pro b/domain/consumer-rules.pro deleted file mode 100644 index e69de29bb..000000000 diff --git a/domain/proguard-rules.pro b/domain/proguard-rules.pro deleted file mode 100644 index 481bb4348..000000000 --- a/domain/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/gradle/build-logic/build.gradle.kts b/gradle/build-logic/build.gradle.kts new file mode 100644 index 000000000..147a70e7f --- /dev/null +++ b/gradle/build-logic/build.gradle.kts @@ -0,0 +1,75 @@ +plugins { + alias(libs.plugins.kotlin.jvm) + alias(libs.plugins.kotlin.samWithReceiver) + alias(libs.plugins.spotless) + `java-gradle-plugin` +} + +// Configuration should be synced with [/gradle/build-logic/src/main/kotlin/PluginSpotless.kt] +val ktlintVersion = libs.ktlint.bom.get().version +val editorConfigFile = rootProject.file("../../.editorconfig") +spotless { + kotlin { + target("src/**/*.kt") + ktlint(ktlintVersion).setEditorConfigPath(editorConfigFile) + trimTrailingWhitespace() + endWithNewline() + } + + kotlinGradle { + target("*.kts") + ktlint(ktlintVersion).setEditorConfigPath(editorConfigFile) + trimTrailingWhitespace() + endWithNewline() + } +} + +dependencies { + compileOnly(gradleKotlinDsl()) + compileOnly(libs.android.gradle) + compileOnly(libs.kotlin.compose.compiler.gradle) + compileOnly(libs.kotlin.gradle) + implementation(libs.spotless.gradle) + implementation(libs.tapmoc.gradle) + + // These allow us to reference the dependency catalog inside our compiled plugins + compileOnly(files(libs::class.java.superclass.protectionDomain.codeSource.location)) + compileOnly(files(mihonx::class.java.superclass.protectionDomain.codeSource.location)) +} + +samWithReceiver { + annotation("org.gradle.api.HasImplicitReceiver") +} + +gradlePlugin { + plugins { + register("android-application") { + id = mihonx.plugins.android.application.get().pluginId + implementationClass = "PluginAndroidApplication" + } + register("android-base") { + id = mihonx.plugins.android.base.get().pluginId + implementationClass = "PluginAndroidBase" + } + register("android-library") { + id = mihonx.plugins.android.library.get().pluginId + implementationClass = "PluginAndroidLibrary" + } + register("android-test") { + id = mihonx.plugins.android.test.get().pluginId + implementationClass = "PluginAndroidTest" + } + register("compose-android") { + id = mihonx.plugins.compose.get().pluginId + implementationClass = "PluginComposeAndroid" + } + register("kotlin-multiplatform") { + id = mihonx.plugins.kotlin.multiplatform.get().pluginId + implementationClass = "PluginKotlinMultiplatform" + } + register("spotless") { + id = mihonx.plugins.spotless.get().pluginId + implementationClass = "PluginSpotless" + } + } +} diff --git a/gradle/build-logic/settings.gradle.kts b/gradle/build-logic/settings.gradle.kts new file mode 100644 index 000000000..37237a83f --- /dev/null +++ b/gradle/build-logic/settings.gradle.kts @@ -0,0 +1,18 @@ +dependencyResolutionManagement { + @Suppress("UnstableApiUsage") + repositories { + google() + mavenCentral() + gradlePluginPortal() + } + versionCatalogs { + create("libs") { + from(files("../libs.versions.toml")) + } + create("mihonx") { + from(files("../mihon.versions.toml")) + } + } +} + +rootProject.name = "build-logic" diff --git a/gradle/build-logic/src/main/kotlin/PluginAndroidApplication.kt b/gradle/build-logic/src/main/kotlin/PluginAndroidApplication.kt new file mode 100644 index 000000000..1348f92cc --- /dev/null +++ b/gradle/build-logic/src/main/kotlin/PluginAndroidApplication.kt @@ -0,0 +1,16 @@ +import mihon.gradle.extensions.alias +import mihon.gradle.extensions.libs +import mihon.gradle.extensions.mihonx +import mihon.gradle.extensions.plugins +import org.gradle.api.Plugin +import org.gradle.api.Project + +@Suppress("UNUSED") +class PluginAndroidApplication : Plugin { + override fun apply(target: Project): Unit = with(target) { + plugins { + alias(libs.plugins.android.application) + alias(mihonx.plugins.android.base) + } + } +} diff --git a/gradle/build-logic/src/main/kotlin/PluginAndroidBase.kt b/gradle/build-logic/src/main/kotlin/PluginAndroidBase.kt new file mode 100644 index 000000000..9f2022dae --- /dev/null +++ b/gradle/build-logic/src/main/kotlin/PluginAndroidBase.kt @@ -0,0 +1,21 @@ +import mihon.gradle.configurations.configureAndroid +import mihon.gradle.configurations.configureKotlin +import mihon.gradle.extensions.alias +import mihon.gradle.extensions.configureTest +import mihon.gradle.extensions.libs +import mihon.gradle.extensions.plugins +import org.gradle.api.Plugin +import org.gradle.api.Project + +@Suppress("UNUSED") +class PluginAndroidBase : Plugin { + override fun apply(target: Project): Unit = with(target) { + plugins { + alias(libs.plugins.kotlin.android) + } + + configureKotlin() + configureTest() + configureAndroid() + } +} diff --git a/gradle/build-logic/src/main/kotlin/PluginAndroidLibrary.kt b/gradle/build-logic/src/main/kotlin/PluginAndroidLibrary.kt new file mode 100644 index 000000000..044301f4e --- /dev/null +++ b/gradle/build-logic/src/main/kotlin/PluginAndroidLibrary.kt @@ -0,0 +1,16 @@ +import mihon.gradle.extensions.alias +import mihon.gradle.extensions.libs +import mihon.gradle.extensions.mihonx +import mihon.gradle.extensions.plugins +import org.gradle.api.Plugin +import org.gradle.api.Project + +@Suppress("UNUSED") +class PluginAndroidLibrary : Plugin { + override fun apply(target: Project): Unit = with(target) { + plugins { + alias(libs.plugins.android.library) + alias(mihonx.plugins.android.base) + } + } +} diff --git a/gradle/build-logic/src/main/kotlin/PluginAndroidTest.kt b/gradle/build-logic/src/main/kotlin/PluginAndroidTest.kt new file mode 100644 index 000000000..91c2027fc --- /dev/null +++ b/gradle/build-logic/src/main/kotlin/PluginAndroidTest.kt @@ -0,0 +1,16 @@ +import mihon.gradle.extensions.alias +import mihon.gradle.extensions.libs +import mihon.gradle.extensions.mihonx +import mihon.gradle.extensions.plugins +import org.gradle.api.Plugin +import org.gradle.api.Project + +@Suppress("UNUSED") +class PluginAndroidTest : Plugin { + override fun apply(target: Project): Unit = with(target) { + plugins { + alias(libs.plugins.android.test) + alias(mihonx.plugins.android.base) + } + } +} diff --git a/gradle/build-logic/src/main/kotlin/PluginComposeAndroid.kt b/gradle/build-logic/src/main/kotlin/PluginComposeAndroid.kt new file mode 100644 index 000000000..24580206a --- /dev/null +++ b/gradle/build-logic/src/main/kotlin/PluginComposeAndroid.kt @@ -0,0 +1,33 @@ +import mihon.gradle.extensions.alias +import mihon.gradle.extensions.android +import mihon.gradle.extensions.api +import mihon.gradle.extensions.debugApi +import mihon.gradle.extensions.implementation +import mihon.gradle.extensions.libs +import mihon.gradle.extensions.plugins +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.dependencies + +@Suppress("UNUSED") +class PluginComposeAndroid : Plugin { + override fun apply(target: Project): Unit = with(target) { + plugins { + alias(libs.plugins.kotlin.compose.compiler) + } + + android { + buildFeatures { + compose = true + } + } + + dependencies { + implementation(platform(libs.androidx.compose.bom)) + + // Compose @Preview tooling + api(libs.androidx.compose.uiToolingPreview) + debugApi(libs.androidx.compose.uiTooling) + } + } +} diff --git a/gradle/build-logic/src/main/kotlin/PluginKotlinMultiplatform.kt b/gradle/build-logic/src/main/kotlin/PluginKotlinMultiplatform.kt new file mode 100644 index 000000000..7f37f863c --- /dev/null +++ b/gradle/build-logic/src/main/kotlin/PluginKotlinMultiplatform.kt @@ -0,0 +1,36 @@ +import mihon.gradle.configurations.configureAndroid +import mihon.gradle.configurations.configureKotlin +import mihon.gradle.extensions.alias +import mihon.gradle.extensions.configureTest +import mihon.gradle.extensions.libs +import mihon.gradle.extensions.plugins +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure +import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension + +@Suppress("UNUSED") +class PluginKotlinMultiplatform : Plugin { + override fun apply(target: Project): Unit = with(target) { + plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.kotlin.multiplatform) + } + + configureKotlin() + configureTest() + configureAndroid() + + kotlin { + @OptIn(ExperimentalKotlinGradlePluginApi::class) + applyDefaultHierarchyTemplate() + + androidTarget() + } + } +} + +private fun Project.kotlin(block: KotlinMultiplatformExtension.() -> Unit) { + extensions.configure(block) +} diff --git a/gradle/build-logic/src/main/kotlin/PluginSpotless.kt b/gradle/build-logic/src/main/kotlin/PluginSpotless.kt new file mode 100644 index 000000000..6584c9f86 --- /dev/null +++ b/gradle/build-logic/src/main/kotlin/PluginSpotless.kt @@ -0,0 +1,44 @@ +import com.diffplug.gradle.spotless.SpotlessExtension +import mihon.gradle.extensions.alias +import mihon.gradle.extensions.libs +import mihon.gradle.extensions.plugins +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure + +@Suppress("UNUSED") +class PluginSpotless : Plugin { + override fun apply(target: Project): Unit = with(target) { + plugins { + alias(libs.plugins.spotless) + } + + // Configuration should be synced with [/gradle/build-logic/build.gradle.kts] + val ktlintVersion = libs.ktlint.bom.get().version + spotless { + kotlin { + target("src/**/*.kt") + ktlint(ktlintVersion) + trimTrailingWhitespace() + endWithNewline() + } + + kotlinGradle { + target("*.kts") + ktlint(ktlintVersion) + trimTrailingWhitespace() + endWithNewline() + } + + format("xml") { + target("src/**/*.xml") + trimTrailingWhitespace() + endWithNewline() + } + } + } +} + +private fun Project.spotless(block: SpotlessExtension.() -> Unit) { + extensions.configure(block) +} diff --git a/buildSrc/src/main/kotlin/mihon/buildlogic/Commands.kt b/gradle/build-logic/src/main/kotlin/mihon/gradle/Commands.kt similarity index 64% rename from buildSrc/src/main/kotlin/mihon/buildlogic/Commands.kt rename to gradle/build-logic/src/main/kotlin/mihon/gradle/Commands.kt index f3470f957..c56a3e269 100644 --- a/buildSrc/src/main/kotlin/mihon/buildlogic/Commands.kt +++ b/gradle/build-logic/src/main/kotlin/mihon/gradle/Commands.kt @@ -1,4 +1,4 @@ -package mihon.buildlogic +package mihon.gradle import org.gradle.api.Project import java.time.Instant @@ -8,33 +8,33 @@ import java.time.format.DateTimeFormatter // Git is needed in your system PATH for these commands to work. // If it's not installed, you can return a random value as a workaround -fun Project.getCommitCount(): String { - return runCommand("git rev-list --count HEAD") +fun Project.getLatestCommitCount(): String { + return exec("git rev-list --count HEAD") // return "1" } -fun Project.getGitSha(): String { - return runCommand("git rev-parse --short HEAD") +fun Project.getLatestCommitSha(): String { + return exec("git rev-parse --short HEAD") // return "1" } private val BUILD_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'") /** - * @param useLastCommitTime If `true`, the build time is based on the timestamp of the last Git commit; + * @param useLatestCommitTime If `true`, the build time is based on the timestamp of the last Git commit; * otherwise, the current time is used. Both are in UTC. * @return A formatted string representing the build time. The format used is defined by [BUILD_TIME_FORMATTER]. */ -fun Project.getBuildTime(useLastCommitTime: Boolean): String { - return if (useLastCommitTime) { - val epoch = runCommand("git log -1 --format=%ct").toLong() +fun Project.getBuildTime(useLatestCommitTime: Boolean): String { + return if (useLatestCommitTime) { + val epoch = exec("git log -1 --format=%ct").toLong() Instant.ofEpochSecond(epoch).atOffset(ZoneOffset.UTC).format(BUILD_TIME_FORMATTER) } else { LocalDateTime.now(ZoneOffset.UTC).format(BUILD_TIME_FORMATTER) } } -private fun Project.runCommand(command: String): String { +fun Project.exec(command: String): String { return providers.exec { commandLine = command.split(" ") } diff --git a/gradle/build-logic/src/main/kotlin/mihon/gradle/configurations/Android.kt b/gradle/build-logic/src/main/kotlin/mihon/gradle/configurations/Android.kt new file mode 100644 index 000000000..2fb978311 --- /dev/null +++ b/gradle/build-logic/src/main/kotlin/mihon/gradle/configurations/Android.kt @@ -0,0 +1,32 @@ +package mihon.gradle.configurations + +import com.android.build.api.dsl.ApplicationDefaultConfig +import mihon.gradle.extensions.android +import mihon.gradle.extensions.coreLibraryDesugaring +import mihon.gradle.extensions.libs +import mihon.gradle.extensions.mihonx +import org.gradle.api.Project +import org.gradle.kotlin.dsl.dependencies + +fun Project.configureAndroid() { + android { + defaultConfig { + minSdk = mihonx.versions.android.sdk.min.get().toInt() + if (this is ApplicationDefaultConfig) { + targetSdk = mihonx.versions.android.sdk.target.get().toInt() + } + + ndkVersion = mihonx.versions.android.ndk.get() + } + + compileSdk = mihonx.versions.android.sdk.compile.get().toInt() + + compileOptions { + isCoreLibraryDesugaringEnabled = true + } + } + + dependencies { + coreLibraryDesugaring(libs.android.desugar) + } +} diff --git a/gradle/build-logic/src/main/kotlin/mihon/gradle/configurations/Kotlin.kt b/gradle/build-logic/src/main/kotlin/mihon/gradle/configurations/Kotlin.kt new file mode 100644 index 000000000..aea762db6 --- /dev/null +++ b/gradle/build-logic/src/main/kotlin/mihon/gradle/configurations/Kotlin.kt @@ -0,0 +1,27 @@ +package mihon.gradle.configurations + +import mihon.gradle.extensions.mihonx +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure +import org.jetbrains.kotlin.gradle.dsl.HasConfigurableKotlinCompilerOptions +import org.jetbrains.kotlin.gradle.dsl.KotlinBaseExtension +import org.jetbrains.kotlin.gradle.dsl.KotlinCommonCompilerOptions +import tapmoc.configureJavaCompatibility + +fun Project.configureKotlin() { + configureJavaCompatibility(mihonx.versions.java.get().toInt()) + + kotlin { + compilerOptions { + freeCompilerArgs.add("-Xcontext-parameters") + } + } +} + +private fun Project.kotlin(block: KotlinBaseExtension.() -> Unit) { + extensions.configure(block) +} + +private fun KotlinBaseExtension.compilerOptions(block: KotlinCommonCompilerOptions.() -> Unit) { + if (this is HasConfigurableKotlinCompilerOptions<*>) compilerOptions(block) +} diff --git a/gradle/build-logic/src/main/kotlin/mihon/gradle/extensions/DependencyHandlerScope.kt b/gradle/build-logic/src/main/kotlin/mihon/gradle/extensions/DependencyHandlerScope.kt new file mode 100644 index 000000000..9627b2145 --- /dev/null +++ b/gradle/build-logic/src/main/kotlin/mihon/gradle/extensions/DependencyHandlerScope.kt @@ -0,0 +1,32 @@ +package mihon.gradle.extensions + +import org.gradle.api.Project +import org.gradle.api.artifacts.ExternalModuleDependencyBundle +import org.gradle.api.artifacts.MinimalExternalModuleDependency +import org.gradle.api.provider.Provider +import org.gradle.kotlin.dsl.DependencyHandlerScope + +fun DependencyHandlerScope.api(dependencyNotation: Provider) { + add("api", dependencyNotation) +} + +fun DependencyHandlerScope.coreLibraryDesugaring(dependencyNotation: Provider) { + add("coreLibraryDesugaring", dependencyNotation) +} + +fun DependencyHandlerScope.debugApi(dependencyNotation: Provider) { + add("debugApi", dependencyNotation) +} + +@JvmName("implementationBundle") +fun DependencyHandlerScope.implementation(dependencyNotation: Provider) { + add("implementation", dependencyNotation) +} + +fun DependencyHandlerScope.implementation(dependencyNotation: Provider) { + add("implementation", dependencyNotation) +} + +fun DependencyHandlerScope.implementation(dependencyNotation: Project) { + add("implementation", dependencyNotation) +} diff --git a/gradle/build-logic/src/main/kotlin/mihon/gradle/extensions/PluginManager.kt b/gradle/build-logic/src/main/kotlin/mihon/gradle/extensions/PluginManager.kt new file mode 100644 index 000000000..5ffc17134 --- /dev/null +++ b/gradle/build-logic/src/main/kotlin/mihon/gradle/extensions/PluginManager.kt @@ -0,0 +1,9 @@ +package mihon.gradle.extensions + +import org.gradle.api.plugins.PluginManager +import org.gradle.api.provider.Provider +import org.gradle.plugin.use.PluginDependency + +fun PluginManager.alias(notation: Provider) { + apply(notation.get().pluginId) +} diff --git a/gradle/build-logic/src/main/kotlin/mihon/gradle/extensions/Project.kt b/gradle/build-logic/src/main/kotlin/mihon/gradle/extensions/Project.kt new file mode 100644 index 000000000..29f9a9483 --- /dev/null +++ b/gradle/build-logic/src/main/kotlin/mihon/gradle/extensions/Project.kt @@ -0,0 +1,35 @@ +package mihon.gradle.extensions + +import com.android.build.api.dsl.CommonExtension +import com.android.build.gradle.BaseExtension +import org.gradle.accessors.dm.LibrariesForLibs +import org.gradle.accessors.dm.LibrariesForMihonx +import org.gradle.api.Project +import org.gradle.api.plugins.PluginManager +import org.gradle.api.tasks.testing.Test +import org.gradle.api.tasks.testing.logging.TestLogEvent +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.the +import org.gradle.kotlin.dsl.withType + +internal val Project.libs get() = the() +internal val Project.mihonx get() = the() + +internal fun Project.plugins(block: PluginManager.() -> Unit) { + pluginManager.apply(block) +} + +internal fun Project.android(block: CommonExtension<*, *, *, *, *, *>.() -> Unit) { + extensions.configure { + if (this is CommonExtension<*, *, *, *, *, *>) apply(block) + } +} + +fun Project.configureTest() { + tasks.withType { + useJUnitPlatform() + testLogging { + events(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED) + } + } +} diff --git a/gradle/build-logic/src/main/kotlin/mihon/gradle/tasks/GenerateLocalesConfigTask.kt b/gradle/build-logic/src/main/kotlin/mihon/gradle/tasks/GenerateLocalesConfigTask.kt new file mode 100644 index 000000000..d963dac0f --- /dev/null +++ b/gradle/build-logic/src/main/kotlin/mihon/gradle/tasks/GenerateLocalesConfigTask.kt @@ -0,0 +1,46 @@ +package mihon.gradle.tasks + +import org.gradle.api.DefaultTask +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.TaskAction + +abstract class GenerateLocalesConfigTask : DefaultTask() { + + @get:OutputDirectory + abstract val outputDir: DirectoryProperty + + @TaskAction + fun action() { + val locales = project.fileTree("src/commonMain/moko-resources") { + matching { include("**/strings.xml") } + } + .asSequence() + .filterNot { it.readText().contains(emptyResourcesElement) } + .map { + it.parentFile.name + .replace("base", "en") + .replace("-r", "-") + .replace("+", "-") + } + .distinct() + .sorted() + .joinToString("\n") { "| " } + + val content = """ + | + | + $locales + | + """.trimMargin() + + outputDir.get().file("xml/locales_config.xml").asFile.apply { + parentFile.mkdirs() + writeText(content) + } + } + + companion object { + private val emptyResourcesElement = "\\s*|".toRegex() + } +} diff --git a/gradle/build-logic/src/main/kotlin/mihon/gradle/tasks/ReplaceShortcutsPlaceholderTask.kt b/gradle/build-logic/src/main/kotlin/mihon/gradle/tasks/ReplaceShortcutsPlaceholderTask.kt new file mode 100644 index 000000000..1cde0423c --- /dev/null +++ b/gradle/build-logic/src/main/kotlin/mihon/gradle/tasks/ReplaceShortcutsPlaceholderTask.kt @@ -0,0 +1,34 @@ +package mihon.gradle.tasks + +import org.gradle.api.DefaultTask +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.TaskAction + +abstract class ReplaceShortcutsPlaceholderTask : DefaultTask() { + + @get:Input + abstract val applicationId: Property + + @get:InputFile + abstract val shortcutsFile: RegularFileProperty + + @get:OutputDirectory + abstract val outputDir: DirectoryProperty + + @TaskAction + fun action() { + val content = shortcutsFile.asFile.get() + .readText() + .replace($$"${applicationId}", applicationId.get()) + + outputDir.get().file("xml/shortcuts.xml").asFile.apply { + parentFile.mkdirs() + writeText(content) + } + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2f072716a..de91ad113 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,6 @@ aboutLibraries = "13.2.1" android-desugar = "2.1.5" android-gradle = "8.13.2" -android-shortcut = "0.1.2" androidx-activity-compose = "1.13.0" androidx-annotation = "1.9.1" androidx-appCompat = "1.7.1" @@ -68,6 +67,7 @@ sqldelight-androidx-driver = "0.0.17" stringSimilarity = "0.1.0" subsamplingScaleImageView = "66e0db195d" swipe = "1.3.0" +tapmoc = "0.4.0" unifile = "e0def6b3dc" voyager = "1.1.0-beta03" xmlutil = "0.91.3" @@ -76,7 +76,6 @@ xmlutil = "0.91.3" aboutLibraries-compose = { module = "com.mikepenz:aboutlibraries-compose-m3", version.ref = "aboutLibraries" } android-desugar = { module = "com.android.tools:desugar_jdk_libs", version.ref = "android-desugar" } android-gradle = { module = "com.android.tools.build:gradle", version.ref = "android-gradle" } -android-shortcut-gradle = { module = "com.github.zellius:android-shortcut-gradle-plugin", version.ref = "android-shortcut" } androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activity-compose" } androidx-annotation = { module = "androidx.annotation:annotation", version.ref = "androidx-annotation" } androidx-appCompat = { module = "androidx.appcompat:appcompat", version.ref = "androidx-appCompat" } @@ -176,6 +175,7 @@ sqldelight-sqliteDialect338 = { module = "app.cash.sqldelight:sqlite-3-38-dialec stringSimilarity = { module = "com.aallam.similarity:string-similarity-kotlin", version.ref = "stringSimilarity" } subsamplingScaleImageView = { module = "com.github.tachiyomiorg:subsampling-scale-image-view", version.ref = "subsamplingScaleImageView" } swipe = { module = "me.saket.swipe:swipe", version.ref = "swipe" } +tapmoc-gradle = { module = "com.gradleup.tapmoc:tapmoc-gradle-plugin", version.ref = "tapmoc" } unifile = { module = "com.github.tachiyomiorg:unifile", version.ref = "unifile" } voyager-navigator = { module = "cafe.adriel.voyager:voyager-navigator", version.ref = "voyager" } voyager-screenModel = { module = "cafe.adriel.voyager:voyager-screenmodel", version.ref = "voyager" } @@ -186,12 +186,19 @@ xmlutil-serialization = { module = "io.github.pdvrieze.xmlutil:serialization", v [plugins] aboutLibraries = { id = "com.mikepenz.aboutlibraries.plugin.android", version.ref = "aboutLibraries" } +android-application = { id = "com.android.application", version.ref = "android-gradle" } +android-library = { id = "com.android.library", version.ref = "android-gradle" } +android-test = { id = "com.android.test", version.ref = "android-gradle" } firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebase-crashlytics" } google-services = { id = "com.google.gms.google-services", version.ref = "google-services" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin-gradle" } kotlin-compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin-gradle" } +kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin-gradle" } +kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin-gradle" } +kotlin-samWithReceiver = { id = "org.jetbrains.kotlin.plugin.sam.with.receiver", version.ref = "kotlin-gradle" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin-gradle" } moko-resources = { id = "dev.icerock.mobile.multiplatform-resources", version.ref = "moko-resources" } +spotless = { id = "com.diffplug.spotless", version.ref = "spotless" } sqldelight = { id = "app.cash.sqldelight", version.ref = "sqldelight" } [bundles] diff --git a/gradle/mihon.versions.toml b/gradle/mihon.versions.toml new file mode 100644 index 000000000..56bff82b3 --- /dev/null +++ b/gradle/mihon.versions.toml @@ -0,0 +1,16 @@ +[versions] +# Used in [/gradle/build-config/src/main/kotlin/PluginKotlinMultiplatform.kt] +android-sdk-min = "23" +android-sdk-compile = "36" +android-sdk-target = "36" +android-ndk = "29.0.14206865" +java = "17" + +[plugins] +android-application = { id = "mihon.plugins.android.application" } +android-base = { id = "mihon.plugins.android.base" } +android-library = { id = "mihon.plugins.android.library" } +android-test = { id = "mihon.plugins.android.test" } +compose = { id = "mihon.plugins.compose.android" } +kotlin-multiplatform = { id = "mihon.plugins.kotlin.multiplatform" } +spotless = { id = "mihon.plugins.spotless" } diff --git a/i18n-sy/build.gradle.kts b/i18n-sy/build.gradle.kts index bf53a2b75..a424b3228 100644 --- a/i18n-sy/build.gradle.kts +++ b/i18n-sy/build.gradle.kts @@ -1,35 +1,38 @@ +import mihon.gradle.tasks.GenerateLocalesConfigTask +import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi + plugins { - id("mihon.library") - kotlin("multiplatform") + alias(mihonx.plugins.kotlin.multiplatform) + alias(mihonx.plugins.spotless) + alias(libs.plugins.moko.resources) id("com.github.ben-manes.versions") } kotlin { - androidTarget() + android { + namespace = "tachiyomi.i18n.sy" + } - applyDefaultHierarchyTemplate() + @OptIn(ExperimentalKotlinGradlePluginApi::class) + @Suppress("UnstableApiUsage") + dependencies { + api(libs.moko.resources) + } - sourceSets { - commonMain { - dependencies { - api(libs.moko.resources) - } - } + @OptIn(ExperimentalKotlinGradlePluginApi::class) + compilerOptions { + freeCompilerArgs.add("-Xexpect-actual-classes") } } -android { - namespace = "tachiyomi.i18n.sy" +androidComponents { + onVariants { variant -> + val resSource = variant.sources.res ?: return@onVariants - sourceSets { - named("main") { - res.srcDir("src/commonMain/resources") - } - } - - lint { - disable.addAll(listOf("MissingTranslation", "ExtraTranslation")) + val variantName = variant.name.replaceFirstChar { it.uppercase() } + val task = tasks.register("generate${variantName}LocalesConfig") + resSource.addGeneratedSourceDirectory(task) { it.outputDir } } } @@ -37,9 +40,3 @@ multiplatformResources { resourcesClassName.set("SYMR") resourcesPackage.set("tachiyomi.i18n.sy") } - -tasks.withType { - compilerOptions.freeCompilerArgs.addAll( - "-Xexpect-actual-classes", - ) -} diff --git a/i18n/build.gradle.kts b/i18n/build.gradle.kts index 71d0347e2..3f667615c 100644 --- a/i18n/build.gradle.kts +++ b/i18n/build.gradle.kts @@ -1,25 +1,23 @@ -import mihon.buildlogic.generatedBuildDir -import mihon.buildlogic.tasks.getLocalesConfigTask +import mihon.gradle.tasks.GenerateLocalesConfigTask import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi plugins { - id("mihon.library") - kotlin("multiplatform") + alias(mihonx.plugins.kotlin.multiplatform) + alias(mihonx.plugins.spotless) + alias(libs.plugins.moko.resources) id("com.github.ben-manes.versions") } kotlin { - androidTarget() + android { + namespace = "tachiyomi.i18n" + } - applyDefaultHierarchyTemplate() - - sourceSets { - commonMain { - dependencies { - api(libs.moko.resources) - } - } + @OptIn(ExperimentalKotlinGradlePluginApi::class) + @Suppress("UnstableApiUsage") + dependencies { + api(libs.moko.resources) } @OptIn(ExperimentalKotlinGradlePluginApi::class) @@ -28,31 +26,16 @@ kotlin { } } -val generatedAndroidResourceDir = generatedBuildDir.resolve("android/res") +androidComponents { + onVariants { variant -> + val resSource = variant.sources.res ?: return@onVariants -android { - namespace = "tachiyomi.i18n" - - sourceSets { - val main by getting - main.res.srcDirs( - "src/commonMain/resources", - generatedAndroidResourceDir, - ) - } - - lint { - disable.addAll(listOf("MissingTranslation", "ExtraTranslation")) + val variantName = variant.name.replaceFirstChar { it.uppercase() } + val task = tasks.register("generate${variantName}LocalesConfig") + resSource.addGeneratedSourceDirectory(task) { it.outputDir } } } multiplatformResources { resourcesPackage.set("tachiyomi.i18n") } - -tasks { - val localesConfigTask = project.getLocalesConfigTask(generatedAndroidResourceDir) - preBuild { - dependsOn(localesConfigTask) - } -} diff --git a/i18n/src/commonMain/moko-resources/he/plurals.xml b/i18n/src/commonMain/moko-resources/he/plurals.xml index 03bd26a33..ce9d6f171 100644 --- a/i18n/src/commonMain/moko-resources/he/plurals.xml +++ b/i18n/src/commonMain/moko-resources/he/plurals.xml @@ -101,4 +101,4 @@ מחרותיים בעוד %1$d ימים - \ No newline at end of file + diff --git a/i18n/src/commonMain/moko-resources/kk/plurals.xml b/i18n/src/commonMain/moko-resources/kk/plurals.xml index 88f5ca807..926ab35fb 100644 --- a/i18n/src/commonMain/moko-resources/kk/plurals.xml +++ b/i18n/src/commonMain/moko-resources/kk/plurals.xml @@ -64,4 +64,4 @@ Ертең %1$d күнде - \ No newline at end of file + diff --git a/i18n/src/commonMain/moko-resources/pl/plurals.xml b/i18n/src/commonMain/moko-resources/pl/plurals.xml index 2a86f3d90..920ab950c 100644 --- a/i18n/src/commonMain/moko-resources/pl/plurals.xml +++ b/i18n/src/commonMain/moko-resources/pl/plurals.xml @@ -114,4 +114,4 @@ %1$s stron %1$s stron - \ No newline at end of file + diff --git a/i18n/src/commonMain/moko-resources/sa/plurals.xml b/i18n/src/commonMain/moko-resources/sa/plurals.xml index 4c1eec295..1cddee912 100644 --- a/i18n/src/commonMain/moko-resources/sa/plurals.xml +++ b/i18n/src/commonMain/moko-resources/sa/plurals.xml @@ -76,4 +76,4 @@ %1$s अध्यायः नास्ति %1$s अध्यायाः न सन्ति - \ No newline at end of file + diff --git a/i18n/src/commonMain/moko-resources/sc/plurals.xml b/i18n/src/commonMain/moko-resources/sc/plurals.xml index dfe3faee0..903973414 100644 --- a/i18n/src/commonMain/moko-resources/sc/plurals.xml +++ b/i18n/src/commonMain/moko-resources/sc/plurals.xml @@ -76,4 +76,4 @@ 1 pàgina %1$s pàginas - \ No newline at end of file + diff --git a/i18n/src/commonMain/moko-resources/tt/strings.xml b/i18n/src/commonMain/moko-resources/tt/strings.xml index 55344e519..045e125f3 100644 --- a/i18n/src/commonMain/moko-resources/tt/strings.xml +++ b/i18n/src/commonMain/moko-resources/tt/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/macrobenchmark/build.gradle.kts b/macrobenchmark/build.gradle.kts index b74c26bdd..c7b006979 100644 --- a/macrobenchmark/build.gradle.kts +++ b/macrobenchmark/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("mihon.benchmark") + alias(mihonx.plugins.android.test) } android { diff --git a/presentation-core/build.gradle.kts b/presentation-core/build.gradle.kts index 62bf55807..32a05e028 100644 --- a/presentation-core/build.gradle.kts +++ b/presentation-core/build.gradle.kts @@ -1,16 +1,12 @@ plugins { - id("mihon.library") - id("mihon.library.compose") - kotlin("android") + alias(mihonx.plugins.android.library) + alias(mihonx.plugins.compose) + + alias(mihonx.plugins.spotless) } android { namespace = "tachiyomi.presentation.core" - - defaultConfig { - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } } kotlin { diff --git a/presentation-core/consumer-rules.pro b/presentation-core/consumer-rules.pro deleted file mode 100644 index e69de29bb..000000000 diff --git a/presentation-core/proguard-rules.pro b/presentation-core/proguard-rules.pro deleted file mode 100644 index 481bb4348..000000000 --- a/presentation-core/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/presentation-widget/build.gradle.kts b/presentation-widget/build.gradle.kts index 3f525c446..ba7d6d4d9 100644 --- a/presentation-widget/build.gradle.kts +++ b/presentation-widget/build.gradle.kts @@ -1,16 +1,12 @@ plugins { - id("mihon.library") - id("mihon.library.compose") - kotlin("android") + alias(mihonx.plugins.android.library) + alias(mihonx.plugins.compose) + + alias(mihonx.plugins.spotless) } android { namespace = "tachiyomi.presentation.widget" - - defaultConfig { - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } } dependencies { diff --git a/presentation-widget/consumer-rules.pro b/presentation-widget/consumer-rules.pro deleted file mode 100644 index e69de29bb..000000000 diff --git a/presentation-widget/proguard-rules.pro b/presentation-widget/proguard-rules.pro deleted file mode 100644 index 481bb4348..000000000 --- a/presentation-widget/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index cd988894c..f2372f47e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,30 +1,26 @@ pluginManagement { - resolutionStrategy { - eachPlugin { - val regex = "com.android.(library|application)".toRegex() - if (regex matches requested.id.id) { - useModule("com.android.tools.build:gradle:${requested.version}") - } - } - } + includeBuild("gradle/build-logic") repositories { - gradlePluginPortal() google() mavenCentral() + gradlePluginPortal() maven(url = "https://www.jitpack.io") } } dependencyResolutionManagement { versionCatalogs { + create("mihonx") { + from(files("gradle/mihon.versions.toml")) + } create("sylibs") { from(files("gradle/sy.versions.toml")) } } repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { - mavenCentral() google() + mavenCentral() maven(url = "https://www.jitpack.io") } } diff --git a/source-api/build.gradle.kts b/source-api/build.gradle.kts index 3164ec162..c3ffbbe4d 100644 --- a/source-api/build.gradle.kts +++ b/source-api/build.gradle.kts @@ -1,39 +1,46 @@ import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi plugins { - id("mihon.library") - kotlin("multiplatform") - kotlin("plugin.serialization") + alias(mihonx.plugins.kotlin.multiplatform) + alias(mihonx.plugins.spotless) + + alias(libs.plugins.kotlin.serialization) + id("com.github.ben-manes.versions") } kotlin { - androidTarget() - sourceSets { - val commonMain by getting { - dependencies { - api(libs.kotlinx.serialization.json) - api(libs.injekt) - api(libs.rxJava) - api(libs.jsoup) + android { + namespace = "eu.kanade.tachiyomi.source" - implementation(project.dependencies.platform(libs.androidx.compose.bom)) - implementation(libs.androidx.compose.runtime) - - // SY --> - api(projects.i18n) - api(projects.i18nSy) - api(libs.kotlin.reflect) - // SY <-- - } + defaultConfig { + consumerProguardFile("consumer-proguard.pro") } - val androidMain by getting { + } + + @OptIn(ExperimentalKotlinGradlePluginApi::class) + @Suppress("UnstableApiUsage") + dependencies { + api(libs.kotlinx.serialization.json) + api(libs.injekt) + api(libs.rxJava) + api(libs.jsoup) + + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.compose.runtime) + + // SY --> + api(projects.i18n) + api(projects.i18nSy) + api(libs.kotlin.reflect) + // SY <-- + } + + sourceSets { + androidMain { dependencies { implementation(projects.core.common) api(libs.androidx.preference) - - // Workaround for https://youtrack.jetbrains.com/issue/KT-57605 - implementation(libs.kotlinx.coroutines.android) } } } @@ -43,11 +50,3 @@ kotlin { freeCompilerArgs.add("-Xexpect-actual-classes") } } - -android { - namespace = "eu.kanade.tachiyomi.source" - - defaultConfig { - consumerProguardFile("consumer-proguard.pro") - } -} diff --git a/source-local/build.gradle.kts b/source-local/build.gradle.kts index c4e5d8a66..cb4ce9a1b 100644 --- a/source-local/build.gradle.kts +++ b/source-local/build.gradle.kts @@ -1,25 +1,29 @@ import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi plugins { - id("mihon.library") - kotlin("multiplatform") + alias(mihonx.plugins.kotlin.multiplatform) + alias(mihonx.plugins.spotless) } kotlin { - androidTarget() - sourceSets { - val commonMain by getting { - dependencies { - implementation(projects.sourceApi) - api(projects.i18n) - // SY --> - api(projects.i18nSy) - // SY <-- + android { + namespace = "tachiyomi.source.local" + } - implementation(libs.unifile) - } - } - val androidMain by getting { + @OptIn(ExperimentalKotlinGradlePluginApi::class) + @Suppress("UnstableApiUsage") + dependencies { + implementation(projects.sourceApi) + api(projects.i18n) + // SY --> + api(projects.i18nSy) + // SY <-- + + implementation(libs.unifile) + } + + sourceSets { + androidMain { dependencies { implementation(projects.core.common) implementation(projects.coreMetadata) @@ -40,12 +44,3 @@ kotlin { ) } } - -android { - namespace = "tachiyomi.source.local" - - defaultConfig { - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } -} diff --git a/source-local/consumer-rules.pro b/source-local/consumer-rules.pro deleted file mode 100644 index e69de29bb..000000000 diff --git a/source-local/proguard-rules.pro b/source-local/proguard-rules.pro deleted file mode 100644 index 481bb4348..000000000 --- a/source-local/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file