From 338d7c3f0b594bf828b99f86c62cfc76808b8659 Mon Sep 17 00:00:00 2001 From: Kimberly Crevecoeur Date: Fri, 31 Jul 2026 06:04:47 -0700 Subject: [PATCH 1/8] Upgrade build infrastructure (AGP 9.3.1, Gradle 9.6.1) Upgrades the project's build system: - Upgraded Android Gradle Plugin to 9.3.1 and Gradle Wrapper to 9.6.1. - Migrated all modules from 'kotlin.android' to AGP's built-in Kotlin support. - Replaced 'kotlin.kapt' with 'legacy-kapt' for compatibility with built-in Kotlin. - Upgraded Hilt to 2.59.2 for AGP 9 compatibility. - Updated compiler flags to pass -Xcontext-receivers under the new built-in Kotlin configuration block in 11 modules. - Updated README to reflect Android Studio Quail / AGP 9 requirements. - Enabled parallel Gradle sync in gradle.properties. --- README.md | 4 ++-- app/build.gradle.kts | 3 +-- benchmark/build.gradle.kts | 16 +++++++++------- build.gradle.kts | 3 +-- core/camera/build.gradle.kts | 8 +++----- .../effects/single-stream/build.gradle.kts | 11 ++++++----- .../low-light-playservices/build.gradle.kts | 3 +-- core/camera/low-light/build.gradle.kts | 3 +-- core/camera/postprocess/build.gradle.kts | 3 +-- core/camera/testing/build.gradle.kts | 1 - core/common/build.gradle.kts | 3 +-- core/common/testing/build.gradle.kts | 1 - core/model/build.gradle.kts | 3 +-- core/settings/build.gradle.kts | 3 +-- core/settings/datastore-prefs/build.gradle.kts | 1 - .../datastore-prefs/testing/build.gradle.kts | 1 - data/camera/build.gradle.kts | 6 ++---- data/camera/consumer-rules.pro | 2 ++ data/media/build.gradle.kts | 3 +-- data/media/testing/build.gradle.kts | 1 - data/settings/build.gradle.kts | 3 +-- data/settings/testing/build.gradle.kts | 1 - feature/permissions/build.gradle.kts | 3 +-- feature/postcapture/build.gradle.kts | 13 +++++-------- feature/preview/build.gradle.kts | 3 +-- feature/settings/build.gradle.kts | 3 +-- gradle.properties | 5 +++-- gradle/libs.versions.toml | 5 +++-- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle.kts | 1 - ui/components/build.gradle.kts | 10 ++++------ ui/components/capture/build.gradle.kts | 12 ++++++------ ui/controller/build.gradle.kts | 12 ++++++------ ui/controller/impl/build.gradle.kts | 12 ++++++------ ui/controller/testing/build.gradle.kts | 1 - ui/debug/build.gradle.kts | 3 +-- ui/debug/testing/build.gradle.kts | 1 - ui/uistate/build.gradle.kts | 12 ++++++------ ui/uistate/capture/build.gradle.kts | 12 ++++++------ ui/uistate/postcapture/build.gradle.kts | 5 ++--- ui/uistateadapter/build.gradle.kts | 12 ++++++------ ui/uistateadapter/capture/build.gradle.kts | 12 ++++++------ ui/uistateadapter/postcapture/build.gradle.kts | 5 ++--- 43 files changed, 100 insertions(+), 127 deletions(-) create mode 100644 data/camera/consumer-rules.pro diff --git a/README.md b/README.md index a733c15c3..b13307a74 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,8 @@ OEMs looking to validate their camera feature implementations. This project uses the gradle build system, and can be imported directly into Android Studio. -Currently, Jetpack Camera App is built using the Android Gradle Plugin 8.10.0, which is only -compatible with Android Studio Meerkat or newer. +Currently, Jetpack Camera App is built using the Android Gradle Plugin 9.3.1, which is only +compatible with Android Studio Quail or newer. ## Pre-push Hook (Recommended) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ad359692b..7246eef3c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.application) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) alias(libs.plugins.compose.compiler) } diff --git a/benchmark/build.gradle.kts b/benchmark/build.gradle.kts index a1708658f..00c54f097 100644 --- a/benchmark/build.gradle.kts +++ b/benchmark/build.gradle.kts @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { alias(libs.plugins.android.test) - alias(libs.plugins.kotlin.android) } android { @@ -24,12 +24,8 @@ android { compileSdk = libs.versions.compileSdk.get().toInt() compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = "1.8" + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } defaultConfig { @@ -69,6 +65,12 @@ android { experimentalProperties["android.experimental.self-instrumenting"] = true } +kotlin { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_17) + } +} + dependencies { implementation(libs.androidx.junit) implementation(libs.androidx.benchmark.macro.junit4) diff --git a/build.gradle.kts b/build.gradle.kts index 64fdc6b56..53a8212e2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,9 +19,8 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.android.library) apply false alias(libs.plugins.android.test) apply false - alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.dagger.hilt.android) apply false - alias(libs.plugins.kotlin.kapt) apply false + alias(libs.plugins.android.legacy.kapt) apply false alias(libs.plugins.compose.compiler) apply false } diff --git a/core/camera/build.gradle.kts b/core/camera/build.gradle.kts index b87fb79ee..975955fd0 100644 --- a/core/camera/build.gradle.kts +++ b/core/camera/build.gradle.kts @@ -16,7 +16,6 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { @@ -93,10 +92,9 @@ android { } kotlin { jvmToolchain(17) - } - - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } } diff --git a/core/camera/effects/single-stream/build.gradle.kts b/core/camera/effects/single-stream/build.gradle.kts index dacbf112c..ee42831de 100644 --- a/core/camera/effects/single-stream/build.gradle.kts +++ b/core/camera/effects/single-stream/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) } @@ -34,10 +33,12 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { + jvmToolchain(17) - } - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" + + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } } diff --git a/core/camera/low-light-playservices/build.gradle.kts b/core/camera/low-light-playservices/build.gradle.kts index 639fa3e51..5c6aab589 100644 --- a/core/camera/low-light-playservices/build.gradle.kts +++ b/core/camera/low-light-playservices/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) } diff --git a/core/camera/low-light/build.gradle.kts b/core/camera/low-light/build.gradle.kts index cade65c9e..9377565e4 100644 --- a/core/camera/low-light/build.gradle.kts +++ b/core/camera/low-light/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) } diff --git a/core/camera/postprocess/build.gradle.kts b/core/camera/postprocess/build.gradle.kts index ceedef0b7..67157f0be 100644 --- a/core/camera/postprocess/build.gradle.kts +++ b/core/camera/postprocess/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) } diff --git a/core/camera/testing/build.gradle.kts b/core/camera/testing/build.gradle.kts index 38f70711f..0768c256e 100644 --- a/core/camera/testing/build.gradle.kts +++ b/core/camera/testing/build.gradle.kts @@ -16,7 +16,6 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts index 185217b27..5886b309b 100644 --- a/core/common/build.gradle.kts +++ b/core/common/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) } diff --git a/core/common/testing/build.gradle.kts b/core/common/testing/build.gradle.kts index 57c300b0e..6d21ce391 100644 --- a/core/common/testing/build.gradle.kts +++ b/core/common/testing/build.gradle.kts @@ -16,7 +16,6 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { diff --git a/core/model/build.gradle.kts b/core/model/build.gradle.kts index d352566c4..f9e6a46d8 100644 --- a/core/model/build.gradle.kts +++ b/core/model/build.gradle.kts @@ -15,8 +15,7 @@ */ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) } android { diff --git a/core/settings/build.gradle.kts b/core/settings/build.gradle.kts index 35c256a56..021d3d4d8 100644 --- a/core/settings/build.gradle.kts +++ b/core/settings/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) } diff --git a/core/settings/datastore-prefs/build.gradle.kts b/core/settings/datastore-prefs/build.gradle.kts index c0ca9f8d4..107acd946 100644 --- a/core/settings/datastore-prefs/build.gradle.kts +++ b/core/settings/datastore-prefs/build.gradle.kts @@ -15,7 +15,6 @@ */ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { diff --git a/core/settings/datastore-prefs/testing/build.gradle.kts b/core/settings/datastore-prefs/testing/build.gradle.kts index 0e619ddbd..d6b25c0f3 100644 --- a/core/settings/datastore-prefs/testing/build.gradle.kts +++ b/core/settings/datastore-prefs/testing/build.gradle.kts @@ -16,7 +16,6 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { diff --git a/data/camera/build.gradle.kts b/data/camera/build.gradle.kts index 8a541423a..39c75b667 100644 --- a/data/camera/build.gradle.kts +++ b/data/camera/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) } @@ -37,8 +36,7 @@ android { buildTypes { release { proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" + getDefaultProguardFile("proguard-android-optimize.txt") ) } create("benchmark") { diff --git a/data/camera/consumer-rules.pro b/data/camera/consumer-rules.pro new file mode 100644 index 000000000..c1a8cebff --- /dev/null +++ b/data/camera/consumer-rules.pro @@ -0,0 +1,2 @@ +# Add project specific consumer ProGuard rules here. +# More info: https://developer.android.com/studio/build/shrink-code diff --git a/data/media/build.gradle.kts b/data/media/build.gradle.kts index 91146f6e8..223daced0 100644 --- a/data/media/build.gradle.kts +++ b/data/media/build.gradle.kts @@ -15,8 +15,7 @@ */ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) } diff --git a/data/media/testing/build.gradle.kts b/data/media/testing/build.gradle.kts index f05656de1..2c531124c 100644 --- a/data/media/testing/build.gradle.kts +++ b/data/media/testing/build.gradle.kts @@ -16,7 +16,6 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { diff --git a/data/settings/build.gradle.kts b/data/settings/build.gradle.kts index 7748c8d51..b7037b199 100644 --- a/data/settings/build.gradle.kts +++ b/data/settings/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) } diff --git a/data/settings/testing/build.gradle.kts b/data/settings/testing/build.gradle.kts index 14e7b1e30..a3ff5b281 100644 --- a/data/settings/testing/build.gradle.kts +++ b/data/settings/testing/build.gradle.kts @@ -16,7 +16,6 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { diff --git a/feature/permissions/build.gradle.kts b/feature/permissions/build.gradle.kts index 6c977afeb..e101d4892 100644 --- a/feature/permissions/build.gradle.kts +++ b/feature/permissions/build.gradle.kts @@ -15,10 +15,9 @@ */ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) alias(libs.plugins.compose.compiler) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) } diff --git a/feature/postcapture/build.gradle.kts b/feature/postcapture/build.gradle.kts index b1faaa055..d0754c11e 100644 --- a/feature/postcapture/build.gradle.kts +++ b/feature/postcapture/build.gradle.kts @@ -15,8 +15,7 @@ */ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) alias(libs.plugins.compose.compiler) } @@ -48,6 +47,9 @@ android { } kotlin { jvmToolchain(17) + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } buildFeatures { buildConfig = true @@ -73,12 +75,7 @@ android { } } } - } - - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" - } -} + }} dependencies { // Compose diff --git a/feature/preview/build.gradle.kts b/feature/preview/build.gradle.kts index 54ab1c505..37e210f8e 100644 --- a/feature/preview/build.gradle.kts +++ b/feature/preview/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) alias(libs.plugins.compose.compiler) } diff --git a/feature/settings/build.gradle.kts b/feature/settings/build.gradle.kts index d5c246d1f..10dadeda4 100644 --- a/feature/settings/build.gradle.kts +++ b/feature/settings/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) alias(libs.plugins.compose.compiler) } diff --git a/gradle.properties b/gradle.properties index 15ab33aba..23a6f2b56 100644 --- a/gradle.properties +++ b/gradle.properties @@ -39,9 +39,10 @@ kotlin.code.style=official # resources declared in the library itself and none from the library's dependencies, # thereby reducing the size of the R class for that library android.nonTransitiveRClass=true -android.nonFinalResIds=false # Properties to make gradle managed devices testing more stable (see https://issuetracker.google.com/287312019#comment41) android.experimental.testOptions.managedDevices.maxConcurrentDevices=1 android.experimental.testOptions.managedDevices.setupTimeoutMinutes=180 # Ensure we can run managed devices on servers that don't support hardware rendering -android.testoptions.manageddevices.emulator.gpu=swiftshader_indirect \ No newline at end of file +android.testoptions.manageddevices.emulator.gpu=swiftshader_indirect +# Enabled parallel sync for Gradle 9.4+ +org.gradle.tooling.parallel=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a2317d598..04676d579 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ accompanist = "0.37.3" # kotlinPlugin and composeCompiler are linked # See https://developer.android.com/jetpack/androidx/releases/compose-kotlin kotlinPlugin = "2.2.0" -androidGradlePlugin = "8.10.1" +androidGradlePlugin = "9.3.1" androidxActivityCompose = "1.10.1" @@ -43,7 +43,7 @@ composeMaterial = "1.5.0-alpha07" cmake = "3.22.1" kotlinxAtomicfu = "0.29.0" kotlinxCoroutines = "1.10.2" -hilt = "2.57" +hilt = "2.59.2" junit = "4.13.2" robolectric = "4.15.1" @@ -124,3 +124,4 @@ dagger-hilt-android = { id = "com.google.dagger.hilt.android", version.ref = "hi kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlinPlugin" } kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlinPlugin" } +android-legacy-kapt = { id = "com.android.legacy-kapt", version.ref = "androidGradlePlugin" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b965ecfd5..c72c372a8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue Mar 12 23:44:57 PDT 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle.kts b/settings.gradle.kts index dfb9e6557..f1197bb76 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -57,7 +57,6 @@ include(":ui:uistate:capture") include(":ui:uistateadapter:capture") include(":ui:components") include(":ui:components:capture") -include(":data:model") include(":core:settings") include(":core:model") include(":ui:uistate:postcapture") diff --git a/ui/components/build.gradle.kts b/ui/components/build.gradle.kts index 02d3b2dca..b152876c8 100644 --- a/ui/components/build.gradle.kts +++ b/ui/components/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.compose.compiler) } @@ -48,15 +47,14 @@ android { } kotlin { jvmToolchain(17) + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } buildFeatures { buildConfig = true compose = true } - - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" - } } dependencies { diff --git a/ui/components/capture/build.gradle.kts b/ui/components/capture/build.gradle.kts index d2f9fc5fa..0766452c4 100644 --- a/ui/components/capture/build.gradle.kts +++ b/ui/components/capture/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.compose.compiler) } @@ -47,16 +46,17 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { + jvmToolchain(17) + + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } buildFeatures { buildConfig = true compose = true } - - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" - } } dependencies { diff --git a/ui/controller/build.gradle.kts b/ui/controller/build.gradle.kts index 2690d28bb..aad8888a3 100644 --- a/ui/controller/build.gradle.kts +++ b/ui/controller/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.compose.compiler) } @@ -47,16 +46,17 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { + jvmToolchain(17) + + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } buildFeatures { buildConfig = true compose = true } - - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" - } } dependencies { diff --git a/ui/controller/impl/build.gradle.kts b/ui/controller/impl/build.gradle.kts index 062e38746..66172ec61 100644 --- a/ui/controller/impl/build.gradle.kts +++ b/ui/controller/impl/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.compose.compiler) } @@ -47,16 +46,17 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { + jvmToolchain(17) + + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } buildFeatures { buildConfig = true compose = true } - - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" - } } dependencies { diff --git a/ui/controller/testing/build.gradle.kts b/ui/controller/testing/build.gradle.kts index 402ca3715..f239cd132 100644 --- a/ui/controller/testing/build.gradle.kts +++ b/ui/controller/testing/build.gradle.kts @@ -16,7 +16,6 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { diff --git a/ui/debug/build.gradle.kts b/ui/debug/build.gradle.kts index d62d15e16..4406021e2 100644 --- a/ui/debug/build.gradle.kts +++ b/ui/debug/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.compose.compiler) } diff --git a/ui/debug/testing/build.gradle.kts b/ui/debug/testing/build.gradle.kts index 4abe6a083..f05e7f6bf 100644 --- a/ui/debug/testing/build.gradle.kts +++ b/ui/debug/testing/build.gradle.kts @@ -16,7 +16,6 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { diff --git a/ui/uistate/build.gradle.kts b/ui/uistate/build.gradle.kts index e06c9e4c7..5ceda5ab4 100644 --- a/ui/uistate/build.gradle.kts +++ b/ui/uistate/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.compose.compiler) } @@ -47,16 +46,17 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { + jvmToolchain(17) + + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } buildFeatures { buildConfig = true compose = true } - - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" - } } dependencies { diff --git a/ui/uistate/capture/build.gradle.kts b/ui/uistate/capture/build.gradle.kts index 345628e27..b32a0c393 100644 --- a/ui/uistate/capture/build.gradle.kts +++ b/ui/uistate/capture/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.compose.compiler) } @@ -47,16 +46,17 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { + jvmToolchain(17) + + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } buildFeatures { buildConfig = true compose = true } - - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" - } } dependencies { diff --git a/ui/uistate/postcapture/build.gradle.kts b/ui/uistate/postcapture/build.gradle.kts index 4fda15af5..cd5412fb3 100644 --- a/ui/uistate/postcapture/build.gradle.kts +++ b/ui/uistate/postcapture/build.gradle.kts @@ -15,7 +15,6 @@ */ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { @@ -42,8 +41,8 @@ android { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" + kotlin { + jvmToolchain(17) } } diff --git a/ui/uistateadapter/build.gradle.kts b/ui/uistateadapter/build.gradle.kts index 2826a1033..9fe67b430 100644 --- a/ui/uistateadapter/build.gradle.kts +++ b/ui/uistateadapter/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.compose.compiler) } @@ -47,16 +46,17 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { + jvmToolchain(17) + + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } buildFeatures { buildConfig = true compose = true } - - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" - } } dependencies { diff --git a/ui/uistateadapter/capture/build.gradle.kts b/ui/uistateadapter/capture/build.gradle.kts index fa52725fe..46ec7008a 100644 --- a/ui/uistateadapter/capture/build.gradle.kts +++ b/ui/uistateadapter/capture/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.compose.compiler) } @@ -47,16 +46,17 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { + jvmToolchain(17) + + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } buildFeatures { buildConfig = true compose = true } - - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" - } } dependencies { diff --git a/ui/uistateadapter/postcapture/build.gradle.kts b/ui/uistateadapter/postcapture/build.gradle.kts index 889e3a51c..8659e8e7a 100644 --- a/ui/uistateadapter/postcapture/build.gradle.kts +++ b/ui/uistateadapter/postcapture/build.gradle.kts @@ -15,7 +15,6 @@ */ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { @@ -42,8 +41,8 @@ android { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" + kotlin { + jvmToolchain(17) } } From 6b8535055b025c3af87a3d575084e6dc01a5984a Mon Sep 17 00:00:00 2001 From: Kimberly Crevecoeur Date: Fri, 31 Jul 2026 07:58:15 -0700 Subject: [PATCH 2/8] Fix Gradle 9 test task failures by removing empty test suites Deletes the unused and duplicated test helper classes in :ui:components:capture. Gradle 9 fails the build if a module contains test sources but no actual @Test classes to execute, which was the case here since it only contained test utilities. --- .../capture/rules/MainDispatcherRule.kt | 39 --- .../workaround/ComposableCaptureToImage.kt | 257 ------------------ 2 files changed, 296 deletions(-) delete mode 100644 ui/components/capture/src/test/java/com/google/jetpackcamera/ui/components/capture/capture/rules/MainDispatcherRule.kt delete mode 100644 ui/components/capture/src/test/java/com/google/jetpackcamera/ui/components/capture/capture/workaround/ComposableCaptureToImage.kt diff --git a/ui/components/capture/src/test/java/com/google/jetpackcamera/ui/components/capture/capture/rules/MainDispatcherRule.kt b/ui/components/capture/src/test/java/com/google/jetpackcamera/ui/components/capture/capture/rules/MainDispatcherRule.kt deleted file mode 100644 index 287fb9fff..000000000 --- a/ui/components/capture/src/test/java/com/google/jetpackcamera/ui/components/capture/capture/rules/MainDispatcherRule.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2025 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.jetpackcamera.ui.components.capture.capture.rules - -import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.resetMain -import kotlinx.coroutines.test.setMain -import org.junit.rules.TestRule -import org.junit.runner.Description -import org.junit.runners.model.Statement - -class MainDispatcherRule(private val dispatcher: CoroutineDispatcher) : TestRule { - @OptIn(ExperimentalCoroutinesApi::class) - override fun apply(base: Statement?, description: Description?) = object : Statement() { - override fun evaluate() { - Dispatchers.setMain(dispatcher) - try { - base!!.evaluate() - } finally { - Dispatchers.resetMain() - } - } - } -} diff --git a/ui/components/capture/src/test/java/com/google/jetpackcamera/ui/components/capture/capture/workaround/ComposableCaptureToImage.kt b/ui/components/capture/src/test/java/com/google/jetpackcamera/ui/components/capture/capture/workaround/ComposableCaptureToImage.kt deleted file mode 100644 index 9805bcde9..000000000 --- a/ui/components/capture/src/test/java/com/google/jetpackcamera/ui/components/capture/capture/workaround/ComposableCaptureToImage.kt +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Copyright (C) 2025 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -@file:SuppressLint("UseSdkSuppress") - -package com.google.jetpackcamera.ui.components.capture.capture.workaround - -import android.annotation.SuppressLint -import android.app.Activity -import android.content.Context -import android.content.ContextWrapper -import android.graphics.Bitmap -import android.graphics.Rect -import android.os.Build -import android.os.Handler -import android.os.Looper -import android.view.PixelCopy -import android.view.View -import android.view.Window -import androidx.annotation.DoNotInline -import androidx.annotation.RequiresApi -import androidx.compose.ui.geometry.Offset -import androidx.compose.ui.graphics.ImageBitmap -import androidx.compose.ui.graphics.asImageBitmap -import androidx.compose.ui.platform.ViewRootForTest -import androidx.compose.ui.semantics.SemanticsNode -import androidx.compose.ui.semantics.SemanticsProperties -import androidx.compose.ui.test.ExperimentalTestApi -import androidx.compose.ui.test.SemanticsNodeInteraction -import androidx.compose.ui.window.DialogWindowProvider -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.platform.graphics.HardwareRendererCompat -import java.util.concurrent.CountDownLatch -import java.util.concurrent.TimeUnit -import kotlin.math.roundToInt - -/** - * Workaround captureToImage method. - * - * Once composable + robolectric graphics bugs are fixed, this can be replaced with the actual - * [SemanticsNodeInteraction.captureToImage]. Alternative is to use - * instrumentations tests, but they are not run at github workflows. - * - * See [robolectric issue 8071](https://github.com/robolectric/robolectric/issues/8071) for details. - */ - -@OptIn(ExperimentalTestApi::class) -@RequiresApi(Build.VERSION_CODES.O) -fun SemanticsNodeInteraction.captureToImage(): ImageBitmap { - val node = fetchSemanticsNode("Failed to capture a node to bitmap.") - // Validate we are in popup - val popupParentMaybe = - node.findClosestParentNode(includeSelf = true) { - it.config.contains(SemanticsProperties.IsPopup) - } - if (popupParentMaybe != null) { - return processMultiWindowScreenshot(node) - } - - val view = (node.root as ViewRootForTest).view - - // If we are in dialog use its window to capture the bitmap - val dialogParentNodeMaybe = - node.findClosestParentNode(includeSelf = true) { - it.config.contains(SemanticsProperties.IsDialog) - } - var dialogWindow: Window? = null - if (dialogParentNodeMaybe != null) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { - // TODO(b/163023027) - throw IllegalArgumentException("Cannot currently capture dialogs on API lower than 28!") - } - - dialogWindow = findDialogWindowProviderInParent(view)?.window - ?: throw IllegalArgumentException( - "Could not find a dialog window provider to capture its bitmap" - ) - } - - val windowToUse = dialogWindow ?: view.context.getActivityWindow() - - val nodeBounds = node.boundsInRoot - val nodeBoundsRect = - Rect( - nodeBounds.left.roundToInt(), - nodeBounds.top.roundToInt(), - nodeBounds.right.roundToInt(), - nodeBounds.bottom.roundToInt() - ) - - val locationInWindow = intArrayOf(0, 0) - view.getLocationInWindow(locationInWindow) - val x = locationInWindow[0] - val y = locationInWindow[1] - - // Now these are bounds in window - nodeBoundsRect.offset(x, y) - - return windowToUse.captureRegionToImage(nodeBoundsRect) -} - -@RequiresApi(Build.VERSION_CODES.O) -private fun SemanticsNode.findClosestParentNode( - includeSelf: Boolean = false, - selector: (SemanticsNode) -> Boolean -): SemanticsNode? { - var currentParent = if (includeSelf) this else parent - while (currentParent != null) { - if (selector(currentParent)) { - return currentParent - } else { - currentParent = currentParent.parent - } - } - - return null -} - -@ExperimentalTestApi -@RequiresApi(Build.VERSION_CODES.O) -private fun processMultiWindowScreenshot(node: SemanticsNode): ImageBitmap { - val nodePositionInScreen = findNodePosition(node) - val nodeBoundsInRoot = node.boundsInRoot - - val combinedBitmap = InstrumentationRegistry.getInstrumentation().uiAutomation.takeScreenshot() - - val finalBitmap = - Bitmap.createBitmap( - combinedBitmap, - (nodePositionInScreen.x + nodeBoundsInRoot.left).roundToInt(), - (nodePositionInScreen.y + nodeBoundsInRoot.top).roundToInt(), - nodeBoundsInRoot.width.roundToInt(), - nodeBoundsInRoot.height.roundToInt() - ) - return finalBitmap.asImageBitmap() -} - -private fun findNodePosition(node: SemanticsNode): Offset { - val view = (node.root as ViewRootForTest).view - val locationOnScreen = intArrayOf(0, 0) - view.getLocationOnScreen(locationOnScreen) - val x = locationOnScreen[0] - val y = locationOnScreen[1] - - return Offset(x.toFloat(), y.toFloat()) -} - -internal fun findDialogWindowProviderInParent(view: View): DialogWindowProvider? { - if (view is DialogWindowProvider) { - return view - } - val parent = view.parent ?: return null - if (parent is View) { - return findDialogWindowProviderInParent(parent) - } - return null -} - -private fun Context.getActivityWindow(): Window { - fun Context.getActivity(): Activity { - return when (this) { - is Activity -> this - is ContextWrapper -> this.baseContext.getActivity() - else -> throw IllegalStateException( - "Context is not an Activity context, but a ${javaClass.simpleName} context. " + - "An Activity context is required to get a Window instance" - ) - } - } - return getActivity().window -} - -@RequiresApi(Build.VERSION_CODES.O) -private fun Window.captureRegionToImage(boundsInWindow: Rect): ImageBitmap { - // Turn on hardware rendering, if necessary - return withDrawingEnabled { - // Then we generate the bitmap - generateBitmap(boundsInWindow).asImageBitmap() - } -} - -private fun withDrawingEnabled(block: () -> R): R { - val wasDrawingEnabled = HardwareRendererCompat.isDrawingEnabled() - try { - if (!wasDrawingEnabled) { - HardwareRendererCompat.setDrawingEnabled(true) - } - return block.invoke() - } finally { - if (!wasDrawingEnabled) { - HardwareRendererCompat.setDrawingEnabled(false) - } - } -} - -@RequiresApi(Build.VERSION_CODES.O) -private fun Window.generateBitmap(boundsInWindow: Rect): Bitmap { - val destBitmap = - Bitmap.createBitmap( - boundsInWindow.width(), - boundsInWindow.height(), - Bitmap.Config.ARGB_8888 - ) - generateBitmapFromPixelCopy(boundsInWindow, destBitmap) - return destBitmap -} - -@RequiresApi(Build.VERSION_CODES.O) -private object PixelCopyHelper { - @DoNotInline - fun request( - source: Window, - srcRect: Rect?, - dest: Bitmap, - listener: PixelCopy.OnPixelCopyFinishedListener, - listenerThread: Handler - ) { - PixelCopy.request(source, srcRect, dest, listener, listenerThread) - } -} - -@RequiresApi(Build.VERSION_CODES.O) -private fun Window.generateBitmapFromPixelCopy(boundsInWindow: Rect, destBitmap: Bitmap) { - val latch = CountDownLatch(1) - var copyResult = 0 - val onCopyFinished = - PixelCopy.OnPixelCopyFinishedListener { result -> - copyResult = result - latch.countDown() - } - PixelCopyHelper.request( - this, - boundsInWindow, - destBitmap, - onCopyFinished, - Handler(Looper.getMainLooper()) - ) - - if (!latch.await(1, TimeUnit.SECONDS)) { - throw AssertionError("Failed waiting for PixelCopy!") - } - if (copyResult != PixelCopy.SUCCESS) { - throw AssertionError("PixelCopy failed!") - } -} From c5db5b5e13d8b3efe2cc5b29a8c1f47736197cf4 Mon Sep 17 00:00:00 2001 From: Kimberly Crevecoeur Date: Fri, 31 Jul 2026 08:35:49 -0700 Subject: [PATCH 3/8] styling cleanups --- core/camera/build.gradle.kts | 2 -- core/camera/effects/single-stream/build.gradle.kts | 4 +--- feature/postcapture/build.gradle.kts | 4 ++-- ui/components/build.gradle.kts | 1 - ui/components/capture/build.gradle.kts | 5 +---- ui/controller/build.gradle.kts | 5 +---- ui/controller/impl/build.gradle.kts | 5 +---- ui/uistate/build.gradle.kts | 5 +---- ui/uistate/capture/build.gradle.kts | 5 +---- ui/uistateadapter/build.gradle.kts | 5 +---- ui/uistateadapter/capture/build.gradle.kts | 5 +---- 11 files changed, 10 insertions(+), 36 deletions(-) diff --git a/core/camera/build.gradle.kts b/core/camera/build.gradle.kts index 975955fd0..b587e0a73 100644 --- a/core/camera/build.gradle.kts +++ b/core/camera/build.gradle.kts @@ -125,7 +125,6 @@ dependencies { implementation(libs.camera.lifecycle) implementation(libs.camera.video) - // Tracing implementation(libs.androidx.tracing) implementation(libs.kotlinx.atomicfu) @@ -141,4 +140,3 @@ dependencies { } - diff --git a/core/camera/effects/single-stream/build.gradle.kts b/core/camera/effects/single-stream/build.gradle.kts index ee42831de..f46fb4666 100644 --- a/core/camera/effects/single-stream/build.gradle.kts +++ b/core/camera/effects/single-stream/build.gradle.kts @@ -33,10 +33,8 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { - jvmToolchain(17) - - compilerOptions { + compilerOptions { freeCompilerArgs.add("-Xcontext-receivers") } } diff --git a/feature/postcapture/build.gradle.kts b/feature/postcapture/build.gradle.kts index d0754c11e..e57a6f450 100644 --- a/feature/postcapture/build.gradle.kts +++ b/feature/postcapture/build.gradle.kts @@ -32,7 +32,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - flavorDimensions += "flavor" productFlavors { create("stable") { @@ -75,7 +74,8 @@ android { } } } - }} + } +} dependencies { // Compose diff --git a/ui/components/build.gradle.kts b/ui/components/build.gradle.kts index b152876c8..cc2306000 100644 --- a/ui/components/build.gradle.kts +++ b/ui/components/build.gradle.kts @@ -32,7 +32,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - flavorDimensions += "flavor" productFlavors { create("stable") { diff --git a/ui/components/capture/build.gradle.kts b/ui/components/capture/build.gradle.kts index 0766452c4..837f3861b 100644 --- a/ui/components/capture/build.gradle.kts +++ b/ui/components/capture/build.gradle.kts @@ -32,7 +32,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - flavorDimensions += "flavor" productFlavors { create("stable") { @@ -46,10 +45,8 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { - jvmToolchain(17) - - compilerOptions { + compilerOptions { freeCompilerArgs.add("-Xcontext-receivers") } } diff --git a/ui/controller/build.gradle.kts b/ui/controller/build.gradle.kts index aad8888a3..836d755b3 100644 --- a/ui/controller/build.gradle.kts +++ b/ui/controller/build.gradle.kts @@ -32,7 +32,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - flavorDimensions += "flavor" productFlavors { create("stable") { @@ -46,10 +45,8 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { - jvmToolchain(17) - - compilerOptions { + compilerOptions { freeCompilerArgs.add("-Xcontext-receivers") } } diff --git a/ui/controller/impl/build.gradle.kts b/ui/controller/impl/build.gradle.kts index 66172ec61..18e226ba7 100644 --- a/ui/controller/impl/build.gradle.kts +++ b/ui/controller/impl/build.gradle.kts @@ -32,7 +32,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - flavorDimensions += "flavor" productFlavors { create("stable") { @@ -46,10 +45,8 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { - jvmToolchain(17) - - compilerOptions { + compilerOptions { freeCompilerArgs.add("-Xcontext-receivers") } } diff --git a/ui/uistate/build.gradle.kts b/ui/uistate/build.gradle.kts index 5ceda5ab4..3f5fffafb 100644 --- a/ui/uistate/build.gradle.kts +++ b/ui/uistate/build.gradle.kts @@ -32,7 +32,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - flavorDimensions += "flavor" productFlavors { create("stable") { @@ -46,10 +45,8 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { - jvmToolchain(17) - - compilerOptions { + compilerOptions { freeCompilerArgs.add("-Xcontext-receivers") } } diff --git a/ui/uistate/capture/build.gradle.kts b/ui/uistate/capture/build.gradle.kts index b32a0c393..14ccd3306 100644 --- a/ui/uistate/capture/build.gradle.kts +++ b/ui/uistate/capture/build.gradle.kts @@ -32,7 +32,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - flavorDimensions += "flavor" productFlavors { create("stable") { @@ -46,10 +45,8 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { - jvmToolchain(17) - - compilerOptions { + compilerOptions { freeCompilerArgs.add("-Xcontext-receivers") } } diff --git a/ui/uistateadapter/build.gradle.kts b/ui/uistateadapter/build.gradle.kts index 9fe67b430..ae6489ddd 100644 --- a/ui/uistateadapter/build.gradle.kts +++ b/ui/uistateadapter/build.gradle.kts @@ -32,7 +32,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - flavorDimensions += "flavor" productFlavors { create("stable") { @@ -46,10 +45,8 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { - jvmToolchain(17) - - compilerOptions { + compilerOptions { freeCompilerArgs.add("-Xcontext-receivers") } } diff --git a/ui/uistateadapter/capture/build.gradle.kts b/ui/uistateadapter/capture/build.gradle.kts index 46ec7008a..a598f51fb 100644 --- a/ui/uistateadapter/capture/build.gradle.kts +++ b/ui/uistateadapter/capture/build.gradle.kts @@ -32,7 +32,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - flavorDimensions += "flavor" productFlavors { create("stable") { @@ -46,10 +45,8 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { - jvmToolchain(17) - - compilerOptions { + compilerOptions { freeCompilerArgs.add("-Xcontext-receivers") } } From f1605380448af40dde36538fa3877e83e5a8fb52 Mon Sep 17 00:00:00 2001 From: Kimberly Crevecoeur Date: Fri, 31 Jul 2026 09:41:36 -0700 Subject: [PATCH 4/8] update all version catalog dependencies except targetsdk and kotlinPlugin --- gradle/libs.versions.toml | 51 ++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 04676d579..bc257fcb7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] # Used directly in build.gradle.kts files -compileSdk = "36" +compileSdk = "37" desugar_jdk_libs = "2.1.5" orchestrator = "1.6.1" minSdk = "24" @@ -9,7 +9,7 @@ targetSdk = "35" # Used below in dependency definitions # Compose and Accompanist versions are linked # See https://github.com/google/accompanist?tab=readme-ov-file#compose-versions -composeBom = "2025.10.01" +composeBom = "2026.06.01" accompanist = "0.37.3" # kotlinPlugin and composeCompiler are linked # See https://developer.android.com/jetpack/androidx/releases/compose-kotlin @@ -17,44 +17,45 @@ kotlinPlugin = "2.2.0" androidGradlePlugin = "9.3.1" -androidxActivityCompose = "1.10.1" + +androidxActivityCompose = "1.13.0" androidxAppCompat = "1.7.1" -androidxAnnotation = "1.7.1" -androidxBenchmark = "1.3.4" +androidxAnnotation = "1.10.0" +androidxBenchmark = "1.4.1" androidxCamera = "1.7.0-SNAPSHOT" androidxConcurrentFutures = "1.3.0" -androidxCoreKtx = "1.16.0" -androidxDatastore = "1.1.7" +androidxCoreKtx = "1.19.0" +androidxDatastore = "1.2.1" -androidxGraphicsCore = "1.0.3" -androidxHiltNavigationCompose = "1.3.0" -androidxLifecycle = "2.9.2" -androidxMedia3 = "1.9.0-alpha01" -androidxNavigationCompose = "2.9.2" +androidxGraphicsCore = "1.0.4" +androidxHiltNavigationCompose = "1.4.0" +androidxLifecycle = "2.11.0" +androidxMedia3 = "1.10.1" +androidxNavigationCompose = "2.9.8" androidxProfileinstaller = "1.4.1" androidxTestCore = "1.7.0" androidxTestEspresso = "3.7.0" androidxTestJunit = "1.3.0" androidxTestMonitor = "1.8.0" androidxTestRules = "1.7.0" -androidxTestUiautomator = "2.3.0" +androidxTestUiautomator = "2.4.0" androidxTracing = "1.3.0" -composeMaterial = "1.5.0-alpha07" +composeMaterial = "1.5.0-alpha25" cmake = "3.22.1" -kotlinxAtomicfu = "0.29.0" -kotlinxCoroutines = "1.10.2" -hilt = "2.59.2" +kotlinxAtomicfu = "0.33.0" +kotlinxCoroutines = "1.11.0" +hilt = "2.60.1" junit = "4.13.2" -robolectric = "4.15.1" -truth = "1.4.4" -testParameterInjector = "1.21" -playServices = "18.9.0" +robolectric = "4.16.1" +truth = "1.4.5" +testParameterInjector = "1.22" +playServices = "18.10.0" playServicesCoroutines = "1.10.2" -playServicesTasks = "18.4.0" -cameraLowLightBoost = "16.0.1-beta06" -material = "1.12.0" -material3WindowSizeClass = "1.3.2" +playServicesTasks = "18.4.1" +cameraLowLightBoost = "16.0.1-beta09" +material = "1.14.0" +material3WindowSizeClass = "1.4.0" [libraries] accompanist-permissions = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanist" } From 6c77cd4b1fdead666fb5cd1dedb72178cc50a31e Mon Sep 17 00:00:00 2001 From: Kimberly Crevecoeur Date: Fri, 31 Jul 2026 10:18:49 -0700 Subject: [PATCH 5/8] update spotless and ktlint --- gradle/init.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/init.gradle.kts b/gradle/init.gradle.kts index 8b5cab4ee..78fe402c0 100644 --- a/gradle/init.gradle.kts +++ b/gradle/init.gradle.kts @@ -14,10 +14,10 @@ * limitations under the License. */ -val ktlintVersion = "1.2.1" +val ktlintVersion = "1.8.0" initscript { - val spotlessVersion = "6.25.0" + val spotlessVersion = "8.9.0" repositories { mavenCentral() From 4fdb416d46936f7ba9613b0aee8009900efaa874 Mon Sep 17 00:00:00 2001 From: Kimberly Crevecoeur Date: Fri, 31 Jul 2026 06:04:47 -0700 Subject: [PATCH 6/8] Upgrade build infrastructure (AGP 9.3.1, Gradle 9.6.1) Upgrades the project's build system: - Upgraded Android Gradle Plugin to 9.3.1 and Gradle Wrapper to 9.6.1. - Migrated all modules from 'kotlin.android' to AGP's built-in Kotlin support. - Replaced 'kotlin.kapt' with 'legacy-kapt' for compatibility with built-in Kotlin. - Upgraded Hilt to 2.59.2 for AGP 9 compatibility. - Updated compiler flags to pass -Xcontext-receivers under the new built-in Kotlin configuration block in 11 modules. - Updated README to reflect Android Studio Quail / AGP 9 requirements. - Enabled parallel Gradle sync in gradle.properties. --- README.md | 4 ++-- app/build.gradle.kts | 3 +-- benchmark/build.gradle.kts | 16 +++++++++------- build.gradle.kts | 3 +-- core/camera/build.gradle.kts | 8 +++----- .../effects/single-stream/build.gradle.kts | 11 ++++++----- .../low-light-playservices/build.gradle.kts | 3 +-- core/camera/low-light/build.gradle.kts | 3 +-- core/camera/postprocess/build.gradle.kts | 3 +-- core/camera/testing/build.gradle.kts | 1 - core/common/build.gradle.kts | 3 +-- core/common/testing/build.gradle.kts | 1 - core/model/build.gradle.kts | 3 +-- core/settings/build.gradle.kts | 3 +-- core/settings/datastore-prefs/build.gradle.kts | 1 - .../datastore-prefs/testing/build.gradle.kts | 1 - data/camera/build.gradle.kts | 6 ++---- data/camera/consumer-rules.pro | 2 ++ data/media/build.gradle.kts | 3 +-- data/media/testing/build.gradle.kts | 1 - data/settings/build.gradle.kts | 3 +-- data/settings/testing/build.gradle.kts | 1 - feature/permissions/build.gradle.kts | 3 +-- feature/postcapture/build.gradle.kts | 13 +++++-------- feature/preview/build.gradle.kts | 3 +-- feature/settings/build.gradle.kts | 3 +-- gradle.properties | 5 +++-- gradle/libs.versions.toml | 5 +++-- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle.kts | 1 - ui/components/build.gradle.kts | 10 ++++------ ui/components/capture/build.gradle.kts | 12 ++++++------ ui/controller/build.gradle.kts | 12 ++++++------ ui/controller/impl/build.gradle.kts | 12 ++++++------ ui/controller/testing/build.gradle.kts | 1 - ui/debug/build.gradle.kts | 3 +-- ui/debug/testing/build.gradle.kts | 1 - ui/uistate/build.gradle.kts | 12 ++++++------ ui/uistate/capture/build.gradle.kts | 12 ++++++------ ui/uistate/postcapture/build.gradle.kts | 5 ++--- ui/uistateadapter/build.gradle.kts | 12 ++++++------ ui/uistateadapter/capture/build.gradle.kts | 12 ++++++------ ui/uistateadapter/postcapture/build.gradle.kts | 5 ++--- 43 files changed, 100 insertions(+), 127 deletions(-) create mode 100644 data/camera/consumer-rules.pro diff --git a/README.md b/README.md index a733c15c3..b13307a74 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,8 @@ OEMs looking to validate their camera feature implementations. This project uses the gradle build system, and can be imported directly into Android Studio. -Currently, Jetpack Camera App is built using the Android Gradle Plugin 8.10.0, which is only -compatible with Android Studio Meerkat or newer. +Currently, Jetpack Camera App is built using the Android Gradle Plugin 9.3.1, which is only +compatible with Android Studio Quail or newer. ## Pre-push Hook (Recommended) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ad359692b..7246eef3c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.application) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) alias(libs.plugins.compose.compiler) } diff --git a/benchmark/build.gradle.kts b/benchmark/build.gradle.kts index a1708658f..00c54f097 100644 --- a/benchmark/build.gradle.kts +++ b/benchmark/build.gradle.kts @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { alias(libs.plugins.android.test) - alias(libs.plugins.kotlin.android) } android { @@ -24,12 +24,8 @@ android { compileSdk = libs.versions.compileSdk.get().toInt() compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = "1.8" + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } defaultConfig { @@ -69,6 +65,12 @@ android { experimentalProperties["android.experimental.self-instrumenting"] = true } +kotlin { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_17) + } +} + dependencies { implementation(libs.androidx.junit) implementation(libs.androidx.benchmark.macro.junit4) diff --git a/build.gradle.kts b/build.gradle.kts index 64fdc6b56..53a8212e2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,9 +19,8 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.android.library) apply false alias(libs.plugins.android.test) apply false - alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.dagger.hilt.android) apply false - alias(libs.plugins.kotlin.kapt) apply false + alias(libs.plugins.android.legacy.kapt) apply false alias(libs.plugins.compose.compiler) apply false } diff --git a/core/camera/build.gradle.kts b/core/camera/build.gradle.kts index b87fb79ee..975955fd0 100644 --- a/core/camera/build.gradle.kts +++ b/core/camera/build.gradle.kts @@ -16,7 +16,6 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { @@ -93,10 +92,9 @@ android { } kotlin { jvmToolchain(17) - } - - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } } diff --git a/core/camera/effects/single-stream/build.gradle.kts b/core/camera/effects/single-stream/build.gradle.kts index dacbf112c..ee42831de 100644 --- a/core/camera/effects/single-stream/build.gradle.kts +++ b/core/camera/effects/single-stream/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) } @@ -34,10 +33,12 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { + jvmToolchain(17) - } - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" + + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } } diff --git a/core/camera/low-light-playservices/build.gradle.kts b/core/camera/low-light-playservices/build.gradle.kts index 639fa3e51..5c6aab589 100644 --- a/core/camera/low-light-playservices/build.gradle.kts +++ b/core/camera/low-light-playservices/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) } diff --git a/core/camera/low-light/build.gradle.kts b/core/camera/low-light/build.gradle.kts index cade65c9e..9377565e4 100644 --- a/core/camera/low-light/build.gradle.kts +++ b/core/camera/low-light/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) } diff --git a/core/camera/postprocess/build.gradle.kts b/core/camera/postprocess/build.gradle.kts index ceedef0b7..67157f0be 100644 --- a/core/camera/postprocess/build.gradle.kts +++ b/core/camera/postprocess/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) } diff --git a/core/camera/testing/build.gradle.kts b/core/camera/testing/build.gradle.kts index 38f70711f..0768c256e 100644 --- a/core/camera/testing/build.gradle.kts +++ b/core/camera/testing/build.gradle.kts @@ -16,7 +16,6 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts index 185217b27..5886b309b 100644 --- a/core/common/build.gradle.kts +++ b/core/common/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) } diff --git a/core/common/testing/build.gradle.kts b/core/common/testing/build.gradle.kts index 57c300b0e..6d21ce391 100644 --- a/core/common/testing/build.gradle.kts +++ b/core/common/testing/build.gradle.kts @@ -16,7 +16,6 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { diff --git a/core/model/build.gradle.kts b/core/model/build.gradle.kts index d352566c4..f9e6a46d8 100644 --- a/core/model/build.gradle.kts +++ b/core/model/build.gradle.kts @@ -15,8 +15,7 @@ */ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) } android { diff --git a/core/settings/build.gradle.kts b/core/settings/build.gradle.kts index 35c256a56..021d3d4d8 100644 --- a/core/settings/build.gradle.kts +++ b/core/settings/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) } diff --git a/core/settings/datastore-prefs/build.gradle.kts b/core/settings/datastore-prefs/build.gradle.kts index c0ca9f8d4..107acd946 100644 --- a/core/settings/datastore-prefs/build.gradle.kts +++ b/core/settings/datastore-prefs/build.gradle.kts @@ -15,7 +15,6 @@ */ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { diff --git a/core/settings/datastore-prefs/testing/build.gradle.kts b/core/settings/datastore-prefs/testing/build.gradle.kts index 0e619ddbd..d6b25c0f3 100644 --- a/core/settings/datastore-prefs/testing/build.gradle.kts +++ b/core/settings/datastore-prefs/testing/build.gradle.kts @@ -16,7 +16,6 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { diff --git a/data/camera/build.gradle.kts b/data/camera/build.gradle.kts index 8a541423a..39c75b667 100644 --- a/data/camera/build.gradle.kts +++ b/data/camera/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) } @@ -37,8 +36,7 @@ android { buildTypes { release { proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" + getDefaultProguardFile("proguard-android-optimize.txt") ) } create("benchmark") { diff --git a/data/camera/consumer-rules.pro b/data/camera/consumer-rules.pro new file mode 100644 index 000000000..c1a8cebff --- /dev/null +++ b/data/camera/consumer-rules.pro @@ -0,0 +1,2 @@ +# Add project specific consumer ProGuard rules here. +# More info: https://developer.android.com/studio/build/shrink-code diff --git a/data/media/build.gradle.kts b/data/media/build.gradle.kts index 91146f6e8..223daced0 100644 --- a/data/media/build.gradle.kts +++ b/data/media/build.gradle.kts @@ -15,8 +15,7 @@ */ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) } diff --git a/data/media/testing/build.gradle.kts b/data/media/testing/build.gradle.kts index f05656de1..2c531124c 100644 --- a/data/media/testing/build.gradle.kts +++ b/data/media/testing/build.gradle.kts @@ -16,7 +16,6 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { diff --git a/data/settings/build.gradle.kts b/data/settings/build.gradle.kts index 7748c8d51..b7037b199 100644 --- a/data/settings/build.gradle.kts +++ b/data/settings/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) } diff --git a/data/settings/testing/build.gradle.kts b/data/settings/testing/build.gradle.kts index 14e7b1e30..a3ff5b281 100644 --- a/data/settings/testing/build.gradle.kts +++ b/data/settings/testing/build.gradle.kts @@ -16,7 +16,6 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { diff --git a/feature/permissions/build.gradle.kts b/feature/permissions/build.gradle.kts index 6c977afeb..e101d4892 100644 --- a/feature/permissions/build.gradle.kts +++ b/feature/permissions/build.gradle.kts @@ -15,10 +15,9 @@ */ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) alias(libs.plugins.compose.compiler) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) } diff --git a/feature/postcapture/build.gradle.kts b/feature/postcapture/build.gradle.kts index b1faaa055..d0754c11e 100644 --- a/feature/postcapture/build.gradle.kts +++ b/feature/postcapture/build.gradle.kts @@ -15,8 +15,7 @@ */ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) alias(libs.plugins.compose.compiler) } @@ -48,6 +47,9 @@ android { } kotlin { jvmToolchain(17) + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } buildFeatures { buildConfig = true @@ -73,12 +75,7 @@ android { } } } - } - - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" - } -} + }} dependencies { // Compose diff --git a/feature/preview/build.gradle.kts b/feature/preview/build.gradle.kts index 54ab1c505..37e210f8e 100644 --- a/feature/preview/build.gradle.kts +++ b/feature/preview/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) alias(libs.plugins.compose.compiler) } diff --git a/feature/settings/build.gradle.kts b/feature/settings/build.gradle.kts index d5c246d1f..10dadeda4 100644 --- a/feature/settings/build.gradle.kts +++ b/feature/settings/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.dagger.hilt.android) alias(libs.plugins.compose.compiler) } diff --git a/gradle.properties b/gradle.properties index 15ab33aba..23a6f2b56 100644 --- a/gradle.properties +++ b/gradle.properties @@ -39,9 +39,10 @@ kotlin.code.style=official # resources declared in the library itself and none from the library's dependencies, # thereby reducing the size of the R class for that library android.nonTransitiveRClass=true -android.nonFinalResIds=false # Properties to make gradle managed devices testing more stable (see https://issuetracker.google.com/287312019#comment41) android.experimental.testOptions.managedDevices.maxConcurrentDevices=1 android.experimental.testOptions.managedDevices.setupTimeoutMinutes=180 # Ensure we can run managed devices on servers that don't support hardware rendering -android.testoptions.manageddevices.emulator.gpu=swiftshader_indirect \ No newline at end of file +android.testoptions.manageddevices.emulator.gpu=swiftshader_indirect +# Enabled parallel sync for Gradle 9.4+ +org.gradle.tooling.parallel=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a2317d598..04676d579 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ accompanist = "0.37.3" # kotlinPlugin and composeCompiler are linked # See https://developer.android.com/jetpack/androidx/releases/compose-kotlin kotlinPlugin = "2.2.0" -androidGradlePlugin = "8.10.1" +androidGradlePlugin = "9.3.1" androidxActivityCompose = "1.10.1" @@ -43,7 +43,7 @@ composeMaterial = "1.5.0-alpha07" cmake = "3.22.1" kotlinxAtomicfu = "0.29.0" kotlinxCoroutines = "1.10.2" -hilt = "2.57" +hilt = "2.59.2" junit = "4.13.2" robolectric = "4.15.1" @@ -124,3 +124,4 @@ dagger-hilt-android = { id = "com.google.dagger.hilt.android", version.ref = "hi kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlinPlugin" } kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlinPlugin" } +android-legacy-kapt = { id = "com.android.legacy-kapt", version.ref = "androidGradlePlugin" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b965ecfd5..c72c372a8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue Mar 12 23:44:57 PDT 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle.kts b/settings.gradle.kts index dfb9e6557..f1197bb76 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -57,7 +57,6 @@ include(":ui:uistate:capture") include(":ui:uistateadapter:capture") include(":ui:components") include(":ui:components:capture") -include(":data:model") include(":core:settings") include(":core:model") include(":ui:uistate:postcapture") diff --git a/ui/components/build.gradle.kts b/ui/components/build.gradle.kts index 02d3b2dca..b152876c8 100644 --- a/ui/components/build.gradle.kts +++ b/ui/components/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.compose.compiler) } @@ -48,15 +47,14 @@ android { } kotlin { jvmToolchain(17) + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } buildFeatures { buildConfig = true compose = true } - - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" - } } dependencies { diff --git a/ui/components/capture/build.gradle.kts b/ui/components/capture/build.gradle.kts index d2f9fc5fa..0766452c4 100644 --- a/ui/components/capture/build.gradle.kts +++ b/ui/components/capture/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.compose.compiler) } @@ -47,16 +46,17 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { + jvmToolchain(17) + + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } buildFeatures { buildConfig = true compose = true } - - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" - } } dependencies { diff --git a/ui/controller/build.gradle.kts b/ui/controller/build.gradle.kts index 2690d28bb..aad8888a3 100644 --- a/ui/controller/build.gradle.kts +++ b/ui/controller/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.compose.compiler) } @@ -47,16 +46,17 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { + jvmToolchain(17) + + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } buildFeatures { buildConfig = true compose = true } - - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" - } } dependencies { diff --git a/ui/controller/impl/build.gradle.kts b/ui/controller/impl/build.gradle.kts index 062e38746..66172ec61 100644 --- a/ui/controller/impl/build.gradle.kts +++ b/ui/controller/impl/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.compose.compiler) } @@ -47,16 +46,17 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { + jvmToolchain(17) + + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } buildFeatures { buildConfig = true compose = true } - - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" - } } dependencies { diff --git a/ui/controller/testing/build.gradle.kts b/ui/controller/testing/build.gradle.kts index 402ca3715..f239cd132 100644 --- a/ui/controller/testing/build.gradle.kts +++ b/ui/controller/testing/build.gradle.kts @@ -16,7 +16,6 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { diff --git a/ui/debug/build.gradle.kts b/ui/debug/build.gradle.kts index d62d15e16..4406021e2 100644 --- a/ui/debug/build.gradle.kts +++ b/ui/debug/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.compose.compiler) } diff --git a/ui/debug/testing/build.gradle.kts b/ui/debug/testing/build.gradle.kts index 4abe6a083..f05e7f6bf 100644 --- a/ui/debug/testing/build.gradle.kts +++ b/ui/debug/testing/build.gradle.kts @@ -16,7 +16,6 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { diff --git a/ui/uistate/build.gradle.kts b/ui/uistate/build.gradle.kts index e06c9e4c7..5ceda5ab4 100644 --- a/ui/uistate/build.gradle.kts +++ b/ui/uistate/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.compose.compiler) } @@ -47,16 +46,17 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { + jvmToolchain(17) + + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } buildFeatures { buildConfig = true compose = true } - - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" - } } dependencies { diff --git a/ui/uistate/capture/build.gradle.kts b/ui/uistate/capture/build.gradle.kts index 345628e27..b32a0c393 100644 --- a/ui/uistate/capture/build.gradle.kts +++ b/ui/uistate/capture/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.compose.compiler) } @@ -47,16 +46,17 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { + jvmToolchain(17) + + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } buildFeatures { buildConfig = true compose = true } - - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" - } } dependencies { diff --git a/ui/uistate/postcapture/build.gradle.kts b/ui/uistate/postcapture/build.gradle.kts index 4fda15af5..cd5412fb3 100644 --- a/ui/uistate/postcapture/build.gradle.kts +++ b/ui/uistate/postcapture/build.gradle.kts @@ -15,7 +15,6 @@ */ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { @@ -42,8 +41,8 @@ android { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" + kotlin { + jvmToolchain(17) } } diff --git a/ui/uistateadapter/build.gradle.kts b/ui/uistateadapter/build.gradle.kts index 2826a1033..9fe67b430 100644 --- a/ui/uistateadapter/build.gradle.kts +++ b/ui/uistateadapter/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.compose.compiler) } @@ -47,16 +46,17 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { + jvmToolchain(17) + + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } buildFeatures { buildConfig = true compose = true } - - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" - } } dependencies { diff --git a/ui/uistateadapter/capture/build.gradle.kts b/ui/uistateadapter/capture/build.gradle.kts index fa52725fe..46ec7008a 100644 --- a/ui/uistateadapter/capture/build.gradle.kts +++ b/ui/uistateadapter/capture/build.gradle.kts @@ -16,8 +16,7 @@ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.android.legacy.kapt) alias(libs.plugins.compose.compiler) } @@ -47,16 +46,17 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { + jvmToolchain(17) + + compilerOptions { + freeCompilerArgs.add("-Xcontext-receivers") + } } buildFeatures { buildConfig = true compose = true } - - kotlinOptions { - freeCompilerArgs += "-Xcontext-receivers" - } } dependencies { diff --git a/ui/uistateadapter/postcapture/build.gradle.kts b/ui/uistateadapter/postcapture/build.gradle.kts index 889e3a51c..8659e8e7a 100644 --- a/ui/uistateadapter/postcapture/build.gradle.kts +++ b/ui/uistateadapter/postcapture/build.gradle.kts @@ -15,7 +15,6 @@ */ plugins { alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.android) } android { @@ -42,8 +41,8 @@ android { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" + kotlin { + jvmToolchain(17) } } From bee3659d06533f3c7e23b0154e8729bab06da537 Mon Sep 17 00:00:00 2001 From: Kimberly Crevecoeur Date: Fri, 31 Jul 2026 07:58:15 -0700 Subject: [PATCH 7/8] Fix Gradle 9 test task failures by removing empty test suites Deletes the unused and duplicated test helper classes in :ui:components:capture. Gradle 9 fails the build if a module contains test sources but no actual @Test classes to execute, which was the case here since it only contained test utilities. --- .../capture/rules/MainDispatcherRule.kt | 39 --- .../workaround/ComposableCaptureToImage.kt | 257 ------------------ 2 files changed, 296 deletions(-) delete mode 100644 ui/components/capture/src/test/java/com/google/jetpackcamera/ui/components/capture/capture/rules/MainDispatcherRule.kt delete mode 100644 ui/components/capture/src/test/java/com/google/jetpackcamera/ui/components/capture/capture/workaround/ComposableCaptureToImage.kt diff --git a/ui/components/capture/src/test/java/com/google/jetpackcamera/ui/components/capture/capture/rules/MainDispatcherRule.kt b/ui/components/capture/src/test/java/com/google/jetpackcamera/ui/components/capture/capture/rules/MainDispatcherRule.kt deleted file mode 100644 index 287fb9fff..000000000 --- a/ui/components/capture/src/test/java/com/google/jetpackcamera/ui/components/capture/capture/rules/MainDispatcherRule.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2025 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.jetpackcamera.ui.components.capture.capture.rules - -import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.resetMain -import kotlinx.coroutines.test.setMain -import org.junit.rules.TestRule -import org.junit.runner.Description -import org.junit.runners.model.Statement - -class MainDispatcherRule(private val dispatcher: CoroutineDispatcher) : TestRule { - @OptIn(ExperimentalCoroutinesApi::class) - override fun apply(base: Statement?, description: Description?) = object : Statement() { - override fun evaluate() { - Dispatchers.setMain(dispatcher) - try { - base!!.evaluate() - } finally { - Dispatchers.resetMain() - } - } - } -} diff --git a/ui/components/capture/src/test/java/com/google/jetpackcamera/ui/components/capture/capture/workaround/ComposableCaptureToImage.kt b/ui/components/capture/src/test/java/com/google/jetpackcamera/ui/components/capture/capture/workaround/ComposableCaptureToImage.kt deleted file mode 100644 index 9805bcde9..000000000 --- a/ui/components/capture/src/test/java/com/google/jetpackcamera/ui/components/capture/capture/workaround/ComposableCaptureToImage.kt +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Copyright (C) 2025 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -@file:SuppressLint("UseSdkSuppress") - -package com.google.jetpackcamera.ui.components.capture.capture.workaround - -import android.annotation.SuppressLint -import android.app.Activity -import android.content.Context -import android.content.ContextWrapper -import android.graphics.Bitmap -import android.graphics.Rect -import android.os.Build -import android.os.Handler -import android.os.Looper -import android.view.PixelCopy -import android.view.View -import android.view.Window -import androidx.annotation.DoNotInline -import androidx.annotation.RequiresApi -import androidx.compose.ui.geometry.Offset -import androidx.compose.ui.graphics.ImageBitmap -import androidx.compose.ui.graphics.asImageBitmap -import androidx.compose.ui.platform.ViewRootForTest -import androidx.compose.ui.semantics.SemanticsNode -import androidx.compose.ui.semantics.SemanticsProperties -import androidx.compose.ui.test.ExperimentalTestApi -import androidx.compose.ui.test.SemanticsNodeInteraction -import androidx.compose.ui.window.DialogWindowProvider -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.platform.graphics.HardwareRendererCompat -import java.util.concurrent.CountDownLatch -import java.util.concurrent.TimeUnit -import kotlin.math.roundToInt - -/** - * Workaround captureToImage method. - * - * Once composable + robolectric graphics bugs are fixed, this can be replaced with the actual - * [SemanticsNodeInteraction.captureToImage]. Alternative is to use - * instrumentations tests, but they are not run at github workflows. - * - * See [robolectric issue 8071](https://github.com/robolectric/robolectric/issues/8071) for details. - */ - -@OptIn(ExperimentalTestApi::class) -@RequiresApi(Build.VERSION_CODES.O) -fun SemanticsNodeInteraction.captureToImage(): ImageBitmap { - val node = fetchSemanticsNode("Failed to capture a node to bitmap.") - // Validate we are in popup - val popupParentMaybe = - node.findClosestParentNode(includeSelf = true) { - it.config.contains(SemanticsProperties.IsPopup) - } - if (popupParentMaybe != null) { - return processMultiWindowScreenshot(node) - } - - val view = (node.root as ViewRootForTest).view - - // If we are in dialog use its window to capture the bitmap - val dialogParentNodeMaybe = - node.findClosestParentNode(includeSelf = true) { - it.config.contains(SemanticsProperties.IsDialog) - } - var dialogWindow: Window? = null - if (dialogParentNodeMaybe != null) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { - // TODO(b/163023027) - throw IllegalArgumentException("Cannot currently capture dialogs on API lower than 28!") - } - - dialogWindow = findDialogWindowProviderInParent(view)?.window - ?: throw IllegalArgumentException( - "Could not find a dialog window provider to capture its bitmap" - ) - } - - val windowToUse = dialogWindow ?: view.context.getActivityWindow() - - val nodeBounds = node.boundsInRoot - val nodeBoundsRect = - Rect( - nodeBounds.left.roundToInt(), - nodeBounds.top.roundToInt(), - nodeBounds.right.roundToInt(), - nodeBounds.bottom.roundToInt() - ) - - val locationInWindow = intArrayOf(0, 0) - view.getLocationInWindow(locationInWindow) - val x = locationInWindow[0] - val y = locationInWindow[1] - - // Now these are bounds in window - nodeBoundsRect.offset(x, y) - - return windowToUse.captureRegionToImage(nodeBoundsRect) -} - -@RequiresApi(Build.VERSION_CODES.O) -private fun SemanticsNode.findClosestParentNode( - includeSelf: Boolean = false, - selector: (SemanticsNode) -> Boolean -): SemanticsNode? { - var currentParent = if (includeSelf) this else parent - while (currentParent != null) { - if (selector(currentParent)) { - return currentParent - } else { - currentParent = currentParent.parent - } - } - - return null -} - -@ExperimentalTestApi -@RequiresApi(Build.VERSION_CODES.O) -private fun processMultiWindowScreenshot(node: SemanticsNode): ImageBitmap { - val nodePositionInScreen = findNodePosition(node) - val nodeBoundsInRoot = node.boundsInRoot - - val combinedBitmap = InstrumentationRegistry.getInstrumentation().uiAutomation.takeScreenshot() - - val finalBitmap = - Bitmap.createBitmap( - combinedBitmap, - (nodePositionInScreen.x + nodeBoundsInRoot.left).roundToInt(), - (nodePositionInScreen.y + nodeBoundsInRoot.top).roundToInt(), - nodeBoundsInRoot.width.roundToInt(), - nodeBoundsInRoot.height.roundToInt() - ) - return finalBitmap.asImageBitmap() -} - -private fun findNodePosition(node: SemanticsNode): Offset { - val view = (node.root as ViewRootForTest).view - val locationOnScreen = intArrayOf(0, 0) - view.getLocationOnScreen(locationOnScreen) - val x = locationOnScreen[0] - val y = locationOnScreen[1] - - return Offset(x.toFloat(), y.toFloat()) -} - -internal fun findDialogWindowProviderInParent(view: View): DialogWindowProvider? { - if (view is DialogWindowProvider) { - return view - } - val parent = view.parent ?: return null - if (parent is View) { - return findDialogWindowProviderInParent(parent) - } - return null -} - -private fun Context.getActivityWindow(): Window { - fun Context.getActivity(): Activity { - return when (this) { - is Activity -> this - is ContextWrapper -> this.baseContext.getActivity() - else -> throw IllegalStateException( - "Context is not an Activity context, but a ${javaClass.simpleName} context. " + - "An Activity context is required to get a Window instance" - ) - } - } - return getActivity().window -} - -@RequiresApi(Build.VERSION_CODES.O) -private fun Window.captureRegionToImage(boundsInWindow: Rect): ImageBitmap { - // Turn on hardware rendering, if necessary - return withDrawingEnabled { - // Then we generate the bitmap - generateBitmap(boundsInWindow).asImageBitmap() - } -} - -private fun withDrawingEnabled(block: () -> R): R { - val wasDrawingEnabled = HardwareRendererCompat.isDrawingEnabled() - try { - if (!wasDrawingEnabled) { - HardwareRendererCompat.setDrawingEnabled(true) - } - return block.invoke() - } finally { - if (!wasDrawingEnabled) { - HardwareRendererCompat.setDrawingEnabled(false) - } - } -} - -@RequiresApi(Build.VERSION_CODES.O) -private fun Window.generateBitmap(boundsInWindow: Rect): Bitmap { - val destBitmap = - Bitmap.createBitmap( - boundsInWindow.width(), - boundsInWindow.height(), - Bitmap.Config.ARGB_8888 - ) - generateBitmapFromPixelCopy(boundsInWindow, destBitmap) - return destBitmap -} - -@RequiresApi(Build.VERSION_CODES.O) -private object PixelCopyHelper { - @DoNotInline - fun request( - source: Window, - srcRect: Rect?, - dest: Bitmap, - listener: PixelCopy.OnPixelCopyFinishedListener, - listenerThread: Handler - ) { - PixelCopy.request(source, srcRect, dest, listener, listenerThread) - } -} - -@RequiresApi(Build.VERSION_CODES.O) -private fun Window.generateBitmapFromPixelCopy(boundsInWindow: Rect, destBitmap: Bitmap) { - val latch = CountDownLatch(1) - var copyResult = 0 - val onCopyFinished = - PixelCopy.OnPixelCopyFinishedListener { result -> - copyResult = result - latch.countDown() - } - PixelCopyHelper.request( - this, - boundsInWindow, - destBitmap, - onCopyFinished, - Handler(Looper.getMainLooper()) - ) - - if (!latch.await(1, TimeUnit.SECONDS)) { - throw AssertionError("Failed waiting for PixelCopy!") - } - if (copyResult != PixelCopy.SUCCESS) { - throw AssertionError("PixelCopy failed!") - } -} From 178f2661210d4fa1b2f250626857a2faa8f4c441 Mon Sep 17 00:00:00 2001 From: Kimberly Crevecoeur Date: Fri, 31 Jul 2026 08:35:49 -0700 Subject: [PATCH 8/8] styling cleanups --- core/camera/build.gradle.kts | 2 -- core/camera/effects/single-stream/build.gradle.kts | 4 +--- feature/postcapture/build.gradle.kts | 4 ++-- ui/components/build.gradle.kts | 1 - ui/components/capture/build.gradle.kts | 5 +---- ui/controller/build.gradle.kts | 5 +---- ui/controller/impl/build.gradle.kts | 5 +---- ui/uistate/build.gradle.kts | 5 +---- ui/uistate/capture/build.gradle.kts | 5 +---- ui/uistateadapter/build.gradle.kts | 5 +---- ui/uistateadapter/capture/build.gradle.kts | 5 +---- 11 files changed, 10 insertions(+), 36 deletions(-) diff --git a/core/camera/build.gradle.kts b/core/camera/build.gradle.kts index 975955fd0..b587e0a73 100644 --- a/core/camera/build.gradle.kts +++ b/core/camera/build.gradle.kts @@ -125,7 +125,6 @@ dependencies { implementation(libs.camera.lifecycle) implementation(libs.camera.video) - // Tracing implementation(libs.androidx.tracing) implementation(libs.kotlinx.atomicfu) @@ -141,4 +140,3 @@ dependencies { } - diff --git a/core/camera/effects/single-stream/build.gradle.kts b/core/camera/effects/single-stream/build.gradle.kts index ee42831de..f46fb4666 100644 --- a/core/camera/effects/single-stream/build.gradle.kts +++ b/core/camera/effects/single-stream/build.gradle.kts @@ -33,10 +33,8 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { - jvmToolchain(17) - - compilerOptions { + compilerOptions { freeCompilerArgs.add("-Xcontext-receivers") } } diff --git a/feature/postcapture/build.gradle.kts b/feature/postcapture/build.gradle.kts index d0754c11e..e57a6f450 100644 --- a/feature/postcapture/build.gradle.kts +++ b/feature/postcapture/build.gradle.kts @@ -32,7 +32,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - flavorDimensions += "flavor" productFlavors { create("stable") { @@ -75,7 +74,8 @@ android { } } } - }} + } +} dependencies { // Compose diff --git a/ui/components/build.gradle.kts b/ui/components/build.gradle.kts index b152876c8..cc2306000 100644 --- a/ui/components/build.gradle.kts +++ b/ui/components/build.gradle.kts @@ -32,7 +32,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - flavorDimensions += "flavor" productFlavors { create("stable") { diff --git a/ui/components/capture/build.gradle.kts b/ui/components/capture/build.gradle.kts index 0766452c4..837f3861b 100644 --- a/ui/components/capture/build.gradle.kts +++ b/ui/components/capture/build.gradle.kts @@ -32,7 +32,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - flavorDimensions += "flavor" productFlavors { create("stable") { @@ -46,10 +45,8 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { - jvmToolchain(17) - - compilerOptions { + compilerOptions { freeCompilerArgs.add("-Xcontext-receivers") } } diff --git a/ui/controller/build.gradle.kts b/ui/controller/build.gradle.kts index aad8888a3..836d755b3 100644 --- a/ui/controller/build.gradle.kts +++ b/ui/controller/build.gradle.kts @@ -32,7 +32,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - flavorDimensions += "flavor" productFlavors { create("stable") { @@ -46,10 +45,8 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { - jvmToolchain(17) - - compilerOptions { + compilerOptions { freeCompilerArgs.add("-Xcontext-receivers") } } diff --git a/ui/controller/impl/build.gradle.kts b/ui/controller/impl/build.gradle.kts index 66172ec61..18e226ba7 100644 --- a/ui/controller/impl/build.gradle.kts +++ b/ui/controller/impl/build.gradle.kts @@ -32,7 +32,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - flavorDimensions += "flavor" productFlavors { create("stable") { @@ -46,10 +45,8 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { - jvmToolchain(17) - - compilerOptions { + compilerOptions { freeCompilerArgs.add("-Xcontext-receivers") } } diff --git a/ui/uistate/build.gradle.kts b/ui/uistate/build.gradle.kts index 5ceda5ab4..3f5fffafb 100644 --- a/ui/uistate/build.gradle.kts +++ b/ui/uistate/build.gradle.kts @@ -32,7 +32,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - flavorDimensions += "flavor" productFlavors { create("stable") { @@ -46,10 +45,8 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { - jvmToolchain(17) - - compilerOptions { + compilerOptions { freeCompilerArgs.add("-Xcontext-receivers") } } diff --git a/ui/uistate/capture/build.gradle.kts b/ui/uistate/capture/build.gradle.kts index b32a0c393..14ccd3306 100644 --- a/ui/uistate/capture/build.gradle.kts +++ b/ui/uistate/capture/build.gradle.kts @@ -32,7 +32,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - flavorDimensions += "flavor" productFlavors { create("stable") { @@ -46,10 +45,8 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { - jvmToolchain(17) - - compilerOptions { + compilerOptions { freeCompilerArgs.add("-Xcontext-receivers") } } diff --git a/ui/uistateadapter/build.gradle.kts b/ui/uistateadapter/build.gradle.kts index 9fe67b430..ae6489ddd 100644 --- a/ui/uistateadapter/build.gradle.kts +++ b/ui/uistateadapter/build.gradle.kts @@ -32,7 +32,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - flavorDimensions += "flavor" productFlavors { create("stable") { @@ -46,10 +45,8 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { - jvmToolchain(17) - - compilerOptions { + compilerOptions { freeCompilerArgs.add("-Xcontext-receivers") } } diff --git a/ui/uistateadapter/capture/build.gradle.kts b/ui/uistateadapter/capture/build.gradle.kts index 46ec7008a..a598f51fb 100644 --- a/ui/uistateadapter/capture/build.gradle.kts +++ b/ui/uistateadapter/capture/build.gradle.kts @@ -32,7 +32,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - flavorDimensions += "flavor" productFlavors { create("stable") { @@ -46,10 +45,8 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlin { - jvmToolchain(17) - - compilerOptions { + compilerOptions { freeCompilerArgs.add("-Xcontext-receivers") } }