diff --git a/ComposeStarter/app/build.gradle.kts b/ComposeStarter/app/build.gradle.kts index 914a5eeeb..fc7d0efde 100644 --- a/ComposeStarter/app/build.gradle.kts +++ b/ComposeStarter/app/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("com.android.application") alias(libs.plugins.roborazzi) alias(libs.plugins.compose.compiler) + alias(libs.plugins.kotlin.serialization) } android { @@ -91,15 +92,16 @@ dependencies { implementation(libs.wear.compose.foundation) implementation(libs.androidx.material.icons.core) - implementation(libs.horologist.compose.layout) - // Preview Tooling implementation(libs.compose.ui.tooling.preview) implementation(libs.androidx.compose.ui.tooling) // If you are using Compose Navigation, use the Wear OS version (NOT the // androidx.navigation:navigation-compose version), that is, uncomment the line below. - implementation(libs.wear.compose.navigation) + implementation(libs.wear.compose.navigation3) + implementation(libs.androidx.navigation3.runtime) + implementation(libs.androidx.navigation3.ui) + implementation(libs.kotlinx.serialization.json) implementation(libs.androidx.ui.test.manifest) diff --git a/ComposeStarter/app/src/main/java/com/example/android/wearable/composestarter/presentation/MainActivity.kt b/ComposeStarter/app/src/main/java/com/example/android/wearable/composestarter/presentation/MainActivity.kt index b1a47abac..011a5324d 100644 --- a/ComposeStarter/app/src/main/java/com/example/android/wearable/composestarter/presentation/MainActivity.kt +++ b/ComposeStarter/app/src/main/java/com/example/android/wearable/composestarter/presentation/MainActivity.kt @@ -30,12 +30,17 @@ import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign +import androidx.navigation3.runtime.NavKey +import androidx.navigation3.runtime.entryProvider +import androidx.navigation3.runtime.rememberNavBackStack +import androidx.navigation3.ui.NavDisplay import androidx.wear.compose.foundation.lazy.TransformingLazyColumn import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState import androidx.wear.compose.material3.AlertDialog import androidx.wear.compose.material3.AlertDialogDefaults import androidx.wear.compose.material3.AppScaffold import androidx.wear.compose.material3.Button +import androidx.wear.compose.material3.ButtonDefaults import androidx.wear.compose.material3.ButtonGroup import androidx.wear.compose.material3.EdgeButton import androidx.wear.compose.material3.EdgeButtonSize @@ -43,6 +48,7 @@ import androidx.wear.compose.material3.FilledIconButton import androidx.wear.compose.material3.Icon import androidx.wear.compose.material3.IconButtonDefaults import androidx.wear.compose.material3.ListHeader +import androidx.wear.compose.material3.ListHeaderDefaults import androidx.wear.compose.material3.MaterialTheme import androidx.wear.compose.material3.ScreenScaffold import androidx.wear.compose.material3.SurfaceTransformation @@ -50,16 +56,13 @@ import androidx.wear.compose.material3.Text import androidx.wear.compose.material3.TitleCard import androidx.wear.compose.material3.lazy.rememberTransformationSpec import androidx.wear.compose.material3.lazy.transformedHeight -import androidx.wear.compose.navigation.SwipeDismissableNavHost -import androidx.wear.compose.navigation.composable -import androidx.wear.compose.navigation.rememberSwipeDismissableNavController +import androidx.wear.compose.navigation3.rememberSwipeDismissableSceneStrategy import androidx.wear.compose.ui.tooling.preview.WearPreviewDevices import androidx.wear.compose.ui.tooling.preview.WearPreviewFontScales import com.example.android.wearable.composestarter.R import com.example.android.wearable.composestarter.presentation.theme.AppCardDefaults import com.example.android.wearable.composestarter.presentation.theme.WearAppTheme -import com.google.android.horologist.compose.layout.ColumnItemType -import com.google.android.horologist.compose.layout.rememberResponsiveColumnPadding +import kotlinx.serialization.Serializable /** * Simple "Hello, World" app meant as a starting point for a new project using Compose for Wear OS. @@ -67,9 +70,9 @@ import com.google.android.horologist.compose.layout.rememberResponsiveColumnPadd * Displays a centered [Text] composable and a list built with [TransformingLazyColumn]. * * Use the Wear version of Compose Navigation. You can carry - * over your knowledge from mobile and it supports the swipe-to-dismiss gesture (Wear OS's + * over your knowledge from mobile, and it supports the swipe-to-dismiss gesture (Wear OS's * back action). For more information, go here: - * https://developer.android.com/reference/kotlin/androidx/wear/compose/navigation/package-summary + * https://developer.android.com/reference/kotlin/androidx/wear/compose/navigation3/package-summary */ class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -81,23 +84,43 @@ class MainActivity : ComponentActivity() { } } +@Serializable +sealed interface AppKey : NavKey + +@Serializable +data object MenuScreen : AppKey + +@Serializable +data object ListNavScreen : AppKey + @Composable fun WearApp() { - val navController = rememberSwipeDismissableNavController() + val backStack = rememberNavBackStack(MenuScreen) WearAppTheme { AppScaffold { - SwipeDismissableNavHost(navController = navController, startDestination = "menu") { - composable("menu") { - GreetingScreen( - "Android", - onShowList = { navController.navigate("list") } - ) - } - composable("list") { - ListScreen() + val entryProvider = + remember { + entryProvider { + entry { + GreetingScreen( + "Android", + onShowList = { backStack.add(ListNavScreen) } + ) + } + entry { + ListScreen() + } + } } - } + + val swipeDismissableSceneStrategy = rememberSwipeDismissableSceneStrategy() + + NavDisplay( + backStack = backStack, + entryProvider = entryProvider, + sceneStrategies = listOf(swipeDismissableSceneStrategy) + ) } } } @@ -123,22 +146,25 @@ fun GreetingScreen( ) { Text(stringResource(R.string.show_list)) } - }, - // The bottom padding value is always ignored when using EdgeButton because this button is - // always placed at the end of the screen. - // The `ScreenScaffold` parameter `edgeButtonSpacing` can be used to specify the - // gap between edgeButton and content. - contentPadding = - rememberResponsiveColumnPadding( - first = ColumnItemType.ListHeader - ) + // The `ScreenScaffold` parameter `edgeButtonSpacing` can be used to specify the + // gap between edgeButton and content. + } ) { contentPadding -> - // Use workaround from Horologist for padding or wait until fix lands TransformingLazyColumn( state = scrollState, contentPadding = contentPadding ) { - item { Greeting(greetingName = greetingName, modifier = modifier.fillMaxSize()) } + item { + Greeting( + greetingName = greetingName, + modifier = + modifier + .fillMaxSize() + .minimumVerticalContentPadding( + ListHeaderDefaults.minimumTopListContentPadding + ) + ) + } } } } @@ -146,26 +172,15 @@ fun GreetingScreen( @Composable fun ListScreen(modifier: Modifier = Modifier) { var showDialog by remember { mutableStateOf(false) } - - /* - * Specifying the types of items that appear at the start and end of the list ensures that the - * appropriate padding is used. - */ val listState = rememberTransformingLazyColumnState() val transformationSpec = rememberTransformationSpec() ScreenScaffold( - scrollState = listState, + scrollState = listState /* * TransformingLazyColumn takes care of the horizontal and vertical * padding for the list and handles scrolling. - * Use workaround from Horologist for padding or wait until fix lands */ - contentPadding = - rememberResponsiveColumnPadding( - first = ColumnItemType.ListHeader, - last = ColumnItemType.IconButton - ) ) { contentPadding -> TransformingLazyColumn( state = listState, @@ -176,7 +191,10 @@ fun ListScreen(modifier: Modifier = Modifier) { modifier = Modifier .fillMaxWidth() - .transformedHeight(this, transformationSpec), + .transformedHeight(this, transformationSpec) + .minimumVerticalContentPadding( + ListHeaderDefaults.minimumTopListContentPadding + ), transformation = SurfaceTransformation(transformationSpec) ) { Text(text = "Header") } } @@ -223,6 +241,9 @@ fun ListScreen(modifier: Modifier = Modifier) { applyContainerTransformation(scrollProgress) } }.transformedHeight(this, transformationSpec) + .minimumVerticalContentPadding( + ButtonDefaults.minimumVerticalListContentPadding + ) ) { FilledIconButton( onClick = { showDialog = true }, diff --git a/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_galaxy_watch_5.png b/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_galaxy_watch_5.png index b09f94ec4..ae48103bf 100644 Binary files a/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_galaxy_watch_5.png and b/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_galaxy_watch_5.png differ diff --git a/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_galaxy_watch_6.png b/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_galaxy_watch_6.png index 16bc9969c..0385c1fae 100644 Binary files a/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_galaxy_watch_6.png and b/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_galaxy_watch_6.png differ diff --git a/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_galaxy_watch_6_small_font.png b/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_galaxy_watch_6_small_font.png index 28ae6dc14..7fb723075 100644 Binary files a/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_galaxy_watch_6_small_font.png and b/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_galaxy_watch_6_small_font.png differ diff --git a/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_large_round.png b/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_large_round.png index 47f47521b..c38a22cd4 100644 Binary files a/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_large_round.png and b/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_large_round.png differ diff --git a/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_pixel_watch.png b/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_pixel_watch.png index d695d26ae..1be5a372c 100644 Binary files a/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_pixel_watch.png and b/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_pixel_watch.png differ diff --git a/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_pixel_watch_large_font.png b/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_pixel_watch_large_font.png index ee7294a50..e1a9b9400 100644 Binary files a/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_pixel_watch_large_font.png and b/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_pixel_watch_large_font.png differ diff --git a/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_small_round.png b/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_small_round.png index d695d26ae..1be5a372c 100644 Binary files a/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_small_round.png and b/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_small_round.png differ diff --git a/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_ticwatch_pro_5.png b/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_ticwatch_pro_5.png index c74f9d806..90eb77931 100644 Binary files a/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_ticwatch_pro_5.png and b/ComposeStarter/app/src/test/screenshots/GreetingScreenTest_ticwatch_pro_5.png differ diff --git a/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_5.png b/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_5.png index 17b90d6b3..79debc2c7 100644 Binary files a/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_5.png and b/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_5.png differ diff --git a/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_5_end.png b/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_5_end.png index d8cf65ed1..12e6413e4 100644 Binary files a/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_5_end.png and b/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_5_end.png differ diff --git a/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_6.png b/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_6.png index babbb31b6..702e604ba 100644 Binary files a/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_6.png and b/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_6.png differ diff --git a/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_6_end.png b/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_6_end.png index 4a5aaa59e..b5a170e20 100644 Binary files a/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_6_end.png and b/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_6_end.png differ diff --git a/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_6_small_font.png b/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_6_small_font.png index 206e702a8..0070aac63 100644 Binary files a/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_6_small_font.png and b/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_6_small_font.png differ diff --git a/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_6_small_font_end.png b/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_6_small_font_end.png index 9d7da4cd6..a9ac52707 100644 Binary files a/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_6_small_font_end.png and b/ComposeStarter/app/src/test/screenshots/ListScreenTest_galaxy_watch_6_small_font_end.png differ diff --git a/ComposeStarter/app/src/test/screenshots/ListScreenTest_large_round.png b/ComposeStarter/app/src/test/screenshots/ListScreenTest_large_round.png index 5347c5235..f93a2328f 100644 Binary files a/ComposeStarter/app/src/test/screenshots/ListScreenTest_large_round.png and b/ComposeStarter/app/src/test/screenshots/ListScreenTest_large_round.png differ diff --git a/ComposeStarter/app/src/test/screenshots/ListScreenTest_large_round_end.png b/ComposeStarter/app/src/test/screenshots/ListScreenTest_large_round_end.png index 71a55492c..67aaf90eb 100644 Binary files a/ComposeStarter/app/src/test/screenshots/ListScreenTest_large_round_end.png and b/ComposeStarter/app/src/test/screenshots/ListScreenTest_large_round_end.png differ diff --git a/ComposeStarter/app/src/test/screenshots/ListScreenTest_pixel_watch.png b/ComposeStarter/app/src/test/screenshots/ListScreenTest_pixel_watch.png index 798e632db..a0b981161 100644 Binary files a/ComposeStarter/app/src/test/screenshots/ListScreenTest_pixel_watch.png and b/ComposeStarter/app/src/test/screenshots/ListScreenTest_pixel_watch.png differ diff --git a/ComposeStarter/app/src/test/screenshots/ListScreenTest_pixel_watch_end.png b/ComposeStarter/app/src/test/screenshots/ListScreenTest_pixel_watch_end.png index 590a2f570..efaef9cba 100644 Binary files a/ComposeStarter/app/src/test/screenshots/ListScreenTest_pixel_watch_end.png and b/ComposeStarter/app/src/test/screenshots/ListScreenTest_pixel_watch_end.png differ diff --git a/ComposeStarter/app/src/test/screenshots/ListScreenTest_pixel_watch_large_font.png b/ComposeStarter/app/src/test/screenshots/ListScreenTest_pixel_watch_large_font.png index 4934e68ae..911292ff7 100644 Binary files a/ComposeStarter/app/src/test/screenshots/ListScreenTest_pixel_watch_large_font.png and b/ComposeStarter/app/src/test/screenshots/ListScreenTest_pixel_watch_large_font.png differ diff --git a/ComposeStarter/app/src/test/screenshots/ListScreenTest_pixel_watch_large_font_end.png b/ComposeStarter/app/src/test/screenshots/ListScreenTest_pixel_watch_large_font_end.png index beb40b295..88b02bef7 100644 Binary files a/ComposeStarter/app/src/test/screenshots/ListScreenTest_pixel_watch_large_font_end.png and b/ComposeStarter/app/src/test/screenshots/ListScreenTest_pixel_watch_large_font_end.png differ diff --git a/ComposeStarter/app/src/test/screenshots/ListScreenTest_small_round.png b/ComposeStarter/app/src/test/screenshots/ListScreenTest_small_round.png index 798e632db..a0b981161 100644 Binary files a/ComposeStarter/app/src/test/screenshots/ListScreenTest_small_round.png and b/ComposeStarter/app/src/test/screenshots/ListScreenTest_small_round.png differ diff --git a/ComposeStarter/app/src/test/screenshots/ListScreenTest_small_round_end.png b/ComposeStarter/app/src/test/screenshots/ListScreenTest_small_round_end.png index 590a2f570..efaef9cba 100644 Binary files a/ComposeStarter/app/src/test/screenshots/ListScreenTest_small_round_end.png and b/ComposeStarter/app/src/test/screenshots/ListScreenTest_small_round_end.png differ diff --git a/ComposeStarter/app/src/test/screenshots/ListScreenTest_ticwatch_pro_5.png b/ComposeStarter/app/src/test/screenshots/ListScreenTest_ticwatch_pro_5.png index 18e726085..432a087b9 100644 Binary files a/ComposeStarter/app/src/test/screenshots/ListScreenTest_ticwatch_pro_5.png and b/ComposeStarter/app/src/test/screenshots/ListScreenTest_ticwatch_pro_5.png differ diff --git a/ComposeStarter/app/src/test/screenshots/ListScreenTest_ticwatch_pro_5_end.png b/ComposeStarter/app/src/test/screenshots/ListScreenTest_ticwatch_pro_5_end.png index b88a6c8b3..c4b1886e7 100644 Binary files a/ComposeStarter/app/src/test/screenshots/ListScreenTest_ticwatch_pro_5_end.png and b/ComposeStarter/app/src/test/screenshots/ListScreenTest_ticwatch_pro_5_end.png differ diff --git a/ComposeStarter/app/src/test/screenshots/SampleDialogTest_galaxy_watch_5.png b/ComposeStarter/app/src/test/screenshots/SampleDialogTest_galaxy_watch_5.png index 4f7735231..4e4eb9f69 100644 Binary files a/ComposeStarter/app/src/test/screenshots/SampleDialogTest_galaxy_watch_5.png and b/ComposeStarter/app/src/test/screenshots/SampleDialogTest_galaxy_watch_5.png differ diff --git a/ComposeStarter/app/src/test/screenshots/SampleDialogTest_galaxy_watch_6.png b/ComposeStarter/app/src/test/screenshots/SampleDialogTest_galaxy_watch_6.png index 516eb1c4f..876568c66 100644 Binary files a/ComposeStarter/app/src/test/screenshots/SampleDialogTest_galaxy_watch_6.png and b/ComposeStarter/app/src/test/screenshots/SampleDialogTest_galaxy_watch_6.png differ diff --git a/ComposeStarter/app/src/test/screenshots/SampleDialogTest_galaxy_watch_6_small_font.png b/ComposeStarter/app/src/test/screenshots/SampleDialogTest_galaxy_watch_6_small_font.png index fc0cb38e4..a22ae434a 100644 Binary files a/ComposeStarter/app/src/test/screenshots/SampleDialogTest_galaxy_watch_6_small_font.png and b/ComposeStarter/app/src/test/screenshots/SampleDialogTest_galaxy_watch_6_small_font.png differ diff --git a/ComposeStarter/app/src/test/screenshots/SampleDialogTest_large_round.png b/ComposeStarter/app/src/test/screenshots/SampleDialogTest_large_round.png index cd71c948b..517e9d176 100644 Binary files a/ComposeStarter/app/src/test/screenshots/SampleDialogTest_large_round.png and b/ComposeStarter/app/src/test/screenshots/SampleDialogTest_large_round.png differ diff --git a/ComposeStarter/app/src/test/screenshots/SampleDialogTest_pixel_watch.png b/ComposeStarter/app/src/test/screenshots/SampleDialogTest_pixel_watch.png index 5f3e6f221..52a484d55 100644 Binary files a/ComposeStarter/app/src/test/screenshots/SampleDialogTest_pixel_watch.png and b/ComposeStarter/app/src/test/screenshots/SampleDialogTest_pixel_watch.png differ diff --git a/ComposeStarter/app/src/test/screenshots/SampleDialogTest_small_round.png b/ComposeStarter/app/src/test/screenshots/SampleDialogTest_small_round.png index 5f3e6f221..52a484d55 100644 Binary files a/ComposeStarter/app/src/test/screenshots/SampleDialogTest_small_round.png and b/ComposeStarter/app/src/test/screenshots/SampleDialogTest_small_round.png differ diff --git a/ComposeStarter/app/src/test/screenshots/SampleDialogTest_ticwatch_pro_5.png b/ComposeStarter/app/src/test/screenshots/SampleDialogTest_ticwatch_pro_5.png index 4e888486a..e119acd6b 100644 Binary files a/ComposeStarter/app/src/test/screenshots/SampleDialogTest_ticwatch_pro_5.png and b/ComposeStarter/app/src/test/screenshots/SampleDialogTest_ticwatch_pro_5.png differ diff --git a/ComposeStarter/gradle/libs.versions.toml b/ComposeStarter/gradle/libs.versions.toml index 768b8b63d..5650bcb0a 100644 --- a/ComposeStarter/gradle/libs.versions.toml +++ b/ComposeStarter/gradle/libs.versions.toml @@ -12,6 +12,8 @@ robolectric = "4.16.1" roborazzi = "1.59.0" ui-test-junit4 = "1.10.6" ui-test-manifest = "1.10.6" +androidx-navigation3 = "1.1.0" +kotlinx-serialization = "1.10.0" [libraries] androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activity" } @@ -35,11 +37,15 @@ test-espresso-core = "androidx.test.espresso:espresso-core:3.7.0" test-ext-junit = "androidx.test.ext:junit:1.3.0" wear-compose-foundation = { module = "androidx.wear.compose:compose-foundation", version.ref = "androidx-wear-compose" } wear-compose-material = { module = "androidx.wear.compose:compose-material3", version.ref = "androidx-wear-compose-material3" } -wear-compose-navigation = { module = "androidx.wear.compose:compose-navigation", version.ref = "androidx-wear-compose" } -horologist-compose-layout = { module = "com.google.android.horologist:horologist-compose-layout", version.ref = "horologist" } +wear-compose-navigation3 = { module = "androidx.wear.compose:compose-navigation3", version.ref = "androidx-wear-compose" } +androidx-navigation3-runtime = { module = "androidx.navigation3:navigation3-runtime", version.ref = "androidx-navigation3" } +androidx-navigation3-ui = { module = "androidx.navigation3:navigation3-ui", version.ref = "androidx-navigation3" } +kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization" } [plugins] com-android-application = { id = "com.android.application", version.ref = "android-gradle-plugin" } com-diffplug-spotless = "com.diffplug.spotless:8.4.0" roborazzi = { id = "io.github.takahirom.roborazzi", version.ref = "roborazzi" } compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "org-jetbrains-kotlin" } +org-jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "org-jetbrains-kotlin" } +kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "org-jetbrains-kotlin" }