From d46b9dc291c0d0adb8f552247ad68d300a841672 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Sun, 31 Aug 2025 11:29:09 +0200 Subject: [PATCH 01/33] =?UTF-8?q?=F0=9F=9A=A7=20AGP=209?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build-logic/convention/build.gradle.kts | 2 +- .../AndroidApplicationConventionPlugin.kt | 4 ++-- ...droidApplicationFirebaseConventionPlugin.kt | 3 ++- .../kotlin/AndroidLibraryConventionPlugin.kt | 2 -- .../main/kotlin/AndroidTestConventionPlugin.kt | 1 - .../apps/nowinandroid/AndroidCompose.kt | 6 ++---- .../samples/apps/nowinandroid/Badging.kt | 4 ++-- .../apps/nowinandroid/GradleManagedDevices.kt | 2 +- .../samples/apps/nowinandroid/KotlinAndroid.kt | 6 ++---- .../samples/apps/nowinandroid/NiaFlavor.kt | 18 ++++++++---------- gradle/libs.versions.toml | 6 +++--- 11 files changed, 23 insertions(+), 31 deletions(-) diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 166b54907..148a1eab6 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -37,7 +37,7 @@ kotlin { } dependencies { - compileOnly(libs.android.gradleApiPlugin) + compileOnly(libs.android.gradlePlugin) compileOnly(libs.android.tools.common) compileOnly(libs.compose.gradlePlugin) compileOnly(libs.firebase.crashlytics.gradlePlugin) diff --git a/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt index f45d664b7..e952a8f5c 100644 --- a/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt @@ -15,6 +15,7 @@ */ import com.android.build.api.dsl.ApplicationExtension +import com.android.build.api.dsl.CommonExtension import com.android.build.api.variant.ApplicationAndroidComponentsExtension import com.google.samples.apps.nowinandroid.configureBadgingTasks import com.google.samples.apps.nowinandroid.configureGradleManagedDevices @@ -30,7 +31,6 @@ class AndroidApplicationConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { apply(plugin = "com.android.application") - apply(plugin = "org.jetbrains.kotlin.android") apply(plugin = "nowinandroid.android.lint") apply(plugin = "com.dropbox.dependency-guard") @@ -43,7 +43,7 @@ class AndroidApplicationConventionPlugin : Plugin { } extensions.configure { configurePrintApksTask(this) - configureBadgingTasks(extensions.getByType(), this) + configureBadgingTasks(extensions.getByType(), this) } } } diff --git a/build-logic/convention/src/main/kotlin/AndroidApplicationFirebaseConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidApplicationFirebaseConventionPlugin.kt index be3ec0365..c6346f569 100644 --- a/build-logic/convention/src/main/kotlin/AndroidApplicationFirebaseConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidApplicationFirebaseConventionPlugin.kt @@ -28,7 +28,8 @@ class AndroidApplicationFirebaseConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { apply(plugin = "com.google.gms.google-services") - apply(plugin = "com.google.firebase.firebase-perf") + // https://github.com/firebase/firebase-android-sdk/issues/7293 + // apply(plugin = "com.google.firebase.firebase-perf") apply(plugin = "com.google.firebase.crashlytics") dependencies { diff --git a/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt index 0f6fde884..37de193df 100644 --- a/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt @@ -32,12 +32,10 @@ class AndroidLibraryConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { apply(plugin = "com.android.library") - apply(plugin = "org.jetbrains.kotlin.android") apply(plugin = "nowinandroid.android.lint") extensions.configure { configureKotlinAndroid(this) - testOptions.targetSdk = 35 lint.targetSdk = 35 defaultConfig.testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testOptions.animationsDisabled = true diff --git a/build-logic/convention/src/main/kotlin/AndroidTestConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidTestConventionPlugin.kt index 49c2eecec..ddfd03e24 100644 --- a/build-logic/convention/src/main/kotlin/AndroidTestConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidTestConventionPlugin.kt @@ -26,7 +26,6 @@ class AndroidTestConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { apply(plugin = "com.android.test") - apply(plugin = "org.jetbrains.kotlin.android") extensions.configure { configureKotlinAndroid(this) diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt index 3d050d86b..1daa63d2e 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt @@ -28,12 +28,10 @@ import org.jetbrains.kotlin.compose.compiler.gradle.ComposeCompilerGradlePluginE * Configure Compose-specific options */ internal fun Project.configureAndroidCompose( - commonExtension: CommonExtension<*, *, *, *, *, *>, + commonExtension: CommonExtension, ) { commonExtension.apply { - buildFeatures { - compose = true - } + buildFeatures.compose = true dependencies { val bom = libs.findLibrary("androidx-compose-bom").get() diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/Badging.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/Badging.kt index 229388001..ea6f83a83 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/Badging.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/Badging.kt @@ -18,7 +18,7 @@ package com.google.samples.apps.nowinandroid import com.android.SdkConstants import com.android.build.api.artifact.SingleArtifact -import com.android.build.api.dsl.ApplicationExtension +import com.android.build.api.dsl.CommonExtension import com.android.build.api.variant.ApplicationAndroidComponentsExtension import com.google.common.truth.Truth.assertWithMessage import org.gradle.api.DefaultTask @@ -110,7 +110,7 @@ private fun String.capitalized() = replaceFirstChar { } fun Project.configureBadgingTasks( - baseExtension: ApplicationExtension, + baseExtension: CommonExtension, componentsExtension: ApplicationAndroidComponentsExtension, ) { // Registers a callback to be called, when a new variant is configured diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/GradleManagedDevices.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/GradleManagedDevices.kt index f67e9093d..9f5cb6637 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/GradleManagedDevices.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/GradleManagedDevices.kt @@ -25,7 +25,7 @@ import org.gradle.kotlin.dsl.invoke * Configure project for Gradle managed devices */ internal fun configureGradleManagedDevices( - commonExtension: CommonExtension<*, *, *, *, *, *>, + commonExtension: CommonExtension, ) { val pixel4 = DeviceConfig("Pixel 4", 30, "aosp-atd") val pixel6 = DeviceConfig("Pixel 6", 31, "aosp") diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt index 2ac96e556..5c0b2a4b1 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt @@ -32,14 +32,12 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension * Configure base Kotlin with Android options */ internal fun Project.configureKotlinAndroid( - commonExtension: CommonExtension<*, *, *, *, *, *>, + commonExtension: CommonExtension, ) { commonExtension.apply { compileSdk = 35 - defaultConfig { - minSdk = 23 - } + defaultConfig.minSdk = 23 compileOptions { // Up to Java 11 APIs are available through desugaring diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/NiaFlavor.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/NiaFlavor.kt index f57e634cc..9778eb641 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/NiaFlavor.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/NiaFlavor.kt @@ -20,7 +20,7 @@ enum class NiaFlavor(val dimension: FlavorDimension, val applicationIdSuffix: St } fun configureFlavors( - commonExtension: CommonExtension<*, *, *, *, *, *>, + commonExtension: CommonExtension, flavorConfigurationBlock: ProductFlavor.(flavor: NiaFlavor) -> Unit = {}, ) { commonExtension.apply { @@ -28,15 +28,13 @@ fun configureFlavors( flavorDimensions += flavorDimension.name } - productFlavors { - NiaFlavor.values().forEach { niaFlavor -> - register(niaFlavor.name) { - dimension = niaFlavor.dimension.name - flavorConfigurationBlock(this, niaFlavor) - if (this@apply is ApplicationExtension && this is ApplicationProductFlavor) { - if (niaFlavor.applicationIdSuffix != null) { - applicationIdSuffix = niaFlavor.applicationIdSuffix - } + NiaFlavor.values().forEach { niaFlavor -> + productFlavors.register(niaFlavor.name) { + dimension = niaFlavor.dimension.name + flavorConfigurationBlock(this, niaFlavor) + if (this@apply is ApplicationExtension && this is ApplicationProductFlavor) { + if (niaFlavor.applicationIdSuffix != null) { + applicationIdSuffix = niaFlavor.applicationIdSuffix } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bcd784e21..472e15425 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,8 +2,8 @@ accompanist = "0.37.0" androidDesugarJdkLibs = "2.1.4" # AGP and tools should be updated together -androidGradlePlugin = "8.13.0" -androidTools = "31.13.0" +androidGradlePlugin = "9.0.0-alpha05" +androidTools = "32.0.0-alpha05" androidxActivity = "1.9.3" androidxAppCompat = "1.7.0" androidxBrowser = "1.8.0" @@ -150,7 +150,7 @@ truth = { group = "com.google.truth", name = "truth", version.ref = "truth" } turbine = { group = "app.cash.turbine", name = "turbine", version.ref = "turbine" } # Dependencies of the included build-logic -android-gradleApiPlugin = { group = "com.android.tools.build", name = "gradle-api", version.ref = "androidGradlePlugin" } +android-gradlePlugin = { group = "com.android.tools.build", name = "gradle-api", version.ref = "androidGradlePlugin" } android-tools-common = { group = "com.android.tools", name = "common", version.ref = "androidTools" } compose-gradlePlugin = { module = "org.jetbrains.kotlin:compose-compiler-gradle-plugin", version.ref = "kotlin" } firebase-crashlytics-gradlePlugin = { group = "com.google.firebase", name = "firebase-crashlytics-gradle", version.ref = "firebaseCrashlyticsPlugin" } From 9908869a36f35b1857a3303d7f0e948121d1455f Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Sun, 14 Sep 2025 14:06:46 +0200 Subject: [PATCH 02/33] android.newDsl=false --- gradle.properties | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gradle.properties b/gradle.properties index 2e9d9fc30..b94170508 100644 --- a/gradle.properties +++ b/gradle.properties @@ -63,3 +63,5 @@ roborazzi.test.verify=true # Prevent uninstall app after instrumented tests # https://issuetracker.google.com/issues/295039976 android.injected.androidTest.leaveApksInstalledAfterRun=true + +android.newDsl=false From a0ad9253c96145ebecb30146220ae3c6c41ec1b8 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Sun, 14 Sep 2025 14:14:35 +0200 Subject: [PATCH 03/33] `devices` is deprecated in `managedDevices` --- .../google/samples/apps/nowinandroid/GradleManagedDevices.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/GradleManagedDevices.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/GradleManagedDevices.kt index 9f5cb6637..eaab1175f 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/GradleManagedDevices.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/GradleManagedDevices.kt @@ -36,7 +36,7 @@ internal fun configureGradleManagedDevices( commonExtension.testOptions { managedDevices { - devices { + allDevices { allDevices.forEach { deviceConfig -> maybeCreate(deviceConfig.taskName, ManagedVirtualDevice::class.java).apply { device = deviceConfig.device @@ -48,7 +48,7 @@ internal fun configureGradleManagedDevices( groups { maybeCreate("ci").apply { ciDevices.forEach { deviceConfig -> - targetDevices.add(devices[deviceConfig.taskName]) + targetDevices.add(localDevices[deviceConfig.taskName]) } } } From fd939d5a48898f263c9e737fcd8428395932d8bd Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Sun, 14 Sep 2025 14:27:12 +0200 Subject: [PATCH 04/33] Move internal modifier to the object to work around build errors `error: cannot find symbol` on: - `DataStoreModule.INSTANCE.providesUserPreferencesDataStore$datastore_demoDebug` - `SyncModule.Companion.provideFirebaseMessaging$work_prodDebug()` --- .../apps/nowinandroid/core/datastore/di/DataStoreModule.kt | 4 +++- .../google/samples/apps/nowinandroid/sync/di/SyncModule.kt | 2 ++ .../google/samples/apps/nowinandroid/sync/di/SyncModule.kt | 6 ++++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/core/datastore/src/main/kotlin/com/google/samples/apps/nowinandroid/core/datastore/di/DataStoreModule.kt b/core/datastore/src/main/kotlin/com/google/samples/apps/nowinandroid/core/datastore/di/DataStoreModule.kt index 8e0d7d4d8..6c4486880 100644 --- a/core/datastore/src/main/kotlin/com/google/samples/apps/nowinandroid/core/datastore/di/DataStoreModule.kt +++ b/core/datastore/src/main/kotlin/com/google/samples/apps/nowinandroid/core/datastore/di/DataStoreModule.kt @@ -33,15 +33,17 @@ import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope +import org.jetbrains.annotations.VisibleForTesting import javax.inject.Singleton +@VisibleForTesting @Module @InstallIn(SingletonComponent::class) object DataStoreModule { @Provides @Singleton - internal fun providesUserPreferencesDataStore( + fun providesUserPreferencesDataStore( @ApplicationContext context: Context, @Dispatcher(IO) ioDispatcher: CoroutineDispatcher, @ApplicationScope scope: CoroutineScope, diff --git a/sync/work/src/demo/kotlin/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt b/sync/work/src/demo/kotlin/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt index 91ef476f6..054cd913d 100644 --- a/sync/work/src/demo/kotlin/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt +++ b/sync/work/src/demo/kotlin/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt @@ -24,7 +24,9 @@ import dagger.Binds import dagger.Module import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent +import org.jetbrains.annotations.VisibleForTesting +@VisibleForTesting @Module @InstallIn(SingletonComponent::class) abstract class SyncModule { diff --git a/sync/work/src/prod/kotlin/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt b/sync/work/src/prod/kotlin/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt index ceeb39548..e59147813 100644 --- a/sync/work/src/prod/kotlin/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt +++ b/sync/work/src/prod/kotlin/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt @@ -28,8 +28,10 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent +import org.jetbrains.annotations.VisibleForTesting import javax.inject.Singleton +@VisibleForTesting @Module @InstallIn(SingletonComponent::class) abstract class SyncModule { @@ -43,9 +45,9 @@ abstract class SyncModule { syncSubscriber: FirebaseSyncSubscriber, ): SyncSubscriber - companion object { + internal companion object { @Provides @Singleton - internal fun provideFirebaseMessaging(): FirebaseMessaging = Firebase.messaging + fun provideFirebaseMessaging(): FirebaseMessaging = Firebase.messaging } } From 80bee3db34323bc4fbac9dfb5fc5f4ebff27d588 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Sun, 21 Sep 2025 11:12:07 +0200 Subject: [PATCH 05/33] Add explicit junit dependency on Android library modules They must have been removed as they are no longer resolved by default. --- .../convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt | 1 + gradle/libs.versions.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt index 37de193df..17c4379e7 100644 --- a/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt @@ -54,6 +54,7 @@ class AndroidLibraryConventionPlugin : Plugin { dependencies { "androidTestImplementation"(libs.findLibrary("kotlin.test").get()) "testImplementation"(libs.findLibrary("kotlin.test").get()) + "testImplementation"(libs.findLibrary("junit").get()) "implementation"(libs.findLibrary("androidx.tracing.ktx").get()) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 472e15425..f8a511182 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -124,6 +124,7 @@ hilt-core = { group = "com.google.dagger", name = "hilt-core", version.ref = "hi hilt-ext-compiler = { group = "androidx.hilt", name = "hilt-compiler", version.ref = "hiltExt" } hilt-ext-work = { group = "androidx.hilt", name = "hilt-work", version.ref = "hiltExt" } javax-inject = { module = "javax.inject:javax.inject", version = "1" } +junit = { module = "junit:junit", version.ref = "junit4" } kotlin-stdlib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib-jdk8", version.ref = "kotlin" } kotlin-test = { group = "org.jetbrains.kotlin", name = "kotlin-test", version.ref = "kotlin" } kotlinx-coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "kotlinxCoroutines" } From ee84562c3704939613c3d101e6d85b9acadf03bb Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Sun, 12 Oct 2025 11:23:11 +0200 Subject: [PATCH 06/33] 9.0.0-alpha10 Updated Android Gradle Plugin and Tools versions. --- 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 f8a511182..dfd721946 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,8 +2,8 @@ accompanist = "0.37.0" androidDesugarJdkLibs = "2.1.4" # AGP and tools should be updated together -androidGradlePlugin = "9.0.0-alpha05" -androidTools = "32.0.0-alpha05" +androidGradlePlugin = "9.0.0-alpha10" +androidTools = "32.0.0-alpha10" androidxActivity = "1.9.3" androidxAppCompat = "1.7.0" androidxBrowser = "1.8.0" From dbce15ce266e30d70fbaf28c63916664fc446115 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Tue, 28 Oct 2025 20:19:01 +0100 Subject: [PATCH 07/33] 9.0.0-alpha12 --- 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 dfd721946..e7956e7cb 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,8 +2,8 @@ accompanist = "0.37.0" androidDesugarJdkLibs = "2.1.4" # AGP and tools should be updated together -androidGradlePlugin = "9.0.0-alpha10" -androidTools = "32.0.0-alpha10" +androidGradlePlugin = "9.0.0-alpha12" +androidTools = "32.0.0-alpha12" androidxActivity = "1.9.3" androidxAppCompat = "1.7.0" androidxBrowser = "1.8.0" From f1043ef7ea6e0f58418bd696d6c445e3264cb8e3 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Tue, 28 Oct 2025 20:24:03 +0100 Subject: [PATCH 08/33] KSP 2.3.0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e7956e7cb..12a1c0432 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -46,7 +46,7 @@ kotlin = "2.2.20" kotlinxCoroutines = "1.10.1" kotlinxDatetime = "0.6.1" kotlinxSerializationJson = "1.8.0" -ksp = "2.2.20-2.0.4" +ksp = "2.3.0" okhttp = "4.12.0" protobuf = "4.29.2" protobufPlugin = "0.9.4" From 61d7a3b9eedbd85182267153d5a8422452a504c2 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Fri, 31 Oct 2025 19:24:48 +0100 Subject: [PATCH 09/33] 9.0.0-alpha13 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 12a1c0432..69383eeb0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ accompanist = "0.37.0" androidDesugarJdkLibs = "2.1.4" # AGP and tools should be updated together -androidGradlePlugin = "9.0.0-alpha12" +androidGradlePlugin = "9.0.0-alpha13" androidTools = "32.0.0-alpha12" androidxActivity = "1.9.3" androidxAppCompat = "1.7.0" From fb4a5ca97095f4bbe0ace6847b8efed03d9d464f Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Fri, 31 Oct 2025 19:27:45 +0100 Subject: [PATCH 10/33] KSP 2.3.1-SNAPSHOT --- build-logic/settings.gradle.kts | 1 + gradle/libs.versions.toml | 2 +- settings.gradle.kts | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts index ff96cc84a..14a4912b0 100644 --- a/build-logic/settings.gradle.kts +++ b/build-logic/settings.gradle.kts @@ -31,6 +31,7 @@ dependencyResolutionManagement { } } mavenCentral() + maven("https://central.sonatype.com/repository/maven-snapshots/") { mavenContent { snapshotsOnly() }} } versionCatalogs { create("libs") { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 69383eeb0..bfa0de779 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -46,7 +46,7 @@ kotlin = "2.2.20" kotlinxCoroutines = "1.10.1" kotlinxDatetime = "0.6.1" kotlinxSerializationJson = "1.8.0" -ksp = "2.3.0" +ksp = "2.3.1-SNAPSHOT" okhttp = "4.12.0" protobuf = "4.29.2" protobufPlugin = "0.9.4" diff --git a/settings.gradle.kts b/settings.gradle.kts index 2b8c6e45c..e82fd82ee 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -26,6 +26,7 @@ pluginManagement { } mavenCentral() gradlePluginPortal() + maven("https://central.sonatype.com/repository/maven-snapshots/") { mavenContent { snapshotsOnly() }} } } @@ -40,6 +41,7 @@ dependencyResolutionManagement { } } mavenCentral() + maven("https://central.sonatype.com/repository/maven-snapshots/") { mavenContent { snapshotsOnly() }} } } rootProject.name = "nowinandroid" From df589f6538deb87ffb50e9603db9867fc70d77bc Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Fri, 31 Oct 2025 19:30:10 +0100 Subject: [PATCH 11/33] Firebase Perf fix (included in firebase-bom 34.5.0) --- .../main/kotlin/AndroidApplicationFirebaseConventionPlugin.kt | 3 +-- gradle/libs.versions.toml | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/AndroidApplicationFirebaseConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidApplicationFirebaseConventionPlugin.kt index c6346f569..be3ec0365 100644 --- a/build-logic/convention/src/main/kotlin/AndroidApplicationFirebaseConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidApplicationFirebaseConventionPlugin.kt @@ -28,8 +28,7 @@ class AndroidApplicationFirebaseConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { apply(plugin = "com.google.gms.google-services") - // https://github.com/firebase/firebase-android-sdk/issues/7293 - // apply(plugin = "com.google.firebase.firebase-perf") + apply(plugin = "com.google.firebase.firebase-perf") apply(plugin = "com.google.firebase.crashlytics") dependencies { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bfa0de779..f73565462 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -34,7 +34,7 @@ coil = "2.7.0" dependencyGuard = "0.5.0" firebaseBom = "33.7.0" firebaseCrashlyticsPlugin = "3.0.6" -firebasePerfPlugin = "2.0.1" +firebasePerfPlugin = "2.0.2" gmsPlugin = "4.4.2" googleOss = "17.1.0" googleOssPlugin = "0.10.8" From ece169e8aa7abca5d46f988ec40ca2dee64a6338 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Thu, 6 Nov 2025 19:05:51 +0100 Subject: [PATCH 12/33] build-tools 32.0.0-alpha13 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9ee0c6a35..71a10eb1d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,7 @@ accompanist = "0.37.0" androidDesugarJdkLibs = "2.1.4" # AGP and tools should be updated together androidGradlePlugin = "9.0.0-alpha13" -androidTools = "32.0.0-alpha12" +androidTools = "32.0.0-alpha13" androidxActivity = "1.9.3" androidxAppCompat = "1.7.0" androidxBrowser = "1.8.0" From 4312937890e47d7414716ac27becb238fb89b781 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Thu, 6 Nov 2025 19:08:18 +0100 Subject: [PATCH 13/33] Remove maven repository for snapshots --- build-logic/settings.gradle.kts | 1 - settings.gradle.kts | 2 -- 2 files changed, 3 deletions(-) diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts index 14a4912b0..ff96cc84a 100644 --- a/build-logic/settings.gradle.kts +++ b/build-logic/settings.gradle.kts @@ -31,7 +31,6 @@ dependencyResolutionManagement { } } mavenCentral() - maven("https://central.sonatype.com/repository/maven-snapshots/") { mavenContent { snapshotsOnly() }} } versionCatalogs { create("libs") { diff --git a/settings.gradle.kts b/settings.gradle.kts index e82fd82ee..2b8c6e45c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -26,7 +26,6 @@ pluginManagement { } mavenCentral() gradlePluginPortal() - maven("https://central.sonatype.com/repository/maven-snapshots/") { mavenContent { snapshotsOnly() }} } } @@ -41,7 +40,6 @@ dependencyResolutionManagement { } } mavenCentral() - maven("https://central.sonatype.com/repository/maven-snapshots/") { mavenContent { snapshotsOnly() }} } } rootProject.name = "nowinandroid" From 3bc6ed6dbbdc64d8233a0594b1ec7f4498a9b3aa Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Fri, 7 Nov 2025 21:06:23 +0100 Subject: [PATCH 14/33] 9.0.0-alpha14 --- 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 71a10eb1d..9a5875bfa 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,8 +2,8 @@ accompanist = "0.37.0" androidDesugarJdkLibs = "2.1.4" # AGP and tools should be updated together -androidGradlePlugin = "9.0.0-alpha13" -androidTools = "32.0.0-alpha13" +androidGradlePlugin = "9.0.0-alpha14" +androidTools = "32.0.0-alpha14" androidxActivity = "1.9.3" androidxAppCompat = "1.7.0" androidxBrowser = "1.8.0" From b060fd0b71cf7cca93c761b4ecb0ee0935998dc2 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Fri, 7 Nov 2025 21:23:20 +0100 Subject: [PATCH 15/33] Replace API breaking changes not sure if they were dropped on purpose... --- .../apps/nowinandroid/GradleManagedDevices.kt | 27 +++++++++---------- .../apps/nowinandroid/KotlinAndroid.kt | 12 ++++----- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/GradleManagedDevices.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/GradleManagedDevices.kt index eaab1175f..25e506b7f 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/GradleManagedDevices.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/GradleManagedDevices.kt @@ -34,22 +34,21 @@ internal fun configureGradleManagedDevices( val allDevices = listOf(pixel4, pixel6, pixelC) val ciDevices = listOf(pixel4, pixelC) - commonExtension.testOptions { - managedDevices { - allDevices { - allDevices.forEach { deviceConfig -> - maybeCreate(deviceConfig.taskName, ManagedVirtualDevice::class.java).apply { - device = deviceConfig.device - apiLevel = deviceConfig.apiLevel - systemImageSource = deviceConfig.systemImageSource - } + + commonExtension.testOptions.managedDevices { + allDevices { + allDevices.forEach { deviceConfig -> + maybeCreate(deviceConfig.taskName, ManagedVirtualDevice::class.java).apply { + device = deviceConfig.device + apiLevel = deviceConfig.apiLevel + systemImageSource = deviceConfig.systemImageSource } } - groups { - maybeCreate("ci").apply { - ciDevices.forEach { deviceConfig -> - targetDevices.add(localDevices[deviceConfig.taskName]) - } + } + groups { + maybeCreate("ci").apply { + ciDevices.forEach { deviceConfig -> + targetDevices.add(localDevices[deviceConfig.taskName]) } } } diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt index 5c0b2a4b1..281cca5fa 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt @@ -39,13 +39,11 @@ internal fun Project.configureKotlinAndroid( defaultConfig.minSdk = 23 - compileOptions { - // Up to Java 11 APIs are available through desugaring - // https://developer.android.com/studio/write/java11-minimal-support-table - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - isCoreLibraryDesugaringEnabled = true - } + // Up to Java 11 APIs are available through desugaring + // https://developer.android.com/studio/write/java11-minimal-support-table + compileOptions.sourceCompatibility = JavaVersion.VERSION_11 + compileOptions.targetCompatibility = JavaVersion.VERSION_11 + compileOptions.isCoreLibraryDesugaringEnabled = true } configureKotlin() From 52b118a1e073c07c4b7843e3ca93ea70333e41a0 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Fri, 7 Nov 2025 21:47:52 +0100 Subject: [PATCH 16/33] Prevent Jacoco convention plugins to enable test coverage on release buildTypes leading to "debuggable" release builds. --- .../AndroidApplicationJacocoConventionPlugin.kt | 16 ++++++---------- .../AndroidLibraryJacocoConventionPlugin.kt | 16 ++++++---------- .../google/samples/apps/nowinandroid/Jacoco.kt | 9 +++++++++ 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/AndroidApplicationJacocoConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidApplicationJacocoConventionPlugin.kt index b0eece41d..326d03f4f 100644 --- a/build-logic/convention/src/main/kotlin/AndroidApplicationJacocoConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidApplicationJacocoConventionPlugin.kt @@ -21,20 +21,16 @@ import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.getByType +import org.gradle.testing.jacoco.plugins.JacocoPlugin class AndroidApplicationJacocoConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { - apply(plugin = "jacoco") - - val androidExtension = extensions.getByType() - - androidExtension.buildTypes.configureEach { - enableAndroidTestCoverage = true - enableUnitTestCoverage = true - } - - configureJacoco(extensions.getByType()) + apply() + configureJacoco( + commonExtension = extensions.getByType(), + androidComponentsExtension = extensions.getByType(), + ) } } } diff --git a/build-logic/convention/src/main/kotlin/AndroidLibraryJacocoConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidLibraryJacocoConventionPlugin.kt index d249e4cbf..2fd97d456 100644 --- a/build-logic/convention/src/main/kotlin/AndroidLibraryJacocoConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidLibraryJacocoConventionPlugin.kt @@ -21,20 +21,16 @@ import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.getByType +import org.gradle.testing.jacoco.plugins.JacocoPlugin class AndroidLibraryJacocoConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { - apply(plugin = "jacoco") - - val androidExtension = extensions.getByType() - - androidExtension.buildTypes.configureEach { - enableAndroidTestCoverage = true - enableUnitTestCoverage = true - } - - configureJacoco(extensions.getByType()) + apply() + configureJacoco( + commonExtension = extensions.getByType(), + androidComponentsExtension = extensions.getByType(), + ) } } } diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/Jacoco.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/Jacoco.kt index ed1ea4254..205fa5acb 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/Jacoco.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/Jacoco.kt @@ -17,9 +17,12 @@ package com.google.samples.apps.nowinandroid import com.android.build.api.artifact.ScopedArtifact +import com.android.build.api.dsl.BuildType +import com.android.build.api.dsl.CommonExtension import com.android.build.api.variant.AndroidComponentsExtension import com.android.build.api.variant.ScopedArtifacts import com.android.build.api.variant.SourceDirectories +import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.Project import org.gradle.api.file.Directory import org.gradle.api.file.RegularFile @@ -59,8 +62,14 @@ private fun String.capitalize() = replaceFirstChar { * tests on CI using a different Github Action or an external device farm. */ internal fun Project.configureJacoco( + commonExtension: CommonExtension, androidComponentsExtension: AndroidComponentsExtension<*, *, *>, ) { + commonExtension.buildTypes.named("debug") { + enableAndroidTestCoverage = true + enableUnitTestCoverage = true + } + configure { toolVersion = libs.findVersion("jacoco").get().toString() } From 1ebc99d32c78318b9210e341687f5dfe7425a799 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Mon, 10 Nov 2025 18:23:34 +0100 Subject: [PATCH 17/33] Clarify Jacoco configuration for debug build Add comment to clarify Jacoco configuration for debug builds. --- .../main/kotlin/com/google/samples/apps/nowinandroid/Jacoco.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/Jacoco.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/Jacoco.kt index 205fa5acb..8d16c428e 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/Jacoco.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/Jacoco.kt @@ -65,6 +65,7 @@ internal fun Project.configureJacoco( commonExtension: CommonExtension, androidComponentsExtension: AndroidComponentsExtension<*, *, *>, ) { + // Configure only the debug build, otherwise it will force the debuggable flag on release buildTypes as well commonExtension.buildTypes.named("debug") { enableAndroidTestCoverage = true enableUnitTestCoverage = true From 06fe6698f387b436eadd0fd89eb200a48b868ec5 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Mon, 10 Nov 2025 18:39:41 +0100 Subject: [PATCH 18/33] Remove VisibleForTesting --- .../apps/nowinandroid/core/datastore/di/DataStoreModule.kt | 2 -- .../com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt | 2 -- .../com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt | 2 -- 3 files changed, 6 deletions(-) diff --git a/core/datastore/src/main/kotlin/com/google/samples/apps/nowinandroid/core/datastore/di/DataStoreModule.kt b/core/datastore/src/main/kotlin/com/google/samples/apps/nowinandroid/core/datastore/di/DataStoreModule.kt index 6c4486880..ac9eaf767 100644 --- a/core/datastore/src/main/kotlin/com/google/samples/apps/nowinandroid/core/datastore/di/DataStoreModule.kt +++ b/core/datastore/src/main/kotlin/com/google/samples/apps/nowinandroid/core/datastore/di/DataStoreModule.kt @@ -33,10 +33,8 @@ import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope -import org.jetbrains.annotations.VisibleForTesting import javax.inject.Singleton -@VisibleForTesting @Module @InstallIn(SingletonComponent::class) object DataStoreModule { diff --git a/sync/work/src/demo/kotlin/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt b/sync/work/src/demo/kotlin/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt index 054cd913d..91ef476f6 100644 --- a/sync/work/src/demo/kotlin/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt +++ b/sync/work/src/demo/kotlin/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt @@ -24,9 +24,7 @@ import dagger.Binds import dagger.Module import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import org.jetbrains.annotations.VisibleForTesting -@VisibleForTesting @Module @InstallIn(SingletonComponent::class) abstract class SyncModule { diff --git a/sync/work/src/prod/kotlin/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt b/sync/work/src/prod/kotlin/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt index e59147813..97de27867 100644 --- a/sync/work/src/prod/kotlin/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt +++ b/sync/work/src/prod/kotlin/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt @@ -28,10 +28,8 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import org.jetbrains.annotations.VisibleForTesting import javax.inject.Singleton -@VisibleForTesting @Module @InstallIn(SingletonComponent::class) abstract class SyncModule { From 1e7095d76a00999b5252dfba5af3e87268870168 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Tue, 11 Nov 2025 09:47:47 +0100 Subject: [PATCH 19/33] Revert AGP's APIs change workarounds with `.apply{}` to reduce visual changes as requested --- .../apps/nowinandroid/AndroidCompose.kt | 4 ++- .../apps/nowinandroid/GradleManagedDevices.kt | 26 ++++++++++--------- .../apps/nowinandroid/KotlinAndroid.kt | 16 +++++++----- .../samples/apps/nowinandroid/NiaFlavor.kt | 16 +++++++----- 4 files changed, 36 insertions(+), 26 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt index 1daa63d2e..f018cbfc5 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt @@ -31,7 +31,9 @@ internal fun Project.configureAndroidCompose( commonExtension: CommonExtension, ) { commonExtension.apply { - buildFeatures.compose = true + buildFeatures.apply { + compose = true + } dependencies { val bom = libs.findLibrary("androidx-compose-bom").get() diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/GradleManagedDevices.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/GradleManagedDevices.kt index 25e506b7f..310d90d81 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/GradleManagedDevices.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/GradleManagedDevices.kt @@ -35,20 +35,22 @@ internal fun configureGradleManagedDevices( val ciDevices = listOf(pixel4, pixelC) - commonExtension.testOptions.managedDevices { - allDevices { - allDevices.forEach { deviceConfig -> - maybeCreate(deviceConfig.taskName, ManagedVirtualDevice::class.java).apply { - device = deviceConfig.device - apiLevel = deviceConfig.apiLevel - systemImageSource = deviceConfig.systemImageSource + commonExtension.testOptions.apply { + managedDevices { + allDevices { + allDevices.forEach { deviceConfig -> + maybeCreate(deviceConfig.taskName, ManagedVirtualDevice::class.java).apply { + device = deviceConfig.device + apiLevel = deviceConfig.apiLevel + systemImageSource = deviceConfig.systemImageSource + } } } - } - groups { - maybeCreate("ci").apply { - ciDevices.forEach { deviceConfig -> - targetDevices.add(localDevices[deviceConfig.taskName]) + groups { + maybeCreate("ci").apply { + ciDevices.forEach { deviceConfig -> + targetDevices.add(localDevices[deviceConfig.taskName]) + } } } } diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt index 281cca5fa..a923ce24e 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt @@ -37,13 +37,17 @@ internal fun Project.configureKotlinAndroid( commonExtension.apply { compileSdk = 35 - defaultConfig.minSdk = 23 + defaultConfig.apply { + minSdk = 23 + } - // Up to Java 11 APIs are available through desugaring - // https://developer.android.com/studio/write/java11-minimal-support-table - compileOptions.sourceCompatibility = JavaVersion.VERSION_11 - compileOptions.targetCompatibility = JavaVersion.VERSION_11 - compileOptions.isCoreLibraryDesugaringEnabled = true + compileOptions.apply { + // Up to Java 11 APIs are available through desugaring + // https://developer.android.com/studio/write/java11-minimal-support-table + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + isCoreLibraryDesugaringEnabled = true + } } configureKotlin() diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/NiaFlavor.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/NiaFlavor.kt index 9778eb641..9fbf0625c 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/NiaFlavor.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/NiaFlavor.kt @@ -28,13 +28,15 @@ fun configureFlavors( flavorDimensions += flavorDimension.name } - NiaFlavor.values().forEach { niaFlavor -> - productFlavors.register(niaFlavor.name) { - dimension = niaFlavor.dimension.name - flavorConfigurationBlock(this, niaFlavor) - if (this@apply is ApplicationExtension && this is ApplicationProductFlavor) { - if (niaFlavor.applicationIdSuffix != null) { - applicationIdSuffix = niaFlavor.applicationIdSuffix + productFlavors.apply { + NiaFlavor.values().forEach { niaFlavor -> + register(niaFlavor.name) { + dimension = niaFlavor.dimension.name + flavorConfigurationBlock(this, niaFlavor) + if (this@apply is ApplicationExtension && this is ApplicationProductFlavor) { + if (niaFlavor.applicationIdSuffix != null) { + applicationIdSuffix = niaFlavor.applicationIdSuffix + } } } } From e420d2b03b0d314285b3237b6e1072f2c8d9b8cf Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Fri, 14 Nov 2025 12:10:30 +0100 Subject: [PATCH 20/33] 9.0.0-beta01 Updated Android Gradle Plugin and tools to beta versions. --- 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 9aecf89f5..1b6654c44 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,8 +2,8 @@ accompanist = "0.37.0" androidDesugarJdkLibs = "2.1.4" # AGP and tools should be updated together -androidGradlePlugin = "9.0.0-alpha14" -androidTools = "32.0.0-alpha14" +androidGradlePlugin = "9.0.0-beta01" +androidTools = "32.0.0-beta01" androidxActivity = "1.9.3" androidxAppCompat = "1.7.0" androidxBrowser = "1.8.0" From 919831cb23bfe61cb27735ff85334631d5b54cd5 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Sat, 22 Nov 2025 15:56:44 +0100 Subject: [PATCH 21/33] 9.0.0-beta02 --- 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 1b6654c44..4a11407a3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,8 +2,8 @@ accompanist = "0.37.0" androidDesugarJdkLibs = "2.1.4" # AGP and tools should be updated together -androidGradlePlugin = "9.0.0-beta01" -androidTools = "32.0.0-beta01" +androidGradlePlugin = "9.0.0-beta02" +androidTools = "32.0.0-beta02" androidxActivity = "1.9.3" androidxAppCompat = "1.7.0" androidxBrowser = "1.8.0" From 113cc2aa267600aab7d6f49f3dfa62765d8964b8 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Sat, 29 Nov 2025 10:55:46 +0100 Subject: [PATCH 22/33] 9.0.0-beta03 --- 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 4a11407a3..cde9691c6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,8 +2,8 @@ accompanist = "0.37.0" androidDesugarJdkLibs = "2.1.4" # AGP and tools should be updated together -androidGradlePlugin = "9.0.0-beta02" -androidTools = "32.0.0-beta02" +androidGradlePlugin = "9.0.0-beta03" +androidTools = "32.0.0-beta03" androidxActivity = "1.9.3" androidxAppCompat = "1.7.0" androidxBrowser = "1.8.0" From 12c265cf55ca21058e11e7393e054f3b7620b1aa Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Wed, 10 Dec 2025 10:47:05 +0100 Subject: [PATCH 23/33] 9.0.0-beta04 --- 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 c8f7d3cce..d6e56f9b0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,8 +2,8 @@ accompanist = "0.37.0" androidDesugarJdkLibs = "2.1.4" # AGP and tools should be updated together -androidGradlePlugin = "9.0.0-beta03" -androidTools = "32.0.0-beta03" +androidGradlePlugin = "9.0.0-beta04" +androidTools = "32.0.0-beta04" androidxActivity = "1.9.3" androidxAppCompat = "1.7.0" androidxBrowser = "1.8.0" From 7af1c8bef9d45a57d478f66e247d33b1cbe7b764 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Wed, 10 Dec 2025 11:07:30 +0100 Subject: [PATCH 24/33] Fix warnings on changed files - Redundant suppression - UnstableApiUsage - There is more than one label with such a name in this scope. --- .../src/main/kotlin/AndroidApplicationConventionPlugin.kt | 1 - .../com/google/samples/apps/nowinandroid/AndroidCompose.kt | 2 ++ .../google/samples/apps/nowinandroid/GradleManagedDevices.kt | 1 + .../kotlin/com/google/samples/apps/nowinandroid/NiaFlavor.kt | 4 ++-- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt index 684821bfc..84a18d048 100644 --- a/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt @@ -37,7 +37,6 @@ class AndroidApplicationConventionPlugin : Plugin { extensions.configure { configureKotlinAndroid(this) defaultConfig.targetSdk = 36 - @Suppress("UnstableApiUsage") testOptions.animationsDisabled = true configureGradleManagedDevices(this) } diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt index 8aa8a48e8..ca2a6c99b 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt @@ -46,6 +46,7 @@ internal fun Project.configureAndroidCompose( extensions.configure { fun Provider.onlyIfTrue() = flatMap { provider { it.takeIf(String::toBoolean) } } fun Provider<*>.relativeToRootProject(dir: String) = map { + @Suppress("UnstableApiUsage") isolated.rootProject.projectDirectory .dir("build") .dir(projectDir.toRelativeString(rootDir)) @@ -59,6 +60,7 @@ internal fun Project.configureAndroidCompose( .relativeToRootProject("compose-reports") .let(reportsDestination::set) + @Suppress("UnstableApiUsage") stabilityConfigurationFiles .add(isolated.rootProject.projectDirectory.file("compose_compiler_config.conf")) } diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/GradleManagedDevices.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/GradleManagedDevices.kt index 310d90d81..992a3f91e 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/GradleManagedDevices.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/GradleManagedDevices.kt @@ -36,6 +36,7 @@ internal fun configureGradleManagedDevices( commonExtension.testOptions.apply { + @Suppress("UnstableApiUsage") managedDevices { allDevices { allDevices.forEach { deviceConfig -> diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/NiaFlavor.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/NiaFlavor.kt index 9fbf0625c..06a12cde8 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/NiaFlavor.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/NiaFlavor.kt @@ -28,12 +28,12 @@ fun configureFlavors( flavorDimensions += flavorDimension.name } - productFlavors.apply { + productFlavors.apply flavors@{ NiaFlavor.values().forEach { niaFlavor -> register(niaFlavor.name) { dimension = niaFlavor.dimension.name flavorConfigurationBlock(this, niaFlavor) - if (this@apply is ApplicationExtension && this is ApplicationProductFlavor) { + if (this@flavors is ApplicationExtension && this is ApplicationProductFlavor) { if (niaFlavor.applicationIdSuffix != null) { applicationIdSuffix = niaFlavor.applicationIdSuffix } From 10a3b628ab2542fc99e248c62a63e0592a7def5b Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Thu, 11 Dec 2025 20:10:28 +0100 Subject: [PATCH 25/33] 9.0.0-beta05 --- 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 d6e56f9b0..760230f7a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,8 +2,8 @@ accompanist = "0.37.0" androidDesugarJdkLibs = "2.1.4" # AGP and tools should be updated together -androidGradlePlugin = "9.0.0-beta04" -androidTools = "32.0.0-beta04" +androidGradlePlugin = "9.0.0-beta05" +androidTools = "32.0.0-beta05" androidxActivity = "1.9.3" androidxAppCompat = "1.7.0" androidxBrowser = "1.8.0" From 7dffc314ce97404f6ded487a525287e1b46843b2 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Thu, 11 Dec 2025 21:05:13 +0100 Subject: [PATCH 26/33] `android.disallowKotlinSourceSets=false` --- gradle.properties | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gradle.properties b/gradle.properties index b94170508..39abf100e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -65,3 +65,6 @@ roborazzi.test.verify=true android.injected.androidTest.leaveApksInstalledAfterRun=true android.newDsl=false + +# Temporary suppresson of androidx.baselineprofile plugin issue (now flagged as error by AGP beta05) +android.disallowKotlinSourceSets=false From 21d2df832bba1c5ea9047d3d0a9de5b191f565bd Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Thu, 18 Dec 2025 19:28:33 +0100 Subject: [PATCH 27/33] 9.0.0-rc01 --- 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 760230f7a..1c54e522e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,8 +2,8 @@ accompanist = "0.37.0" androidDesugarJdkLibs = "2.1.4" # AGP and tools should be updated together -androidGradlePlugin = "9.0.0-beta05" -androidTools = "32.0.0-beta05" +androidGradlePlugin = "9.0.0-rc01" +androidTools = "32.0.0-rc01" androidxActivity = "1.9.3" androidxAppCompat = "1.7.0" androidxBrowser = "1.8.0" From c2c7bed11649c6b8bf3a2e3adaa0ba837a2a3dda Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Fri, 9 Jan 2026 10:21:06 +0100 Subject: [PATCH 28/33] 9.0.0-rc02 --- 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 1c54e522e..0489fefaf 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,8 +2,8 @@ accompanist = "0.37.0" androidDesugarJdkLibs = "2.1.4" # AGP and tools should be updated together -androidGradlePlugin = "9.0.0-rc01" -androidTools = "32.0.0-rc01" +androidGradlePlugin = "9.0.0-rc02" +androidTools = "32.0.0-rc02" androidxActivity = "1.9.3" androidxAppCompat = "1.7.0" androidxBrowser = "1.8.0" From 7807618f348fd5277cf5954a2dba036e5e542a4a Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Fri, 9 Jan 2026 10:21:19 +0100 Subject: [PATCH 29/33] 9.0.0-rc03 --- 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 0489fefaf..365abfb19 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,8 +2,8 @@ accompanist = "0.37.0" androidDesugarJdkLibs = "2.1.4" # AGP and tools should be updated together -androidGradlePlugin = "9.0.0-rc02" -androidTools = "32.0.0-rc02" +androidGradlePlugin = "9.0.0-rc03" +androidTools = "32.0.0-rc03" androidxActivity = "1.9.3" androidxAppCompat = "1.7.0" androidxBrowser = "1.8.0" From 7839613a5b2fab6c16a0f1beb9ee2cb693d25816 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Fri, 9 Jan 2026 11:00:58 +0100 Subject: [PATCH 30/33] Restore kotlin-dsl extension available on `NamedDomainObjectContainer` --- .../kotlin/com/google/samples/apps/nowinandroid/NiaFlavor.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/NiaFlavor.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/NiaFlavor.kt index daa58ad4b..96ca6073d 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/NiaFlavor.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/NiaFlavor.kt @@ -4,6 +4,7 @@ import com.android.build.api.dsl.ApplicationExtension import com.android.build.api.dsl.ApplicationProductFlavor import com.android.build.api.dsl.CommonExtension import com.android.build.api.dsl.ProductFlavor +import org.gradle.kotlin.dsl.invoke @Suppress("EnumEntryName") enum class FlavorDimension { @@ -28,12 +29,12 @@ fun configureFlavors( flavorDimensions += flavorDimension.name } - productFlavors.apply flavors@{ + productFlavors { NiaFlavor.entries.forEach { niaFlavor -> register(niaFlavor.name) { dimension = niaFlavor.dimension.name flavorConfigurationBlock(this, niaFlavor) - if (this@flavors is ApplicationExtension && this is ApplicationProductFlavor) { + if (commonExtension is ApplicationExtension && this is ApplicationProductFlavor) { if (niaFlavor.applicationIdSuffix != null) { applicationIdSuffix = niaFlavor.applicationIdSuffix } From 4fb667ffd1eb521884dba7f8909d2e173487bfb8 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Fri, 9 Jan 2026 11:10:15 +0100 Subject: [PATCH 31/33] Revert "Move internal modifier to the object to work around build errors" This reverts commit fd939d5a48898f263c9e737fcd8428395932d8bd. --- .../apps/nowinandroid/core/datastore/di/DataStoreModule.kt | 2 +- .../google/samples/apps/nowinandroid/sync/di/SyncModule.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/datastore/src/main/kotlin/com/google/samples/apps/nowinandroid/core/datastore/di/DataStoreModule.kt b/core/datastore/src/main/kotlin/com/google/samples/apps/nowinandroid/core/datastore/di/DataStoreModule.kt index ac9eaf767..8e0d7d4d8 100644 --- a/core/datastore/src/main/kotlin/com/google/samples/apps/nowinandroid/core/datastore/di/DataStoreModule.kt +++ b/core/datastore/src/main/kotlin/com/google/samples/apps/nowinandroid/core/datastore/di/DataStoreModule.kt @@ -41,7 +41,7 @@ object DataStoreModule { @Provides @Singleton - fun providesUserPreferencesDataStore( + internal fun providesUserPreferencesDataStore( @ApplicationContext context: Context, @Dispatcher(IO) ioDispatcher: CoroutineDispatcher, @ApplicationScope scope: CoroutineScope, diff --git a/sync/work/src/prod/kotlin/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt b/sync/work/src/prod/kotlin/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt index 97de27867..ceeb39548 100644 --- a/sync/work/src/prod/kotlin/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt +++ b/sync/work/src/prod/kotlin/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt @@ -43,9 +43,9 @@ abstract class SyncModule { syncSubscriber: FirebaseSyncSubscriber, ): SyncSubscriber - internal companion object { + companion object { @Provides @Singleton - fun provideFirebaseMessaging(): FirebaseMessaging = Firebase.messaging + internal fun provideFirebaseMessaging(): FirebaseMessaging = Firebase.messaging } } From 8cbbd454ebb9901f05e5f37c44564d82d67ede0c Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Fri, 9 Jan 2026 11:12:54 +0100 Subject: [PATCH 32/33] Add links to relevant issues for `android.newDsl=false` --- gradle.properties | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gradle.properties b/gradle.properties index 39abf100e..77e1ae314 100644 --- a/gradle.properties +++ b/gradle.properties @@ -64,6 +64,9 @@ roborazzi.test.verify=true # https://issuetracker.google.com/issues/295039976 android.injected.androidTest.leaveApksInstalledAfterRun=true +# Blockers: +# - https://github.com/google/dagger/issues/4944 +# - https://github.com/google/dagger/issues/4979 android.newDsl=false # Temporary suppresson of androidx.baselineprofile plugin issue (now flagged as error by AGP beta05) From 374ed8b002ffec37cef2bbf98dbe66b7ca3889ea Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Fri, 9 Jan 2026 12:03:04 +0100 Subject: [PATCH 33/33] fix: restore removal during merge --- .../src/main/kotlin/AndroidApplicationConventionPlugin.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt index f740f222c..8c45a056c 100644 --- a/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt @@ -19,6 +19,7 @@ import com.android.build.api.variant.ApplicationAndroidComponentsExtension import com.google.samples.apps.nowinandroid.configureBadgingTasks import com.google.samples.apps.nowinandroid.configureGradleManagedDevices import com.google.samples.apps.nowinandroid.configureKotlinAndroid +import com.google.samples.apps.nowinandroid.configurePrintApksTask import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.apply @@ -38,6 +39,7 @@ class AndroidApplicationConventionPlugin : Plugin { configureGradleManagedDevices(this) } extensions.configure { + configurePrintApksTask(this) configureBadgingTasks(this) } }