Skip to content

Commit

Permalink
[gradle] Add a customization for resources directories. (#5016)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
terrakok committed Jun 25, 2024
1 parent 0bd1536 commit c86df61
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ internal fun Project.configureComposeResourcesGeneration(
}

//common resources must be converted (XML -> CVR)
val preparedResourcesTask = registerPrepareComposeResourcesTask(sourceSet)
val preparedResourcesTask = registerPrepareComposeResourcesTask(sourceSet, config)
val preparedResources = preparedResourcesTask.flatMap { it.outputDir.asFile }
configureResourceAccessorsGeneration(
sourceSet,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.jetbrains.compose.resources

import org.gradle.api.Project
import org.gradle.api.file.Directory
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.FileSystemOperations
import org.gradle.api.file.FileTree
Expand All @@ -25,11 +26,19 @@ import javax.inject.Inject
import javax.xml.parsers.DocumentBuilderFactory

internal fun Project.registerPrepareComposeResourcesTask(
sourceSet: KotlinSourceSet
sourceSet: KotlinSourceSet,
config: Provider<ResourcesExtension>
): TaskProvider<PrepareComposeResourcesTask> {
val resDir = "${sourceSet.name}/$COMPOSE_RESOURCES_DIR"
val userComposeResourcesDir = project.projectDir.resolve("src/$resDir")
val preparedComposeResourcesDir = layout.buildDirectory.dir("$RES_GEN_DIR/preparedResources/$resDir")
val userComposeResourcesDir: Provider<Directory> = config.flatMap { ext ->
ext.customResourceDirectories[sourceSet.name] ?: provider {
//default path
layout.projectDirectory.dir("src/${sourceSet.name}/$COMPOSE_RESOURCES_DIR")
}
}

val preparedComposeResourcesDir = layout.buildDirectory.dir(
"$RES_GEN_DIR/preparedResources/${sourceSet.name}/$COMPOSE_RESOURCES_DIR"
)

val convertXmlValueResources = tasks.register(
"convertXmlValueResourcesFor${sourceSet.name.uppercaseFirstChar()}",
Expand Down Expand Up @@ -61,11 +70,11 @@ internal fun Project.registerPrepareComposeResourcesTask(
}

internal fun Project.getPreparedComposeResourcesDir(sourceSet: KotlinSourceSet): Provider<File> = tasks
.named(
getPrepareComposeResourcesTaskName(sourceSet),
PrepareComposeResourcesTask::class.java
)
.flatMap { it.outputDir.asFile }
.named(
getPrepareComposeResourcesTaskName(sourceSet),
PrepareComposeResourcesTask::class.java
)
.flatMap { it.outputDir.asFile }

private fun getPrepareComposeResourcesTaskName(sourceSet: KotlinSourceSet) =
"prepareComposeResourcesTaskFor${sourceSet.name.uppercaseFirstChar()}"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.jetbrains.compose.resources

import org.gradle.api.Project
import org.gradle.api.file.Directory
import org.gradle.api.provider.Provider
import java.io.File

Expand Down Expand Up @@ -36,6 +37,18 @@ abstract class ResourcesExtension {
* - `never`: Never generate the Res class.
*/
var generateResClass: ResourceClassGeneration = auto

internal val customResourceDirectories: MutableMap<String, Provider<Directory>> = mutableMapOf()

/**
* Associates a custom resource directory with a specific source set.
*
* @param sourceSetName the name of the source set to associate the custom resource directory with
* @param directoryProvider the provider that provides the custom directory
*/
fun customDirectory(sourceSetName: String, directoryProvider: Provider<Directory>) {
customResourceDirectories[sourceSetName] = directoryProvider
}
}

internal fun Provider<ResourcesExtension>.getResourcePackage(project: Project) = map { config ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,31 @@ android {
targetCompatibility = JavaVersion.VERSION_11
}
}

abstract class GenerateAndroidRes : DefaultTask() {
@get:Inject
abstract val layout: ProjectLayout

@get:OutputDirectory
val outputDir = layout.buildDirectory.dir("generatedAndroidResources")

@TaskAction
fun run() {
val dir = outputDir.get().asFile
dir.deleteRecursively()
File(dir, "values/strings.xml").apply {
parentFile.mkdirs()
writeText(
"""
<resources>
<string name="android_str">Android string</string>
</resources>
""".trimIndent()
)
}
}
}
compose.resources.customDirectory(
sourceSetName = "androidMain",
directoryProvider = tasks.register<GenerateAndroidRes>("generateAndroidRes").map { it.outputDir.get() }
)

This file was deleted.

0 comments on commit c86df61

Please sign in to comment.