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 b830ec4f6..9dcec0129 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,23 @@ +## 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 + - 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 - https://github.com/ndtp/android-testify/pull/269 diff --git a/Ext/Accessibility/build.gradle b/Ext/Accessibility/build.gradle index 2afb35f96..c64e3c9c8 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,18 @@ ext { version = project.findProperty("testify_version") ?: "0.0.1-SNAPSHOT" group = pom.publishedGroupId -archivesBaseName = pom.artifact + +base { + archivesName = pom.artifact +} android { namespace "dev.testify.accessibility" - lintOptions { + lint { abortOnError true warningsAsErrors true - textOutput 'stdout' + textOutput = file('stdout') textReport true xmlReport false } @@ -41,15 +46,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 +59,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 +90,10 @@ android { } } +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 1dbe2394e..63f8082a6 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,18 @@ ext { version = project.findProperty("testify_version") ?: "0.0.1-SNAPSHOT" group = pom.publishedGroupId -archivesBaseName = pom.artifact + +base { + archivesName = pom.artifact +} android { namespace "dev.testify.compose" - lintOptions { + lint { abortOnError true warningsAsErrors true - textOutput 'stdout' + textOutput = file('stdout') textReport true xmlReport false } @@ -44,15 +47,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 { @@ -74,13 +68,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 { @@ -109,6 +103,10 @@ android { } } +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..483730924 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,18 @@ ext { version = project.findProperty("testify_version") ?: "0.0.1-SNAPSHOT" group = pom.publishedGroupId -archivesBaseName = pom.artifact + +base { + archivesName = pom.artifact +} android { namespace "dev.testify.fullscreen" - lintOptions { + lint { abortOnError true warningsAsErrors true - textOutput 'stdout' + textOutput = file('stdout') textReport true xmlReport false } @@ -41,15 +46,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 +59,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 +88,10 @@ android { } } +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 a2130af36..9612d3c45 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,18 @@ ext { version = project.findProperty("testify_version") ?: "0.0.1-SNAPSHOT" group = pom.publishedGroupId -archivesBaseName = pom.artifact + +base { + archivesName = pom.artifact +} android { namespace "dev.testify.ktx" - lintOptions { + lint { abortOnError true warningsAsErrors true - textOutput 'stdout' + textOutput = file('stdout') textReport true xmlReport false } @@ -45,12 +48,6 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } - libraryVariants.configureEach { variant -> - variant.outputs.all { - outputFileName = "${archivesBaseName}-${version}.aar" - } - } - testOptions { unitTests.returnDefaultValues = true unitTests.all { @@ -63,8 +60,8 @@ android { } compileOptions { - sourceCompatibility JavaVersion.VERSION_21 - targetCompatibility JavaVersion.VERSION_21 + sourceCompatibility JavaVersion.VERSION_25 + targetCompatibility JavaVersion.VERSION_25 } dependencies { @@ -80,7 +77,7 @@ android { androidTestImplementation libs.androidx.junit androidTestImplementation libs.androidx.runner } - packagingOptions { + packaging { resources { excludes += [ 'MANIFEST.MF', @@ -105,6 +102,10 @@ afterEvaluate { tasks.withType(KotlinJvmCompile).configureEach { compilerOptions { allWarningsAsErrors.set(true) - jvmTarget.set(JvmTarget.JVM_21) + jvmTarget.set(JvmTarget.JVM_25) } } + +tasks.withType(BundleAar).configureEach { + archiveFileName.set("${pom.artifact}-${version}.aar") +} diff --git a/Library/build.gradle b/Library/build.gradle index e6be21b23..4ba8d9899 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,17 +25,17 @@ ext { version = project.findProperty("testify_version") ?: "0.0.1-SNAPSHOT" group = pom.publishedGroupId -archivesBaseName = pom.artifact + +base { + archivesName = pom.artifact +} jacoco { toolVersion = "0.8.10" } android { - kotlinOptions { - jvmTarget = '21' - } compileOptions { - sourceCompatibility JavaVersion.VERSION_21 - targetCompatibility JavaVersion.VERSION_21 + sourceCompatibility JavaVersion.VERSION_25 + targetCompatibility JavaVersion.VERSION_25 } defaultConfig { @@ -47,18 +47,12 @@ android { kotlin { compilerOptions { allWarningsAsErrors.set(true) - jvmTarget.set(JvmTarget.JVM_21) + jvmTarget.set(JvmTarget.JVM_25) freeCompilerArgs.addAll("-Xcontext-parameters") } } } - libraryVariants.configureEach { variant -> - variant.outputs.all { - outputFileName = "${archivesBaseName}-${version}.aar" - } - } - testOptions { unitTests.returnDefaultValues = true unitTests.all { @@ -98,13 +92,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 +118,10 @@ android { } } +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..b63b7ec1b 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,12 +505,6 @@ open class ScreenshotScenarioRule @JvmOverloads constructor( } ?: throw ScenarioRequiredException() } - @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/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..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) @@ -43,12 +42,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 { @@ -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 59c116c5c..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) @@ -52,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") } } @@ -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..66e2aac8a 100644 --- a/Samples/Gmd/build.gradle +++ b/Samples/Gmd/build.gradle @@ -1,17 +1,16 @@ -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' } android { - compileSdk 33 + compileSdk 36 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 2fb37b78a..bce7eed04 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,27 +14,29 @@ buildscript { plugins { id 'com.android.application' - id 'kotlin-android' id 'dev.testify' alias(libs.plugins.compose.compiler) } 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 - kotlinOptions { - jvmTarget = '21' - freeCompilerArgs = ["-Xcontext-receivers"] + kotlin { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_25) + freeCompilerArgs.add("-Xcontext-parameters") + } } compileOptions { - sourceCompatibility JavaVersion.VERSION_21 - targetCompatibility JavaVersion.VERSION_21 + sourceCompatibility JavaVersion.VERSION_25 + targetCompatibility JavaVersion.VERSION_25 } defaultConfig { applicationId "dev.testify.sample" minSdkVersion 26 - compileSdkVersion 35 targetSdkVersion 35 versionCode 1 versionName "1.0" @@ -58,7 +62,7 @@ android { composeOptions { kotlinCompilerExtensionVersion "${versions.compose.compilerExt}" } - packagingOptions { + packaging { resources { excludes += [ 'META-INF/AL2.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/Samples/Paparazzi/PaparazziSampleLibrary/build.gradle b/Samples/Paparazzi/PaparazziSampleLibrary/build.gradle index a0498588e..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) @@ -43,12 +42,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 { @@ -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 195b2862e..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) @@ -51,12 +50,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") } } @@ -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/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" 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..9dd907708 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,18 +12,19 @@ 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" 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" @@ -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..2b7a686b4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ 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