diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 036eee5004..9b7cdc715b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -18,7 +18,7 @@ plugins { alias(libs.plugins.ktlint) alias(libs.plugins.compose.compiler) alias(libs.plugins.kotlinx.serialization) - alias(testLibs.plugins.compose.screenshot) + id("com.android.compose.screenshot") alias(benchmarkLibs.plugins.baselineprofile) id("androidx.navigation.safeargs") id("kotlin-parcelize") diff --git a/build-logic/plugins/build.gradle.kts b/build-logic/plugins/build.gradle.kts index 2853f16804..c304d6eabd 100644 --- a/build-logic/plugins/build.gradle.kts +++ b/build-logic/plugins/build.gradle.kts @@ -22,6 +22,7 @@ dependencies { implementation(libs.kotlin.gradle.plugin) implementation(libs.android.library) implementation(libs.android.application) + implementation(testLibs.compose.screenshot.plugin) implementation(libs.ktlint) implementation(project(":tools")) diff --git a/build-logic/plugins/src/main/java/signal-library.gradle.kts b/build-logic/plugins/src/main/java/signal-library.gradle.kts index 32c6fcc751..33fb30f286 100644 --- a/build-logic/plugins/src/main/java/signal-library.gradle.kts +++ b/build-logic/plugins/src/main/java/signal-library.gradle.kts @@ -72,3 +72,18 @@ dependencies { testImplementation(testLibs.androidx.test.core) testImplementation(testLibs.androidx.test.core.ktx) } + +// Enable screenshot testing for modules that use compose +plugins.withId("org.jetbrains.kotlin.plugin.compose") { + android { + experimentalProperties["android.experimental.enableScreenshotTest"] = true + } + + apply(plugin = "com.android.compose.screenshot") + + dependencies { + add("screenshotTestImplementation", testLibs.compose.screenshot.validation.api) + add("screenshotTestImplementation", libs.androidx.compose.ui.tooling.core) + add("screenshotTestImplementation", libs.androidx.compose.ui.tooling.preview) + } +} diff --git a/build-logic/plugins/src/main/java/signal-sample-app.gradle.kts b/build-logic/plugins/src/main/java/signal-sample-app.gradle.kts index a6fb05d979..ad10b654a0 100644 --- a/build-logic/plugins/src/main/java/signal-sample-app.gradle.kts +++ b/build-logic/plugins/src/main/java/signal-sample-app.gradle.kts @@ -78,3 +78,18 @@ dependencies { testImplementation(testLibs.androidx.test.core) testImplementation(testLibs.androidx.test.core.ktx) } + +// Enable screenshot testing for modules that use compose +plugins.withId("org.jetbrains.kotlin.plugin.compose") { + android { + experimentalProperties["android.experimental.enableScreenshotTest"] = true + } + + apply(plugin = "com.android.compose.screenshot") + + dependencies { + add("screenshotTestImplementation", testLibs.compose.screenshot.validation.api) + add("screenshotTestImplementation", libs.androidx.compose.ui.tooling.core) + add("screenshotTestImplementation", libs.androidx.compose.ui.tooling.preview) + } +} diff --git a/build.gradle.kts b/build.gradle.kts index b5f5a4b8f1..fe777411b9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -140,7 +140,11 @@ gradle.projectsEvaluated { tasks.named("validateScreenshots") { subprojects.filter { it.name != "Signal-Android" }.forEach { subproject -> - subproject.tasks.findByName("validateDebugScreenshotTest")?.let { dependsOn(it) } + // All modules get screenshotTests enabled by default, but the validate task fails if there's no tests. + // So we just filter out the modules that have no tests ourselves. + if (subproject.file("src/screenshotTest").isDirectory) { + subproject.tasks.findByName("validateDebugScreenshotTest")?.let { dependsOn(it) } + } } } diff --git a/feature/registration/build.gradle.kts b/feature/registration/build.gradle.kts index de2d820025..fa115c919b 100644 --- a/feature/registration/build.gradle.kts +++ b/feature/registration/build.gradle.kts @@ -4,7 +4,6 @@ plugins { id("com.squareup.wire") alias(libs.plugins.compose.compiler) alias(libs.plugins.kotlinx.serialization) - alias(testLibs.plugins.compose.screenshot) } android { @@ -24,8 +23,6 @@ android { isIncludeAndroidResources = true } } - - experimentalProperties["android.experimental.enableScreenshotTest"] = true } screenshotTests { @@ -112,9 +109,4 @@ dependencies { androidTestImplementation(testLibs.androidx.test.ext.junit) androidTestImplementation(libs.androidx.compose.ui.test.junit4) debugImplementation(libs.androidx.compose.ui.test.manifest) - - // Compose screenshot testing - screenshotTestImplementation(testLibs.compose.screenshot.validation.api) - screenshotTestImplementation(libs.androidx.compose.ui.tooling.core) - screenshotTestImplementation(libs.androidx.compose.ui.tooling.preview) } diff --git a/gradle/test-libs.versions.toml b/gradle/test-libs.versions.toml index 00cba6ff93..e711de64a8 100644 --- a/gradle/test-libs.versions.toml +++ b/gradle/test-libs.versions.toml @@ -12,6 +12,7 @@ compose-screenshot = "0.0.1-alpha15" compose-screenshot = { id = "com.android.compose.screenshot", version.ref = "compose-screenshot" } [libraries] +compose-screenshot-plugin = { module = "com.android.compose.screenshot:com.android.compose.screenshot.gradle.plugin", version.ref = "compose-screenshot" } compose-screenshot-validation-api = { module = "com.android.tools.screenshot:screenshot-validation-api", version.ref = "compose-screenshot" } junit-junit = "junit:junit:4.13.2" androidx-test-core = { module = "androidx.test:core", version.ref = "androidx-test" }