Upgrade dependencies to latest Kotlin 2.1.20 compatible versions

Upgrade build toolchain (Gradle 8.13, AGP 8.13.0, Kotlin 2.1.20, KSP 2.1.20-1.0.32),
Compose Multiplatform 1.8.0, and all core/test/AndroidX libraries to their latest versions
compatible with Kotlin 2.1.20. Fix all resulting API breakages including Koin 4.1.0 startup,
material3-adaptive suspend navigation, JVM target consistency, and AGP managed device API changes.
pull/2064/head
Mercury Li 5 months ago
parent a77c01795d
commit a0ac3e1474

@ -31,7 +31,7 @@ plugins {
kotlin {
@OptIn(ExperimentalWasmDsl::class)
wasmJs {
moduleName = "composeApp"
outputModuleName.set("composeApp")
browser {
commonWebpackConfig {
outputFileName = "composeApp.js"
@ -52,7 +52,11 @@ kotlin {
}
}
jvm("desktop")
jvm("desktop") {
compilerOptions {
jvmTarget.set(JVM_11)
}
}
listOf(
iosX64(),
@ -94,7 +98,7 @@ android {
versionName = "0.0.1" // X.Y.Z; X = Major, Y = minor, Z = Patch level
minSdk = 24
targetSdk = 34
compileSdk = 34
compileSdk = 35
// The UI catalog does not depend on content from the app, however, it depends on modules
// which do, so we must specify a default value for the contentType dimension.
missingDimensionStrategy("contentType", "demo")

@ -1,6 +1,6 @@
androidx.activity:activity-compose:1.9.3
androidx.activity:activity-ktx:1.9.3
androidx.activity:activity:1.9.3
androidx.activity:activity-compose:1.10.0
androidx.activity:activity-ktx:1.10.0
androidx.activity:activity:1.10.0
androidx.annotation:annotation-experimental:1.4.1
androidx.annotation:annotation-jvm:1.9.1
androidx.annotation:annotation:1.9.1
@ -8,57 +8,57 @@ androidx.appcompat:appcompat-resources:1.7.0
androidx.arch.core:core-common:2.2.0
androidx.arch.core:core-runtime:2.2.0
androidx.autofill:autofill:1.0.0
androidx.collection:collection-jvm:1.4.4
androidx.collection:collection-ktx:1.4.4
androidx.collection:collection:1.4.4
androidx.compose.animation:animation-android:1.7.6
androidx.compose.animation:animation-core-android:1.7.6
androidx.compose.animation:animation-core:1.7.6
androidx.compose.animation:animation:1.7.6
androidx.compose.foundation:foundation-android:1.7.6
androidx.compose.foundation:foundation-layout-android:1.7.6
androidx.compose.foundation:foundation-layout:1.7.6
androidx.compose.foundation:foundation:1.7.6
androidx.compose.material3.adaptive:adaptive-android:1.0.0
androidx.compose.material3.adaptive:adaptive-layout-android:1.0.0
androidx.compose.material3.adaptive:adaptive-layout:1.0.0
androidx.compose.material3.adaptive:adaptive:1.0.0
androidx.compose.material3:material3-adaptive-navigation-suite-android:1.3.1
androidx.compose.material3:material3-adaptive-navigation-suite:1.3.1
androidx.compose.material3:material3-android:1.3.1
androidx.compose.material3:material3:1.3.1
androidx.compose.material:material-android:1.7.6
androidx.collection:collection-jvm:1.5.0
androidx.collection:collection-ktx:1.5.0
androidx.collection:collection:1.5.0
androidx.compose.animation:animation-android:1.8.0
androidx.compose.animation:animation-core-android:1.8.0
androidx.compose.animation:animation-core:1.8.0
androidx.compose.animation:animation:1.8.0
androidx.compose.foundation:foundation-android:1.8.0
androidx.compose.foundation:foundation-layout-android:1.8.0
androidx.compose.foundation:foundation-layout:1.8.0
androidx.compose.foundation:foundation:1.8.0
androidx.compose.material3.adaptive:adaptive-android:1.1.0
androidx.compose.material3.adaptive:adaptive-layout-android:1.1.0
androidx.compose.material3.adaptive:adaptive-layout:1.1.0
androidx.compose.material3.adaptive:adaptive:1.1.0
androidx.compose.material3:material3-adaptive-navigation-suite-android:1.3.2
androidx.compose.material3:material3-adaptive-navigation-suite:1.3.2
androidx.compose.material3:material3-android:1.3.2
androidx.compose.material3:material3:1.3.2
androidx.compose.material:material-android:1.8.0
androidx.compose.material:material-icons-core-android:1.7.6
androidx.compose.material:material-icons-core:1.7.6
androidx.compose.material:material-icons-extended-android:1.7.6
androidx.compose.material:material-icons-extended:1.7.6
androidx.compose.material:material-ripple-android:1.7.6
androidx.compose.material:material-ripple:1.7.6
androidx.compose.material:material:1.7.6
androidx.compose.runtime:runtime-android:1.7.6
androidx.compose.runtime:runtime-saveable-android:1.7.6
androidx.compose.runtime:runtime-saveable:1.7.6
androidx.compose.runtime:runtime:1.7.6
androidx.compose.ui:ui-android:1.7.6
androidx.compose.ui:ui-geometry-android:1.7.6
androidx.compose.ui:ui-geometry:1.7.6
androidx.compose.ui:ui-graphics-android:1.7.6
androidx.compose.ui:ui-graphics:1.7.6
androidx.compose.ui:ui-text-android:1.7.6
androidx.compose.ui:ui-text:1.7.6
androidx.compose.ui:ui-tooling-preview-android:1.7.6
androidx.compose.ui:ui-tooling-preview:1.7.6
androidx.compose.ui:ui-unit-android:1.7.6
androidx.compose.ui:ui-unit:1.7.6
androidx.compose.ui:ui-util-android:1.7.6
androidx.compose.ui:ui-util:1.7.6
androidx.compose.ui:ui:1.7.6
androidx.compose.material:material-ripple-android:1.8.0
androidx.compose.material:material-ripple:1.8.0
androidx.compose.material:material:1.8.0
androidx.compose.runtime:runtime-android:1.8.1
androidx.compose.runtime:runtime-saveable-android:1.8.1
androidx.compose.runtime:runtime-saveable:1.8.1
androidx.compose.runtime:runtime:1.8.1
androidx.compose.ui:ui-android:1.8.1
androidx.compose.ui:ui-geometry-android:1.8.1
androidx.compose.ui:ui-geometry:1.8.1
androidx.compose.ui:ui-graphics-android:1.8.1
androidx.compose.ui:ui-graphics:1.8.1
androidx.compose.ui:ui-text-android:1.8.1
androidx.compose.ui:ui-text:1.8.1
androidx.compose.ui:ui-tooling-preview-android:1.8.1
androidx.compose.ui:ui-tooling-preview:1.8.1
androidx.compose.ui:ui-unit-android:1.8.1
androidx.compose.ui:ui-unit:1.8.1
androidx.compose.ui:ui-util-android:1.8.1
androidx.compose.ui:ui-util:1.8.1
androidx.compose.ui:ui:1.8.1
androidx.concurrent:concurrent-futures:1.1.0
androidx.core:core-ktx:1.13.1
androidx.core:core:1.13.1
androidx.core:core-ktx:1.15.0
androidx.core:core:1.15.0
androidx.customview:customview-poolingcontainer:1.0.0
androidx.emoji2:emoji2:1.3.0
androidx.exifinterface:exifinterface:1.3.7
androidx.emoji2:emoji2:1.4.0
androidx.exifinterface:exifinterface:1.4.1
androidx.graphics:graphics-path:1.0.1
androidx.interpolator:interpolator:1.0.0
androidx.lifecycle:lifecycle-common-java8:2.8.7
@ -80,7 +80,7 @@ androidx.profileinstaller:profileinstaller:1.4.1
androidx.savedstate:savedstate-ktx:1.2.1
androidx.savedstate:savedstate:1.2.1
androidx.startup:startup-runtime:1.1.1
androidx.tracing:tracing:1.0.0
androidx.tracing:tracing:1.2.0
androidx.vectordrawable:vectordrawable-animated:1.1.0
androidx.vectordrawable:vectordrawable:1.1.0
androidx.versionedparcelable:versionedparcelable:1.1.1
@ -88,50 +88,51 @@ androidx.window.extensions.core:core:1.0.0
androidx.window:window-core-android:1.3.0
androidx.window:window-core:1.3.0
androidx.window:window:1.3.0
com.google.accompanist:accompanist-drawablepainter:0.36.0
com.google.accompanist:accompanist-drawablepainter:0.37.3
com.google.guava:listenablefuture:1.0
com.squareup.okio:okio-jvm:3.9.1
com.squareup.okio:okio:3.9.1
io.coil-kt.coil3:coil-compose-core-android:3.0.3
io.coil-kt.coil3:coil-compose-core:3.0.3
io.coil-kt.coil3:coil-core-android:3.0.3
io.coil-kt.coil3:coil-core:3.0.3
com.squareup.okio:okio-jvm:3.11.0
com.squareup.okio:okio:3.11.0
io.coil-kt.coil3:coil-compose-core-android:3.2.0
io.coil-kt.coil3:coil-compose-core:3.2.0
io.coil-kt.coil3:coil-core-android:3.2.0
io.coil-kt.coil3:coil-core:3.2.0
org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.4
org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose:2.8.4
org.jetbrains.androidx.lifecycle:lifecycle-runtime:2.8.4
org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.4
org.jetbrains.androidx.window:window-core:1.3.1
org.jetbrains.compose.animation:animation-core:1.7.3
org.jetbrains.compose.animation:animation:1.7.3
org.jetbrains.compose.annotation-internal:annotation:1.7.3
org.jetbrains.compose.collection-internal:collection:1.7.3
org.jetbrains.compose.components:components-resources-android:1.7.3
org.jetbrains.compose.components:components-resources:1.7.3
org.jetbrains.compose.components:components-ui-tooling-preview-android:1.7.3
org.jetbrains.compose.components:components-ui-tooling-preview:1.7.3
org.jetbrains.compose.foundation:foundation-layout:1.7.3
org.jetbrains.compose.foundation:foundation:1.7.3
org.jetbrains.compose.material3.adaptive:adaptive-layout:1.0.1
org.jetbrains.compose.material3.adaptive:adaptive:1.0.1
org.jetbrains.compose.material3:material3-adaptive-navigation-suite:1.7.3
org.jetbrains.compose.material3:material3:1.7.3
org.jetbrains.compose.animation:animation-core:1.8.0
org.jetbrains.compose.animation:animation:1.8.0
org.jetbrains.compose.annotation-internal:annotation:1.8.0
org.jetbrains.compose.collection-internal:collection:1.8.0
org.jetbrains.compose.components:components-resources-android:1.8.0
org.jetbrains.compose.components:components-resources:1.8.0
org.jetbrains.compose.components:components-ui-tooling-preview-android:1.8.0
org.jetbrains.compose.components:components-ui-tooling-preview:1.8.0
org.jetbrains.compose.foundation:foundation-layout:1.8.0
org.jetbrains.compose.foundation:foundation:1.8.0
org.jetbrains.compose.material3.adaptive:adaptive-layout:1.1.0
org.jetbrains.compose.material3.adaptive:adaptive:1.1.0
org.jetbrains.compose.material3:material3-adaptive-navigation-suite:1.8.0
org.jetbrains.compose.material3:material3:1.8.0
org.jetbrains.compose.material:material-icons-core:1.7.3
org.jetbrains.compose.material:material-icons-extended:1.7.3
org.jetbrains.compose.material:material-ripple:1.7.3
org.jetbrains.compose.material:material:1.7.3
org.jetbrains.compose.runtime:runtime-saveable:1.7.3
org.jetbrains.compose.runtime:runtime:1.7.3
org.jetbrains.compose.ui:ui-geometry:1.7.3
org.jetbrains.compose.ui:ui-graphics:1.7.3
org.jetbrains.compose.ui:ui-text:1.7.3
org.jetbrains.compose.ui:ui-unit:1.7.3
org.jetbrains.compose.ui:ui-util:1.7.3
org.jetbrains.compose.ui:ui:1.7.3
org.jetbrains.kotlin:kotlin-stdlib:2.1.0
org.jetbrains.kotlinx:atomicfu-jvm:0.23.2
org.jetbrains.kotlinx:atomicfu:0.23.2
org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0
org.jetbrains.compose.material:material-ripple:1.8.0
org.jetbrains.compose.material:material:1.8.0
org.jetbrains.compose.runtime:runtime-saveable:1.8.0
org.jetbrains.compose.runtime:runtime:1.8.0
org.jetbrains.compose.ui:ui-backhandler-android:1.8.0
org.jetbrains.compose.ui:ui-backhandler:1.8.0
org.jetbrains.compose.ui:ui-geometry:1.8.0
org.jetbrains.compose.ui:ui-graphics:1.8.0
org.jetbrains.compose.ui:ui-text:1.8.0
org.jetbrains.compose.ui:ui-unit:1.8.0
org.jetbrains.compose.ui:ui-util:1.8.0
org.jetbrains.compose.ui:ui:1.8.0
org.jetbrains.kotlin:kotlin-stdlib:2.1.20
org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2
org.jetbrains:annotations:23.0.0
org.jspecify:jspecify:1.0.0

@ -1,5 +1,5 @@
package: name='com.google.samples.apps.nowinandroid' versionCode='8' versionName='0.1.2' platformBuildVersionName='15' platformBuildVersionCode='35' compileSdkVersion='35' compileSdkVersionCodename='15'
sdkVersion:'21'
minSdkVersion:'21'
targetSdkVersion:'34'
uses-permission: name='android.permission.INTERNET'
uses-permission: name='android.permission.ACCESS_NETWORK_STATE'

@ -27,22 +27,23 @@ import com.google.samples.apps.nowinandroid.util.ProfileVerifierLogger
import org.koin.android.ext.android.inject
import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger
import org.koin.androix.startup.KoinStartup.onKoinStartup
import org.koin.androix.startup.KoinStartup
import org.koin.core.annotation.KoinExperimentalAPI
import org.koin.dsl.koinConfiguration
/**
* [Application] class for NiA
*/
class NiaApplication : Application(), SingletonImageLoader.Factory {
@OptIn(KoinExperimentalAPI::class)
class NiaApplication : Application(), SingletonImageLoader.Factory, KoinStartup {
init {
onKoinStartup {
androidContext(this@NiaApplication)
androidLogger()
modules(
jankStatsModule,
appModules,
)
}
override fun onKoinStartup() = koinConfiguration {
androidContext(this@NiaApplication)
androidLogger()
modules(
jankStatsModule,
appModules,
)
}
private val profileVerifierLogger: ProfileVerifierLogger by inject()

@ -54,7 +54,6 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavDestination
import androidx.navigation.NavDestination.Companion.hasRoute
import androidx.navigation.NavDestination.Companion.hierarchy
@ -65,6 +64,7 @@ import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaTopAp
import com.google.samples.apps.nowinandroid.core.designsystem.icon.NiaIcons
import com.google.samples.apps.nowinandroid.core.designsystem.theme.GradientColors
import com.google.samples.apps.nowinandroid.core.designsystem.theme.LocalGradientColors
import com.google.samples.apps.nowinandroid.core.ui.collectAsStateWithLifecycle
import com.google.samples.apps.nowinandroid.feature.settings.SettingsDialog
import com.google.samples.apps.nowinandroid.navigation.NiaNavHost
import com.google.samples.apps.nowinandroid.navigation.TopLevelDestination

@ -32,20 +32,22 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.key
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.Saver
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.google.samples.apps.nowinandroid.core.ui.collectAsStateWithLifecycle
import com.google.samples.apps.nowinandroid.feature.interests.InterestsRoute
import com.google.samples.apps.nowinandroid.feature.interests.navigation.InterestsRoute
import com.google.samples.apps.nowinandroid.feature.topic.TopicDetailPlaceholder
import com.google.samples.apps.nowinandroid.feature.topic.navigation.TopicRoute
import com.google.samples.apps.nowinandroid.feature.topic.navigation.navigateToTopic
import com.google.samples.apps.nowinandroid.feature.topic.navigation.topicScreen
import kotlinx.coroutines.launch
import kotlinx.serialization.Serializable
import org.koin.compose.viewmodel.koinViewModel
import kotlin.uuid.ExperimentalUuidApi
@ -99,6 +101,8 @@ internal fun InterestsListDetailScreen(
// listDetailNavigator.navigateBack()
// }
val coroutineScope = rememberCoroutineScope()
var nestedNavHostStartRoute by remember {
val route = selectedTopicId?.let { TopicRoute(id = it) } ?: TopicPlaceholderRoute
mutableStateOf(route)
@ -125,7 +129,9 @@ internal fun InterestsListDetailScreen(
nestedNavHostStartRoute = TopicRoute(id = topicId)
nestedNavKey = Uuid.random()
}
listDetailNavigator.navigateTo(ListDetailPaneScaffoldRole.Detail)
coroutineScope.launch {
listDetailNavigator.navigateTo(ListDetailPaneScaffoldRole.Detail)
}
}
ListDetailPaneScaffold(
@ -149,7 +155,11 @@ internal fun InterestsListDetailScreen(
) {
topicScreen(
showBackButton = !listDetailNavigator.isListPaneVisible(),
onBackClick = listDetailNavigator::navigateBack,
onBackClick = {
coroutineScope.launch {
listDetailNavigator.navigateBack()
}
},
onTopicClick = ::onTopicClickShowDetailPane,
)
composable<TopicPlaceholderRoute> {

@ -22,11 +22,14 @@ import com.google.samples.apps.nowinandroid.configureGradleManagedDevices
import com.google.samples.apps.nowinandroid.configureKotlinAndroid
import com.google.samples.apps.nowinandroid.configurePrintApksTask
import com.google.samples.apps.nowinandroid.libs
import org.gradle.api.JavaVersion
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.dependencies
import org.gradle.kotlin.dsl.getByType
import org.gradle.kotlin.dsl.withType
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
@ -87,7 +90,11 @@ private fun Project.configureComposeMultiplatformApp() {
}
// Add JVM target for desktop
jvm()
jvm {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_11)
}
}
// Configure iOS targets
listOf(
@ -122,4 +129,15 @@ private fun Project.configureComposeMultiplatformApp() {
dependsOn("allTests")
}
}
// Set Java compilation compatibility for JVM target to match Kotlin JVM target (11).
// Only apply --release to non-Android Java tasks, since AGP manages bootclasspath itself.
project.tasks.withType<JavaCompile>().configureEach {
sourceCompatibility = JavaVersion.VERSION_11.toString()
targetCompatibility = JavaVersion.VERSION_11.toString()
// Android tasks are named like "compileDebugJavaWithJavac"; KMP JVM tasks like "compileJvmMainJava"
if (!name.endsWith("JavaWithJavac")) {
options.release.set(11)
}
}
}

@ -31,13 +31,14 @@ internal fun configureGradleManagedDevices(
val pixel6 = DeviceConfig("Pixel 6", 31, "aosp")
val pixelC = DeviceConfig("Pixel C", 30, "aosp-atd")
val allDevices = listOf(pixel4, pixel6, pixelC)
val ciDevices = listOf(pixel4, pixelC)
val deviceConfigs = listOf(pixel4, pixel6, pixelC)
val ciDeviceConfigs = listOf(pixel4, pixelC)
commonExtension.testOptions {
managedDevices {
@Suppress("DEPRECATION")
devices {
allDevices.forEach { deviceConfig ->
deviceConfigs.forEach { deviceConfig ->
maybeCreate(deviceConfig.taskName, ManagedVirtualDevice::class.java).apply {
device = deviceConfig.device
apiLevel = deviceConfig.apiLevel
@ -47,7 +48,8 @@ internal fun configureGradleManagedDevices(
}
groups {
maybeCreate("ci").apply {
ciDevices.forEach { deviceConfig ->
ciDeviceConfigs.forEach { deviceConfig ->
@Suppress("DEPRECATION")
targetDevices.add(devices[deviceConfig.taskName])
}
}

@ -29,7 +29,6 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinBaseExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinTopLevelExtension
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
/**

@ -16,10 +16,13 @@
package com.google.samples.apps.nowinandroid
import org.gradle.api.JavaVersion
import org.gradle.api.Project
import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.withType
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
@ -35,7 +38,11 @@ internal fun Project.configureKotlinMultiplatform() {
// https://kotlinlang.org/docs/whatsnew1820.html#new-approach-to-source-set-hierarchy
applyDefaultHierarchyTemplate()
jvm()
jvm {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_11)
}
}
androidTarget()
// SqlDelight does not support wasm yet
// https://github.com/cashapp/sqldelight/pull/4965/files
@ -105,4 +112,15 @@ internal fun Project.configureKotlinMultiplatform() {
dependsOn("allTests")
}
}
// Set Java compilation compatibility for JVM target to match Kotlin JVM target (11).
// Only apply --release to non-Android Java tasks, since AGP manages bootclasspath itself.
project.tasks.withType<JavaCompile>().configureEach {
sourceCompatibility = JavaVersion.VERSION_11.toString()
targetCompatibility = JavaVersion.VERSION_11.toString()
// Android tasks are named like "compileDebugJavaWithJavac"; KMP JVM tasks like "compileJvmMainJava"
if (!name.endsWith("JavaWithJavac")) {
options.release.set(11)
}
}
}

@ -36,7 +36,7 @@ android {
kotlin {
@OptIn(ExperimentalWasmDsl::class)
wasmJs {
moduleName = "composeApp"
outputModuleName.set("composeApp")
browser {
commonWebpackConfig {
outputFileName = "composeApp.js"

@ -47,7 +47,6 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import coil3.ImageLoader
import coil3.compose.LocalPlatformContext
import com.google.samples.apps.nowinandroid.core.designsystem.component.DynamicAsyncImage
@ -64,6 +63,7 @@ import com.google.samples.apps.nowinandroid.core.model.data.UserNewsResource
import com.google.samples.apps.nowinandroid.core.ui.DevicePreviews
import com.google.samples.apps.nowinandroid.core.ui.TrackScreenViewEvent
import com.google.samples.apps.nowinandroid.core.ui.UserNewsResourcePreviewParameterProvider
import com.google.samples.apps.nowinandroid.core.ui.collectAsStateWithLifecycle
import com.google.samples.apps.nowinandroid.core.ui.userNewsResourceCardItems
import nowinandroid.core.ui.generated.resources.core_ui_back
import nowinandroid.feature.topic.generated.resources.Res

@ -14,10 +14,10 @@
* limitations under the License.
*/
val ktlintVersion = "1.4.0"
val ktlintVersion = "1.5.0"
initscript {
val spotlessVersion = "6.25.0"
val spotlessVersion = "7.0.2"
repositories {
mavenCentral()

@ -2,22 +2,21 @@
accompanist = "0.37.0"
androidDesugarJdkLibs = "2.1.4"
# AGP and tools should be updated together
androidGradlePlugin = "8.7.3"
androidTools = "31.7.3"
androidxActivity = "1.9.3"
androidGradlePlugin = "8.13.0"
androidTools = "31.13.0"
androidxActivity = "1.10.0"
androidxBrowser = "1.8.0"
androidxComposeBom = "2024.12.01"
androidxComposeFoundation = "1.8.0-alpha07"
androidxComposeRuntimeTracing = "1.7.6"
androidxCore = "1.15.0"
androidxCoreSplashscreen = "1.0.1"
androidxDataStore = "1.1.1"
androidxComposeBom = "2025.05.00"
androidxComposeRuntimeTracing = "1.8.1"
androidxCore = "1.16.0"
androidxCoreSplashscreen = "1.2.0-alpha02"
androidxDataStore = "1.1.4"
androidxEspresso = "3.6.1"
androidxLifecycle = "2.8.7"
androidxLifecycle = "2.9.0"
androidxLintGradle = "1.0.0-alpha03"
androidxMacroBenchmark = "1.3.3"
androidxMacroBenchmark = "1.4.0"
androidxMetrics = "1.0.0-beta01"
androidxNavigation = "2.8.5"
androidxNavigation = "2.9.0"
androidxProfileinstaller = "1.4.1"
androidxTestCore = "1.6.1"
androidxTestExt = "1.2.1"
@ -27,19 +26,19 @@ androidxTracing = "1.3.0-alpha02"
androidxUiAutomator = "2.3.0"
androidxWindowManager = "1.3.0"
androidxWork = "2.10.0"
coil = "3.0.3"
coil = "3.2.0"
dependencyGuard = "0.5.0"
jacoco = "0.8.7"
kotlin = "2.1.0"
kotlinxCoroutines = "1.10.1"
jacoco = "0.8.12"
kotlin = "2.1.20"
kotlinxCoroutines = "1.10.2"
kotlinxDatetime = "0.6.1"
kotlinxSerializationJson = "1.8.0"
ksp = "2.1.0-1.0.29"
ksp = "2.1.20-1.0.32"
logback = "1.5.15"
material3adaptive = "1.0.1"
material3adaptive = "1.1.0"
moduleGraph = "2.7.1"
robolectric = "4.14"
roborazzi = "1.39.0"
robolectric = "4.14.1"
roborazzi = "1.46.1"
secrets = "2.0.1"
truth = "1.4.4"
turbine = "1.2.0"
@ -47,19 +46,19 @@ androidx-constraintlayout = "2.2.0"
androidx-espresso-core = "3.6.1"
androidx-material = "1.12.0"
androidx-test-junit = "1.2.1"
compose-ui-tooling = "1.7.6"
compose-plugin = "1.7.3"
compose-ui-tooling = "1.8.1"
compose-plugin = "1.8.0"
sqldelight = "2.0.2"
kotlinInject = '0.7.2'
multiplatform-settings = "1.2.0"
kermit = "2.0.4"
koin = "4.0.0"
koin-annotations = "2.0.0-Beta2"
ktor = "3.0.2"
ktrofit = "2.2.0"
kotlinInject = "0.8.0"
multiplatform-settings = "1.3.0"
kermit = "2.0.5"
koin = "4.1.0"
koin-annotations = "2.0.0"
ktor = "3.1.2"
ktrofit = "2.5.1"
buildKonfig = "0.15.2"
lifecycle-viewmodel-compose = "2.8.4"
navigation-compose = "2.8.0-alpha11"
lifecycle-viewmodel-compose = "2.9.0"
navigation-compose = "2.9.0-beta02"
[bundles]
androidx-compose-ui-test = ["androidx-compose-ui-test", "androidx-compose-ui-testManifest"]

@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

Loading…
Cancel
Save