diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index aed47226f1..fe34069901 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -56,6 +56,7 @@ tools-common = { module = "com.android.tools:common", version.ref = "androidTool tools-layoutlib-api = { module = "com.android.tools.layoutlib:layoutlib-api", version = "31.4.0-alpha10" } tools-layoutlib = { module = "com.android.tools.layoutlib:layoutlib", version.ref = "layoutlib" } tools-layoutlib-runtime = { module = "com.android.tools.layoutlib:layoutlib-runtime", version.ref = "layoutlib" } +tools-layoutlib-resources = { module = "com.android.tools.layoutlib:layoutlib-resources", version.ref = "layoutlib" } tools-ninepatch = { module = "com.android.tools:ninepatch", version.ref = "androidTools" } tools-sdkCommon = { module = "com.android.tools:sdk-common", version.ref = "androidTools" } diff --git a/paparazzi-gradle-plugin/src/main/java/app/cash/paparazzi/gradle/PaparazziPlugin.kt b/paparazzi-gradle-plugin/src/main/java/app/cash/paparazzi/gradle/PaparazziPlugin.kt index 89a59e5fe0..cc35da4850 100644 --- a/paparazzi-gradle-plugin/src/main/java/app/cash/paparazzi/gradle/PaparazziPlugin.kt +++ b/paparazzi-gradle-plugin/src/main/java/app/cash/paparazzi/gradle/PaparazziPlugin.kt @@ -77,6 +77,7 @@ public class PaparazziPlugin : Plugin { private fun setupPaparazzi(project: Project, variants: DomainObjectSet) where T : BaseVariant, T : TestedVariant { project.addTestDependency() val nativePlatformFileCollection = project.setupNativePlatformDependency() + val layoutlibResourcesFileCollection = project.setupLayoutlibResourcesDependency() // Create anchor tasks for all variants. val verifyVariants = project.tasks.register("verifyPaparazzi") { @@ -232,6 +233,8 @@ public class PaparazziPlugin : Plugin { // They need special handling, so they're added as inputs.property above, and systemProperty here. test.systemProperties["paparazzi.platform.data.root"] = nativePlatformFileCollection.singleFile.absolutePath + test.systemProperties["paparazzi.resources.data.root"] = + layoutlibResourcesFileCollection.singleFile.absolutePath test.systemProperties["paparazzi.test.record"] = isRecordRun.get() test.systemProperties["paparazzi.test.verify"] = isVerifyRun.get() } @@ -282,6 +285,21 @@ public class PaparazziPlugin : Plugin { .files } + private fun Project.setupLayoutlibResourcesDependency(): FileCollection { + val layoutlibResourcesConfiguration = configurations.create("layoutlibResources") + layoutlibResourcesConfiguration.dependencies.add( + dependencies.create("com.android.tools.layoutlib:layoutlib-resources:$NATIVE_LIB_VERSION") + ) + dependencies.registerTransform(UnzipTransform::class.java) { transform -> + transform.from.attribute(ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.JAR_TYPE) + transform.to.attribute(ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.DIRECTORY_TYPE) + } + + return layoutlibResourcesConfiguration + .artifactViewFor(ArtifactTypeDefinition.DIRECTORY_TYPE) + .files + } + private fun Project.addTestDependency() { val dependency = if (isInternal()) { dependencies.project(mapOf("path" to ":paparazzi")) diff --git a/paparazzi/build.gradle b/paparazzi/build.gradle index 2ee4456dff..faeb7383c2 100644 --- a/paparazzi/build.gradle +++ b/paparazzi/build.gradle @@ -13,7 +13,10 @@ java { def artifactType = Attribute.of('artifactType', String) configurations { - unzip { + layoutlibPlatform { + attributes.attribute(artifactType, ArtifactTypeDefinition.DIRECTORY_TYPE) + } + layoutlibResources { attributes.attribute(artifactType, ArtifactTypeDefinition.DIRECTORY_TYPE) } } @@ -63,15 +66,16 @@ dependencies { if (osName.startsWith("mac")) { def osArch = System.getProperty("os.arch").toLowerCase(Locale.US) if (osArch.startsWith("x86")) { - unzip variantOf(libs.tools.layoutlib.runtime) { classifier("mac") } + layoutlibPlatform variantOf(libs.tools.layoutlib.runtime) { classifier("mac") } } else { - unzip variantOf(libs.tools.layoutlib.runtime) { classifier("mac-arm") } + layoutlibPlatform variantOf(libs.tools.layoutlib.runtime) { classifier("mac-arm") } } } else if (osName.startsWith("windows")) { - unzip variantOf(libs.tools.layoutlib.runtime) { classifier("win") } + layoutlibPlatform variantOf(libs.tools.layoutlib.runtime) { classifier("win") } } else { - unzip variantOf(libs.tools.layoutlib.runtime) { classifier("linux") } + layoutlibPlatform variantOf(libs.tools.layoutlib.runtime) { classifier("linux") } } + layoutlibResources libs.tools.layoutlib.resources testImplementation libs.truth @@ -144,7 +148,11 @@ tasks.withType(Test).configureEach { ) systemProperty( "paparazzi.platform.data.root", - configurations.unzip.singleFile.absolutePath + configurations.layoutlibPlatform.singleFile.absolutePath + ) + systemProperty( + "paparazzi.resources.data.root", + configurations.layoutlibResources.singleFile.absolutePath ) // Uncomment to debug JNI issues in layoutlib // jvmArgs '-Xcheck:jni' diff --git a/paparazzi/src/main/java/app/cash/paparazzi/internal/Renderer.kt b/paparazzi/src/main/java/app/cash/paparazzi/internal/Renderer.kt index aa2a08ed63..c1aef9f81c 100644 --- a/paparazzi/src/main/java/app/cash/paparazzi/internal/Renderer.kt +++ b/paparazzi/src/main/java/app/cash/paparazzi/internal/Renderer.kt @@ -79,10 +79,14 @@ internal class Renderer( val platformDataRoot = System.getProperty("paparazzi.platform.data.root") ?: throw RuntimeException("Missing system property for 'paparazzi.platform.data.root'") val platformDataDir = File(platformDataRoot, "data") - val fontLocation = File(platformDataDir, "fonts") val nativeLibLocation = File(platformDataDir, getNativeLibDir()) - val icuLocation = File(platformDataDir, "icu" + File.separator + "icudt72l.dat") - val keyboardLocation = File(platformDataDir, "keyboards" + File.separator + "Generic.kcm") + + val resourcesDataRoot = System.getProperty("paparazzi.resources.data.root") + ?: throw RuntimeException("Missing system property for 'paparazzi.resources.data.root'") + val resourcesDataDir = File(resourcesDataRoot, "data") + val fontLocation = File(resourcesDataDir, "fonts") + val icuLocation = File(resourcesDataDir, "icu" + File.separator + "icudt72l.dat") + val keyboardLocation = File(resourcesDataDir, "keyboards" + File.separator + "Generic.kcm") val buildProp = File(environment.platformDir, "build.prop") val attrs = File(platformDataResDir, "values" + File.separator + "attrs.xml") val systemProperties = DeviceConfig.loadProperties(buildProp) + mapOf(