Skip to content

Commit

Permalink
Added android support
Browse files Browse the repository at this point in the history
  • Loading branch information
gmazzo committed Apr 25, 2023
1 parent e6cf543 commit d3abc5c
Show file tree
Hide file tree
Showing 12 changed files with 110 additions and 25 deletions.
30 changes: 18 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
[![codecov](https://codecov.io/gh/gmazzo/gradle-buildconfig-plugin/branch/master/graph/badge.svg)](https://codecov.io/gh/gmazzo/gradle-buildconfig-plugin)

# gradle-buildconfig-plugin
A plugin for generating BuildConstants for any kind of Gradle projects: Java, Kotlin, Groovy, etc.
A plugin for generating BuildConstants for any kind of Gradle projects: Java, Kotlin, Android, Groovy, etc.
Designed for KTS scripts, with *experimental* support for Kotlin's **multi-platform** plugin

## Usage in KTS
Expand Down Expand Up @@ -207,20 +207,22 @@ myproject
```
If you add in your `build.gradle.kts`:
```kotlin
val generateBuildConfig by tasks

task("generateResourcesConstants") {
val buildResources = buildConfig.forClass("BuildResources")

val buildResources = buildConfig.forClass("BuildResources")
val generateResourcesConstants by tasks.regitering {
val resources = sourceSets["main"].resources.asFileTree

inputs.files(resources)
doFirst {
sourceSets["main"].resources.asFileTree.visit(Action<FileVisitDetails> {
resources.visit(Action<FileVisitDetails> {
val name = path.toUpperCase().replace("\\W".toRegex(), "_")

buildResources.buildConfigField("java.io.File", name, "File(\"$path\")")
})
}
}

generateBuildConfig.dependsOn(this)
tasks.generateBuildConfig {
dependsOn(generateResourcesConstants)
}
```
Will generate in `BuildResources.kt`:
Expand All @@ -237,18 +239,22 @@ object BuildResources {
```
#### Or in Groovy:
```groovy
task("generateResourcesConstants") {
def buildResources = buildConfig.forClass("BuildResources")
def buildResources = buildConfig.forClass("BuildResources")
def generateResourcesConstants = tasks.register("generateResourcesConstants") {
def resources = sourceSets["main"].resources.asFileTree
inputs.files(resources)
doFirst {
sourceSets["main"].resources.asFileTree.visit { file ->
resources.visit { file ->
def name = file.path.toUpperCase().replaceAll("\\W", "_")
buildResources.buildConfigField("java.io.File", name, "new File(\"$file.path\")")
}
}
}
generateBuildConfig.dependsOn(it)
tasks.generateBuildConfig {
dependsOn(generateResourcesConstants)
}
```
Will generate in `BuildResources.java`:
Expand Down
1 change: 1 addition & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
plugins {
base
alias(libs.plugins.kotlin) apply false
alias(libs.plugins.android) apply false
`jacoco-report-aggregation`
}

Expand Down
41 changes: 41 additions & 0 deletions demo-project/android/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import com.github.gmazzo.gradle.plugins.BuildConfigTask

plugins {
alias(libs.plugins.android)
kotlin("android")
id("com.github.gmazzo.buildconfig")
}

java.toolchain.languageVersion.set(JavaLanguageVersion.of(11))

android {
namespace = "com.github.gmazzo.buildconfig.demos.android"
compileSdkVersion = "android-30"

buildFeatures.buildConfig = true

compileOptions {
targetCompatibility(java.targetCompatibility)
sourceCompatibility(java.sourceCompatibility)
}
}

dependencies {
testImplementation(libs.kotlin.test)
}

buildConfig {
className("NonAndroidBuildConfig")
buildConfigField("String", "APP_NAME", "\"${project.name}\"")
buildConfigField("String", "APP_SECRET", "\"Z3JhZGxlLWphdmEtYnVpbGRjb25maWctcGx1Z2lu\"")
buildConfigField("long", "BUILD_TIME", "${System.currentTimeMillis()}L")
buildConfigField("boolean", "FEATURE_ENABLED", "${true}")
buildConfigField("kotlin.IntArray", "MAGIC_NUMBERS", "intArrayOf(1, 2, 3, 4)")
}

// workaround of AGP issue failing to pick test sources correctly
afterEvaluate {
tasks.named("lintAnalyzeDebug") {
mustRunAfter(tasks.withType<BuildConfigTask>())
}
}
1 change: 1 addition & 0 deletions demo-project/android/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<manifest />
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.github.gmazzo.buildconfig.demos.android

import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertTrue

class BuildConfigTest {

@Test
fun testBuildConfigProperties() {
assertEquals("com.github.gmazzo.buildconfig.demos.android", BuildConfig.APPLICATION_ID)

assertEquals("android", NonAndroidBuildConfig.APP_NAME)
assertEquals("Z3JhZGxlLWphdmEtYnVpbGRjb25maWctcGx1Z2lu", NonAndroidBuildConfig.APP_SECRET)
assertTrue(System.currentTimeMillis() >= NonAndroidBuildConfig.BUILD_TIME)
assertTrue(NonAndroidBuildConfig.FEATURE_ENABLED)
assertEquals(listOf(1, 2, 3, 4), NonAndroidBuildConfig.MAGIC_NUMBERS.toList())
}

}
2 changes: 1 addition & 1 deletion demo-project/groovy/build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
plugins {
id 'java'
id 'groovy'
id 'com.github.gmazzo.buildconfig'
}

Expand Down
1 change: 1 addition & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
org.gradle.caching=true
1 change: 1 addition & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ kotlinpoet = { module = "com.squareup:kotlinpoet", version = "1.10.2" }
mockk = { module = "io.mockk:mockk", version = "1.13.5" }

[plugins]
android = { id = "com.android.application", version = "7.4.2" }
gitVersioning = { id = "me.qoomon.git-versioning", version = "6.4.2" }
gradle-pluginPublish = { id = "com.gradle.plugin-publish", version = "1.2.0" }
kotlin = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
8 changes: 8 additions & 0 deletions gradle/shared.settings.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
pluginManagement {
repositories {
gradlePluginPortal()
google()
}
}

dependencyResolutionManagement {
repositories {
mavenCentral()
google()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,16 @@ class BuildConfigPlugin : Plugin<Project> {
plugins.withId("java") {
JavaHandler(project, extension).configure(sourceSets)
}

plugins.withAnyId(
"org.jetbrains.kotlin.android",
"org.jetbrains.kotlin.jvm",
"org.jetbrains.kotlin.js",
"kotlin2js",
) {
) {
KotlinHandler(project, extension).configure(sourceSets)
}

plugins.withId("org.jetbrains.kotlin.multiplatform") {
KotlinMultiplatformHandler(KotlinHandler(project, extension)).configure(sourceSets)
}
Expand All @@ -70,21 +72,24 @@ class BuildConfigPlugin : Plugin<Project> {
private fun Project.configureSourceSet(
sourceSet: BuildConfigSourceSetInternal,
defaultSS: BuildConfigSourceSetInternal,
) {
val prefix = when (sourceSet) {
defaultSS -> ""
else -> sourceSet.name.replaceFirstChar { it.titlecaseChar() }
}
) {
val prefix = (if (plugins.hasPlugin("com.android.base")) "NonAndroid" else "") +
when (sourceSet) {
defaultSS -> ""
else -> sourceSet.name.replaceFirstChar { it.titlecaseChar() }
}

sourceSet.className.convention("${prefix}BuildConfig")
sourceSet.packageName.convention(when(sourceSet) {
sourceSet.packageName.convention(when (sourceSet) {
defaultSS -> defaultPackage.map { it.replace("[^a-zA-Z._$]".toRegex(), "_") }
else -> defaultSS.packageName
})
sourceSet.generator.convention(when(sourceSet) {
defaultSS -> provider(::BuildConfigJavaGenerator)
else -> defaultSS.generator
})
sourceSet.generator.convention(
when (sourceSet) {
defaultSS -> provider(::BuildConfigJavaGenerator)
else -> defaultSS.generator
}
)
sourceSet.generateTask = tasks.register<BuildConfigTask>("generate${prefix}BuildConfig") {
group = "BuildConfig"
description = "Generates the build constants class for '${sourceSet.name}' source"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ abstract class BuildConfigTask : DefaultTask() {

val generator = generator.get()

specs.get().forEach {
specs.get().asSequence().filter { it.buildConfigFields.isNotEmpty() }.forEach {
val rawClassName = it.className.get()
val (packageName, className) = when (val rawPackage = it.packageName.orNull) {
null -> when (val i = rawClassName.lastIndexOf('.')) {
Expand Down
1 change: 1 addition & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ rootProject.name = "gradle-buildconfig-plugin"

includeBuild("plugin")
include(
"demo-project:android",
"demo-project:generic",
"demo-project:groovy",
"demo-project:kts",
Expand Down

0 comments on commit d3abc5c

Please sign in to comment.