From 14d7d20a918e2b7b425b7f890088fdd9f0e1df55 Mon Sep 17 00:00:00 2001 From: Don Turner Date: Tue, 1 Jul 2025 14:17:47 +0100 Subject: [PATCH 01/13] Refactor :bookmarks into :bookmarks:impl --- app/build.gradle.kts | 2 +- .../samples/apps/nowinandroid/navigation/NiaNavHost.kt | 2 +- .../apps/nowinandroid/navigation/TopLevelDestination.kt | 4 ++-- .../com/google/samples/apps/nowinandroid/ui/NiaAppState.kt | 2 +- feature/bookmarks/{ => impl}/.gitignore | 0 feature/bookmarks/{ => impl}/README.md | 0 feature/bookmarks/{ => impl}/build.gradle.kts | 2 +- .../nowinandroid/feature/bookmarks/BookmarksScreenTest.kt | 3 ++- feature/bookmarks/{ => impl}/src/main/AndroidManifest.xml | 0 .../nowinandroid/feature/bookmarks/impl}/BookmarksScreen.kt | 4 ++-- .../feature/bookmarks/impl}/BookmarksViewModel.kt | 4 ++-- .../bookmarks/impl}/navigation/BookmarksNavigation.kt | 6 +++--- .../res/drawable/feature_bookmarks_img_empty_bookmarks.xml | 0 .../bookmarks/{ => impl}/src/main/res/values/strings.xml | 0 .../feature/bookmarks/BookmarksViewModelTest.kt | 1 + settings.gradle.kts | 2 +- 16 files changed, 17 insertions(+), 15 deletions(-) rename feature/bookmarks/{ => impl}/.gitignore (100%) rename feature/bookmarks/{ => impl}/README.md (100%) rename feature/bookmarks/{ => impl}/build.gradle.kts (98%) rename feature/bookmarks/{ => impl}/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt (97%) rename feature/bookmarks/{ => impl}/src/main/AndroidManifest.xml (100%) rename feature/bookmarks/{src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks => impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl}/BookmarksScreen.kt (98%) rename feature/bookmarks/{src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks => impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl}/BookmarksViewModel.kt (96%) rename feature/bookmarks/{src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks => impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl}/navigation/BookmarksNavigation.kt (84%) rename feature/bookmarks/{ => impl}/src/main/res/drawable/feature_bookmarks_img_empty_bookmarks.xml (100%) rename feature/bookmarks/{ => impl}/src/main/res/values/strings.xml (100%) rename feature/bookmarks/{ => impl}/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt (98%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 6aec2d1bca..53b9323315 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -72,7 +72,7 @@ android { dependencies { implementation(projects.feature.interests) implementation(projects.feature.foryou) - implementation(projects.feature.bookmarks) + implementation(projects.feature.bookmarks.impl) implementation(projects.feature.topic) implementation(projects.feature.search) implementation(projects.feature.settings) diff --git a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt index e079c98f45..238844fb52 100644 --- a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt +++ b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt @@ -19,7 +19,7 @@ package com.google.samples.apps.nowinandroid.navigation import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.navigation.compose.NavHost -import com.google.samples.apps.nowinandroid.feature.bookmarks.navigation.bookmarksScreen +import com.google.samples.apps.nowinandroid.feature.bookmarks.impl.navigation.bookmarksScreen import com.google.samples.apps.nowinandroid.feature.foryou.navigation.ForYouBaseRoute import com.google.samples.apps.nowinandroid.feature.foryou.navigation.forYouSection import com.google.samples.apps.nowinandroid.feature.interests.navigation.navigateToInterests diff --git a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/TopLevelDestination.kt b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/TopLevelDestination.kt index 429e626ffb..2f53b2c76b 100644 --- a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/TopLevelDestination.kt +++ b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/TopLevelDestination.kt @@ -20,12 +20,12 @@ import androidx.annotation.StringRes import androidx.compose.ui.graphics.vector.ImageVector import com.google.samples.apps.nowinandroid.R import com.google.samples.apps.nowinandroid.core.designsystem.icon.NiaIcons -import com.google.samples.apps.nowinandroid.feature.bookmarks.navigation.BookmarksRoute +import com.google.samples.apps.nowinandroid.feature.bookmarks.impl.navigation.BookmarksRoute import com.google.samples.apps.nowinandroid.feature.foryou.navigation.ForYouBaseRoute import com.google.samples.apps.nowinandroid.feature.foryou.navigation.ForYouRoute import com.google.samples.apps.nowinandroid.feature.interests.navigation.InterestsRoute import kotlin.reflect.KClass -import com.google.samples.apps.nowinandroid.feature.bookmarks.R as bookmarksR +import com.google.samples.apps.nowinandroid.feature.bookmarks.impl.R as bookmarksR import com.google.samples.apps.nowinandroid.feature.foryou.R as forYouR import com.google.samples.apps.nowinandroid.feature.search.R as searchR diff --git a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt index 7c892c854e..5673a0bace 100644 --- a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt +++ b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt @@ -34,7 +34,7 @@ import com.google.samples.apps.nowinandroid.core.data.repository.UserNewsResourc import com.google.samples.apps.nowinandroid.core.data.util.NetworkMonitor import com.google.samples.apps.nowinandroid.core.data.util.TimeZoneMonitor import com.google.samples.apps.nowinandroid.core.ui.TrackDisposableJank -import com.google.samples.apps.nowinandroid.feature.bookmarks.navigation.navigateToBookmarks +import com.google.samples.apps.nowinandroid.feature.bookmarks.impl.navigation.navigateToBookmarks import com.google.samples.apps.nowinandroid.feature.foryou.navigation.navigateToForYou import com.google.samples.apps.nowinandroid.feature.interests.navigation.navigateToInterests import com.google.samples.apps.nowinandroid.feature.search.navigation.navigateToSearch diff --git a/feature/bookmarks/.gitignore b/feature/bookmarks/impl/.gitignore similarity index 100% rename from feature/bookmarks/.gitignore rename to feature/bookmarks/impl/.gitignore diff --git a/feature/bookmarks/README.md b/feature/bookmarks/impl/README.md similarity index 100% rename from feature/bookmarks/README.md rename to feature/bookmarks/impl/README.md diff --git a/feature/bookmarks/build.gradle.kts b/feature/bookmarks/impl/build.gradle.kts similarity index 98% rename from feature/bookmarks/build.gradle.kts rename to feature/bookmarks/impl/build.gradle.kts index 51a15ce7a0..07226c5511 100644 --- a/feature/bookmarks/build.gradle.kts +++ b/feature/bookmarks/impl/build.gradle.kts @@ -21,7 +21,7 @@ plugins { } android { - namespace = "com.google.samples.apps.nowinandroid.feature.bookmarks" + namespace = "com.google.samples.apps.nowinandroid.feature.bookmarks.impl" } dependencies { diff --git a/feature/bookmarks/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt b/feature/bookmarks/impl/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt similarity index 97% rename from feature/bookmarks/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt rename to feature/bookmarks/impl/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt index dd01b84c99..8a4b6ac89f 100644 --- a/feature/bookmarks/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt +++ b/feature/bookmarks/impl/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt @@ -36,6 +36,7 @@ import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.testing.TestLifecycleOwner import com.google.samples.apps.nowinandroid.core.testing.data.userNewsResourcesTestData import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState +import com.google.samples.apps.nowinandroid.feature.bookmarks.impl.BookmarksScreen import kotlinx.coroutines.test.runTest import org.junit.Rule import org.junit.Test @@ -43,7 +44,7 @@ import kotlin.test.assertEquals import kotlin.test.assertTrue /** - * UI tests for [BookmarksScreen] composable. + * UI tests for [com.google.samples.apps.nowinandroid.feature.bookmarks.impl.BookmarksScreen] composable. */ class BookmarksScreenTest { diff --git a/feature/bookmarks/src/main/AndroidManifest.xml b/feature/bookmarks/impl/src/main/AndroidManifest.xml similarity index 100% rename from feature/bookmarks/src/main/AndroidManifest.xml rename to feature/bookmarks/impl/src/main/AndroidManifest.xml diff --git a/feature/bookmarks/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt b/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/BookmarksScreen.kt similarity index 98% rename from feature/bookmarks/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt rename to feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/BookmarksScreen.kt index 7c229c5ea5..2cf1c2b6e7 100644 --- a/feature/bookmarks/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt +++ b/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/BookmarksScreen.kt @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.google.samples.apps.nowinandroid.feature.bookmarks +package com.google.samples.apps.nowinandroid.feature.bookmarks.impl import androidx.annotation.VisibleForTesting import androidx.compose.foundation.Image diff --git a/feature/bookmarks/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModel.kt b/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/BookmarksViewModel.kt similarity index 96% rename from feature/bookmarks/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModel.kt rename to feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/BookmarksViewModel.kt index f936024855..3f715564ac 100644 --- a/feature/bookmarks/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModel.kt +++ b/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/BookmarksViewModel.kt @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.google.samples.apps.nowinandroid.feature.bookmarks +package com.google.samples.apps.nowinandroid.feature.bookmarks.impl import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf diff --git a/feature/bookmarks/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/navigation/BookmarksNavigation.kt b/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/navigation/BookmarksNavigation.kt similarity index 84% rename from feature/bookmarks/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/navigation/BookmarksNavigation.kt rename to feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/navigation/BookmarksNavigation.kt index ea8d525ab0..856d48c554 100644 --- a/feature/bookmarks/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/navigation/BookmarksNavigation.kt +++ b/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/navigation/BookmarksNavigation.kt @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,13 +14,13 @@ * limitations under the License. */ -package com.google.samples.apps.nowinandroid.feature.bookmarks.navigation +package com.google.samples.apps.nowinandroid.feature.bookmarks.impl.navigation import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions import androidx.navigation.compose.composable -import com.google.samples.apps.nowinandroid.feature.bookmarks.BookmarksRoute +import com.google.samples.apps.nowinandroid.feature.bookmarks.impl.BookmarksRoute import kotlinx.serialization.Serializable @Serializable object BookmarksRoute diff --git a/feature/bookmarks/src/main/res/drawable/feature_bookmarks_img_empty_bookmarks.xml b/feature/bookmarks/impl/src/main/res/drawable/feature_bookmarks_img_empty_bookmarks.xml similarity index 100% rename from feature/bookmarks/src/main/res/drawable/feature_bookmarks_img_empty_bookmarks.xml rename to feature/bookmarks/impl/src/main/res/drawable/feature_bookmarks_img_empty_bookmarks.xml diff --git a/feature/bookmarks/src/main/res/values/strings.xml b/feature/bookmarks/impl/src/main/res/values/strings.xml similarity index 100% rename from feature/bookmarks/src/main/res/values/strings.xml rename to feature/bookmarks/impl/src/main/res/values/strings.xml diff --git a/feature/bookmarks/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt b/feature/bookmarks/impl/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt similarity index 98% rename from feature/bookmarks/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt rename to feature/bookmarks/impl/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt index aa42adae21..8885824cfd 100644 --- a/feature/bookmarks/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt +++ b/feature/bookmarks/impl/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt @@ -23,6 +23,7 @@ import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserData import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState.Loading import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState.Success +import com.google.samples.apps.nowinandroid.feature.bookmarks.impl.BookmarksViewModel import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher diff --git a/settings.gradle.kts b/settings.gradle.kts index 2b8c6e45c6..014f86d322 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -67,7 +67,7 @@ include(":core:ui") include(":feature:foryou") include(":feature:interests") -include(":feature:bookmarks") +include(":feature:bookmarks:impl") include(":feature:topic") include(":feature:search") include(":feature:settings") From 8d7befb2587cc90b38c7d5969143a800db4dc6bf Mon Sep 17 00:00:00 2001 From: Don Turner Date: Tue, 1 Jul 2025 14:40:56 +0100 Subject: [PATCH 02/13] Add :bookmarks:api module --- .../apps/nowinandroid/ui/NavigationTest.kt | 2 +- feature/bookmarks/api/.gitignore | 1 + feature/bookmarks/api/build.gradle.kts | 28 +++++++++++++++++++ .../api/src/main/AndroidManifest.xml | 17 +++++++++++ settings.gradle.kts | 1 + 5 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 feature/bookmarks/api/.gitignore create mode 100644 feature/bookmarks/api/build.gradle.kts create mode 100644 feature/bookmarks/api/src/main/AndroidManifest.xml diff --git a/app/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt b/app/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt index 54053a1bbf..be8976f90a 100644 --- a/app/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt +++ b/app/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt @@ -47,7 +47,7 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import javax.inject.Inject -import com.google.samples.apps.nowinandroid.feature.bookmarks.R as BookmarksR +import com.google.samples.apps.nowinandroid.feature.bookmarks.impl.R as BookmarksR import com.google.samples.apps.nowinandroid.feature.foryou.R as FeatureForyouR import com.google.samples.apps.nowinandroid.feature.search.R as FeatureSearchR import com.google.samples.apps.nowinandroid.feature.settings.R as SettingsR diff --git a/feature/bookmarks/api/.gitignore b/feature/bookmarks/api/.gitignore new file mode 100644 index 0000000000..42afabfd2a --- /dev/null +++ b/feature/bookmarks/api/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/feature/bookmarks/api/build.gradle.kts b/feature/bookmarks/api/build.gradle.kts new file mode 100644 index 0000000000..35287b9d71 --- /dev/null +++ b/feature/bookmarks/api/build.gradle.kts @@ -0,0 +1,28 @@ +/* + * Copyright 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +plugins { + alias(libs.plugins.nowinandroid.android.library) + alias(libs.plugins.kotlin.serialization) +} + +android { + namespace = "com.google.samples.apps.nowinandroid.feature.bookmarks.api" +} + +dependencies { + implementation(libs.kotlinx.serialization.json) +} diff --git a/feature/bookmarks/api/src/main/AndroidManifest.xml b/feature/bookmarks/api/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..90b5d04981 --- /dev/null +++ b/feature/bookmarks/api/src/main/AndroidManifest.xml @@ -0,0 +1,17 @@ + + + \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 014f86d322..b57455ad99 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -67,6 +67,7 @@ include(":core:ui") include(":feature:foryou") include(":feature:interests") +include(":feature:bookmarks:api") include(":feature:bookmarks:impl") include(":feature:topic") include(":feature:search") From f024e283f93623f0b4d75b10155c2bfa98c693e2 Mon Sep 17 00:00:00 2001 From: Don Turner Date: Tue, 1 Jul 2025 17:27:24 +0100 Subject: [PATCH 03/13] Add Nav3 dependencies, :core:navigation and NavDisplay --- app/build.gradle.kts | 1 + .../nowinandroid/navigation/NiaNavHost.kt | 63 ++++++++++++------- .../apps/nowinandroid/KotlinAndroid.kt | 2 +- core/navigation/.gitignore | 1 + core/navigation/build.gradle.kts | 27 ++++++++ gradle/libs.versions.toml | 12 +++- settings.gradle.kts | 1 + 7 files changed, 81 insertions(+), 26 deletions(-) create mode 100644 core/navigation/.gitignore create mode 100644 core/navigation/build.gradle.kts diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 53b9323315..9d43f184e7 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -78,6 +78,7 @@ dependencies { implementation(projects.feature.settings) implementation(projects.core.common) + implementation(projects.core.navigation) implementation(projects.core.ui) implementation(projects.core.designsystem) implementation(projects.core.data) diff --git a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt index 238844fb52..21e9d3d2d6 100644 --- a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt +++ b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt @@ -19,6 +19,11 @@ package com.google.samples.apps.nowinandroid.navigation import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.navigation.compose.NavHost +import androidx.navigation3.runtime.NavKey +import androidx.navigation3.runtime.entry +import androidx.navigation3.runtime.entryProvider +import androidx.navigation3.runtime.rememberNavBackStack +import androidx.navigation3.ui.NavDisplay import com.google.samples.apps.nowinandroid.feature.bookmarks.impl.navigation.bookmarksScreen import com.google.samples.apps.nowinandroid.feature.foryou.navigation.ForYouBaseRoute import com.google.samples.apps.nowinandroid.feature.foryou.navigation.forYouSection @@ -29,6 +34,7 @@ import com.google.samples.apps.nowinandroid.feature.topic.navigation.topicScreen import com.google.samples.apps.nowinandroid.navigation.TopLevelDestination.INTERESTS import com.google.samples.apps.nowinandroid.ui.NiaAppState import com.google.samples.apps.nowinandroid.ui.interests2pane.interestsListDetailScreen +import kotlinx.serialization.Serializable /** * Top-level navigation graph. Navigation is organized as explained at @@ -44,29 +50,38 @@ fun NiaNavHost( modifier: Modifier = Modifier, ) { val navController = appState.navController - NavHost( - navController = navController, - startDestination = ForYouBaseRoute, - modifier = modifier, - ) { - forYouSection( - onTopicClick = navController::navigateToTopic, - ) { - topicScreen( - showBackButton = true, - onBackClick = navController::popBackStack, - onTopicClick = navController::navigateToTopic, - ) + val backStack = rememberNavBackStack(LegacyRoute) + + NavDisplay(backStack = backStack, entryProvider = entryProvider { + entry { + NavHost( + navController = navController, + startDestination = ForYouBaseRoute, + modifier = modifier, + ) { + forYouSection( + onTopicClick = navController::navigateToTopic, + ) { + topicScreen( + showBackButton = true, + onBackClick = navController::popBackStack, + onTopicClick = navController::navigateToTopic, + ) + } + bookmarksScreen( + onTopicClick = navController::navigateToInterests, + onShowSnackbar = onShowSnackbar, + ) + searchScreen( + onBackClick = navController::popBackStack, + onInterestsClick = { appState.navigateToTopLevelDestination(INTERESTS) }, + onTopicClick = navController::navigateToInterests, + ) + interestsListDetailScreen() + } } - bookmarksScreen( - onTopicClick = navController::navigateToInterests, - onShowSnackbar = onShowSnackbar, - ) - searchScreen( - onBackClick = navController::popBackStack, - onInterestsClick = { appState.navigateToTopLevelDestination(INTERESTS) }, - onTopicClick = navController::navigateToInterests, - ) - interestsListDetailScreen() - } + }) } + +@Serializable +data object LegacyRoute : NavKey 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 5d396d2a49..79be8122fe 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 @@ -35,7 +35,7 @@ internal fun Project.configureKotlinAndroid( commonExtension: CommonExtension<*, *, *, *, *, *>, ) { commonExtension.apply { - compileSdk = 35 + compileSdk = 36 defaultConfig { minSdk = 21 diff --git a/core/navigation/.gitignore b/core/navigation/.gitignore new file mode 100644 index 0000000000..42afabfd2a --- /dev/null +++ b/core/navigation/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/core/navigation/build.gradle.kts b/core/navigation/build.gradle.kts new file mode 100644 index 0000000000..83cac9f46b --- /dev/null +++ b/core/navigation/build.gradle.kts @@ -0,0 +1,27 @@ +/* + * Copyright 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +plugins { + alias(libs.plugins.nowinandroid.android.library) +} + +android { + namespace = "com.google.samples.apps.nowinandroid.core.navigation" +} + +dependencies { + api(libs.androidx.navigation3.ui) + api(libs.androidx.navigation3.runtime) +} \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 477dde9165..9f96aaa305 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 = "8.9.0" +androidGradlePlugin = "8.9.3" androidTools = "31.9.0" androidxActivity = "1.9.3" androidxAppCompat = "1.7.0" @@ -21,6 +21,7 @@ androidxLintGradle = "1.0.0-alpha03" androidxMacroBenchmark = "1.3.4" androidxMetrics = "1.0.0-beta01" androidxNavigation = "2.8.5" +androidxNavigation3 = "1.0.0-alpha04" androidxProfileinstaller = "1.4.1" androidxTestCore = "1.6.1" androidxTestExt = "1.2.1" @@ -59,6 +60,9 @@ room = "2.6.1" secrets = "2.0.1" truth = "1.4.4" turbine = "1.2.0" +junit = "4.13.2" +junitVersion = "1.2.1" +material = "1.12.0" [bundles] androidx-compose-ui-test = ["androidx-compose-ui-test", "androidx-compose-ui-testManifest"] @@ -99,6 +103,8 @@ androidx-lint-gradle = { group = "androidx.lint", name = "lint-gradle", version. androidx-metrics = { group = "androidx.metrics", name = "metrics-performance", version.ref = "androidxMetrics" } androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "androidxNavigation" } androidx-navigation-testing = { group = "androidx.navigation", name = "navigation-testing", version.ref = "androidxNavigation" } +androidx-navigation3-runtime = { module = "androidx.navigation3:navigation3-runtime", version.ref = "androidxNavigation3" } +androidx-navigation3-ui = { module = "androidx.navigation3:navigation3-ui", version.ref = "androidxNavigation3" } androidx-profileinstaller = { group = "androidx.profileinstaller", name = "profileinstaller", version.ref = "androidxProfileinstaller" } androidx-test-core = { group = "androidx.test", name = "core", version.ref = "androidxTestCore" } androidx-test-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "androidxEspresso" } @@ -161,6 +167,9 @@ firebase-performance-gradlePlugin = { group = "com.google.firebase", name = "per kotlin-gradlePlugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" } ksp-gradlePlugin = { group = "com.google.devtools.ksp", name = "com.google.devtools.ksp.gradle.plugin", version.ref = "ksp" } room-gradlePlugin = { group = "androidx.room", name = "room-gradle-plugin", version.ref = "room" } +junit = { group = "junit", name = "junit", version.ref = "junit" } +androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } +material = { group = "com.google.android.material", name = "material", version.ref = "material" } [plugins] android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" } @@ -198,3 +207,4 @@ nowinandroid-android-room = { id = "nowinandroid.android.room" } nowinandroid-android-test = { id = "nowinandroid.android.test" } nowinandroid-hilt = { id = "nowinandroid.hilt" } nowinandroid-jvm-library = { id = "nowinandroid.jvm.library" } +kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } diff --git a/settings.gradle.kts b/settings.gradle.kts index b57455ad99..3a83fdd84a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -84,3 +84,4 @@ check(JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_17)) { https://developer.android.com/build/jdks#jdk-config-in-studio """.trimIndent() } +include(":core:navigation") From 995e1ab13dc2f681439970e1779100149fbeff3a Mon Sep 17 00:00:00 2001 From: Don Turner Date: Mon, 7 Jul 2025 15:14:01 +0100 Subject: [PATCH 04/13] Mirroring Nav2 back stack state --- .idea/codeStyles/Project.xml | 1 + app/build.gradle.kts | 1 + .../nowinandroid/navigation/NiaNavHost.kt | 74 ++++----- .../samples/apps/nowinandroid/ui/NiaApp.kt | 13 +- .../apps/nowinandroid/ui/NiaAppState.kt | 142 ++++++++++++++++++ .../src/main/kotlin/NavigationModule.kt | 20 +++ feature/bookmarks/api/build.gradle.kts | 1 + .../api/src/main/kotlin/BookmarksRoutes.kt | 21 +++ feature/bookmarks/impl/build.gradle.kts | 2 +- .../feature/bookmarks/impl/BookmarksScreen.kt | 2 +- 10 files changed, 236 insertions(+), 41 deletions(-) create mode 100644 core/navigation/src/main/kotlin/NavigationModule.kt create mode 100644 feature/bookmarks/api/src/main/kotlin/BookmarksRoutes.kt diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 6ef06e25a3..3fa0ef5697 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -12,6 +12,7 @@