diff --git a/build-logic/gradle.properties b/build-logic/gradle.properties new file mode 120000 index 000000000..7677fb73b --- /dev/null +++ b/build-logic/gradle.properties @@ -0,0 +1 @@ +../gradle.properties \ No newline at end of file diff --git a/build-logic/plugins/build.gradle.kts b/build-logic/plugins/build.gradle.kts new file mode 100644 index 000000000..51ccdc43c --- /dev/null +++ b/build-logic/plugins/build.gradle.kts @@ -0,0 +1,70 @@ +/* + * Copyright (c) SRG SSR. All rights reserved. + * License information is available from the LICENSE file. + */ + +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + `kotlin-dsl` +} + +group = "ch.srgssr.pillarbox.gradle" + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +tasks.withType().configureEach { + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17.majorVersion + } +} + +dependencies { + compileOnly(libs.android.gradle.api) + compileOnly(libs.kotlinx.kover.gradle) + compileOnly(libs.kotlin.gradle.plugin) +} + +tasks { + validatePlugins { + enableStricterValidation = true + failOnWarning = true + } +} + +gradlePlugin { + plugins { + register("PillarboxAndroidApplication") { + id = "ch.srgssr.pillarbox.gradle.android_application" + implementationClass = "ch.srgssr.pillarbox.gradle.PillarboxAndroidApplicationPlugin" + } + + register("PillarboxAndroidLibrary") { + id = "ch.srgssr.pillarbox.gradle.android_library" + implementationClass = "ch.srgssr.pillarbox.gradle.PillarboxAndroidLibraryPlugin" + } + + register("PillarboxAndroidLibraryCompose") { + id = "ch.srgssr.pillarbox.gradle.android_library_compose" + implementationClass = "ch.srgssr.pillarbox.gradle.PillarboxAndroidLibraryComposePlugin" + } + + register("PillarboxAndroidLibraryLint") { + id = "ch.srgssr.pillarbox.gradle.android_library_lint" + implementationClass = "ch.srgssr.pillarbox.gradle.PillarboxAndroidLibraryLintPlugin" + } + + register("PillarboxAndroidLibraryPublishing") { + id = "ch.srgssr.pillarbox.gradle.android_library_publishing" + implementationClass = "ch.srgssr.pillarbox.gradle.PillarboxAndroidLibraryPublishingPlugin" + } + + register("PillarboxAndroidLibraryTestedModule") { + id = "ch.srgssr.pillarbox.gradle.android_library_tested_module" + implementationClass = "ch.srgssr.pillarbox.gradle.PillarboxAndroidLibraryTestedModulePlugin" + } + } +} diff --git a/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxAndroidApplicationPlugin.kt b/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxAndroidApplicationPlugin.kt new file mode 100644 index 000000000..3f9e70290 --- /dev/null +++ b/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxAndroidApplicationPlugin.kt @@ -0,0 +1,69 @@ +/* + * Copyright (c) SRG SSR. All rights reserved. + * License information is available from the LICENSE file. + */ +package ch.srgssr.pillarbox.gradle + +import ch.srgssr.pillarbox.gradle.internal.AppConfig +import ch.srgssr.pillarbox.gradle.internal.VersionConfig +import ch.srgssr.pillarbox.gradle.internal.configureAndroidLintModule +import ch.srgssr.pillarbox.gradle.internal.configureAndroidModule +import ch.srgssr.pillarbox.gradle.internal.configureComposeModule +import ch.srgssr.pillarbox.gradle.internal.configureKotlinModule +import com.android.build.api.dsl.ApplicationExtension +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.extra + +/** + * Custom Gradle plugin to configure an Android library module for Pillarbox. + */ +class PillarboxAndroidApplicationPlugin : Plugin { + override fun apply(target: Project) = with(target) { + pluginManager.apply("com.android.application") + pluginManager.apply("org.jetbrains.kotlin.android") + + extensions.configure { + configureAndroidLintModule(this) + configureAndroidModule(this) + configureComposeModule(this) + + defaultConfig { + applicationId = namespace + targetSdk = AppConfig.targetSdk + versionCode = VersionConfig.versionCode() + versionName = VersionConfig.versionName() + vectorDrawables.useSupportLibrary = true + } + + signingConfigs { + create("release") { + val password = System.getenv("DEMO_KEY_PASSWORD") ?: extra.properties["pillarbox.keystore.password"] as String? + + storeFile = file("./demo.keystore") + storePassword = password + keyAlias = "demo" + keyPassword = password + } + } + + buildTypes { + debug { + applicationIdSuffix = ".debug" + versionNameSuffix = "-debug" + } + + release { + signingConfig = signingConfigs.getByName("release") + isMinifyEnabled = false + isDebuggable = true + + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + } + } + + configureKotlinModule() + } +} diff --git a/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxAndroidLibraryComposePlugin.kt b/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxAndroidLibraryComposePlugin.kt new file mode 100644 index 000000000..97f92e2db --- /dev/null +++ b/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxAndroidLibraryComposePlugin.kt @@ -0,0 +1,24 @@ +/* + * Copyright (c) SRG SSR. All rights reserved. + * License information is available from the LICENSE file. + */ +package ch.srgssr.pillarbox.gradle + +import ch.srgssr.pillarbox.gradle.internal.configureComposeModule +import com.android.build.api.dsl.LibraryExtension +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure + +/** + * Custom Gradle plugin to configure Compose in an Android library module for Pillarbox. + */ +class PillarboxAndroidLibraryComposePlugin : Plugin { + override fun apply(target: Project) = with(target) { + pluginManager.apply("com.android.library") + + extensions.configure { + configureComposeModule(this) + } + } +} diff --git a/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxAndroidLibraryLintPlugin.kt b/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxAndroidLibraryLintPlugin.kt new file mode 100644 index 000000000..dd1d7ce7d --- /dev/null +++ b/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxAndroidLibraryLintPlugin.kt @@ -0,0 +1,24 @@ +/* + * Copyright (c) SRG SSR. All rights reserved. + * License information is available from the LICENSE file. + */ +package ch.srgssr.pillarbox.gradle + +import ch.srgssr.pillarbox.gradle.internal.configureAndroidLintModule +import com.android.build.api.dsl.LibraryExtension +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure + +/** + * Custom Gradle plugin to configure Lint in an Android library module for Pillarbox. + */ +class PillarboxAndroidLibraryLintPlugin : Plugin { + override fun apply(target: Project) = with(target) { + pluginManager.apply("com.android.library") + + extensions.configure { + configureAndroidLintModule(this) + } + } +} diff --git a/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxAndroidLibraryPlugin.kt b/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxAndroidLibraryPlugin.kt new file mode 100644 index 000000000..dc371244b --- /dev/null +++ b/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxAndroidLibraryPlugin.kt @@ -0,0 +1,40 @@ +/* + * Copyright (c) SRG SSR. All rights reserved. + * License information is available from the LICENSE file. + */ +package ch.srgssr.pillarbox.gradle + +import ch.srgssr.pillarbox.gradle.internal.configureAndroidModule +import ch.srgssr.pillarbox.gradle.internal.configureKotlinModule +import com.android.build.api.dsl.LibraryExtension +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure + +/** + * Custom Gradle plugin to configure an Android library module for Pillarbox. + */ +class PillarboxAndroidLibraryPlugin : Plugin { + override fun apply(target: Project) = with(target) { + pluginManager.apply("com.android.library") + pluginManager.apply("org.jetbrains.kotlin.android") + + extensions.configure { + configureAndroidModule(this) + + defaultConfig { + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + release { + isMinifyEnabled = false + + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + } + } + + configureKotlinModule() + } +} diff --git a/buildSrc/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxPublishingPlugin.kt b/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxAndroidLibraryPublishingPlugin.kt similarity index 72% rename from buildSrc/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxPublishingPlugin.kt rename to build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxAndroidLibraryPublishingPlugin.kt index 843d656b3..417378e3a 100644 --- a/buildSrc/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxPublishingPlugin.kt +++ b/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxAndroidLibraryPublishingPlugin.kt @@ -4,7 +4,7 @@ */ package ch.srgssr.pillarbox.gradle -import VersionConfig +import ch.srgssr.pillarbox.gradle.internal.VersionConfig import com.android.build.api.dsl.LibraryExtension import org.gradle.api.Plugin import org.gradle.api.Project @@ -15,9 +15,9 @@ import org.gradle.kotlin.dsl.get import org.gradle.kotlin.dsl.register /** - * Custom Gradle plugin to manage publication of a Pillarbox's library modules. + * Custom Gradle plugin to configure publication in an Android library module for Pillarbox. */ -class PillarboxPublishingPlugin : Plugin { +class PillarboxAndroidLibraryPublishingPlugin : Plugin { override fun apply(target: Project) = with(target) { pluginManager.apply("com.android.library") pluginManager.apply("org.gradle.maven-publish") @@ -49,9 +49,14 @@ class PillarboxPublishingPlugin : Plugin { maven { name = "GitHubPackages" url = uri("https://maven.pkg.github.com/SRGSSR/pillarbox-android") + credentials { - username = findProperty("gpr.user") as String? ?: System.getenv("USERNAME") - password = findProperty("gpr.key") as String? ?: System.getenv("GITHUB_TOKEN") + username = providers.gradleProperty("gpr.user") + .orElse(providers.environmentVariable("USERNAME")) + .get() + password = providers.gradleProperty("gpr.key") + .orElse(providers.environmentVariable("GITHUB_TOKEN")) + .get() } } } diff --git a/buildSrc/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxTestedModulePlugin.kt b/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxAndroidLibraryTestedModulePlugin.kt similarity index 89% rename from buildSrc/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxTestedModulePlugin.kt rename to build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxAndroidLibraryTestedModulePlugin.kt index 904181c0f..415a56bd5 100644 --- a/buildSrc/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxTestedModulePlugin.kt +++ b/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/PillarboxAndroidLibraryTestedModulePlugin.kt @@ -14,9 +14,9 @@ import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.withType /** - * Custom Gradle plugin to configure a Pillarbox module for testing. + * Custom Gradle plugin to configure testing in an Android library module for Pillarbox. */ -class PillarboxTestedModulePlugin : Plugin { +class PillarboxAndroidLibraryTestedModulePlugin : Plugin { override fun apply(target: Project) = with(target) { pluginManager.apply("com.android.library") pluginManager.apply("org.jetbrains.kotlinx.kover") diff --git a/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/internal/AppConfig.kt b/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/internal/AppConfig.kt new file mode 100644 index 000000000..d2abe458e --- /dev/null +++ b/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/internal/AppConfig.kt @@ -0,0 +1,17 @@ +/* + * Copyright (c) SRG SSR. All rights reserved. + * License information is available from the LICENSE file. + */ +package ch.srgssr.pillarbox.gradle.internal + +import org.gradle.api.JavaVersion + +internal object AppConfig { + internal const val minSdk = 21 + internal const val targetSdk = 34 + internal const val compileSdk = 34 + internal const val androidXComposeCompiler = "1.5.10" + + // When changing this value, don't forget to also update the Detekt config in the root `build.gradle.kts` file + internal val javaVersion = JavaVersion.VERSION_17 +} diff --git a/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/internal/ProjectExtensions.kt b/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/internal/ProjectExtensions.kt new file mode 100644 index 000000000..6d07c7e7d --- /dev/null +++ b/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/internal/ProjectExtensions.kt @@ -0,0 +1,58 @@ +/* + * Copyright (c) SRG SSR. All rights reserved. + * License information is available from the LICENSE file. + */ +package ch.srgssr.pillarbox.gradle.internal + +import com.android.build.api.dsl.CommonExtension +import org.gradle.api.Project +import org.gradle.kotlin.dsl.withType +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +internal fun Project.configureAndroidModule(extension: CommonExtension<*, *, *, *, *, *>) = with(extension) { + namespace = "ch.srgssr.pillarbox." + name.removePrefix("pillarbox-").replace('-', '.') + compileSdk = AppConfig.compileSdk + + defaultConfig { + minSdk = AppConfig.minSdk + } + + compileOptions { + sourceCompatibility = AppConfig.javaVersion + targetCompatibility = AppConfig.javaVersion + } + + buildFeatures { + resValues = false + shaders = false + } +} + +internal fun configureComposeModule(extension: CommonExtension<*, *, *, *, *, *>) = with(extension) { + buildFeatures { + compose = true + } + + composeOptions { + kotlinCompilerExtensionVersion = AppConfig.androidXComposeCompiler + } +} + +internal fun Project.configureKotlinModule() { + tasks.withType().configureEach { + kotlinOptions { + jvmTarget = AppConfig.javaVersion.majorVersion + } + } +} + +internal fun Project.configureAndroidLintModule(extension: CommonExtension<*, *, *, *, *, *>) = with(extension) { + lint { + abortOnError = true + checkAllWarnings = true + checkDependencies = true + sarifReport = true + sarifOutput = file("${rootProject.rootDir}/build/reports/android-lint/$name.sarif") + disable.add("LogConditional") + } +} diff --git a/buildSrc/src/main/java/VersionConfig.kt b/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/internal/VersionConfig.kt similarity index 72% rename from buildSrc/src/main/java/VersionConfig.kt rename to build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/internal/VersionConfig.kt index 12f4cff57..194224028 100644 --- a/buildSrc/src/main/java/VersionConfig.kt +++ b/build-logic/plugins/src/main/java/ch/srgssr/pillarbox/gradle/internal/VersionConfig.kt @@ -2,19 +2,14 @@ * Copyright (c) SRG SSR. All rights reserved. * License information is available from the LICENSE file. */ +package ch.srgssr.pillarbox.gradle.internal /** * VersionConfig will build * - VersionName for Pillarbox Demo * - Version for Libraries */ -object VersionConfig { - /** - * Environment variable automatically set by GitHub actions. - * @see [GitHub](https://docs.github.com/en/actions/learn-github-actions/variables#default-environment-variables) - */ - val isCI: Boolean = System.getenv("CI")?.toBooleanStrictOrNull() ?: false - +internal object VersionConfig { /** * Environment variable set by workflow. */ @@ -26,7 +21,7 @@ object VersionConfig { * * @return "Local" if [ENV_VERSION_NAME] no set. */ - fun versionName(): String { + internal fun versionName(): String { return ENV_VERSION_NAME ?: "Local" } @@ -35,7 +30,7 @@ object VersionConfig { * It assumes that major.minor.patch each <= 99 * 0.0.0, 0.0.99, 0.1.0, 0.99.99 */ - fun versionCode(): Int { + internal fun versionCode(): Int { return ENV_VERSION_NAME ?.let { versionOnlyRegex.find(it)?.value } ?.let { diff --git a/buildSrc/settings.gradle.kts b/build-logic/settings.gradle.kts similarity index 94% rename from buildSrc/settings.gradle.kts rename to build-logic/settings.gradle.kts index fc0b70257..1cc98eb7a 100644 --- a/buildSrc/settings.gradle.kts +++ b/build-logic/settings.gradle.kts @@ -17,3 +17,5 @@ dependencyResolutionManagement { } } } + +include(":plugins") diff --git a/build.gradle.kts b/build.gradle.kts index a4b7dcc9a..7e345beb3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,6 +12,7 @@ plugins { alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.detekt) alias(libs.plugins.dependency.analysis.gradle.plugin) + alias(libs.plugins.kotlinx.kover) } apply(plugin = "android-reporting") @@ -39,7 +40,7 @@ allprojects { } tasks.withType().configureEach { - jvmTarget = AppConfig.javaVersion.majorVersion + jvmTarget = JavaVersion.VERSION_17.majorVersion basePath = rootDir.absolutePath reports { xml.required = false diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts deleted file mode 100644 index ca5e136fd..000000000 --- a/buildSrc/build.gradle.kts +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (c) SRG SSR. All rights reserved. - * License information is available from the LICENSE file. - */ -plugins { - `kotlin-dsl` -} - -dependencies { - api(libs.android.gradle.api) - api(libs.kotlinx.kover.gradle) -} diff --git a/buildSrc/src/main/java/AppConfig.kt b/buildSrc/src/main/java/AppConfig.kt deleted file mode 100644 index e0e53a436..000000000 --- a/buildSrc/src/main/java/AppConfig.kt +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) SRG SSR. All rights reserved. - * License information is available from the LICENSE file. - */ - -import org.gradle.api.JavaVersion -import java.util.Date - -object AppConfig { - const val minSdk = 21 - const val targetSdk = 34 - const val compileSdk = 34 - val javaVersion = JavaVersion.VERSION_17 - - @Suppress("SimpleDateFormat") - fun getBuildDate(): String { - val sdf = java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss") - return sdf.format(Date()) - } -} diff --git a/buildSrc/src/main/resources/META-INF/gradle-plugins/ch.srgssr.pillarbox.gradle.publishing.properties b/buildSrc/src/main/resources/META-INF/gradle-plugins/ch.srgssr.pillarbox.gradle.publishing.properties deleted file mode 100644 index ab5bd13e2..000000000 --- a/buildSrc/src/main/resources/META-INF/gradle-plugins/ch.srgssr.pillarbox.gradle.publishing.properties +++ /dev/null @@ -1 +0,0 @@ -implementation-class=ch.srgssr.pillarbox.gradle.PillarboxPublishingPlugin diff --git a/buildSrc/src/main/resources/META-INF/gradle-plugins/ch.srgssr.pillarbox.gradle.tested_module.properties b/buildSrc/src/main/resources/META-INF/gradle-plugins/ch.srgssr.pillarbox.gradle.tested_module.properties deleted file mode 100644 index 154a6e069..000000000 --- a/buildSrc/src/main/resources/META-INF/gradle-plugins/ch.srgssr.pillarbox.gradle.tested_module.properties +++ /dev/null @@ -1 +0,0 @@ -implementation-class=ch.srgssr.pillarbox.gradle.PillarboxTestedModulePlugin diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cc90f14d0..d1b3d1b36 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,8 +4,6 @@ android-gradle-plugin = "8.3.0" androidx-activity = "1.8.2" androidx-annotation = "1.7.1" androidx-compose = "2024.02.02" -# https://developer.android.com/jetpack/androidx/releases/compose-kotlin -androidx-compose-compiler = "1.5.10" androidx-core = "1.12.0" androidx-fragment = "1.6.2" androidx-leanback = "1.0.0" @@ -68,6 +66,7 @@ androidx-tv-material = { module = "androidx.tv:tv-material", version.ref = "andr coil = { group = "io.coil-kt", name = "coil-compose", version.ref = "coil" } coil-base = { module = "io.coil-kt:coil-compose-base", version.ref = "coil" } json = { module = "org.json:json", version.ref = "json" } +kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" } kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } kotlinx-kover-gradle = { module = "org.jetbrains.kotlinx:kover-gradle-plugin", version.ref = "kotlinx-kover" } @@ -143,3 +142,10 @@ dependency-analysis-gradle-plugin = { id = "com.autonomousapps.dependency-analys detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } +kotlinx-kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kotlinx-kover" } +pillarbox-android-application = { id = "ch.srgssr.pillarbox.gradle.android_application", version = "unspecified" } +pillarbox-android-library = { id = "ch.srgssr.pillarbox.gradle.android_library", version = "unspecified" } +pillarbox-android-library-compose = { id = "ch.srgssr.pillarbox.gradle.android_library_compose", version = "unspecified" } +pillarbox-android-library-lint = { id = "ch.srgssr.pillarbox.gradle.android_library_lint", version = "unspecified" } +pillarbox-android-library-publishing = { id = "ch.srgssr.pillarbox.gradle.android_library_publishing", version = "unspecified" } +pillarbox-android-library-tested-module = { id = "ch.srgssr.pillarbox.gradle.android_library_tested_module", version = "unspecified" } diff --git a/pillarbox-analytics/build.gradle.kts b/pillarbox-analytics/build.gradle.kts index 210ce7eb3..043b9bb52 100644 --- a/pillarbox-analytics/build.gradle.kts +++ b/pillarbox-analytics/build.gradle.kts @@ -3,44 +3,25 @@ * License information is available from the LICENSE file. */ +import java.text.SimpleDateFormat +import java.util.Date + plugins { - id("ch.srgssr.pillarbox.gradle.publishing") - id("ch.srgssr.pillarbox.gradle.tested_module") - alias(libs.plugins.kotlin.android) + alias(libs.plugins.pillarbox.android.library) + alias(libs.plugins.pillarbox.android.library.publishing) + alias(libs.plugins.pillarbox.android.library.tested.module) } android { - namespace = "ch.srgssr.pillarbox.analytics" - compileSdk = AppConfig.compileSdk - defaultConfig { - minSdk = AppConfig.minSdk + val buildDate = SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date()) - buildConfigField("String", "BUILD_DATE", "\"${AppConfig.getBuildDate()}\"") + buildConfigField("String", "BUILD_DATE", "\"$buildDate\"") buildConfigField("String", "VERSION_NAME", "\"${version}\"") - - consumerProguardFiles("consumer-rules.pro") } - buildTypes { - release { - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) - } - } - compileOptions { - sourceCompatibility = AppConfig.javaVersion - targetCompatibility = AppConfig.javaVersion - } - kotlinOptions { - jvmTarget = AppConfig.javaVersion.majorVersion - } buildFeatures { buildConfig = true - resValues = false } } diff --git a/pillarbox-core-business/build.gradle.kts b/pillarbox-core-business/build.gradle.kts index 8fb5bf738..1ed2db21a 100644 --- a/pillarbox-core-business/build.gradle.kts +++ b/pillarbox-core-business/build.gradle.kts @@ -4,38 +4,15 @@ */ plugins { - id("ch.srgssr.pillarbox.gradle.publishing") - id("ch.srgssr.pillarbox.gradle.tested_module") - alias(libs.plugins.kotlin.android) + alias(libs.plugins.pillarbox.android.library) + alias(libs.plugins.pillarbox.android.library.publishing) + alias(libs.plugins.pillarbox.android.library.tested.module) alias(libs.plugins.kotlin.serialization) } android { - namespace = "ch.srgssr.pillarbox.core.business" - compileSdk = AppConfig.compileSdk - - defaultConfig { - minSdk = AppConfig.minSdk - - consumerProguardFiles("consumer-rules.pro") - } - - buildTypes { - release { - isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") - } - } - compileOptions { - sourceCompatibility = AppConfig.javaVersion - targetCompatibility = AppConfig.javaVersion - } - kotlinOptions { - jvmTarget = AppConfig.javaVersion.majorVersion - } buildFeatures { buildConfig = true - resValues = false } } diff --git a/pillarbox-demo-shared/build.gradle.kts b/pillarbox-demo-shared/build.gradle.kts index efc908347..783c35140 100644 --- a/pillarbox-demo-shared/build.gradle.kts +++ b/pillarbox-demo-shared/build.gradle.kts @@ -2,38 +2,9 @@ * Copyright (c) SRG SSR. All rights reserved. * License information is available from the LICENSE file. */ -plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) -} - -android { - namespace = "ch.srgssr.pillarbox.demo.shared" - compileSdk = AppConfig.compileSdk - defaultConfig { - minSdk = AppConfig.minSdk - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } - - buildTypes { - release { - isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") - } - } - compileOptions { - sourceCompatibility = AppConfig.javaVersion - targetCompatibility = AppConfig.javaVersion - } - kotlinOptions { - jvmTarget = AppConfig.javaVersion.majorVersion - } - buildFeatures { - resValues = false - } +plugins { + alias(libs.plugins.pillarbox.android.library) } dependencies { diff --git a/pillarbox-demo-tv/build.gradle.kts b/pillarbox-demo-tv/build.gradle.kts index 850f793c9..07f91286d 100644 --- a/pillarbox-demo-tv/build.gradle.kts +++ b/pillarbox-demo-tv/build.gradle.kts @@ -3,64 +3,7 @@ * License information is available from the LICENSE file. */ plugins { - alias(libs.plugins.android.application) - alias(libs.plugins.kotlin.android) -} - -android { - namespace = "ch.srgssr.pillarbox.demo.tv" - compileSdk = AppConfig.compileSdk - - defaultConfig { - applicationId = "ch.srgssr.pillarbox.demo.tv" - minSdk = AppConfig.minSdk - targetSdk = AppConfig.targetSdk - versionCode = VersionConfig.versionCode() - versionName = VersionConfig.versionName() - } - - signingConfigs { - create("release") { - val password = System.getenv("DEMO_KEY_PASSWORD") ?: extra.properties["pillarbox.keystore.password"] as String? - storeFile = file("./demo.keystore") - storePassword = password - keyAlias = "demo" - keyPassword = password - } - } - - buildTypes { - debug { - applicationIdSuffix = ".debug" - versionNameSuffix = "-debug" - } - release { - isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") - } - } - compileOptions { - sourceCompatibility = AppConfig.javaVersion - targetCompatibility = AppConfig.javaVersion - } - kotlinOptions { - jvmTarget = AppConfig.javaVersion.majorVersion - } - buildFeatures { - compose = true - resValues = false - } - lint { - // https://developer.android.com/reference/tools/gradle-api/8.1/com/android/build/api/dsl/Lint - abortOnError = true - checkAllWarnings = true - checkDependencies = true - sarifReport = true - sarifOutput = file("${rootProject.rootDir}/build/reports/android-lint/pillarbox-demo-tv.sarif") - } - composeOptions { - kotlinCompilerExtensionVersion = libs.versions.androidx.compose.compiler.get() - } + alias(libs.plugins.pillarbox.android.application) } dependencies { diff --git a/pillarbox-demo/build.gradle.kts b/pillarbox-demo/build.gradle.kts index 2044b5cff..47e73f00b 100644 --- a/pillarbox-demo/build.gradle.kts +++ b/pillarbox-demo/build.gradle.kts @@ -3,97 +3,40 @@ * License information is available from the LICENSE file. */ plugins { - alias(libs.plugins.android.application) - alias(libs.plugins.kotlin.android) + alias(libs.plugins.pillarbox.android.application) } android { - compileSdk = AppConfig.compileSdk - defaultConfig { - applicationId = "ch.srgssr.pillarbox.demo" - minSdk = AppConfig.minSdk - targetSdk = AppConfig.targetSdk - versionCode = VersionConfig.versionCode() - versionName = VersionConfig.versionName() - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - vectorDrawables { - useSupportLibrary = true + val versionDimension = "version" + flavorDimensions += versionDimension + productFlavors { + create("prod") { + dimension = versionDimension } - } - signingConfigs { - create("release") { - val password = System.getenv("DEMO_KEY_PASSWORD") ?: extra.properties["pillarbox.keystore.password"] as String? - storeFile = file("./demo.keystore") - storePassword = password - keyAlias = "demo" - keyPassword = password + create("nightly") { + dimension = versionDimension + applicationIdSuffix = ".nightly" + versionNameSuffix = "-nightly" } } - buildTypes { - debug { - applicationIdSuffix = ".debug" - versionNameSuffix = "-debug" - } - release { - signingConfig = signingConfigs.getByName("release") - isMinifyEnabled = false - isDebuggable = true - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) - } - val versionDimension = "version" - flavorDimensions += versionDimension - productFlavors { - create("prod") { - dimension = versionDimension - } - create("nightly") { - dimension = versionDimension - applicationIdSuffix = ".nightly" - versionNameSuffix = "-nightly" - } - } - } - compileOptions { - sourceCompatibility = AppConfig.javaVersion - targetCompatibility = AppConfig.javaVersion - } - kotlinOptions { - jvmTarget = AppConfig.javaVersion.majorVersion - } buildFeatures { buildConfig = true - compose = true - resValues = false } - composeOptions { - kotlinCompilerExtensionVersion = libs.versions.androidx.compose.compiler.get() - } - lint { - // https://developer.android.com/reference/tools/gradle-api/8.1/com/android/build/api/dsl/Lint - abortOnError = true - checkAllWarnings = true - checkDependencies = true - sarifReport = true - sarifOutput = file("${rootProject.rootDir}/build/reports/android-lint/pillarbox-demo.sarif") - disable.add("LogConditional") - } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" } } - namespace = "ch.srgssr.pillarbox.demo" // Hide nightly flavors from BuildVariants in AndroidStudio androidComponents { beforeVariants { variant -> - variant.enable = VersionConfig.isCI || variant.flavorName != "nightly" + val isCI = System.getenv("CI")?.toBooleanStrictOrNull() ?: false + + variant.enable = isCI || variant.flavorName != "nightly" } } } diff --git a/pillarbox-player-testutils/build.gradle.kts b/pillarbox-player-testutils/build.gradle.kts index ba5be0ad1..911160170 100644 --- a/pillarbox-player-testutils/build.gradle.kts +++ b/pillarbox-player-testutils/build.gradle.kts @@ -2,46 +2,10 @@ * Copyright (c) SRG SSR. All rights reserved. * License information is available from the LICENSE file. */ -plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) -} - -android { - namespace = "ch.srgssr.pillarbox.player.test.utils" - compileSdk = AppConfig.compileSdk - defaultConfig { - minSdk = AppConfig.minSdk - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } - - buildTypes { - release { - isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") - } - } - compileOptions { - sourceCompatibility = AppConfig.javaVersion - targetCompatibility = AppConfig.javaVersion - } - lint { - // https://developer.android.com/reference/tools/gradle-api/8.1/com/android/build/api/dsl/Lint - abortOnError = true - checkAllWarnings = true - checkDependencies = true - sarifReport = true - sarifOutput = file("${rootProject.rootDir}/build/reports/android-lint/pillarbox-player-testutils.sarif") - } - kotlinOptions { - jvmTarget = AppConfig.javaVersion.majorVersion - } - buildFeatures { - resValues = false - } +plugins { + alias(libs.plugins.pillarbox.android.library) + alias(libs.plugins.pillarbox.android.library.lint) } dependencies { diff --git a/pillarbox-player/build.gradle.kts b/pillarbox-player/build.gradle.kts index 63deeb184..3bbe56fad 100644 --- a/pillarbox-player/build.gradle.kts +++ b/pillarbox-player/build.gradle.kts @@ -4,40 +4,14 @@ */ plugins { - id("ch.srgssr.pillarbox.gradle.publishing") - id("ch.srgssr.pillarbox.gradle.tested_module") - alias(libs.plugins.kotlin.android) + alias(libs.plugins.pillarbox.android.library) + alias(libs.plugins.pillarbox.android.library.publishing) + alias(libs.plugins.pillarbox.android.library.tested.module) } android { - namespace = "ch.srgssr.pillarbox.player" - compileSdk = AppConfig.compileSdk - - defaultConfig { - minSdk = AppConfig.minSdk - - consumerProguardFile("consumer-rules.pro") - } - - buildTypes { - release { - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) - } - } - compileOptions { - sourceCompatibility = AppConfig.javaVersion - targetCompatibility = AppConfig.javaVersion - } - kotlinOptions { - jvmTarget = AppConfig.javaVersion.majorVersion - } buildFeatures { buildConfig = true - resValues = false } // Mockk includes some licenses information, which may conflict with other license files. This block merges all licenses together. diff --git a/pillarbox-ui/build.gradle.kts b/pillarbox-ui/build.gradle.kts index ca4e70ec4..c294110e0 100644 --- a/pillarbox-ui/build.gradle.kts +++ b/pillarbox-ui/build.gradle.kts @@ -4,41 +4,10 @@ */ plugins { - id("ch.srgssr.pillarbox.gradle.publishing") - id("ch.srgssr.pillarbox.gradle.tested_module") - alias(libs.plugins.kotlin.android) -} - -android { - namespace = "ch.srgssr.pillarbox.ui" - compileSdk = AppConfig.compileSdk - - defaultConfig { - minSdk = AppConfig.minSdk - - consumerProguardFile("consumer-rules.pro") - } - - buildTypes { - release { - isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") - } - } - compileOptions { - sourceCompatibility = AppConfig.javaVersion - targetCompatibility = AppConfig.javaVersion - } - kotlinOptions { - jvmTarget = AppConfig.javaVersion.majorVersion - } - buildFeatures { - compose = true - resValues = false - } - composeOptions { - kotlinCompilerExtensionVersion = libs.versions.androidx.compose.compiler.get() - } + alias(libs.plugins.pillarbox.android.library) + alias(libs.plugins.pillarbox.android.library.compose) + alias(libs.plugins.pillarbox.android.library.publishing) + alias(libs.plugins.pillarbox.android.library.tested.module) } dependencies { diff --git a/settings.gradle.kts b/settings.gradle.kts index 7e53fc23d..9cf4026ef 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -4,6 +4,8 @@ */ pluginManagement { + includeBuild("build-logic") + repositories { gradlePluginPortal() google() @@ -14,8 +16,12 @@ pluginManagement { dependencyResolutionManagement { repositoriesMode = RepositoriesMode.FAIL_ON_PROJECT_REPOS repositories { - val gitHubUsername = providers.gradleProperty("gpr.user").getOrElse(System.getenv("USERNAME")) - val gitHubKey = providers.gradleProperty("gpr.key").getOrElse(System.getenv("GITHUB_TOKEN")) + val gitHubUsername = providers.gradleProperty("gpr.user") + .orElse(providers.environmentVariable("USERNAME")) + .get() + val gitHubKey = providers.gradleProperty("gpr.key") + .orElse(providers.environmentVariable("GITHUB_TOKEN")) + .get() google() mavenCentral()