From 7deb4bf72e6b4cb10da82e4aa14cbb708bda267c Mon Sep 17 00:00:00 2001 From: Daniel Jette Date: Sun, 16 Aug 2026 15:31:46 -0400 Subject: [PATCH 1/6] Upgrade all project files to use Java 25 --- Ext/Compose/build.gradle | 6 +++--- Ext/Ktx/build.gradle | 6 +++--- Library/build.gradle | 8 ++++---- Plugins/IntelliJ/build.gradle.kts | 2 +- Samples/Flix/FlixLibrary/build.gradle | 6 +++--- Samples/Flix/build.gradle | 6 +++--- Samples/Legacy/build.gradle | 6 +++--- Samples/Paparazzi/PaparazziSampleLibrary/build.gradle | 6 +++--- Samples/Paparazzi/build.gradle | 6 +++--- bitrise.yml | 2 +- 10 files changed, 27 insertions(+), 27 deletions(-) diff --git a/Ext/Compose/build.gradle b/Ext/Compose/build.gradle index 1dbe2394e..4e3b26799 100644 --- a/Ext/Compose/build.gradle +++ b/Ext/Compose/build.gradle @@ -74,13 +74,13 @@ android { kotlin { compilerOptions { allWarningsAsErrors.set(true) - jvmTarget.set(JvmTarget.JVM_21) + jvmTarget.set(JvmTarget.JVM_25) freeCompilerArgs.addAll("-Xcontext-parameters") } } compileOptions { - sourceCompatibility JavaVersion.VERSION_21 - targetCompatibility JavaVersion.VERSION_21 + sourceCompatibility JavaVersion.VERSION_25 + targetCompatibility JavaVersion.VERSION_25 } dependencies { diff --git a/Ext/Ktx/build.gradle b/Ext/Ktx/build.gradle index a2130af36..3df5f7272 100644 --- a/Ext/Ktx/build.gradle +++ b/Ext/Ktx/build.gradle @@ -63,8 +63,8 @@ android { } compileOptions { - sourceCompatibility JavaVersion.VERSION_21 - targetCompatibility JavaVersion.VERSION_21 + sourceCompatibility JavaVersion.VERSION_25 + targetCompatibility JavaVersion.VERSION_25 } dependencies { @@ -105,6 +105,6 @@ afterEvaluate { tasks.withType(KotlinJvmCompile).configureEach { compilerOptions { allWarningsAsErrors.set(true) - jvmTarget.set(JvmTarget.JVM_21) + jvmTarget.set(JvmTarget.JVM_25) } } diff --git a/Library/build.gradle b/Library/build.gradle index e6be21b23..25010076e 100644 --- a/Library/build.gradle +++ b/Library/build.gradle @@ -31,11 +31,11 @@ jacoco { toolVersion = "0.8.10" } android { kotlinOptions { - jvmTarget = '21' + jvmTarget = '25' } compileOptions { - sourceCompatibility JavaVersion.VERSION_21 - targetCompatibility JavaVersion.VERSION_21 + sourceCompatibility JavaVersion.VERSION_25 + targetCompatibility JavaVersion.VERSION_25 } defaultConfig { @@ -47,7 +47,7 @@ android { kotlin { compilerOptions { allWarningsAsErrors.set(true) - jvmTarget.set(JvmTarget.JVM_21) + jvmTarget.set(JvmTarget.JVM_25) freeCompilerArgs.addAll("-Xcontext-parameters") } } diff --git a/Plugins/IntelliJ/build.gradle.kts b/Plugins/IntelliJ/build.gradle.kts index 2bdae2d6a..8081d6958 100644 --- a/Plugins/IntelliJ/build.gradle.kts +++ b/Plugins/IntelliJ/build.gradle.kts @@ -16,7 +16,7 @@ version = providers.gradleProperty("pluginVersion").get() // Set the JVM language level used to build the project. kotlin { - jvmToolchain(21) + jvmToolchain(25) } // Configure project's dependencies diff --git a/Samples/Flix/FlixLibrary/build.gradle b/Samples/Flix/FlixLibrary/build.gradle index 7cc502ad8..dd3f7ffc4 100644 --- a/Samples/Flix/FlixLibrary/build.gradle +++ b/Samples/Flix/FlixLibrary/build.gradle @@ -43,12 +43,12 @@ android { } } compileOptions { - sourceCompatibility JavaVersion.VERSION_21 - targetCompatibility JavaVersion.VERSION_21 + sourceCompatibility JavaVersion.VERSION_25 + targetCompatibility JavaVersion.VERSION_25 } kotlin { compilerOptions { - jvmTarget.set(JvmTarget.JVM_21) + jvmTarget.set(JvmTarget.JVM_25) } } buildFeatures { diff --git a/Samples/Flix/build.gradle b/Samples/Flix/build.gradle index 59c116c5c..df0521e38 100644 --- a/Samples/Flix/build.gradle +++ b/Samples/Flix/build.gradle @@ -52,12 +52,12 @@ android { } } compileOptions { - sourceCompatibility JavaVersion.VERSION_21 - targetCompatibility JavaVersion.VERSION_21 + sourceCompatibility JavaVersion.VERSION_25 + targetCompatibility JavaVersion.VERSION_25 } kotlin { compilerOptions { - jvmTarget.set(JvmTarget.JVM_21) + jvmTarget.set(JvmTarget.JVM_25) freeCompilerArgs.add("-opt-in=kotlin.time.ExperimentalTime") } } diff --git a/Samples/Legacy/build.gradle b/Samples/Legacy/build.gradle index 2fb37b78a..30c8f1d8d 100644 --- a/Samples/Legacy/build.gradle +++ b/Samples/Legacy/build.gradle @@ -21,12 +21,12 @@ android { compileSdk 34 kotlinOptions { - jvmTarget = '21' + jvmTarget = '25' freeCompilerArgs = ["-Xcontext-receivers"] } compileOptions { - sourceCompatibility JavaVersion.VERSION_21 - targetCompatibility JavaVersion.VERSION_21 + sourceCompatibility JavaVersion.VERSION_25 + targetCompatibility JavaVersion.VERSION_25 } defaultConfig { diff --git a/Samples/Paparazzi/PaparazziSampleLibrary/build.gradle b/Samples/Paparazzi/PaparazziSampleLibrary/build.gradle index a0498588e..c80510c0d 100644 --- a/Samples/Paparazzi/PaparazziSampleLibrary/build.gradle +++ b/Samples/Paparazzi/PaparazziSampleLibrary/build.gradle @@ -43,12 +43,12 @@ android { } } compileOptions { - sourceCompatibility JavaVersion.VERSION_21 - targetCompatibility JavaVersion.VERSION_21 + sourceCompatibility JavaVersion.VERSION_25 + targetCompatibility JavaVersion.VERSION_25 } kotlin { compilerOptions { - jvmTarget.set(JvmTarget.JVM_21) + jvmTarget.set(JvmTarget.JVM_25) } } buildFeatures { diff --git a/Samples/Paparazzi/build.gradle b/Samples/Paparazzi/build.gradle index 195b2862e..c194ce7ca 100644 --- a/Samples/Paparazzi/build.gradle +++ b/Samples/Paparazzi/build.gradle @@ -51,12 +51,12 @@ android { } } compileOptions { - sourceCompatibility JavaVersion.VERSION_21 - targetCompatibility JavaVersion.VERSION_21 + sourceCompatibility JavaVersion.VERSION_25 + targetCompatibility JavaVersion.VERSION_25 } kotlin { compilerOptions { - jvmTarget.set(JvmTarget.JVM_21) + jvmTarget.set(JvmTarget.JVM_25) freeCompilerArgs.add("-opt-in=kotlin.time.ExperimentalTime") } } diff --git a/bitrise.yml b/bitrise.yml index 85c1794dd..1185cb065 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -140,7 +140,7 @@ workflows: - git-clone@8: {} - set-java-version@1: inputs: - - set_java_version: '21' + - set_java_version: '25' - install-missing-android-tools@3: inputs: - gradlew_path: "$PROJECT_LOCATION/gradlew" From 1ee43c12577397d268cbe5ed0677d4e29e323cb7 Mon Sep 17 00:00:00 2001 From: Daniel Jette Date: Sun, 16 Aug 2026 15:51:07 -0400 Subject: [PATCH 2/6] Upgrade kotlin to 2.3.21, gradle to 9.5.0 and AGP to 9.3.1 --- Ext/Accessibility/build.gradle | 35 ++++++++++--------- Ext/Compose/build.gradle | 22 +++++------- Ext/Fullscreen/build.gradle | 35 ++++++++++--------- Ext/Ktx/build.gradle | 21 ++++++----- Library/build.gradle | 22 +++++------- .../scenario/ScreenshotScenarioRule.kt | 9 +++-- Samples/Flix/FlixLibrary/build.gradle | 15 +++----- Samples/Flix/build.gradle | 16 +++------ Samples/Gmd/build.gradle | 19 +++++----- Samples/Legacy/build.gradle | 13 ++++--- .../PaparazziSampleLibrary/build.gradle | 15 +++----- Samples/Paparazzi/build.gradle | 16 +++------ build.gradle.kts | 1 + gradle/libs.versions.toml | 12 ++++--- gradle/wrapper/gradle-wrapper.properties | 4 ++- 15 files changed, 121 insertions(+), 134 deletions(-) diff --git a/Ext/Accessibility/build.gradle b/Ext/Accessibility/build.gradle index 2afb35f96..dbecb471e 100644 --- a/Ext/Accessibility/build.gradle +++ b/Ext/Accessibility/build.gradle @@ -1,6 +1,8 @@ +import com.android.build.gradle.tasks.BundleAar +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { id 'com.android.library' - id 'kotlin-android' id 'org.jetbrains.dokka' id 'maven-publish' id 'signing' @@ -22,15 +24,14 @@ ext { version = project.findProperty("testify_version") ?: "0.0.1-SNAPSHOT" group = pom.publishedGroupId -archivesBaseName = pom.artifact android { namespace "dev.testify.accessibility" - lintOptions { + lint { abortOnError true warningsAsErrors true - textOutput 'stdout' + textOutput = file('stdout') textReport true xmlReport false } @@ -41,15 +42,6 @@ android { targetSdkVersion libs.versions.targetSdk.get().toInteger() testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled = true - kotlinOptions { - allWarningsAsErrors = true - } - } - - libraryVariants.configureEach { variant -> - variant.outputs.all { - outputFileName = "${archivesBaseName}-${version}.aar" - } } testOptions { @@ -63,12 +55,15 @@ android { } } - kotlinOptions { - jvmTarget = '17' + kotlin { + compilerOptions { + allWarningsAsErrors.set(true) + jvmTarget.set(JvmTarget.JVM_25) + } } compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 + sourceCompatibility JavaVersion.VERSION_25 + targetCompatibility JavaVersion.VERSION_25 } dependencies { @@ -91,6 +86,12 @@ android { } } +// AGP 9 removed the legacy `libraryVariants` API that was previously used to set +// `outputFileName`. The AAR is renamed by configuring its bundle task directly. +tasks.withType(BundleAar).configureEach { + archiveFileName.set("${pom.artifact}-${version}.aar") +} + afterEvaluate { apply from: "../../publish.build.gradle" } diff --git a/Ext/Compose/build.gradle b/Ext/Compose/build.gradle index 4e3b26799..fead407a5 100644 --- a/Ext/Compose/build.gradle +++ b/Ext/Compose/build.gradle @@ -1,8 +1,8 @@ +import com.android.build.gradle.tasks.BundleAar import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { id 'com.android.library' - id 'kotlin-android' id 'org.jetbrains.dokka' id 'maven-publish' id 'signing' @@ -25,15 +25,14 @@ ext { version = project.findProperty("testify_version") ?: "0.0.1-SNAPSHOT" group = pom.publishedGroupId -archivesBaseName = pom.artifact android { namespace "dev.testify.compose" - lintOptions { + lint { abortOnError true warningsAsErrors true - textOutput 'stdout' + textOutput = file('stdout') textReport true xmlReport false } @@ -44,15 +43,6 @@ android { targetSdkVersion libs.versions.targetSdk.get().toInteger() testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled = true - kotlinOptions { - allWarningsAsErrors = true - } - } - - libraryVariants.all { variant -> - variant.outputs.all { - outputFileName = "${archivesBaseName}-${version}.aar" - } } testOptions { @@ -109,6 +99,12 @@ android { } } +// AGP 9 removed the legacy `libraryVariants` API that was previously used to set +// `outputFileName`. The AAR is renamed by configuring its bundle task directly. +tasks.withType(BundleAar).configureEach { + archiveFileName.set("${pom.artifact}-${version}.aar") +} + afterEvaluate { apply from: "../../publish.build.gradle" } diff --git a/Ext/Fullscreen/build.gradle b/Ext/Fullscreen/build.gradle index a9b51750d..317927ef1 100644 --- a/Ext/Fullscreen/build.gradle +++ b/Ext/Fullscreen/build.gradle @@ -1,6 +1,8 @@ +import com.android.build.gradle.tasks.BundleAar +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { id 'com.android.library' - id 'kotlin-android' id 'org.jetbrains.dokka' id 'maven-publish' id 'signing' @@ -22,15 +24,14 @@ ext { version = project.findProperty("testify_version") ?: "0.0.1-SNAPSHOT" group = pom.publishedGroupId -archivesBaseName = pom.artifact android { namespace "dev.testify.fullscreen" - lintOptions { + lint { abortOnError true warningsAsErrors true - textOutput 'stdout' + textOutput = file('stdout') textReport true xmlReport false } @@ -41,15 +42,6 @@ android { targetSdkVersion libs.versions.targetSdk.get().toInteger() testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled = true - kotlinOptions { - allWarningsAsErrors = true - } - } - - libraryVariants.all { variant -> - variant.outputs.all { - outputFileName = "${archivesBaseName}-${version}.aar" - } } testOptions { @@ -63,12 +55,15 @@ android { } } - kotlinOptions { - jvmTarget = '17' + kotlin { + compilerOptions { + allWarningsAsErrors.set(true) + jvmTarget.set(JvmTarget.JVM_25) + } } compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 + sourceCompatibility JavaVersion.VERSION_25 + targetCompatibility JavaVersion.VERSION_25 } dependencies { @@ -89,6 +84,12 @@ android { } } +// AGP 9 removed the legacy `libraryVariants` API that was previously used to set +// `outputFileName`. The AAR is renamed by configuring its bundle task directly. +tasks.withType(BundleAar).configureEach { + archiveFileName.set("${pom.artifact}-${version}.aar") +} + afterEvaluate { apply from: "../../publish.build.gradle" } diff --git a/Ext/Ktx/build.gradle b/Ext/Ktx/build.gradle index 3df5f7272..c9c509cce 100644 --- a/Ext/Ktx/build.gradle +++ b/Ext/Ktx/build.gradle @@ -1,9 +1,9 @@ +import com.android.build.gradle.tasks.BundleAar import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile plugins { id 'com.android.library' - id 'kotlin-android' id 'org.jetbrains.dokka' id 'maven-publish' id 'signing' @@ -25,15 +25,14 @@ ext { version = project.findProperty("testify_version") ?: "0.0.1-SNAPSHOT" group = pom.publishedGroupId -archivesBaseName = pom.artifact android { namespace "dev.testify.ktx" - lintOptions { + lint { abortOnError true warningsAsErrors true - textOutput 'stdout' + textOutput = file('stdout') textReport true xmlReport false } @@ -45,12 +44,6 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } - libraryVariants.configureEach { variant -> - variant.outputs.all { - outputFileName = "${archivesBaseName}-${version}.aar" - } - } - testOptions { unitTests.returnDefaultValues = true unitTests.all { @@ -80,7 +73,7 @@ android { androidTestImplementation libs.androidx.junit androidTestImplementation libs.androidx.runner } - packagingOptions { + packaging { resources { excludes += [ 'MANIFEST.MF', @@ -108,3 +101,9 @@ tasks.withType(KotlinJvmCompile).configureEach { jvmTarget.set(JvmTarget.JVM_25) } } + +// AGP 9 removed the legacy `libraryVariants` API that was previously used to set +// `outputFileName`. The AAR is renamed by configuring its bundle task directly. +tasks.withType(BundleAar).configureEach { + archiveFileName.set("${pom.artifact}-${version}.aar") +} diff --git a/Library/build.gradle b/Library/build.gradle index 25010076e..af990e19b 100644 --- a/Library/build.gradle +++ b/Library/build.gradle @@ -1,8 +1,8 @@ +import com.android.build.gradle.tasks.BundleAar import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { id 'com.android.library' - id 'kotlin-android' id 'org.jetbrains.dokka' id 'jacoco' id 'maven-publish' @@ -25,14 +25,10 @@ ext { version = project.findProperty("testify_version") ?: "0.0.1-SNAPSHOT" group = pom.publishedGroupId -archivesBaseName = pom.artifact jacoco { toolVersion = "0.8.10" } android { - kotlinOptions { - jvmTarget = '25' - } compileOptions { sourceCompatibility JavaVersion.VERSION_25 targetCompatibility JavaVersion.VERSION_25 @@ -53,12 +49,6 @@ android { } } - libraryVariants.configureEach { variant -> - variant.outputs.all { - outputFileName = "${archivesBaseName}-${version}.aar" - } - } - testOptions { unitTests.returnDefaultValues = true unitTests.all { @@ -98,13 +88,13 @@ android { } lint { abortOnError true - textOutput file('stdout') + textOutput = file('stdout') textReport true htmlReport true warningsAsErrors true xmlReport false } - packagingOptions { + packaging { resources { excludes += [ 'MANIFEST.MF', @@ -124,6 +114,12 @@ android { } } +// AGP 9 removed the legacy `libraryVariants` API that was previously used to set +// `outputFileName`. The AAR is renamed by configuring its bundle task directly. +tasks.withType(BundleAar).configureEach { + archiveFileName.set("${pom.artifact}-${version}.aar") +} + afterEvaluate { apply from: "../publish.build.gradle" } diff --git a/Library/src/main/java/dev/testify/scenario/ScreenshotScenarioRule.kt b/Library/src/main/java/dev/testify/scenario/ScreenshotScenarioRule.kt index 05161ee88..4b54da25f 100644 --- a/Library/src/main/java/dev/testify/scenario/ScreenshotScenarioRule.kt +++ b/Library/src/main/java/dev/testify/scenario/ScreenshotScenarioRule.kt @@ -305,7 +305,7 @@ open class ScreenshotScenarioRule @JvmOverloads constructor( throw NoResourceConfigurationOnScenarioException( cause = "fontScale", value = configuration.fontScale.toString(), - activity = activity?.javaClass?.simpleName.orEmpty() + activity = activity.javaClass.simpleName.orEmpty() ) } @@ -313,7 +313,7 @@ open class ScreenshotScenarioRule @JvmOverloads constructor( throw NoResourceConfigurationOnScenarioException( cause = "locale", value = configuration.locale.toString(), - activity = activity?.javaClass?.simpleName.orEmpty() + activity = activity.javaClass.simpleName.orEmpty() ) } } @@ -505,6 +505,11 @@ open class ScreenshotScenarioRule @JvmOverloads constructor( } ?: throw ScenarioRequiredException() } + // Kotlin 2.3 added the CONTEXTUAL_OVERLOAD_SHADOWED diagnostic, which fires here because the + // no-arg `assertSame()` above takes precedence in overload resolution over this + // context-parameter variant. Suppressed to keep the Java 25 upgrade behaviour-neutral; + // resolving it for real would mean changing this public API. + @Suppress("CONTEXTUAL_OVERLOAD_SHADOWED") @JvmName("assertSameContext") context (scenario: ActivityScenario<*>) fun assertSame() { diff --git a/Samples/Flix/FlixLibrary/build.gradle b/Samples/Flix/FlixLibrary/build.gradle index dd3f7ffc4..209b28f1c 100644 --- a/Samples/Flix/FlixLibrary/build.gradle +++ b/Samples/Flix/FlixLibrary/build.gradle @@ -15,8 +15,7 @@ buildscript { plugins { id 'com.android.library' - id 'org.jetbrains.kotlin.android' - id 'kotlin-kapt' + alias(libs.plugins.google.devtools.ksp) id 'com.google.dagger.hilt.android' id 'dev.testify' alias(libs.plugins.compose.compiler) @@ -57,17 +56,13 @@ android { composeOptions { kotlinCompilerExtensionVersion "${versions.compose.compilerExt}" } - packagingOptions { + packaging { resources { excludes += '/META-INF/{AL2.0,LGPL2.1}' } } } -kapt { - correctErrorTypes true -} - testify { applicationPackageId "dev.testify.samples.flix.library.test" testPackageId "dev.testify.samples.flix.library.test" @@ -75,8 +70,8 @@ testify { } dependencies { - kapt "com.google.dagger:dagger-compiler:2.57.1" - kapt "com.google.dagger:hilt-compiler:2.57.1" + ksp "com.google.dagger:dagger-compiler:2.60.1" + ksp "com.google.dagger:hilt-compiler:2.60.1" def composeBom = platform('androidx.compose:compose-bom:2025.08.01') implementation composeBom @@ -85,7 +80,7 @@ dependencies { implementation "androidx.hilt:hilt-navigation-compose:1.2.0" implementation "androidx.lifecycle:lifecycle-runtime-compose:2.9.3" implementation "androidx.test.espresso.idling:idling-concurrent:3.7.0" - implementation "com.google.dagger:hilt-android:2.57.1" + implementation "com.google.dagger:hilt-android:2.60.1" implementation 'androidx.compose.material3:material3:1.3.2' implementation 'androidx.core:core-ktx:1.17.0' implementation 'io.ktor:ktor-client-android:3.2.3' diff --git a/Samples/Flix/build.gradle b/Samples/Flix/build.gradle index df0521e38..9c049a5d8 100644 --- a/Samples/Flix/build.gradle +++ b/Samples/Flix/build.gradle @@ -15,10 +15,9 @@ buildscript { plugins { id 'com.android.application' - id 'org.jetbrains.kotlin.android' id 'org.jetbrains.kotlin.plugin.serialization' id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' - id 'kotlin-kapt' + alias(libs.plugins.google.devtools.ksp) id 'com.google.dagger.hilt.android' id 'dev.testify' alias(libs.plugins.compose.compiler) @@ -68,22 +67,17 @@ android { composeOptions { kotlinCompilerExtensionVersion "${versions.compose.compilerExt}" } - packagingOptions { + packaging { resources { excludes += '/META-INF/{AL2.0,LGPL2.1}' } } - lintOptions { + lint { disable 'UseTomlInstead' } } -// Allow references to generated code -kapt { - correctErrorTypes true -} - dependencies { implementation project(":FlixLibrary") @@ -106,8 +100,8 @@ dependencies { androidTestImplementation composeBom // Dependency injection - implementation "com.google.dagger:hilt-android:2.57.1" - kapt "com.google.dagger:hilt-compiler:2.57.1" + implementation "com.google.dagger:hilt-android:2.60.1" + ksp "com.google.dagger:hilt-compiler:2.60.1" // Navigation implementation "androidx.navigation:navigation-compose:2.9.3" diff --git a/Samples/Gmd/build.gradle b/Samples/Gmd/build.gradle index 0b65c31f2..bd4f67713 100644 --- a/Samples/Gmd/build.gradle +++ b/Samples/Gmd/build.gradle @@ -1,8 +1,7 @@ -import com.android.build.api.dsl.ManagedVirtualDevice +import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { id 'com.android.application' - id 'kotlin-android' id 'dev.testify' } @@ -10,8 +9,8 @@ android { compileSdk 33 compileOptions { - sourceCompatibility 1.8 - targetCompatibility 1.8 + sourceCompatibility JavaVersion.VERSION_25 + targetCompatibility JavaVersion.VERSION_25 } defaultConfig { @@ -40,8 +39,10 @@ android { viewBinding true } - kotlinOptions { - jvmTarget = "1.8" + kotlin { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_25) + } } lint { disable 'GradleDependency' @@ -50,8 +51,10 @@ android { testOptions { managedDevices { - devices { - tester(ManagedVirtualDevice) { + // AGP 9 replaced the untyped `devices` container with `localDevices`, + // which is already typed as ManagedVirtualDevice. + localDevices { + tester { device = "Pixel 2" apiLevel = 30 systemImageSource = "aosp" diff --git a/Samples/Legacy/build.gradle b/Samples/Legacy/build.gradle index 30c8f1d8d..010406c82 100644 --- a/Samples/Legacy/build.gradle +++ b/Samples/Legacy/build.gradle @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + buildscript { ext { versions = [ @@ -12,7 +14,6 @@ buildscript { plugins { id 'com.android.application' - id 'kotlin-android' id 'dev.testify' alias(libs.plugins.compose.compiler) } @@ -20,9 +21,11 @@ plugins { android { compileSdk 34 - kotlinOptions { - jvmTarget = '25' - freeCompilerArgs = ["-Xcontext-receivers"] + kotlin { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_25) + freeCompilerArgs.add("-Xcontext-parameters") + } } compileOptions { sourceCompatibility JavaVersion.VERSION_25 @@ -58,7 +61,7 @@ android { composeOptions { kotlinCompilerExtensionVersion "${versions.compose.compilerExt}" } - packagingOptions { + packaging { resources { excludes += [ 'META-INF/AL2.0', diff --git a/Samples/Paparazzi/PaparazziSampleLibrary/build.gradle b/Samples/Paparazzi/PaparazziSampleLibrary/build.gradle index c80510c0d..d83bca96c 100644 --- a/Samples/Paparazzi/PaparazziSampleLibrary/build.gradle +++ b/Samples/Paparazzi/PaparazziSampleLibrary/build.gradle @@ -15,8 +15,7 @@ buildscript { plugins { id 'com.android.library' - id 'org.jetbrains.kotlin.android' - id 'kotlin-kapt' + alias(libs.plugins.google.devtools.ksp) id 'com.google.dagger.hilt.android' id 'app.cash.paparazzi' alias(libs.plugins.compose.compiler) @@ -62,7 +61,7 @@ android { composeOptions { kotlinCompilerExtensionVersion "${versions.compose.compilerExt}" } - packagingOptions { + packaging { resources { excludes += '/META-INF/{AL2.0,LGPL2.1}' } @@ -75,13 +74,9 @@ android { } } -kapt { - correctErrorTypes true -} - dependencies { - kapt "com.google.dagger:dagger-compiler:2.57.1" - kapt "com.google.dagger:hilt-compiler:2.57.1" + ksp "com.google.dagger:dagger-compiler:2.60.1" + ksp "com.google.dagger:hilt-compiler:2.60.1" def composeBom = platform('androidx.compose:compose-bom:2025.08.01') implementation composeBom @@ -89,7 +84,7 @@ dependencies { implementation "androidx.hilt:hilt-navigation-compose:1.2.0" implementation "androidx.lifecycle:lifecycle-runtime-compose:2.9.3" implementation "androidx.test.espresso.idling:idling-concurrent:3.7.0" - implementation "com.google.dagger:hilt-android:2.57.1" + implementation "com.google.dagger:hilt-android:2.60.1" implementation 'androidx.compose.material3:material3:1.3.2' implementation 'androidx.core:core-ktx:1.17.0' implementation 'io.ktor:ktor-client-android:3.2.3' diff --git a/Samples/Paparazzi/build.gradle b/Samples/Paparazzi/build.gradle index c194ce7ca..d8084a13c 100644 --- a/Samples/Paparazzi/build.gradle +++ b/Samples/Paparazzi/build.gradle @@ -15,10 +15,9 @@ buildscript { plugins { id 'com.android.application' - id 'org.jetbrains.kotlin.android' id 'org.jetbrains.kotlin.plugin.serialization' id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' - id 'kotlin-kapt' + alias(libs.plugins.google.devtools.ksp) id 'com.google.dagger.hilt.android' id 'app.cash.paparazzi' alias(libs.plugins.compose.compiler) @@ -67,13 +66,13 @@ android { composeOptions { kotlinCompilerExtensionVersion "${versions.compose.compilerExt}" } - packagingOptions { + packaging { resources { excludes += '/META-INF/{AL2.0,LGPL2.1}' } } - lintOptions { + lint { disable 'UseTomlInstead' } @@ -97,11 +96,6 @@ android { } } -// Allow references to generated code -kapt { - correctErrorTypes true -} - dependencies { implementation project(":PaparazziSampleLibrary") @@ -122,8 +116,8 @@ dependencies { debugImplementation 'androidx.compose.ui:ui-tooling' // Dependency injection - implementation "com.google.dagger:hilt-android:2.57.1" - kapt "com.google.dagger:hilt-compiler:2.57.1" + implementation "com.google.dagger:hilt-android:2.60.1" + ksp "com.google.dagger:hilt-compiler:2.60.1" // Navigation implementation "androidx.navigation:navigation-compose:2.9.3" diff --git a/build.gradle.kts b/build.gradle.kts index 2e5ae6bf4..52e554fde 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,6 +3,7 @@ plugins { alias(libs.plugins.android.library) apply false alias(libs.plugins.google.android.libraries.mapsplatform.secrets) apply false alias(libs.plugins.google.dagger.hilt.android) apply false + alias(libs.plugins.google.devtools.ksp) apply false alias(libs.plugins.jetbrains.dokka) apply false alias(libs.plugins.jetbrains.kotlin.android) apply false alias(libs.plugins.jetbrains.kotlin.plugin.serialization) apply false diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 77d5abcbe..3f65e419b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,7 @@ compileSdk = "36" minSdk = "26" targetSdk = "36" activityCompose = "1.10.1" -agp = "8.13.2" +agp = "9.3.1" appcompat = "1.7.1" colormath = "1.4.1" coreKtx = "1.7.0" @@ -12,12 +12,13 @@ dokka = "2.1.0" espressoCore = "3.7.0" gson = "2.13.1" guava = "33.4.8-android" -hilt = "2.57.1" +hilt = "2.60.1" junit = "1.3.0" -kotlin = "2.2.10" -kotlinPluginSerialization = "2.2.10" +kotlin = "2.3.21" +kotlinPluginSerialization = "2.3.21" kotlinxCoroutinesAndroid = "1.10.2" -ktlint = "13.1.0" +ksp = "2.3.11" +ktlint = "14.2.0" lifecycleRuntimeKtx = "2.9.3" mapsplatformSecrets = "2.0.1" material = "1.13.0" @@ -75,6 +76,7 @@ android-library = { id = "com.android.library", version.ref = "agp" } compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } google-android-libraries-mapsplatform-secrets = { id = "com.google.android.libraries.mapsplatform.secrets-gradle-plugin", version.ref = "mapsplatformSecrets" } google-dagger-hilt-android = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } +google-devtools-ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } jetbrains-dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } jetbrains-kotlin-plugin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlinPluginSerialization" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37f853b1c..5bb2ef91e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,8 @@ +#Sun Aug 16 15:39:16 EDT 2026 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +distributionSha256Sum=553c78f50dafcd54d65b9a444649057857469edf836431389695608536d6b746 +distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 6e45235d15333d27ab77a79779e52d795cf70109 Mon Sep 17 00:00:00 2001 From: Daniel Jette Date: Sun, 16 Aug 2026 17:24:54 -0400 Subject: [PATCH 3/6] Update CHANGELOG --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b830ec4f6..3de588070 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## Unreleased + +- Upgrade kotlin to 2.3.21, gradle to 9.5.0 and AGP to 9.3.1 +- Upgrade all project files to use Java 25 + ## 6.0.0 - https://github.com/ndtp/android-testify/pull/269 From 159b6666eb9e6452002b5245efaa1026ff61381f Mon Sep 17 00:00:00 2001 From: Daniel Jette Date: Sun, 16 Aug 2026 20:32:45 -0400 Subject: [PATCH 4/6] Address PR review feedback for the Java 25 / AGP 9 upgrade Restore archive base names: - Gradle 9 removed the `archivesBaseName` property; replace it with `base { archivesName = pom.artifact }` in the five published modules. This drives the androidTest APK name as well as the AAR, so dropping it had renamed the APKs that bitrise.yml pins and turned the Ktx and Library instrumented-test steps red. Move CI off the old JDKs: - flix_sample.yml: java-version 21 -> 25 (was failing with "invalid source release: 25"). - central_release.yml: java-version 17 -> 25, and refresh actions/checkout@v2 -> v4 and actions/setup-java@v1 -> v4, since v1 cannot resolve JDK 25 and v4 requires an explicit distribution. Fix samples that no longer build under AGP 9: - GmdSample: compileSdk 33 -> 36. androidx.databinding:viewbinding:9.3.1 declares minCompileSdk=34, so checkDebugAarMetadata failed outright. - LegacySample: compileSdk -> 36 to satisfy the AAR metadata of the Testify modules it depends on, and drop the contradictory `compileSdkVersion 35` from defaultConfig. targetSdk stays at 35. Fix Plugin unit tests (run by bitrise as Plugin:test): - Bump mockk to 1.14.11. JDK 25 reimplemented java.io over NIO (IoOverNioFileSystem), so mockk 1.13.16 could not mock java.io.File and every AdbTest failed with an NPE out of the real getAbsolutePath(). - Pull the ktlint plugin version from the included build's own catalog instead of hardcoding it, so it cannot drift from the root catalog. Remove the ActivityScenario context-parameter overload of ScreenshotScenarioRule.assertSame(): - Kotlin 2.3 makes it ambiguous with the no-arg assertSame() at any call site where an ActivityScenario is an implicit receiver, such as inside ActivityScenario.test { }, which broke compilation of LegacySample's androidTest sources. The overload was also what set the scenario, so hiding rather than removing it compiles but throws ScenarioRequiredException at runtime. - Update ScenarioMainActivityScreenshotTest to set the scenario explicitly via withScenario(this), matching the pattern used by every other scenario test in the repo. Also drop the machine-local timestamp from gradle-wrapper.properties and document the consumer impact of Java 25 bytecode in the CHANGELOG. --- .github/workflows/central_release.yml | 7 ++++--- .github/workflows/flix_sample.yml | 2 +- CHANGELOG.md | 10 ++++++++++ Ext/Accessibility/build.gradle | 6 ++++++ Ext/Compose/build.gradle | 6 ++++++ Ext/Fullscreen/build.gradle | 6 ++++++ Ext/Ktx/build.gradle | 6 ++++++ Library/build.gradle | 6 ++++++ .../dev/testify/scenario/ScreenshotScenarioRule.kt | 11 ----------- Plugins/Gradle/build.gradle | 2 +- Plugins/Gradle/gradle/libs.versions.toml | 8 +++++++- Samples/Gmd/build.gradle | 5 ++++- Samples/Legacy/build.gradle | 5 +++-- .../scenario/ScenarioMainActivityScreenshotTest.kt | 2 +- gradle/wrapper/gradle-wrapper.properties | 1 - 15 files changed, 61 insertions(+), 22 deletions(-) diff --git a/.github/workflows/central_release.yml b/.github/workflows/central_release.yml index ddca82e4e..9e02ecd9a 100644 --- a/.github/workflows/central_release.yml +++ b/.github/workflows/central_release.yml @@ -7,11 +7,12 @@ jobs: name: Central Repository Deployment runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up Java - uses: actions/setup-java@v1 + uses: actions/setup-java@v4 with: - java-version: 17 + distribution: "temurin" + java-version: 25 - name: Publish Testify Library run: ./gradlew Library:publish env: diff --git a/.github/workflows/flix_sample.yml b/.github/workflows/flix_sample.yml index 5aa71058b..b5554d694 100644 --- a/.github/workflows/flix_sample.yml +++ b/.github/workflows/flix_sample.yml @@ -25,7 +25,7 @@ jobs: uses: actions/setup-java@v4 with: distribution: "temurin" - java-version: 21 + java-version: 25 - name: Build run: | diff --git a/CHANGELOG.md b/CHANGELOG.md index 3de588070..a5e0efe23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,16 @@ - Upgrade kotlin to 2.3.21, gradle to 9.5.0 and AGP to 9.3.1 - Upgrade all project files to use Java 25 + - Java 25 requires you to update your app to use Java 25 + - Requires Android Gradle Plugin 9.x. The published artifacts are Java 25 bytecode (class file + major version 69) and cannot be consumed by AGP 8.x + - Gradle 9.5.0 is required to build; `kotlinOptions`, `lintOptions`, `packagingOptions` and the + legacy `libraryVariants` API have been migrated to their AGP 9 replacements + - **Removed** `ScreenshotScenarioRule.assertSame()` with an `ActivityScenario` context parameter + (JVM name `assertSameContext`). Kotlin 2.3 makes it ambiguous with the no-arg `assertSame()` + at any call site where an `ActivityScenario` is an implicit receiver, such as inside + `ActivityScenario.test { }`, so it could no longer be called. Set the scenario explicitly + instead: `rule.withScenario(scenario).assertSame()` ## 6.0.0 diff --git a/Ext/Accessibility/build.gradle b/Ext/Accessibility/build.gradle index dbecb471e..35809e0a8 100644 --- a/Ext/Accessibility/build.gradle +++ b/Ext/Accessibility/build.gradle @@ -25,6 +25,12 @@ ext { version = project.findProperty("testify_version") ?: "0.0.1-SNAPSHOT" group = pom.publishedGroupId +// Gradle 9 removed the `archivesBaseName` property; `base.archivesName` is the replacement. +// This drives the androidTest APK name (which bitrise.yml pins), not just the AAR. +base { + archivesName = pom.artifact +} + android { namespace "dev.testify.accessibility" diff --git a/Ext/Compose/build.gradle b/Ext/Compose/build.gradle index fead407a5..f2916ce96 100644 --- a/Ext/Compose/build.gradle +++ b/Ext/Compose/build.gradle @@ -26,6 +26,12 @@ ext { version = project.findProperty("testify_version") ?: "0.0.1-SNAPSHOT" group = pom.publishedGroupId +// Gradle 9 removed the `archivesBaseName` property; `base.archivesName` is the replacement. +// This drives the androidTest APK name (which bitrise.yml pins), not just the AAR. +base { + archivesName = pom.artifact +} + android { namespace "dev.testify.compose" diff --git a/Ext/Fullscreen/build.gradle b/Ext/Fullscreen/build.gradle index 317927ef1..09d85f836 100644 --- a/Ext/Fullscreen/build.gradle +++ b/Ext/Fullscreen/build.gradle @@ -25,6 +25,12 @@ ext { version = project.findProperty("testify_version") ?: "0.0.1-SNAPSHOT" group = pom.publishedGroupId +// Gradle 9 removed the `archivesBaseName` property; `base.archivesName` is the replacement. +// This drives the androidTest APK name (which bitrise.yml pins), not just the AAR. +base { + archivesName = pom.artifact +} + android { namespace "dev.testify.fullscreen" diff --git a/Ext/Ktx/build.gradle b/Ext/Ktx/build.gradle index c9c509cce..1a46730bb 100644 --- a/Ext/Ktx/build.gradle +++ b/Ext/Ktx/build.gradle @@ -26,6 +26,12 @@ ext { version = project.findProperty("testify_version") ?: "0.0.1-SNAPSHOT" group = pom.publishedGroupId +// Gradle 9 removed the `archivesBaseName` property; `base.archivesName` is the replacement. +// This drives the androidTest APK name (which bitrise.yml pins), not just the AAR. +base { + archivesName = pom.artifact +} + android { namespace "dev.testify.ktx" diff --git a/Library/build.gradle b/Library/build.gradle index af990e19b..6a04e88e0 100644 --- a/Library/build.gradle +++ b/Library/build.gradle @@ -26,6 +26,12 @@ ext { version = project.findProperty("testify_version") ?: "0.0.1-SNAPSHOT" group = pom.publishedGroupId +// Gradle 9 removed the `archivesBaseName` property; `base.archivesName` is the replacement. +// This drives the androidTest APK name (which bitrise.yml pins), not just the AAR. +base { + archivesName = pom.artifact +} + jacoco { toolVersion = "0.8.10" } android { diff --git a/Library/src/main/java/dev/testify/scenario/ScreenshotScenarioRule.kt b/Library/src/main/java/dev/testify/scenario/ScreenshotScenarioRule.kt index 4b54da25f..b63b7ec1b 100644 --- a/Library/src/main/java/dev/testify/scenario/ScreenshotScenarioRule.kt +++ b/Library/src/main/java/dev/testify/scenario/ScreenshotScenarioRule.kt @@ -505,17 +505,6 @@ open class ScreenshotScenarioRule @JvmOverloads constructor( } ?: throw ScenarioRequiredException() } - // Kotlin 2.3 added the CONTEXTUAL_OVERLOAD_SHADOWED diagnostic, which fires here because the - // no-arg `assertSame()` above takes precedence in overload resolution over this - // context-parameter variant. Suppressed to keep the Java 25 upgrade behaviour-neutral; - // resolving it for real would mean changing this public API. - @Suppress("CONTEXTUAL_OVERLOAD_SHADOWED") - @JvmName("assertSameContext") - context (scenario: ActivityScenario<*>) - fun assertSame() { - assertSame(scenario) - } - private fun assertSame(scenario: ActivityScenario<*>) { this.scenario = scenario diff --git a/Plugins/Gradle/build.gradle b/Plugins/Gradle/build.gradle index 1a4842d77..7d7e7410c 100644 --- a/Plugins/Gradle/build.gradle +++ b/Plugins/Gradle/build.gradle @@ -9,7 +9,7 @@ plugins { id 'jacoco' id 'maven-publish' id 'signing' - id 'org.jlleitschuh.gradle.ktlint' version '13.1.0' + alias(libs.plugins.ktlint) } def gradleProperties = new Properties() diff --git a/Plugins/Gradle/gradle/libs.versions.toml b/Plugins/Gradle/gradle/libs.versions.toml index b1d87ff66..fabc255dc 100644 --- a/Plugins/Gradle/gradle/libs.versions.toml +++ b/Plugins/Gradle/gradle/libs.versions.toml @@ -2,7 +2,8 @@ gradle = "8.13.2" junitJupiter = "5.8.2" kotlin = "2.2.0" -mockk = "1.13.16" +ktlint = "14.2.0" +mockk = "1.14.11" truthVersion = "1.2.0" [libraries] @@ -13,3 +14,8 @@ junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher kotlin-stdlib-jdk8 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlin" } mockk = { module = "io.mockk:mockk", version.ref = "mockk" } truth-v120 = { module = "com.google.truth:truth", version.ref = "truthVersion" } + +[plugins] +# Kept in step with the root catalog's `ktlint` version. This is a separate included build, +# so the two catalogs cannot share a value automatically — bump both together. +ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint" } diff --git a/Samples/Gmd/build.gradle b/Samples/Gmd/build.gradle index bd4f67713..2a4c1c14a 100644 --- a/Samples/Gmd/build.gradle +++ b/Samples/Gmd/build.gradle @@ -6,7 +6,10 @@ plugins { } android { - compileSdk 33 + // androidx.databinding:viewbinding:9.3.1 (pulled in by `viewBinding true`) declares + // minCompileSdk=34, so AGP 9 fails checkDebugAarMetadata below 34. Matched to the rest + // of the repo rather than the bare minimum. + compileSdk 36 compileOptions { sourceCompatibility JavaVersion.VERSION_25 diff --git a/Samples/Legacy/build.gradle b/Samples/Legacy/build.gradle index 010406c82..bce7eed04 100644 --- a/Samples/Legacy/build.gradle +++ b/Samples/Legacy/build.gradle @@ -19,7 +19,9 @@ plugins { } android { - compileSdk 34 + // Must be >= the compileSdk of the Testify modules this sample depends on (36), or AGP 9's + // checkDebugAndroidTestAarMetadata fails. targetSdk is deliberately left at 35. + compileSdk 36 kotlin { compilerOptions { @@ -35,7 +37,6 @@ android { defaultConfig { applicationId "dev.testify.sample" minSdkVersion 26 - compileSdkVersion 35 targetSdkVersion 35 versionCode 1 versionName "1.0" diff --git a/Samples/Legacy/src/androidTest/java/dev/testify/sample/scenario/ScenarioMainActivityScreenshotTest.kt b/Samples/Legacy/src/androidTest/java/dev/testify/sample/scenario/ScenarioMainActivityScreenshotTest.kt index ce04aaf61..b83aad601 100644 --- a/Samples/Legacy/src/androidTest/java/dev/testify/sample/scenario/ScenarioMainActivityScreenshotTest.kt +++ b/Samples/Legacy/src/androidTest/java/dev/testify/sample/scenario/ScenarioMainActivityScreenshotTest.kt @@ -43,7 +43,7 @@ class ScenarioMainActivityScreenshotTest { @Test fun default() { launchActivity().test { - rule.assertSame() + rule.withScenario(this).assertSame() } } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5bb2ef91e..2b7a686b4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,4 +1,3 @@ -#Sun Aug 16 15:39:16 EDT 2026 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionSha256Sum=553c78f50dafcd54d65b9a444649057857469edf836431389695608536d6b746 From c355dadecb66c6f72556243402a09407ad09bb1e Mon Sep 17 00:00:00 2001 From: Daniel Jette Date: Sun, 16 Aug 2026 20:39:42 -0400 Subject: [PATCH 5/6] Bump mockk to 1.14.11 so unit tests run on Java 25 mockk 1.14.5 bundles a Byte Buddy that officially supports up to Java 24 and rejects class file major version 69: java.lang.IllegalArgumentException: Java 25 (69) is not supported by the current version of Byte Buddy which officially supports Java 24 (68) Every mockk-based unit test in :Library and :Ktx failed with MockKException as a result, which is what turned the Ktx bitrise workflow red at its android-unit-test step. This is the same version already used by the :Plugin included build, where an older mockk additionally could not mock java.io.File on JDK 25. --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3f65e419b..9dd907708 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -23,8 +23,8 @@ lifecycleRuntimeKtx = "2.9.3" mapsplatformSecrets = "2.0.1" material = "1.13.0" materialVersion = "1.9.0" -mockk = "1.14.5" -mockkAndroid = "1.14.5" +mockk = "1.14.11" +mockkAndroid = "1.14.11" monitor = "1.8.0" multidex = "2.0.1" paparazzi = "2.0.0-alpha05" From 7764a262cb4b6beefb4399f2740d303b78ec3f17 Mon Sep 17 00:00:00 2001 From: Daniel Jette Date: Mon, 17 Aug 2026 14:47:14 -0400 Subject: [PATCH 6/6] Update CHANGELOG --- CHANGELOG.md | 5 +++++ Ext/Accessibility/build.gradle | 4 ---- Ext/Compose/build.gradle | 4 ---- Ext/Fullscreen/build.gradle | 4 ---- Ext/Ktx/build.gradle | 4 ---- Library/build.gradle | 4 ---- Samples/Gmd/build.gradle | 3 --- 7 files changed, 5 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5e0efe23..9dcec0129 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ ## Unreleased +> [!CAUTION] +> **Critical Update Needed:** Check your configuration files. +> This release uses Java 25 which requires you to update your app to use Java 25. +> Java 25 also requires Android Gradle Plugin 9.x — the published artifacts are Java 25 bytecode and cannot be consumed by AGP 8.x + - Upgrade kotlin to 2.3.21, gradle to 9.5.0 and AGP to 9.3.1 - Upgrade all project files to use Java 25 - Java 25 requires you to update your app to use Java 25 diff --git a/Ext/Accessibility/build.gradle b/Ext/Accessibility/build.gradle index 35809e0a8..c64e3c9c8 100644 --- a/Ext/Accessibility/build.gradle +++ b/Ext/Accessibility/build.gradle @@ -25,8 +25,6 @@ ext { version = project.findProperty("testify_version") ?: "0.0.1-SNAPSHOT" group = pom.publishedGroupId -// Gradle 9 removed the `archivesBaseName` property; `base.archivesName` is the replacement. -// This drives the androidTest APK name (which bitrise.yml pins), not just the AAR. base { archivesName = pom.artifact } @@ -92,8 +90,6 @@ android { } } -// AGP 9 removed the legacy `libraryVariants` API that was previously used to set -// `outputFileName`. The AAR is renamed by configuring its bundle task directly. tasks.withType(BundleAar).configureEach { archiveFileName.set("${pom.artifact}-${version}.aar") } diff --git a/Ext/Compose/build.gradle b/Ext/Compose/build.gradle index f2916ce96..63f8082a6 100644 --- a/Ext/Compose/build.gradle +++ b/Ext/Compose/build.gradle @@ -26,8 +26,6 @@ ext { version = project.findProperty("testify_version") ?: "0.0.1-SNAPSHOT" group = pom.publishedGroupId -// Gradle 9 removed the `archivesBaseName` property; `base.archivesName` is the replacement. -// This drives the androidTest APK name (which bitrise.yml pins), not just the AAR. base { archivesName = pom.artifact } @@ -105,8 +103,6 @@ android { } } -// AGP 9 removed the legacy `libraryVariants` API that was previously used to set -// `outputFileName`. The AAR is renamed by configuring its bundle task directly. tasks.withType(BundleAar).configureEach { archiveFileName.set("${pom.artifact}-${version}.aar") } diff --git a/Ext/Fullscreen/build.gradle b/Ext/Fullscreen/build.gradle index 09d85f836..483730924 100644 --- a/Ext/Fullscreen/build.gradle +++ b/Ext/Fullscreen/build.gradle @@ -25,8 +25,6 @@ ext { version = project.findProperty("testify_version") ?: "0.0.1-SNAPSHOT" group = pom.publishedGroupId -// Gradle 9 removed the `archivesBaseName` property; `base.archivesName` is the replacement. -// This drives the androidTest APK name (which bitrise.yml pins), not just the AAR. base { archivesName = pom.artifact } @@ -90,8 +88,6 @@ android { } } -// AGP 9 removed the legacy `libraryVariants` API that was previously used to set -// `outputFileName`. The AAR is renamed by configuring its bundle task directly. tasks.withType(BundleAar).configureEach { archiveFileName.set("${pom.artifact}-${version}.aar") } diff --git a/Ext/Ktx/build.gradle b/Ext/Ktx/build.gradle index 1a46730bb..9612d3c45 100644 --- a/Ext/Ktx/build.gradle +++ b/Ext/Ktx/build.gradle @@ -26,8 +26,6 @@ ext { version = project.findProperty("testify_version") ?: "0.0.1-SNAPSHOT" group = pom.publishedGroupId -// Gradle 9 removed the `archivesBaseName` property; `base.archivesName` is the replacement. -// This drives the androidTest APK name (which bitrise.yml pins), not just the AAR. base { archivesName = pom.artifact } @@ -108,8 +106,6 @@ tasks.withType(KotlinJvmCompile).configureEach { } } -// AGP 9 removed the legacy `libraryVariants` API that was previously used to set -// `outputFileName`. The AAR is renamed by configuring its bundle task directly. tasks.withType(BundleAar).configureEach { archiveFileName.set("${pom.artifact}-${version}.aar") } diff --git a/Library/build.gradle b/Library/build.gradle index 6a04e88e0..4ba8d9899 100644 --- a/Library/build.gradle +++ b/Library/build.gradle @@ -26,8 +26,6 @@ ext { version = project.findProperty("testify_version") ?: "0.0.1-SNAPSHOT" group = pom.publishedGroupId -// Gradle 9 removed the `archivesBaseName` property; `base.archivesName` is the replacement. -// This drives the androidTest APK name (which bitrise.yml pins), not just the AAR. base { archivesName = pom.artifact } @@ -120,8 +118,6 @@ android { } } -// AGP 9 removed the legacy `libraryVariants` API that was previously used to set -// `outputFileName`. The AAR is renamed by configuring its bundle task directly. tasks.withType(BundleAar).configureEach { archiveFileName.set("${pom.artifact}-${version}.aar") } diff --git a/Samples/Gmd/build.gradle b/Samples/Gmd/build.gradle index 2a4c1c14a..66e2aac8a 100644 --- a/Samples/Gmd/build.gradle +++ b/Samples/Gmd/build.gradle @@ -6,9 +6,6 @@ plugins { } android { - // androidx.databinding:viewbinding:9.3.1 (pulled in by `viewBinding true`) declares - // minCompileSdk=34, so AGP 9 fails checkDebugAarMetadata below 34. Matched to the rest - // of the repo rather than the bare minimum. compileSdk 36 compileOptions {