Skip to content

Commit c86df61

Browse files
authored
[gradle] Add a customization for resources directories. (#5016)
With the new API it is possible to customize compose resources directories. For example: ```kotlin abstract class GenerateAndroidRes : DefaultTask() { @get:Inject abstract val layout: ProjectLayout @get:OutputDirectory val outputDir = layout.buildDirectory.dir("generatedAndroidResources") @TaskAction fun run() {...} } compose.resources { customDirectory( sourceSetName = "androidMain", directoryProvider = tasks.register<GenerateAndroidRes>("generateAndroidRes").map { it.outputDir.get() } ) customDirectory( sourceSetName = "desktopMain", directoryProvider = provider { layout.projectDirectory.dir("desktopResources") } ) } ``` <!-- Optional --> Fixes #4718 Fixes #4564 ## Release Notes ### Features - Resources - Add a customization for resources directories. Now it is possible to use e.g downloaded resources.
1 parent 0bd1536 commit c86df61

File tree

5 files changed

+60
-13
lines changed

5 files changed

+60
-13
lines changed

gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/ComposeResourcesGeneration.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ internal fun Project.configureComposeResourcesGeneration(
5454
}
5555

5656
//common resources must be converted (XML -> CVR)
57-
val preparedResourcesTask = registerPrepareComposeResourcesTask(sourceSet)
57+
val preparedResourcesTask = registerPrepareComposeResourcesTask(sourceSet, config)
5858
val preparedResources = preparedResourcesTask.flatMap { it.outputDir.asFile }
5959
configureResourceAccessorsGeneration(
6060
sourceSet,

gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/PrepareComposeResources.kt

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.jetbrains.compose.resources
22

33
import org.gradle.api.Project
4+
import org.gradle.api.file.Directory
45
import org.gradle.api.file.DirectoryProperty
56
import org.gradle.api.file.FileSystemOperations
67
import org.gradle.api.file.FileTree
@@ -25,11 +26,19 @@ import javax.inject.Inject
2526
import javax.xml.parsers.DocumentBuilderFactory
2627

2728
internal fun Project.registerPrepareComposeResourcesTask(
28-
sourceSet: KotlinSourceSet
29+
sourceSet: KotlinSourceSet,
30+
config: Provider<ResourcesExtension>
2931
): TaskProvider<PrepareComposeResourcesTask> {
30-
val resDir = "${sourceSet.name}/$COMPOSE_RESOURCES_DIR"
31-
val userComposeResourcesDir = project.projectDir.resolve("src/$resDir")
32-
val preparedComposeResourcesDir = layout.buildDirectory.dir("$RES_GEN_DIR/preparedResources/$resDir")
32+
val userComposeResourcesDir: Provider<Directory> = config.flatMap { ext ->
33+
ext.customResourceDirectories[sourceSet.name] ?: provider {
34+
//default path
35+
layout.projectDirectory.dir("src/${sourceSet.name}/$COMPOSE_RESOURCES_DIR")
36+
}
37+
}
38+
39+
val preparedComposeResourcesDir = layout.buildDirectory.dir(
40+
"$RES_GEN_DIR/preparedResources/${sourceSet.name}/$COMPOSE_RESOURCES_DIR"
41+
)
3342

3443
val convertXmlValueResources = tasks.register(
3544
"convertXmlValueResourcesFor${sourceSet.name.uppercaseFirstChar()}",
@@ -61,11 +70,11 @@ internal fun Project.registerPrepareComposeResourcesTask(
6170
}
6271

6372
internal fun Project.getPreparedComposeResourcesDir(sourceSet: KotlinSourceSet): Provider<File> = tasks
64-
.named(
65-
getPrepareComposeResourcesTaskName(sourceSet),
66-
PrepareComposeResourcesTask::class.java
67-
)
68-
.flatMap { it.outputDir.asFile }
73+
.named(
74+
getPrepareComposeResourcesTaskName(sourceSet),
75+
PrepareComposeResourcesTask::class.java
76+
)
77+
.flatMap { it.outputDir.asFile }
6978

7079
private fun getPrepareComposeResourcesTaskName(sourceSet: KotlinSourceSet) =
7180
"prepareComposeResourcesTaskFor${sourceSet.name.uppercaseFirstChar()}"

gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/ResourcesDSL.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.jetbrains.compose.resources
22

33
import org.gradle.api.Project
4+
import org.gradle.api.file.Directory
45
import org.gradle.api.provider.Provider
56
import java.io.File
67

@@ -36,6 +37,18 @@ abstract class ResourcesExtension {
3637
* - `never`: Never generate the Res class.
3738
*/
3839
var generateResClass: ResourceClassGeneration = auto
40+
41+
internal val customResourceDirectories: MutableMap<String, Provider<Directory>> = mutableMapOf()
42+
43+
/**
44+
* Associates a custom resource directory with a specific source set.
45+
*
46+
* @param sourceSetName the name of the source set to associate the custom resource directory with
47+
* @param directoryProvider the provider that provides the custom directory
48+
*/
49+
fun customDirectory(sourceSetName: String, directoryProvider: Provider<Directory>) {
50+
customResourceDirectories[sourceSetName] = directoryProvider
51+
}
3952
}
4053

4154
internal fun Provider<ResourcesExtension>.getResourcePackage(project: Project) = map { config ->

gradle-plugins/compose/src/test/test-projects/misc/commonResources/build.gradle.kts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,31 @@ android {
6262
targetCompatibility = JavaVersion.VERSION_11
6363
}
6464
}
65+
66+
abstract class GenerateAndroidRes : DefaultTask() {
67+
@get:Inject
68+
abstract val layout: ProjectLayout
69+
70+
@get:OutputDirectory
71+
val outputDir = layout.buildDirectory.dir("generatedAndroidResources")
72+
73+
@TaskAction
74+
fun run() {
75+
val dir = outputDir.get().asFile
76+
dir.deleteRecursively()
77+
File(dir, "values/strings.xml").apply {
78+
parentFile.mkdirs()
79+
writeText(
80+
"""
81+
<resources>
82+
<string name="android_str">Android string</string>
83+
</resources>
84+
""".trimIndent()
85+
)
86+
}
87+
}
88+
}
89+
compose.resources.customDirectory(
90+
sourceSetName = "androidMain",
91+
directoryProvider = tasks.register<GenerateAndroidRes>("generateAndroidRes").map { it.outputDir.get() }
92+
)

gradle-plugins/compose/src/test/test-projects/misc/commonResources/src/androidMain/composeResources/values/strings.xml

Lines changed: 0 additions & 3 deletions
This file was deleted.

0 commit comments

Comments
 (0)