From a059e426126d1db57cec2b4ef99149d0a5b82a5d Mon Sep 17 00:00:00 2001 From: Clara Fok Date: Mon, 11 Aug 2025 11:51:47 -0700 Subject: [PATCH] Update readme and build dependency graph --- app/build.gradle.kts | 1 - .../samples/apps/nowinandroid/MainActivity.kt | 4 +- .../apps/nowinandroid/di/BackStackProvider.kt | 4 +- .../nowinandroid/navigation/NiaNavDisplay.kt | 2 +- .../navigation/TopLevelDestination.kt | 8 +- .../samples/apps/nowinandroid/ui/NiaApp.kt | 2 +- .../apps/nowinandroid/ui/NiaAppState.kt | 5 +- .../ui/NiaAppScreenSizesScreenshotTests.kt | 4 +- .../apps/nowinandroid/ui/NiaAppStateTest.kt | 2 +- .../ui/SnackbarInsetsScreenshotTests.kt | 4 +- .../ui/SnackbarScreenshotTests.kt | 4 +- .../samples/apps/nowinandroid/ui/TestUtil.kt | 6 +- benchmarks/README.md | 3 + .../AndroidFeatureApiConventionPlugin.kt | 1 - core/navigation/README.md | 3 + core/navigation/build.gradle.kts | 16 + .../navigation/NiaBackStackViewModelTest.kt | 53 +-- .../core/navigation/NiaBackStack.kt | 12 +- .../core/navigation/NiaBackStackViewModel.kt | 7 +- .../core/navigation/NiaBackStackTest.kt | 63 ++-- docs/images/graphs/dep_graph_app.svg | 305 ------------------ .../graphs/dep_graph_app_nia_catalog.svg | 45 --- .../graphs/dep_graph_core_analytics.svg | 9 - docs/images/graphs/dep_graph_core_common.svg | 9 - docs/images/graphs/dep_graph_core_data.svg | 97 ------ .../graphs/dep_graph_core_data_test.svg | 105 ------ .../images/graphs/dep_graph_core_database.svg | 17 - .../graphs/dep_graph_core_datastore.svg | 33 -- .../graphs/dep_graph_core_datastore_proto.svg | 9 - .../graphs/dep_graph_core_datastore_test.svg | 45 --- .../graphs/dep_graph_core_designsystem.svg | 9 - docs/images/graphs/dep_graph_core_domain.svg | 109 ------- docs/images/graphs/dep_graph_core_model.svg | 9 - .../graphs/dep_graph_core_navigation.svg | 0 docs/images/graphs/dep_graph_core_network.svg | 25 -- .../graphs/dep_graph_core_notifications.svg | 25 -- .../dep_graph_core_screenshot_testing.svg | 17 - docs/images/graphs/dep_graph_core_testing.svg | 121 ------- docs/images/graphs/dep_graph_core_ui.svg | 33 -- .../dep_graph_feature_bookmarks_api.svg | 0 .../dep_graph_feature_bookmarks_impl.svg | 0 .../graphs/dep_graph_feature_foryou_api.svg | 0 .../graphs/dep_graph_feature_foryou_impl.svg | 0 .../dep_graph_feature_interests_api.svg | 0 .../dep_graph_feature_interests_impl.svg | 0 .../graphs/dep_graph_feature_search_api.svg | 0 .../graphs/dep_graph_feature_search_impl.svg | 0 .../graphs/dep_graph_feature_settings_api.svg | 0 .../graphs/dep_graph_feature_topic_api.svg | 0 .../graphs/dep_graph_feature_topic_impl.svg | 0 docs/images/graphs/dep_graph_lint.svg | 0 .../graphs/dep_graph_sync_sync_test.svg | 121 ------- docs/images/graphs/dep_graph_sync_work.svg | 109 ------- .../dep_graph_ui_test_hilt_manifest.svg | 0 feature/bookmarks/api/README.md | 3 + ...okmarksNavigation.kt => BookmarksRoute.kt} | 2 +- feature/bookmarks/impl/README.md | 3 + .../impl/navigation/BookmarksEntryProvider.kt | 4 +- .../navigation/BookmarksSerializerModule.kt | 2 +- feature/foryou/api/README.md | 3 + .../{ForYouNavigation.kt => ForYouRoute.kt} | 2 +- feature/foryou/impl/README.md | 3 + feature/foryou/impl/build.gradle.kts | 1 - .../feature/foryou/impl/ForYouScreenTest.kt | 18 +- .../impl/navigation/ForYouEntryProvider.kt | 6 +- .../navigation/ForYouRouteSerializerModule.kt | 4 +- feature/interests/api/README.md | 3 + ...terestsNavigation.kt => InterestsRoute.kt} | 4 +- ...e_interests_api_ic_detail_placeholder.xml} | 4 +- .../api/src/main/res/values/strings.xml | 1 + feature/interests/impl/README.md | 3 + feature/interests/impl/build.gradle.kts | 1 - .../impl/InterestsDetailPlaceholder.kt} | 11 +- .../interests/impl/InterestsViewModel.kt | 2 +- .../feature/interests/impl/TabContent.kt | 6 +- .../impl/navigation/InterestsEntryProvider.kt | 14 +- .../navigation/InterestsSerializerModule.kt | 2 +- .../impl/InterestsListDetailScreenTest.kt | 18 +- .../interests/impl/InterestsViewModelTest.kt | 3 +- feature/search/api/README.md | 3 + .../{SearchNavigation.kt => SearchRoute.kt} | 4 +- feature/search/impl/README.md | 3 + feature/search/impl/build.gradle.kts | 1 - .../impl/navigation/SearchEntryProvider.kt | 4 +- feature/settings/api/README.md | 3 + .../settings/api/src/main/AndroidManifest.xml | 28 +- feature/topic/api/README.md | 3 + feature/topic/api/build.gradle.kts | 8 - .../{TopicNavigation.kt => TopicRoute.kt} | 4 +- .../api/navigation/TopicSerializerModule.kt | 2 +- .../topic/api/src/main/res/values/strings.xml | 1 - feature/topic/impl/README.md | 3 + feature/topic/impl/build.gradle.kts | 28 +- .../feature/topic/impl}/TopicScreenTest.kt | 3 +- .../feature/topic/impl}/TopicScreen.kt | 9 +- .../feature/topic/impl}/TopicViewModel.kt | 2 +- .../impl/navigation/TopicEntryProvider.kt | 12 +- .../feature/topic/impl}/TopicViewModelTest.kt | 2 +- lint/README.md | 3 + ui-test-hilt-manifest/README.md | 3 + 100 files changed, 265 insertions(+), 1443 deletions(-) create mode 100644 benchmarks/README.md create mode 100644 core/navigation/README.md create mode 100644 docs/images/graphs/dep_graph_core_navigation.svg create mode 100644 docs/images/graphs/dep_graph_feature_bookmarks_api.svg create mode 100644 docs/images/graphs/dep_graph_feature_bookmarks_impl.svg create mode 100644 docs/images/graphs/dep_graph_feature_foryou_api.svg create mode 100644 docs/images/graphs/dep_graph_feature_foryou_impl.svg create mode 100644 docs/images/graphs/dep_graph_feature_interests_api.svg create mode 100644 docs/images/graphs/dep_graph_feature_interests_impl.svg create mode 100644 docs/images/graphs/dep_graph_feature_search_api.svg create mode 100644 docs/images/graphs/dep_graph_feature_search_impl.svg create mode 100644 docs/images/graphs/dep_graph_feature_settings_api.svg create mode 100644 docs/images/graphs/dep_graph_feature_topic_api.svg create mode 100644 docs/images/graphs/dep_graph_feature_topic_impl.svg create mode 100644 docs/images/graphs/dep_graph_lint.svg create mode 100644 docs/images/graphs/dep_graph_ui_test_hilt_manifest.svg create mode 100644 feature/bookmarks/api/README.md rename feature/bookmarks/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/api/navigation/{BookmarksNavigation.kt => BookmarksRoute.kt} (96%) create mode 100644 feature/bookmarks/impl/README.md create mode 100644 feature/foryou/api/README.md rename feature/foryou/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/api/navigation/{ForYouNavigation.kt => ForYouRoute.kt} (93%) create mode 100644 feature/foryou/impl/README.md create mode 100644 feature/interests/api/README.md rename feature/interests/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/api/navigation/{InterestsNavigation.kt => InterestsRoute.kt} (98%) rename feature/{topic/api/src/main/res/drawable/feature_topic_api_ic_topic_placeholder.xml => interests/api/src/main/res/drawable/feature_interests_api_ic_detail_placeholder.xml} (97%) create mode 100644 feature/interests/impl/README.md rename feature/{topic/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/api/TopicDetailPlaceholder.kt => interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/InterestsDetailPlaceholder.kt} (86%) create mode 100644 feature/search/api/README.md rename feature/search/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/search/api/navigation/{SearchNavigation.kt => SearchRoute.kt} (96%) create mode 100644 feature/search/impl/README.md create mode 100644 feature/settings/api/README.md create mode 100644 feature/topic/api/README.md rename feature/topic/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/api/navigation/{TopicNavigation.kt => TopicRoute.kt} (95%) create mode 100644 feature/topic/impl/README.md rename feature/topic/{api/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/feature/topic/api => impl/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl}/TopicScreenTest.kt (97%) rename feature/topic/{api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/api => impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl}/TopicScreen.kt (97%) rename feature/topic/{api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/api => impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl}/TopicViewModel.kt (98%) rename feature/topic/{api/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/topic/api => impl/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl}/TopicViewModelTest.kt (99%) create mode 100644 lint/README.md create mode 100644 ui-test-hilt-manifest/README.md diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c8a5a3180..0dade6da5 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -85,7 +85,6 @@ dependencies { implementation(projects.core.data) implementation(projects.core.model) implementation(projects.core.analytics) - implementation(projects.core.navigation) implementation(projects.sync.work) implementation(libs.androidx.activity.compose) diff --git a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/MainActivity.kt b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/MainActivity.kt index d4a1f9cce..71b50e799 100644 --- a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/MainActivity.kt +++ b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/MainActivity.kt @@ -41,9 +41,9 @@ 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.designsystem.theme.NiaTheme -import com.google.samples.apps.nowinandroid.core.ui.LocalTimeZone import com.google.samples.apps.nowinandroid.core.navigation.NiaBackStackViewModel import com.google.samples.apps.nowinandroid.core.navigation.NiaNavKey +import com.google.samples.apps.nowinandroid.core.ui.LocalTimeZone import com.google.samples.apps.nowinandroid.ui.NiaApp import com.google.samples.apps.nowinandroid.ui.rememberNiaAppState import com.google.samples.apps.nowinandroid.util.isSystemInDarkTheme @@ -160,7 +160,7 @@ class MainActivity : ComponentActivity() { ) { NiaApp( appState, - entryProviderBuilders + entryProviderBuilders, ) } } diff --git a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/di/BackStackProvider.kt b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/di/BackStackProvider.kt index fddc532a6..998d60ce9 100644 --- a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/di/BackStackProvider.kt +++ b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/di/BackStackProvider.kt @@ -44,8 +44,8 @@ object BackStackProvider { @Provides @Singleton fun provideSerializersModule( - polymorphicModuleBuilders: Set<@JvmSuppressWildcards PolymorphicModuleBuilder.() -> Unit> - ) : SerializersModule = SerializersModule { + polymorphicModuleBuilders: Set<@JvmSuppressWildcards PolymorphicModuleBuilder.() -> Unit>, + ): SerializersModule = SerializersModule { polymorphic(NiaNavKey::class) { polymorphicModuleBuilders.forEach { it() } } diff --git a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/NiaNavDisplay.kt b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/NiaNavDisplay.kt index 726c6766d..da4461a84 100644 --- a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/NiaNavDisplay.kt +++ b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/NiaNavDisplay.kt @@ -51,4 +51,4 @@ fun NiaNavDisplay( } }, ) -} \ No newline at end of file +} 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 f3c9c73f8..ea5fdb345 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 @@ -49,7 +49,7 @@ enum class TopLevelDestination( @StringRes val iconTextId: Int, @StringRes val titleTextId: Int, val route: KClass<*>, - val key: NiaNavKey + val key: NiaNavKey, ) { FOR_YOU( selectedIcon = NiaIcons.Upcoming, @@ -57,7 +57,7 @@ enum class TopLevelDestination( iconTextId = forYouR.string.feature_foryou_api_title, titleTextId = R.string.app_name, route = ForYouRoute::class, - key = ForYouRoute + key = ForYouRoute, ), BOOKMARKS( selectedIcon = NiaIcons.Bookmarks, @@ -65,7 +65,7 @@ enum class TopLevelDestination( iconTextId = bookmarksR.string.feature_bookmarks_api_title, titleTextId = bookmarksR.string.feature_bookmarks_api_title, route = BookmarksRoute::class, - key = BookmarksRoute + key = BookmarksRoute, ), INTERESTS( selectedIcon = NiaIcons.Grid3x3, @@ -73,7 +73,7 @@ enum class TopLevelDestination( iconTextId = searchR.string.feature_search_api_interests, titleTextId = searchR.string.feature_search_api_interests, route = InterestsRoute::class, - key = InterestsRoute(null) + key = InterestsRoute(null), ), } diff --git a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaApp.kt b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaApp.kt index 8257c47d6..c15797879 100644 --- a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaApp.kt +++ b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaApp.kt @@ -271,4 +271,4 @@ private fun Modifier.notificationDot(): Modifier = ), ) } - } \ No newline at end of file + } 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 725ef9f60..7e3d8eb68 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 @@ -18,7 +18,6 @@ package com.google.samples.apps.nowinandroid.ui import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.snapshotFlow @@ -125,6 +124,6 @@ private fun NavigationTrackingSideEffect(niaBackStack: NiaBackStack) { val stack = niaBackStack.backStack.toList() metricsHolder.state?.putState("Navigation", stack.lastOrNull().toString()) } - onDispose { } + onDispose { } } -} \ No newline at end of file +} diff --git a/app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppScreenSizesScreenshotTests.kt b/app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppScreenSizesScreenshotTests.kt index a70209e9a..e463fb439 100644 --- a/app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppScreenSizesScreenshotTests.kt +++ b/app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppScreenSizesScreenshotTests.kt @@ -125,7 +125,7 @@ class NiaAppScreenSizesScreenshotTests { networkMonitor = networkMonitor, userNewsResourceRepository = userNewsResourceRepository, timeZoneMonitor = timeZoneMonitor, - niaBackStack = mockNiaBackStack() + niaBackStack = mockNiaBackStack(), ) NiaApp( fakeAppState, @@ -230,4 +230,4 @@ class NiaAppScreenSizesScreenshotTests { "expandedWidth_expandedHeight_showsNavigationRail", ) } -} \ No newline at end of file +} diff --git a/app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt b/app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt index 44ad77f74..2c67c1dc1 100644 --- a/app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt +++ b/app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt @@ -145,4 +145,4 @@ class NiaAppStateTest { state.currentTimeZone.value, ) } -} \ No newline at end of file +} diff --git a/app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/SnackbarInsetsScreenshotTests.kt b/app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/SnackbarInsetsScreenshotTests.kt index 36bd81db5..b20a8e5a6 100644 --- a/app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/SnackbarInsetsScreenshotTests.kt +++ b/app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/SnackbarInsetsScreenshotTests.kt @@ -213,7 +213,7 @@ class SnackbarInsetsScreenshotTests { CompositionLocalProvider( // Replaces images with placeholders LocalInspectionMode provides true, - LocalSnackbarHostState provides snackbarHostState + LocalSnackbarHostState provides snackbarHostState, ) { scope = rememberCoroutineScope() @@ -250,7 +250,7 @@ class SnackbarInsetsScreenshotTests { networkMonitor = networkMonitor, userNewsResourceRepository = userNewsResourceRepository, timeZoneMonitor = timeZoneMonitor, - niaBackStack = mockNiaBackStack() + niaBackStack = mockNiaBackStack(), ) NiaApp( appState = appState, diff --git a/app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/SnackbarScreenshotTests.kt b/app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/SnackbarScreenshotTests.kt index 7b321645a..bc538d494 100644 --- a/app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/SnackbarScreenshotTests.kt +++ b/app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/SnackbarScreenshotTests.kt @@ -186,7 +186,7 @@ class SnackbarScreenshotTests { CompositionLocalProvider( // Replaces images with placeholders LocalInspectionMode provides true, - LocalSnackbarHostState provides snackbarHostState + LocalSnackbarHostState provides snackbarHostState, ) { scope = rememberCoroutineScope() @@ -200,7 +200,7 @@ class SnackbarScreenshotTests { networkMonitor = networkMonitor, userNewsResourceRepository = userNewsResourceRepository, timeZoneMonitor = timeZoneMonitor, - niaBackStack = mockNiaBackStack() + niaBackStack = mockNiaBackStack(), ) NiaApp( appState = appState, diff --git a/app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/TestUtil.kt b/app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/TestUtil.kt index 0be35b806..a92b5a387 100644 --- a/app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/TestUtil.kt +++ b/app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/TestUtil.kt @@ -26,12 +26,12 @@ import com.google.samples.apps.nowinandroid.feature.foryou.impl.ForYouScreen val MockEntryProvider: Set.() -> Unit> = setOf( { - entry{ + entry { ForYouScreen({}) } }, -) + ) private val startKey = ForYouRoute -fun mockNiaBackStack() = NiaBackStack(startKey) \ No newline at end of file +fun mockNiaBackStack() = NiaBackStack(startKey) diff --git a/benchmarks/README.md b/benchmarks/README.md new file mode 100644 index 000000000..4551a1e9c --- /dev/null +++ b/benchmarks/README.md @@ -0,0 +1,3 @@ +# :benchmarks module +## Dependency graph +![Dependency graph](../docs/images/graphs/dep_graph_benchmarks.svg) diff --git a/build-logic/convention/src/main/kotlin/AndroidFeatureApiConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidFeatureApiConventionPlugin.kt index ca46cac19..969cf96d4 100644 --- a/build-logic/convention/src/main/kotlin/AndroidFeatureApiConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidFeatureApiConventionPlugin.kt @@ -28,7 +28,6 @@ class AndroidFeatureApiConventionPlugin : Plugin { dependencies { "api"(project(":core:navigation")) - "implementation"(project(":core:data")) } } } diff --git a/core/navigation/README.md b/core/navigation/README.md new file mode 100644 index 000000000..7cd3b7e9f --- /dev/null +++ b/core/navigation/README.md @@ -0,0 +1,3 @@ +# :core:navigation module +## Dependency graph +![Dependency graph](../../docs/images/graphs/dep_graph_core_navigation.svg) diff --git a/core/navigation/build.gradle.kts b/core/navigation/build.gradle.kts index 81d0fbbd4..abc59d239 100644 --- a/core/navigation/build.gradle.kts +++ b/core/navigation/build.gradle.kts @@ -1,3 +1,19 @@ +/* + * 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.nowinandroid.hilt) diff --git a/core/navigation/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/core/navigation/NiaBackStackViewModelTest.kt b/core/navigation/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/core/navigation/NiaBackStackViewModelTest.kt index 5eb03ec77..7007d1abf 100644 --- a/core/navigation/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/core/navigation/NiaBackStackViewModelTest.kt +++ b/core/navigation/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/core/navigation/NiaBackStackViewModelTest.kt @@ -42,7 +42,6 @@ class NiaBackStackViewModelTest { subclass(TestTopLevelKeySecond::class, TestTopLevelKeySecond.serializer()) subclass(TestKeyFirst::class, TestKeyFirst.serializer()) subclass(TestKeySecond::class, TestKeySecond.serializer()) - } } @@ -57,7 +56,8 @@ class NiaBackStackViewModelTest { rule.setContent { val viewModel = createViewModel() assertThat(viewModel.backStackMap).containsEntry( - TestStartKey, mutableListOf(TestStartKey), + TestStartKey, + mutableListOf(TestStartKey), ) } } @@ -72,7 +72,8 @@ class NiaBackStackViewModelTest { } assertThat(viewModel.backStackMap).containsEntry( - TestStartKey, mutableListOf(TestStartKey, TestKeyFirst), + TestStartKey, + mutableListOf(TestStartKey, TestKeyFirst), ) } @@ -87,8 +88,10 @@ class NiaBackStackViewModelTest { } assertThat(viewModel.backStackMap).containsExactly( - TestStartKey, mutableListOf(TestStartKey, TestKeyFirst), - TestTopLevelKeyFirst, mutableListOf(TestTopLevelKeyFirst), + TestStartKey, + mutableListOf(TestStartKey, TestKeyFirst), + TestTopLevelKeyFirst, + mutableListOf(TestTopLevelKeyFirst), ).inOrder() } @@ -102,8 +105,10 @@ class NiaBackStackViewModelTest { } assertThat(viewModel.backStackMap).containsExactly( - TestStartKey, mutableListOf(TestStartKey, TestKeyFirst), - TestTopLevelKeyFirst, mutableListOf(TestTopLevelKeyFirst, TestKeySecond), + TestStartKey, + mutableListOf(TestStartKey, TestKeyFirst), + TestTopLevelKeyFirst, + mutableListOf(TestTopLevelKeyFirst, TestKeySecond), ).inOrder() } @@ -115,12 +120,14 @@ class NiaBackStackViewModelTest { backStack.navigate(TestKeyFirst) assertThat(viewModel.backStackMap).containsExactly( - TestStartKey, mutableListOf(TestStartKey, TestKeyFirst), + TestStartKey, + mutableListOf(TestStartKey, TestKeyFirst), ) backStack.popLast() assertThat(viewModel.backStackMap).containsExactly( - TestStartKey, mutableListOf(TestStartKey), + TestStartKey, + mutableListOf(TestStartKey), ) } } @@ -141,7 +148,8 @@ class NiaBackStackViewModelTest { rule.runOnIdle { scenario.viewModel.niaBackStack.navigate(TestKeyFirst) assertThat(scenario.viewModel.niaBackStack.backStack).containsExactly( - TestStartKey, TestKeyFirst, + TestStartKey, + TestKeyFirst, ).inOrder() } @@ -149,7 +157,8 @@ class NiaBackStackViewModelTest { rule.runOnIdle { assertThat(scenario.viewModel.niaBackStack.backStack).containsExactly( - TestStartKey, TestKeyFirst, + TestStartKey, + TestKeyFirst, ).inOrder() } } @@ -173,7 +182,10 @@ class NiaBackStackViewModelTest { scenario.viewModel.niaBackStack.navigate(TestKeySecond) assertThat(scenario.viewModel.niaBackStack.backStack).containsExactly( - TestStartKey, TestKeyFirst, TestTopLevelKeyFirst, TestKeySecond, + TestStartKey, + TestKeyFirst, + TestTopLevelKeyFirst, + TestKeySecond, ).inOrder() } @@ -181,38 +193,41 @@ class NiaBackStackViewModelTest { rule.runOnIdle { assertThat(scenario.viewModel.niaBackStack.backStack).containsExactly( - TestStartKey, TestKeyFirst, TestTopLevelKeyFirst, TestKeySecond, + TestStartKey, + TestKeyFirst, + TestTopLevelKeyFirst, + TestKeySecond, ).inOrder() } } } @Serializable -private object TestStartKey: NiaNavKey { +private object TestStartKey : NiaNavKey { override val isTopLevel: Boolean get() = true } @Serializable -private object TestTopLevelKeyFirst: NiaNavKey { +private object TestTopLevelKeyFirst : NiaNavKey { override val isTopLevel: Boolean get() = true } @Serializable -private object TestTopLevelKeySecond: NiaNavKey { +private object TestTopLevelKeySecond : NiaNavKey { override val isTopLevel: Boolean get() = true } @Serializable -private object TestKeyFirst: NiaNavKey { +private object TestKeyFirst : NiaNavKey { override val isTopLevel: Boolean get() = false } @Serializable -private object TestKeySecond: NiaNavKey { +private object TestKeySecond : NiaNavKey { override val isTopLevel: Boolean get() = false -} \ No newline at end of file +} diff --git a/core/navigation/src/main/kotlin/com/google/samples/apps/nowinandroid/core/navigation/NiaBackStack.kt b/core/navigation/src/main/kotlin/com/google/samples/apps/nowinandroid/core/navigation/NiaBackStack.kt index 7fc6961eb..82a7bb1c9 100644 --- a/core/navigation/src/main/kotlin/com/google/samples/apps/nowinandroid/core/navigation/NiaBackStack.kt +++ b/core/navigation/src/main/kotlin/com/google/samples/apps/nowinandroid/core/navigation/NiaBackStack.kt @@ -24,7 +24,6 @@ import androidx.compose.runtime.snapshots.SnapshotStateList import org.jetbrains.annotations.VisibleForTesting import kotlin.collections.mutableListOf - // TODO refine back behavior - perhaps take a lambda so that each screen / use site can customize back behavior? // https://github.com/android/nowinandroid/issues/1934 class NiaBackStack( @@ -32,10 +31,9 @@ class NiaBackStack( ) { internal var backStackMap: LinkedHashMap> = linkedMapOf( - startKey to mutableListOf(startKey) + startKey to mutableListOf(startKey), ) - @VisibleForTesting val backStack: SnapshotStateList = mutableStateListOf(startKey) @@ -58,11 +56,10 @@ class NiaBackStack( val tempStack = mapOf(startKey to backStackMap[startKey]!!) backStackMap.clear() backStackMap.putAll(tempStack) - // else either restore an existing substack or initiate new one + // else either restore an existing substack or initiate new one } else { backStackMap[key] = backStackMap.remove(key) ?: mutableListOf(key) } - } // not top level - add to current substack else -> { @@ -73,7 +70,6 @@ class NiaBackStack( } currentStack.add(key) } - } updateBackStack() } @@ -105,7 +101,7 @@ class NiaBackStack( backStack.apply { clear() backStack.addAll( - backStackMap.flatMap { it.value } + backStackMap.flatMap { it.value }, ) } @@ -128,4 +124,4 @@ private fun popErrorMessage(count: Int, lastPopped: NiaNavKey) = """ Failed to pop $count entries. BackStack has been popped to an empty stack. Last popped key is $lastPopped. - """.trimIndent() \ No newline at end of file + """.trimIndent() diff --git a/core/navigation/src/main/kotlin/com/google/samples/apps/nowinandroid/core/navigation/NiaBackStackViewModel.kt b/core/navigation/src/main/kotlin/com/google/samples/apps/nowinandroid/core/navigation/NiaBackStackViewModel.kt index d14d3f65e..097b79967 100644 --- a/core/navigation/src/main/kotlin/com/google/samples/apps/nowinandroid/core/navigation/NiaBackStackViewModel.kt +++ b/core/navigation/src/main/kotlin/com/google/samples/apps/nowinandroid/core/navigation/NiaBackStackViewModel.kt @@ -23,20 +23,20 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.serialization.saved import androidx.lifecycle.viewModelScope import androidx.savedstate.serialization.SavedStateConfiguration -import javax.inject.Inject import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.serialization.builtins.MapSerializer import kotlinx.serialization.modules.SerializersModule import kotlinx.serialization.serializer +import javax.inject.Inject @HiltViewModel class NiaBackStackViewModel @Inject constructor( savedStateHandle: SavedStateHandle, val niaBackStack: NiaBackStack, serializersModules: SerializersModule, -): ViewModel() { +) : ViewModel() { private val config = SavedStateConfiguration { serializersModule = serializersModules } @@ -53,11 +53,10 @@ class NiaBackStackViewModel @Inject constructor( // Restore backstack from saved state handle if not emtpy @Suppress("UNCHECKED_CAST") niaBackStack.restore( - backStackMap as LinkedHashMap> + backStackMap as LinkedHashMap>, ) } - // Start observing changes to the backStack and save backStack whenever it updates viewModelScope.launch { snapshotFlow { diff --git a/core/navigation/src/test/kotlin/com/google/samples/apps/nowinandroid/core/navigation/NiaBackStackTest.kt b/core/navigation/src/test/kotlin/com/google/samples/apps/nowinandroid/core/navigation/NiaBackStackTest.kt index 18201c47d..2a87024f9 100644 --- a/core/navigation/src/test/kotlin/com/google/samples/apps/nowinandroid/core/navigation/NiaBackStackTest.kt +++ b/core/navigation/src/test/kotlin/com/google/samples/apps/nowinandroid/core/navigation/NiaBackStackTest.kt @@ -57,13 +57,15 @@ class NiaBackStackTest { niaBackStack.navigate(TestKeyFirst) assertThat(niaBackStack.backStack).containsExactly( - TestStartKey, TestKeyFirst + TestStartKey, + TestKeyFirst, ).inOrder() niaBackStack.navigate(TestKeyFirst) assertThat(niaBackStack.backStack).containsExactly( - TestStartKey, TestKeyFirst + TestStartKey, + TestKeyFirst, ).inOrder() } @@ -73,13 +75,16 @@ class NiaBackStackTest { niaBackStack.navigate(TestKeyFirst) assertThat(niaBackStack.backStack).containsExactly( - TestStartKey, TestTopLevelKey, TestKeyFirst + TestStartKey, + TestTopLevelKey, + TestKeyFirst, ).inOrder() niaBackStack.navigate(TestTopLevelKey) assertThat(niaBackStack.backStack).containsExactly( - TestStartKey, TestTopLevelKey + TestStartKey, + TestTopLevelKey, ).inOrder() } @@ -130,12 +135,15 @@ class NiaBackStackTest { niaBackStack.restore( linkedMapOf( TestStartKey to mutableListOf(TestStartKey, TestKeyFirst), - TestTopLevelKey to mutableListOf(TestTopLevelKey, TestKeySecond) - ) + TestTopLevelKey to mutableListOf(TestTopLevelKey, TestKeySecond), + ), ) assertThat(niaBackStack.backStack).containsExactly( - TestStartKey, TestKeyFirst, TestTopLevelKey, TestKeySecond + TestStartKey, + TestKeyFirst, + TestTopLevelKey, + TestKeySecond, ).inOrder() assertThat(niaBackStack.currentKey).isEqualTo(TestKeySecond) @@ -148,13 +156,16 @@ class NiaBackStackTest { niaBackStack.navigate(TestKeySecond) assertThat(niaBackStack.backStack).containsExactly( - TestStartKey, TestKeyFirst, TestKeySecond + TestStartKey, + TestKeyFirst, + TestKeySecond, ).inOrder() niaBackStack.popLast() assertThat(niaBackStack.backStack).containsExactly( - TestStartKey, TestKeyFirst + TestStartKey, + TestKeyFirst, ).inOrder() assertThat(niaBackStack.currentKey).isEqualTo(TestKeyFirst) @@ -167,7 +178,9 @@ class NiaBackStackTest { niaBackStack.navigate(TestTopLevelKey) assertThat(niaBackStack.backStack).containsExactly( - TestStartKey, TestKeyFirst, TestTopLevelKey + TestStartKey, + TestKeyFirst, + TestTopLevelKey, ).inOrder() assertThat(niaBackStack.currentKey).isEqualTo(TestTopLevelKey) @@ -177,7 +190,8 @@ class NiaBackStackTest { niaBackStack.popLast() assertThat(niaBackStack.backStack).containsExactly( - TestStartKey, TestKeyFirst + TestStartKey, + TestKeyFirst, ).inOrder() assertThat(niaBackStack.currentKey).isEqualTo(TestKeyFirst) @@ -190,13 +204,15 @@ class NiaBackStackTest { niaBackStack.navigate(TestKeySecond) assertThat(niaBackStack.backStack).containsExactly( - TestStartKey, TestKeyFirst, TestKeySecond + TestStartKey, + TestKeyFirst, + TestKeySecond, ).inOrder() niaBackStack.popLast(2) assertThat(niaBackStack.backStack).containsExactly( - TestStartKey + TestStartKey, ).inOrder() assertThat(niaBackStack.currentKey).isEqualTo(TestStartKey) @@ -205,7 +221,7 @@ class NiaBackStackTest { @Test fun popMultipleTopLevel() { - val TestTopLevelKeyTwo = object: NiaNavKey { + val testTopLevelKeyTwo = object : NiaNavKey { override val isTopLevel: Boolean get() = true } @@ -214,17 +230,21 @@ class NiaBackStackTest { niaBackStack.navigate(TestTopLevelKey) niaBackStack.navigate(TestKeyFirst) // third sub-stack - niaBackStack.navigate(TestTopLevelKeyTwo) + niaBackStack.navigate(testTopLevelKeyTwo) niaBackStack.navigate(TestKeySecond) assertThat(niaBackStack.backStack).containsExactly( - TestStartKey, TestTopLevelKey, TestKeyFirst, TestTopLevelKeyTwo, TestKeySecond, + TestStartKey, + TestTopLevelKey, + TestKeyFirst, + testTopLevelKeyTwo, + TestKeySecond, ).inOrder() niaBackStack.popLast(4) assertThat(niaBackStack.backStack).containsExactly( - TestStartKey + TestStartKey, ).inOrder() assertThat(niaBackStack.currentKey).isEqualTo(TestStartKey) @@ -239,23 +259,22 @@ class NiaBackStackTest { } } -private object TestStartKey: NiaNavKey { +private object TestStartKey : NiaNavKey { override val isTopLevel: Boolean get() = true } -private object TestTopLevelKey: NiaNavKey { +private object TestTopLevelKey : NiaNavKey { override val isTopLevel: Boolean get() = true } -private object TestKeyFirst: NiaNavKey { +private object TestKeyFirst : NiaNavKey { override val isTopLevel: Boolean get() = false } -private object TestKeySecond: NiaNavKey { +private object TestKeySecond : NiaNavKey { override val isTopLevel: Boolean get() = false } - diff --git a/docs/images/graphs/dep_graph_app.svg b/docs/images/graphs/dep_graph_app.svg index 8e5d9d429..e69de29bb 100644 --- a/docs/images/graphs/dep_graph_app.svg +++ b/docs/images/graphs/dep_graph_app.svg @@ -1,305 +0,0 @@ - - - - - - :app - - - - :feature:interests - - - - - - - - :feature:foryou - - - - - - - - :feature:bookmarks - - - - - - - - :feature:topic - - - - - - - - :feature:search - - - - - - - - :feature:settings - - - - - - - - :core:common - - - - - - - - :core:ui - - - - - - - - :core:designsystem - - - - - - - - :core:data - - - - - - - - :core:model - - - - - - - - :core:analytics - - - - - - - - :sync:work - - - - - - - - - - - - - - - - - - - - :core:domain - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - :core:database - - - - - - - - :core:datastore - - - - - - - - :core:network - - - - - - - - :core:notifications - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - :core:datastore-proto - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/images/graphs/dep_graph_app_nia_catalog.svg b/docs/images/graphs/dep_graph_app_nia_catalog.svg index 151ee63ad..e69de29bb 100644 --- a/docs/images/graphs/dep_graph_app_nia_catalog.svg +++ b/docs/images/graphs/dep_graph_app_nia_catalog.svg @@ -1,45 +0,0 @@ - - - - - - :app-nia-catalog - - - - :core:designsystem - - - - - - - - :core:ui - - - - - - - - - - - - :core:analytics - - - - - - - - :core:model - - - - - - - diff --git a/docs/images/graphs/dep_graph_core_analytics.svg b/docs/images/graphs/dep_graph_core_analytics.svg index 45f1c1eb0..e69de29bb 100644 --- a/docs/images/graphs/dep_graph_core_analytics.svg +++ b/docs/images/graphs/dep_graph_core_analytics.svg @@ -1,9 +0,0 @@ - - - - - - :core:analytics - - - diff --git a/docs/images/graphs/dep_graph_core_common.svg b/docs/images/graphs/dep_graph_core_common.svg index 91033eaa0..e69de29bb 100644 --- a/docs/images/graphs/dep_graph_core_common.svg +++ b/docs/images/graphs/dep_graph_core_common.svg @@ -1,9 +0,0 @@ - - - - - - :core:common - - - diff --git a/docs/images/graphs/dep_graph_core_data.svg b/docs/images/graphs/dep_graph_core_data.svg index ab91bafb2..e69de29bb 100644 --- a/docs/images/graphs/dep_graph_core_data.svg +++ b/docs/images/graphs/dep_graph_core_data.svg @@ -1,97 +0,0 @@ - - - - - - :core:data - - - - :core:common - - - - - - - - :core:database - - - - - - - - :core:datastore - - - - - - - - :core:network - - - - - - - - :core:analytics - - - - - - - - :core:notifications - - - - - - - - :core:model - - - - - - - - - - - - - - - - :core:datastore-proto - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/images/graphs/dep_graph_core_data_test.svg b/docs/images/graphs/dep_graph_core_data_test.svg index b9736c859..e69de29bb 100644 --- a/docs/images/graphs/dep_graph_core_data_test.svg +++ b/docs/images/graphs/dep_graph_core_data_test.svg @@ -1,105 +0,0 @@ - - - - - - :core:data-test - - - - :core:data - - - - - - - - :core:common - - - - - - - - :core:database - - - - - - - - :core:datastore - - - - - - - - :core:network - - - - - - - - :core:analytics - - - - - - - - :core:notifications - - - - - - - - :core:model - - - - - - - - - - - - - - - - :core:datastore-proto - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/images/graphs/dep_graph_core_database.svg b/docs/images/graphs/dep_graph_core_database.svg index e82d46436..e69de29bb 100644 --- a/docs/images/graphs/dep_graph_core_database.svg +++ b/docs/images/graphs/dep_graph_core_database.svg @@ -1,17 +0,0 @@ - - - - - - :core:database - - - - :core:model - - - - - - - diff --git a/docs/images/graphs/dep_graph_core_datastore.svg b/docs/images/graphs/dep_graph_core_datastore.svg index f7502e55b..e69de29bb 100644 --- a/docs/images/graphs/dep_graph_core_datastore.svg +++ b/docs/images/graphs/dep_graph_core_datastore.svg @@ -1,33 +0,0 @@ - - - - - - :core:datastore - - - - :core:datastore-proto - - - - - - - - :core:model - - - - - - - - :core:common - - - - - - - diff --git a/docs/images/graphs/dep_graph_core_datastore_proto.svg b/docs/images/graphs/dep_graph_core_datastore_proto.svg index 7fcfb8358..e69de29bb 100644 --- a/docs/images/graphs/dep_graph_core_datastore_proto.svg +++ b/docs/images/graphs/dep_graph_core_datastore_proto.svg @@ -1,9 +0,0 @@ - - - - - - :core:datastore-proto - - - diff --git a/docs/images/graphs/dep_graph_core_datastore_test.svg b/docs/images/graphs/dep_graph_core_datastore_test.svg index 37521a05f..e69de29bb 100644 --- a/docs/images/graphs/dep_graph_core_datastore_test.svg +++ b/docs/images/graphs/dep_graph_core_datastore_test.svg @@ -1,45 +0,0 @@ - - - - - - :core:datastore-test - - - - :core:common - - - - - - - - :core:datastore - - - - - - - - - - - - :core:datastore-proto - - - - - - - - :core:model - - - - - - - diff --git a/docs/images/graphs/dep_graph_core_designsystem.svg b/docs/images/graphs/dep_graph_core_designsystem.svg index 737140876..e69de29bb 100644 --- a/docs/images/graphs/dep_graph_core_designsystem.svg +++ b/docs/images/graphs/dep_graph_core_designsystem.svg @@ -1,9 +0,0 @@ - - - - - - :core:designsystem - - - diff --git a/docs/images/graphs/dep_graph_core_domain.svg b/docs/images/graphs/dep_graph_core_domain.svg index fe3740d2f..e69de29bb 100644 --- a/docs/images/graphs/dep_graph_core_domain.svg +++ b/docs/images/graphs/dep_graph_core_domain.svg @@ -1,109 +0,0 @@ - - - - - - :core:domain - - - - :core:data - - - - - - - - :core:model - - - - - - - - :core:common - - - - - - - - :core:database - - - - - - - - :core:datastore - - - - - - - - :core:network - - - - - - - - :core:analytics - - - - - - - - :core:notifications - - - - - - - - - - - - - - - - - - - - :core:datastore-proto - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/images/graphs/dep_graph_core_model.svg b/docs/images/graphs/dep_graph_core_model.svg index 125684a08..e69de29bb 100644 --- a/docs/images/graphs/dep_graph_core_model.svg +++ b/docs/images/graphs/dep_graph_core_model.svg @@ -1,9 +0,0 @@ - - - - - - :core:model - - - diff --git a/docs/images/graphs/dep_graph_core_navigation.svg b/docs/images/graphs/dep_graph_core_navigation.svg new file mode 100644 index 000000000..e69de29bb diff --git a/docs/images/graphs/dep_graph_core_network.svg b/docs/images/graphs/dep_graph_core_network.svg index 3022a86ee..e69de29bb 100644 --- a/docs/images/graphs/dep_graph_core_network.svg +++ b/docs/images/graphs/dep_graph_core_network.svg @@ -1,25 +0,0 @@ - - - - - - :core:network - - - - :core:common - - - - - - - - :core:model - - - - - - - diff --git a/docs/images/graphs/dep_graph_core_notifications.svg b/docs/images/graphs/dep_graph_core_notifications.svg index d96d28769..e69de29bb 100644 --- a/docs/images/graphs/dep_graph_core_notifications.svg +++ b/docs/images/graphs/dep_graph_core_notifications.svg @@ -1,25 +0,0 @@ - - - - - - :core:notifications - - - - :core:model - - - - - - - - :core:common - - - - - - - diff --git a/docs/images/graphs/dep_graph_core_screenshot_testing.svg b/docs/images/graphs/dep_graph_core_screenshot_testing.svg index a7d58b0ea..e69de29bb 100644 --- a/docs/images/graphs/dep_graph_core_screenshot_testing.svg +++ b/docs/images/graphs/dep_graph_core_screenshot_testing.svg @@ -1,17 +0,0 @@ - - - - - - :core:screenshot-testing - - - - :core:designsystem - - - - - - - diff --git a/docs/images/graphs/dep_graph_core_testing.svg b/docs/images/graphs/dep_graph_core_testing.svg index d441858e5..e69de29bb 100644 --- a/docs/images/graphs/dep_graph_core_testing.svg +++ b/docs/images/graphs/dep_graph_core_testing.svg @@ -1,121 +0,0 @@ - - - - - - :core:testing - - - - :core:analytics - - - - - - - - :core:common - - - - - - - - :core:data - - - - - - - - :core:model - - - - - - - - :core:notifications - - - - - - - - - - - - - - - - - - - - :core:database - - - - - - - - :core:datastore - - - - - - - - :core:network - - - - - - - - - - - - - - - - - - - - - - - - - - - - :core:datastore-proto - - - - - - - - - - - - - - - diff --git a/docs/images/graphs/dep_graph_core_ui.svg b/docs/images/graphs/dep_graph_core_ui.svg index 2cd972357..e69de29bb 100644 --- a/docs/images/graphs/dep_graph_core_ui.svg +++ b/docs/images/graphs/dep_graph_core_ui.svg @@ -1,33 +0,0 @@ - - - - - - :core:ui - - - - :core:analytics - - - - - - - - :core:designsystem - - - - - - - - :core:model - - - - - - - diff --git a/docs/images/graphs/dep_graph_feature_bookmarks_api.svg b/docs/images/graphs/dep_graph_feature_bookmarks_api.svg new file mode 100644 index 000000000..e69de29bb diff --git a/docs/images/graphs/dep_graph_feature_bookmarks_impl.svg b/docs/images/graphs/dep_graph_feature_bookmarks_impl.svg new file mode 100644 index 000000000..e69de29bb diff --git a/docs/images/graphs/dep_graph_feature_foryou_api.svg b/docs/images/graphs/dep_graph_feature_foryou_api.svg new file mode 100644 index 000000000..e69de29bb diff --git a/docs/images/graphs/dep_graph_feature_foryou_impl.svg b/docs/images/graphs/dep_graph_feature_foryou_impl.svg new file mode 100644 index 000000000..e69de29bb diff --git a/docs/images/graphs/dep_graph_feature_interests_api.svg b/docs/images/graphs/dep_graph_feature_interests_api.svg new file mode 100644 index 000000000..e69de29bb diff --git a/docs/images/graphs/dep_graph_feature_interests_impl.svg b/docs/images/graphs/dep_graph_feature_interests_impl.svg new file mode 100644 index 000000000..e69de29bb diff --git a/docs/images/graphs/dep_graph_feature_search_api.svg b/docs/images/graphs/dep_graph_feature_search_api.svg new file mode 100644 index 000000000..e69de29bb diff --git a/docs/images/graphs/dep_graph_feature_search_impl.svg b/docs/images/graphs/dep_graph_feature_search_impl.svg new file mode 100644 index 000000000..e69de29bb diff --git a/docs/images/graphs/dep_graph_feature_settings_api.svg b/docs/images/graphs/dep_graph_feature_settings_api.svg new file mode 100644 index 000000000..e69de29bb diff --git a/docs/images/graphs/dep_graph_feature_topic_api.svg b/docs/images/graphs/dep_graph_feature_topic_api.svg new file mode 100644 index 000000000..e69de29bb diff --git a/docs/images/graphs/dep_graph_feature_topic_impl.svg b/docs/images/graphs/dep_graph_feature_topic_impl.svg new file mode 100644 index 000000000..e69de29bb diff --git a/docs/images/graphs/dep_graph_lint.svg b/docs/images/graphs/dep_graph_lint.svg new file mode 100644 index 000000000..e69de29bb diff --git a/docs/images/graphs/dep_graph_sync_sync_test.svg b/docs/images/graphs/dep_graph_sync_sync_test.svg index 7a083ba54..e69de29bb 100644 --- a/docs/images/graphs/dep_graph_sync_sync_test.svg +++ b/docs/images/graphs/dep_graph_sync_sync_test.svg @@ -1,121 +0,0 @@ - - - - - - :sync:sync-test - - - - :core:data - - - - - - - - :sync:work - - - - - - - - :core:common - - - - - - - - :core:database - - - - - - - - :core:datastore - - - - - - - - :core:network - - - - - - - - :core:analytics - - - - - - - - :core:notifications - - - - - - - - - - - - - - - - :core:model - - - - - - - - - - - - - - - - :core:datastore-proto - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/images/graphs/dep_graph_sync_work.svg b/docs/images/graphs/dep_graph_sync_work.svg index c649f2397..e69de29bb 100644 --- a/docs/images/graphs/dep_graph_sync_work.svg +++ b/docs/images/graphs/dep_graph_sync_work.svg @@ -1,109 +0,0 @@ - - - - - - :sync:work - - - - :core:analytics - - - - - - - - :core:data - - - - - - - - - - - - :core:common - - - - - - - - :core:database - - - - - - - - :core:datastore - - - - - - - - :core:network - - - - - - - - :core:notifications - - - - - - - - :core:model - - - - - - - - - - - - - - - - :core:datastore-proto - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/images/graphs/dep_graph_ui_test_hilt_manifest.svg b/docs/images/graphs/dep_graph_ui_test_hilt_manifest.svg new file mode 100644 index 000000000..e69de29bb diff --git a/feature/bookmarks/api/README.md b/feature/bookmarks/api/README.md new file mode 100644 index 000000000..7ee6e7b86 --- /dev/null +++ b/feature/bookmarks/api/README.md @@ -0,0 +1,3 @@ +# :feature:bookmarks:api module +## Dependency graph +![Dependency graph](../../../docs/images/graphs/dep_graph_feature_bookmarks_api.svg) diff --git a/feature/bookmarks/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/api/navigation/BookmarksNavigation.kt b/feature/bookmarks/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/api/navigation/BookmarksRoute.kt similarity index 96% rename from feature/bookmarks/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/api/navigation/BookmarksNavigation.kt rename to feature/bookmarks/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/api/navigation/BookmarksRoute.kt index e45370974..e3955176b 100644 --- a/feature/bookmarks/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/api/navigation/BookmarksNavigation.kt +++ b/feature/bookmarks/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/api/navigation/BookmarksRoute.kt @@ -20,7 +20,7 @@ import com.google.samples.apps.nowinandroid.core.navigation.NiaNavKey import kotlinx.serialization.Serializable @Serializable -object BookmarksRoute: NiaNavKey{ +object BookmarksRoute : NiaNavKey { override val isTopLevel: Boolean get() = true } diff --git a/feature/bookmarks/impl/README.md b/feature/bookmarks/impl/README.md new file mode 100644 index 000000000..f7cc92060 --- /dev/null +++ b/feature/bookmarks/impl/README.md @@ -0,0 +1,3 @@ +# :feature:bookmarks:impl module +## Dependency graph +![Dependency graph](../../../docs/images/graphs/dep_graph_feature_bookmarks_impl.svg) diff --git a/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/navigation/BookmarksEntryProvider.kt b/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/navigation/BookmarksEntryProvider.kt index d776f9941..cff561bf4 100644 --- a/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/navigation/BookmarksEntryProvider.kt +++ b/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/navigation/BookmarksEntryProvider.kt @@ -35,7 +35,7 @@ import dagger.multibindings.IntoSet @Module @InstallIn(ActivityComponent::class) -object BookmarksModule { +object BookmarksEntryProvider { @Provides @IntoSet @@ -52,7 +52,7 @@ object BookmarksModule { actionLabel = action, duration = Short, ) == ActionPerformed - } + }, ) } } diff --git a/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/navigation/BookmarksSerializerModule.kt b/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/navigation/BookmarksSerializerModule.kt index 3f556ebef..b26bb646c 100644 --- a/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/navigation/BookmarksSerializerModule.kt +++ b/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/navigation/BookmarksSerializerModule.kt @@ -34,7 +34,7 @@ import kotlinx.serialization.modules.PolymorphicModuleBuilder object BookmarksSerializerModule { @Provides @IntoSet - fun provideSearchPolymorphicModuleBuilder(): PolymorphicModuleBuilder<@JvmSuppressWildcards NiaNavKey>.() -> Unit = { + fun provideBookmarksPolymorphicModuleBuilder(): PolymorphicModuleBuilder<@JvmSuppressWildcards NiaNavKey>.() -> Unit = { subclass(BookmarksRoute::class, BookmarksRoute.serializer()) } } diff --git a/feature/foryou/api/README.md b/feature/foryou/api/README.md new file mode 100644 index 000000000..2d3154ba2 --- /dev/null +++ b/feature/foryou/api/README.md @@ -0,0 +1,3 @@ +# :feature:foryou:api module +## Dependency graph +![Dependency graph](../../../docs/images/graphs/dep_graph_feature_foryou_api.svg) diff --git a/feature/foryou/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/api/navigation/ForYouNavigation.kt b/feature/foryou/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/api/navigation/ForYouRoute.kt similarity index 93% rename from feature/foryou/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/api/navigation/ForYouNavigation.kt rename to feature/foryou/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/api/navigation/ForYouRoute.kt index 22d1f7909..2467649a4 100644 --- a/feature/foryou/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/api/navigation/ForYouNavigation.kt +++ b/feature/foryou/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/api/navigation/ForYouRoute.kt @@ -20,7 +20,7 @@ import com.google.samples.apps.nowinandroid.core.navigation.NiaNavKey import kotlinx.serialization.Serializable @Serializable -object ForYouRoute: NiaNavKey{ // route to ForYou screen +object ForYouRoute : NiaNavKey { // route to ForYou screen override val isTopLevel: Boolean get() = true } diff --git a/feature/foryou/impl/README.md b/feature/foryou/impl/README.md new file mode 100644 index 000000000..32d4e0845 --- /dev/null +++ b/feature/foryou/impl/README.md @@ -0,0 +1,3 @@ +# :feature:foryou:impl module +## Dependency graph +![Dependency graph](../../../docs/images/graphs/dep_graph_feature_foryou_impl.svg) diff --git a/feature/foryou/impl/build.gradle.kts b/feature/foryou/impl/build.gradle.kts index 7809a3c1a..5a91a1944 100644 --- a/feature/foryou/impl/build.gradle.kts +++ b/feature/foryou/impl/build.gradle.kts @@ -26,7 +26,6 @@ android { dependencies { implementation(libs.accompanist.permissions) - implementation(projects.core.data) implementation(projects.core.domain) implementation(projects.core.notifications) implementation(projects.feature.foryou.api) diff --git a/feature/foryou/impl/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/impl/ForYouScreenTest.kt b/feature/foryou/impl/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/impl/ForYouScreenTest.kt index 74378b699..fc4fc0241 100644 --- a/feature/foryou/impl/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/impl/ForYouScreenTest.kt +++ b/feature/foryou/impl/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/impl/ForYouScreenTest.kt @@ -154,12 +154,12 @@ class ForYouScreenTest { ForYouScreen( isSyncing = false, onboardingUiState = - OnboardingUiState.Shown( - // Follow one topic - topics = followableTopicTestData.mapIndexed { index, testTopic -> - testTopic.copy(isFollowed = index == 1) - }, - ), + OnboardingUiState.Shown( + // Follow one topic + topics = followableTopicTestData.mapIndexed { index, testTopic -> + testTopic.copy(isFollowed = index == 1) + }, + ), feedState = NewsFeedUiState.Success( feed = emptyList(), ), @@ -201,9 +201,9 @@ class ForYouScreenTest { ForYouScreen( isSyncing = false, onboardingUiState = - OnboardingUiState.Shown( - topics = followableTopicTestData - ), + OnboardingUiState.Shown( + topics = followableTopicTestData, + ), feedState = NewsFeedUiState.Loading, deepLinkedUserNewsResource = null, onTopicCheckedChanged = { _, _ -> }, diff --git a/feature/foryou/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/impl/navigation/ForYouEntryProvider.kt b/feature/foryou/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/impl/navigation/ForYouEntryProvider.kt index 1f05d1e1a..8259afa31 100644 --- a/feature/foryou/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/impl/navigation/ForYouEntryProvider.kt +++ b/feature/foryou/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/impl/navigation/ForYouEntryProvider.kt @@ -31,7 +31,7 @@ import dagger.multibindings.IntoSet @Module @InstallIn(ActivityComponent::class) -object ForYouModule { +object ForYouEntryProvider { /** * The ForYou composable for the app. It can also display information about topics. * This should be supplied from a separate module. @@ -43,8 +43,8 @@ object ForYouModule { ): EntryProviderBuilder.() -> Unit = { entry { ForYouScreen( - onTopicClick = backStack::navigateToTopic + onTopicClick = backStack::navigateToTopic, ) } } -} \ No newline at end of file +} diff --git a/feature/foryou/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/impl/navigation/ForYouRouteSerializerModule.kt b/feature/foryou/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/impl/navigation/ForYouRouteSerializerModule.kt index d3fa6a22a..15c010fb3 100644 --- a/feature/foryou/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/impl/navigation/ForYouRouteSerializerModule.kt +++ b/feature/foryou/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/impl/navigation/ForYouRouteSerializerModule.kt @@ -34,7 +34,7 @@ import kotlinx.serialization.modules.PolymorphicModuleBuilder object ForYouRouteSerializerModule { @Provides @IntoSet - fun provideSearchPolymorphicModuleBuilder(): PolymorphicModuleBuilder<@JvmSuppressWildcards NiaNavKey>.() -> Unit = { + fun provideForYouPolymorphicModuleBuilder(): PolymorphicModuleBuilder<@JvmSuppressWildcards NiaNavKey>.() -> Unit = { subclass(ForYouRoute::class, ForYouRoute.serializer()) } -} \ No newline at end of file +} diff --git a/feature/interests/api/README.md b/feature/interests/api/README.md new file mode 100644 index 000000000..95a625c89 --- /dev/null +++ b/feature/interests/api/README.md @@ -0,0 +1,3 @@ +# :feature:interests:api module +## Dependency graph +![Dependency graph](../../../docs/images/graphs/dep_graph_feature_interests_api.svg) diff --git a/feature/interests/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/api/navigation/InterestsNavigation.kt b/feature/interests/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/api/navigation/InterestsRoute.kt similarity index 98% rename from feature/interests/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/api/navigation/InterestsNavigation.kt rename to feature/interests/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/api/navigation/InterestsRoute.kt index 61669a399..ce48a1df6 100644 --- a/feature/interests/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/api/navigation/InterestsNavigation.kt +++ b/feature/interests/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/api/navigation/InterestsRoute.kt @@ -23,7 +23,7 @@ import kotlinx.serialization.Serializable data class InterestsRoute( // The ID of the topic which will be initially selected at this destination val initialTopicId: String? = null, -): NiaNavKey { +) : NiaNavKey { override val isTopLevel: Boolean get() = true -} \ No newline at end of file +} diff --git a/feature/topic/api/src/main/res/drawable/feature_topic_api_ic_topic_placeholder.xml b/feature/interests/api/src/main/res/drawable/feature_interests_api_ic_detail_placeholder.xml similarity index 97% rename from feature/topic/api/src/main/res/drawable/feature_topic_api_ic_topic_placeholder.xml rename to feature/interests/api/src/main/res/drawable/feature_interests_api_ic_detail_placeholder.xml index 39a10c38f..2789b54e6 100644 --- a/feature/topic/api/src/main/res/drawable/feature_topic_api_ic_topic_placeholder.xml +++ b/feature/interests/api/src/main/res/drawable/feature_interests_api_ic_detail_placeholder.xml @@ -6,14 +6,14 @@ 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 + http://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. - --> +--> Interests Loading data "No available data" + Select an Interest diff --git a/feature/interests/impl/README.md b/feature/interests/impl/README.md new file mode 100644 index 000000000..722f4ef41 --- /dev/null +++ b/feature/interests/impl/README.md @@ -0,0 +1,3 @@ +# :feature:interests:impl module +## Dependency graph +![Dependency graph](../../../docs/images/graphs/dep_graph_feature_interests_impl.svg) diff --git a/feature/interests/impl/build.gradle.kts b/feature/interests/impl/build.gradle.kts index 86c5df6ce..d1a682e27 100644 --- a/feature/interests/impl/build.gradle.kts +++ b/feature/interests/impl/build.gradle.kts @@ -24,7 +24,6 @@ android { } dependencies { - implementation(projects.core.data) implementation(projects.core.domain) implementation(projects.feature.topic.api) implementation(projects.feature.interests.api) diff --git a/feature/topic/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/api/TopicDetailPlaceholder.kt b/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/InterestsDetailPlaceholder.kt similarity index 86% rename from feature/topic/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/api/TopicDetailPlaceholder.kt rename to feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/InterestsDetailPlaceholder.kt index 2519fa78a..2a03019d3 100644 --- a/feature/topic/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/api/TopicDetailPlaceholder.kt +++ b/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/InterestsDetailPlaceholder.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.google.samples.apps.nowinandroid.feature.topic.api +package com.google.samples.apps.nowinandroid.feature.interests.impl import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -33,9 +33,10 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme +import com.google.samples.apps.nowinandroid.feature.interests.api.R @Composable -fun TopicDetailPlaceholder(modifier: Modifier = Modifier) { +fun InterestsDetailPlaceholder(modifier: Modifier = Modifier) { Card( modifier = modifier, colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceVariant), @@ -50,12 +51,12 @@ fun TopicDetailPlaceholder(modifier: Modifier = Modifier) { ), ) { Icon( - painter = painterResource(id = R.drawable.feature_topic_api_ic_topic_placeholder), + painter = painterResource(id = R.drawable.feature_interests_api_ic_detail_placeholder), contentDescription = null, tint = MaterialTheme.colorScheme.primary, ) Text( - text = stringResource(id = R.string.feature_topic_api_select_an_interest), + text = stringResource(id = R.string.feature_interests_api_select_an_interest), style = MaterialTheme.typography.titleLarge, ) } @@ -66,6 +67,6 @@ fun TopicDetailPlaceholder(modifier: Modifier = Modifier) { @Composable fun TopicDetailPlaceholderPreview() { NiaTheme { - TopicDetailPlaceholder() + InterestsDetailPlaceholder() } } diff --git a/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/InterestsViewModel.kt b/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/InterestsViewModel.kt index 646f79658..8f30fbe95 100644 --- a/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/InterestsViewModel.kt +++ b/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/InterestsViewModel.kt @@ -71,7 +71,7 @@ class InterestsViewModel @AssistedInject constructor( } @AssistedFactory - interface Factory{ + interface Factory { fun create(key: InterestsRoute): InterestsViewModel } } diff --git a/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/TabContent.kt b/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/TabContent.kt index bb3d52e7d..d8a09c8f0 100644 --- a/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/TabContent.kt +++ b/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/TabContent.kt @@ -16,8 +16,6 @@ package com.google.samples.apps.nowinandroid.feature.interests.impl -import android.graphics.Color.RED -import androidx.compose.foundation.background import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues @@ -32,11 +30,9 @@ import androidx.compose.foundation.layout.windowInsetsBottomHeight import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.testTag import androidx.compose.ui.unit.dp import com.google.samples.apps.nowinandroid.core.designsystem.component.scrollbar.DraggableScrollbar @@ -108,4 +104,4 @@ fun TopicsTabContent( } } -val LIST_PANE_TEST_TAG = "interests:topics" \ No newline at end of file +val LIST_PANE_TEST_TAG = "interests:topics" diff --git a/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/navigation/InterestsEntryProvider.kt b/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/navigation/InterestsEntryProvider.kt index 35019c1e2..68c0a5981 100644 --- a/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/navigation/InterestsEntryProvider.kt +++ b/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/navigation/InterestsEntryProvider.kt @@ -24,9 +24,9 @@ import androidx.navigation3.runtime.entry import com.google.samples.apps.nowinandroid.core.navigation.NiaBackStack import com.google.samples.apps.nowinandroid.core.navigation.NiaNavKey import com.google.samples.apps.nowinandroid.feature.interests.api.navigation.InterestsRoute +import com.google.samples.apps.nowinandroid.feature.interests.impl.InterestsDetailPlaceholder import com.google.samples.apps.nowinandroid.feature.interests.impl.InterestsScreen import com.google.samples.apps.nowinandroid.feature.interests.impl.InterestsViewModel -import com.google.samples.apps.nowinandroid.feature.topic.api.TopicDetailPlaceholder import com.google.samples.apps.nowinandroid.feature.topic.api.navigation.navigateToTopic import dagger.Module import dagger.Provides @@ -36,18 +36,18 @@ import dagger.multibindings.IntoSet @Module @InstallIn(ActivityComponent::class) -object InterestsModule { +object InterestsEntryProvider { @OptIn(ExperimentalMaterial3AdaptiveApi::class) @Provides @IntoSet fun provideInterestsEntryProviderBuilder( - backStack: NiaBackStack + backStack: NiaBackStack, ): EntryProviderBuilder.() -> Unit = { entry( metadata = ListDetailSceneStrategy.listPane { - TopicDetailPlaceholder() - } + InterestsDetailPlaceholder() + }, ) { key -> val viewModel = hiltViewModel { it.create(key) @@ -55,8 +55,8 @@ object InterestsModule { InterestsScreen( onTopicClick = backStack::navigateToTopic, shouldHighlightSelectedTopic = false, - viewModel = viewModel + viewModel = viewModel, ) } } -} \ No newline at end of file +} diff --git a/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/navigation/InterestsSerializerModule.kt b/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/navigation/InterestsSerializerModule.kt index 29ae3de00..cdc1234b8 100644 --- a/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/navigation/InterestsSerializerModule.kt +++ b/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/navigation/InterestsSerializerModule.kt @@ -34,7 +34,7 @@ import kotlinx.serialization.modules.PolymorphicModuleBuilder object InterestsSerializerModule { @Provides @IntoSet - fun provideSearchPolymorphicModuleBuilder(): PolymorphicModuleBuilder<@JvmSuppressWildcards NiaNavKey>.() -> Unit = { + fun provideInterestsPolymorphicModuleBuilder(): PolymorphicModuleBuilder<@JvmSuppressWildcards NiaNavKey>.() -> Unit = { subclass(InterestsRoute::class, InterestsRoute.serializer()) } } diff --git a/feature/interests/impl/src/test/kotlin/com/google/samples/apps/nowinandroid/interests/impl/InterestsListDetailScreenTest.kt b/feature/interests/impl/src/test/kotlin/com/google/samples/apps/nowinandroid/interests/impl/InterestsListDetailScreenTest.kt index 1c909be10..81ec9c549 100644 --- a/feature/interests/impl/src/test/kotlin/com/google/samples/apps/nowinandroid/interests/impl/InterestsListDetailScreenTest.kt +++ b/feature/interests/impl/src/test/kotlin/com/google/samples/apps/nowinandroid/interests/impl/InterestsListDetailScreenTest.kt @@ -37,8 +37,9 @@ import com.google.samples.apps.nowinandroid.core.data.repository.TopicsRepositor import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme import com.google.samples.apps.nowinandroid.core.model.data.Topic import com.google.samples.apps.nowinandroid.core.navigation.NiaBackStack -import com.google.samples.apps.nowinandroid.core.navigation.NiaNavKey import com.google.samples.apps.nowinandroid.core.navigation.NiaBackStackViewModel +import com.google.samples.apps.nowinandroid.core.navigation.NiaNavKey +import com.google.samples.apps.nowinandroid.feature.interests.api.R import com.google.samples.apps.nowinandroid.feature.interests.api.navigation.InterestsRoute import com.google.samples.apps.nowinandroid.feature.interests.impl.LIST_PANE_TEST_TAG import com.google.samples.apps.nowinandroid.uitesthiltmanifest.HiltComponentActivity @@ -47,6 +48,7 @@ import dagger.Provides import dagger.hilt.EntryPoint import dagger.hilt.EntryPoints import dagger.hilt.InstallIn +import dagger.hilt.android.components.ActivityComponent import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest import dagger.hilt.android.testing.HiltTestApplication @@ -64,10 +66,8 @@ import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config import javax.inject.Inject import javax.inject.Singleton -import kotlin.properties.ReadOnlyProperty -import com.google.samples.apps.nowinandroid.feature.topic.api.R as FeatureTopicR -import dagger.hilt.android.components.ActivityComponent import kotlin.getValue +import kotlin.properties.ReadOnlyProperty private const val EXPANDED_WIDTH = "w1200dp-h840dp" private const val COMPACT_WIDTH = "w412dp-h915dp" @@ -87,7 +87,7 @@ class InterestsListDetailScreenTest { @EntryPoint @InstallIn(ActivityComponent::class) interface EntryProvidersEntryPoint { - fun getEntryProviders() : Set<@JvmSuppressWildcards EntryProviderBuilder.() -> Unit> + fun getEntryProviders(): Set<@JvmSuppressWildcards EntryProviderBuilder.() -> Unit> } @Inject @@ -99,7 +99,7 @@ class InterestsListDetailScreenTest { } // The strings used for matching in these tests. - private val placeholderText by composeTestRule.stringResource(FeatureTopicR.string.feature_topic_api_select_an_interest) + private val placeholderText by composeTestRule.stringResource(R.string.feature_interests_api_select_an_interest) private val Topic.testTag get() = "topic:${this.id}" @@ -257,10 +257,10 @@ object BackStackProvider { @Provides @Singleton fun provideSerializersModule( - polymorphicModuleBuilders: Set<@JvmSuppressWildcards PolymorphicModuleBuilder.() -> Unit> - ) : SerializersModule = SerializersModule { + polymorphicModuleBuilders: Set<@JvmSuppressWildcards PolymorphicModuleBuilder.() -> Unit>, + ): SerializersModule = SerializersModule { polymorphic(NiaNavKey::class) { polymorphicModuleBuilders.forEach { it() } } } -} \ No newline at end of file +} diff --git a/feature/interests/impl/src/test/kotlin/com/google/samples/apps/nowinandroid/interests/impl/InterestsViewModelTest.kt b/feature/interests/impl/src/test/kotlin/com/google/samples/apps/nowinandroid/interests/impl/InterestsViewModelTest.kt index 301ecf505..4998e86ca 100644 --- a/feature/interests/impl/src/test/kotlin/com/google/samples/apps/nowinandroid/interests/impl/InterestsViewModelTest.kt +++ b/feature/interests/impl/src/test/kotlin/com/google/samples/apps/nowinandroid/interests/impl/InterestsViewModelTest.kt @@ -37,7 +37,6 @@ import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config -import kotlin.intArrayOf import kotlin.test.assertEquals /** @@ -73,7 +72,7 @@ class InterestsViewModelTest { ), userDataRepository = userDataRepository, getFollowableTopics = getFollowableTopicsUseCase, - InterestsRoute(initialTopicId = testInputTopics[0].topic.id) + InterestsRoute(initialTopicId = testInputTopics[0].topic.id), ) } diff --git a/feature/search/api/README.md b/feature/search/api/README.md new file mode 100644 index 000000000..88460cbe0 --- /dev/null +++ b/feature/search/api/README.md @@ -0,0 +1,3 @@ +# :feature:search:api module +## Dependency graph +![Dependency graph](../../../docs/images/graphs/dep_graph_feature_search_api.svg) diff --git a/feature/search/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/search/api/navigation/SearchNavigation.kt b/feature/search/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/search/api/navigation/SearchRoute.kt similarity index 96% rename from feature/search/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/search/api/navigation/SearchNavigation.kt rename to feature/search/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/search/api/navigation/SearchRoute.kt index 6d85dd452..e45c177b3 100644 --- a/feature/search/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/search/api/navigation/SearchNavigation.kt +++ b/feature/search/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/search/api/navigation/SearchRoute.kt @@ -21,11 +21,11 @@ import com.google.samples.apps.nowinandroid.core.navigation.NiaNavKey import kotlinx.serialization.Serializable @Serializable -object SearchRoute: NiaNavKey { +object SearchRoute : NiaNavKey { override val isTopLevel: Boolean get() = false } fun NiaBackStack.navigateToSearch() { navigate(SearchRoute) -} \ No newline at end of file +} diff --git a/feature/search/impl/README.md b/feature/search/impl/README.md new file mode 100644 index 000000000..d1304a4d3 --- /dev/null +++ b/feature/search/impl/README.md @@ -0,0 +1,3 @@ +# :feature:search:impl module +## Dependency graph +![Dependency graph](../../../docs/images/graphs/dep_graph_feature_search_impl.svg) diff --git a/feature/search/impl/build.gradle.kts b/feature/search/impl/build.gradle.kts index 8168a3d2d..8425b29f3 100644 --- a/feature/search/impl/build.gradle.kts +++ b/feature/search/impl/build.gradle.kts @@ -25,7 +25,6 @@ android { } dependencies { - implementation(projects.core.data) implementation(projects.core.domain) implementation(projects.feature.interests.api) implementation(projects.feature.search.api) diff --git a/feature/search/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/search/impl/navigation/SearchEntryProvider.kt b/feature/search/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/search/impl/navigation/SearchEntryProvider.kt index 5404350bb..272e4c7ba 100644 --- a/feature/search/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/search/impl/navigation/SearchEntryProvider.kt +++ b/feature/search/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/search/impl/navigation/SearchEntryProvider.kt @@ -32,7 +32,7 @@ import dagger.multibindings.IntoSet @Module @InstallIn(ActivityComponent::class) -object SearchModule { +object SearchEntryProvider { @Provides @IntoSet @@ -47,4 +47,4 @@ object SearchModule { ) } } -} \ No newline at end of file +} diff --git a/feature/settings/api/README.md b/feature/settings/api/README.md new file mode 100644 index 000000000..6b51d5dfd --- /dev/null +++ b/feature/settings/api/README.md @@ -0,0 +1,3 @@ +# :feature:settings:api module +## Dependency graph +![Dependency graph](../../../docs/images/graphs/dep_graph_feature_settings_api.svg) diff --git a/feature/settings/api/src/main/AndroidManifest.xml b/feature/settings/api/src/main/AndroidManifest.xml index 00b4c35bd..1fd9557d1 100644 --- a/feature/settings/api/src/main/AndroidManifest.xml +++ b/feature/settings/api/src/main/AndroidManifest.xml @@ -1,19 +1,19 @@ + Copyright 2022 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 + + http://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. +--> .() -> Unit = { + fun provideTopicPolymorphicModuleBuilder(): PolymorphicModuleBuilder<@JvmSuppressWildcards NiaNavKey>.() -> Unit = { subclass(TopicRoute::class, TopicRoute.serializer()) } } diff --git a/feature/topic/api/src/main/res/values/strings.xml b/feature/topic/api/src/main/res/values/strings.xml index 25f8a7126..1e3f376cf 100644 --- a/feature/topic/api/src/main/res/values/strings.xml +++ b/feature/topic/api/src/main/res/values/strings.xml @@ -16,5 +16,4 @@ --> Loading topic - Select an Interest diff --git a/feature/topic/impl/README.md b/feature/topic/impl/README.md new file mode 100644 index 000000000..eee690ec0 --- /dev/null +++ b/feature/topic/impl/README.md @@ -0,0 +1,3 @@ +# :feature:topic:impl module +## Dependency graph +![Dependency graph](../../../docs/images/graphs/dep_graph_feature_topic_impl.svg) diff --git a/feature/topic/impl/build.gradle.kts b/feature/topic/impl/build.gradle.kts index 523075130..fdf37c32e 100644 --- a/feature/topic/impl/build.gradle.kts +++ b/feature/topic/impl/build.gradle.kts @@ -1,18 +1,18 @@ /* -* Copyright 2022 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. -*/ + * Copyright 2022 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.feature.impl) diff --git a/feature/topic/api/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/feature/topic/api/TopicScreenTest.kt b/feature/topic/impl/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl/TopicScreenTest.kt similarity index 97% rename from feature/topic/api/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/feature/topic/api/TopicScreenTest.kt rename to feature/topic/impl/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl/TopicScreenTest.kt index 5c80f67c3..5f6782160 100644 --- a/feature/topic/api/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/feature/topic/api/TopicScreenTest.kt +++ b/feature/topic/impl/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl/TopicScreenTest.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.google.samples.apps.nowinandroid.feature.topic.api +package com.google.samples.apps.nowinandroid.feature.topic.impl import androidx.activity.ComponentActivity import androidx.compose.ui.test.hasScrollToNodeAction @@ -26,6 +26,7 @@ import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performScrollToNode import com.google.samples.apps.nowinandroid.core.testing.data.followableTopicTestData import com.google.samples.apps.nowinandroid.core.testing.data.userNewsResourcesTestData +import com.google.samples.apps.nowinandroid.feature.topic.api.R import org.junit.Before import org.junit.Rule import org.junit.Test diff --git a/feature/topic/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/api/TopicScreen.kt b/feature/topic/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl/TopicScreen.kt similarity index 97% rename from feature/topic/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/api/TopicScreen.kt rename to feature/topic/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl/TopicScreen.kt index b931ff263..7c1624ce8 100644 --- a/feature/topic/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/api/TopicScreen.kt +++ b/feature/topic/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl/TopicScreen.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.google.samples.apps.nowinandroid.feature.topic.api +package com.google.samples.apps.nowinandroid.feature.topic.impl import androidx.annotation.VisibleForTesting import androidx.compose.foundation.gestures.Orientation @@ -64,11 +64,12 @@ import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme import com.google.samples.apps.nowinandroid.core.model.data.FollowableTopic 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.R as UiR import com.google.samples.apps.nowinandroid.core.ui.TrackScreenViewEvent import com.google.samples.apps.nowinandroid.core.ui.TrackScrollJank import com.google.samples.apps.nowinandroid.core.ui.UserNewsResourcePreviewParameterProvider import com.google.samples.apps.nowinandroid.core.ui.userNewsResourceCardItems -import com.google.samples.apps.nowinandroid.feature.topic.api.R.string +import com.google.samples.apps.nowinandroid.feature.topic.api.R as TopicR @Composable fun TopicScreen( @@ -124,7 +125,7 @@ internal fun TopicScreen( TopicUiState.Loading -> item { NiaLoadingWheel( modifier = modifier, - contentDesc = stringResource(id = string.feature_topic_api_loading), + contentDesc = stringResource(id = TopicR.string.feature_topic_api_loading), ) } @@ -292,7 +293,7 @@ private fun TopicToolbar( Icon( imageVector = NiaIcons.ArrowBack, contentDescription = stringResource( - id = com.google.samples.apps.nowinandroid.core.ui.R.string.core_ui_back, + id = UiR.string.core_ui_back, ), ) } diff --git a/feature/topic/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/api/TopicViewModel.kt b/feature/topic/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl/TopicViewModel.kt similarity index 98% rename from feature/topic/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/api/TopicViewModel.kt rename to feature/topic/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl/TopicViewModel.kt index 4a8b107a6..8f780f025 100644 --- a/feature/topic/api/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/api/TopicViewModel.kt +++ b/feature/topic/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl/TopicViewModel.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.google.samples.apps.nowinandroid.feature.topic.api +package com.google.samples.apps.nowinandroid.feature.topic.impl import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope diff --git a/feature/topic/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl/navigation/TopicEntryProvider.kt b/feature/topic/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl/navigation/TopicEntryProvider.kt index 7d43282dd..4584fe93d 100644 --- a/feature/topic/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl/navigation/TopicEntryProvider.kt +++ b/feature/topic/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl/navigation/TopicEntryProvider.kt @@ -25,9 +25,9 @@ import com.google.samples.apps.nowinandroid.core.navigation.NiaBackStack import com.google.samples.apps.nowinandroid.core.navigation.NiaNavKey import com.google.samples.apps.nowinandroid.feature.topic.api.navigation.TopicRoute import com.google.samples.apps.nowinandroid.feature.topic.api.navigation.navigateToTopic -import com.google.samples.apps.nowinandroid.feature.topic.api.TopicScreen -import com.google.samples.apps.nowinandroid.feature.topic.api.TopicViewModel -import com.google.samples.apps.nowinandroid.feature.topic.api.TopicViewModel.Factory +import com.google.samples.apps.nowinandroid.feature.topic.impl.TopicScreen +import com.google.samples.apps.nowinandroid.feature.topic.impl.TopicViewModel +import com.google.samples.apps.nowinandroid.feature.topic.impl.TopicViewModel.Factory import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -36,7 +36,7 @@ import dagger.multibindings.IntoSet @Module @InstallIn(ActivityComponent::class) -object TopicModule { +object TopicEntryProvider { @OptIn(ExperimentalMaterial3AdaptiveApi::class) @Provides @@ -45,7 +45,7 @@ object TopicModule { backStack: NiaBackStack, ): EntryProviderBuilder.() -> Unit = { entry( - metadata = ListDetailSceneStrategy.detailPane() + metadata = ListDetailSceneStrategy.detailPane(), ) { key -> val id = key.id TopicScreen( @@ -60,4 +60,4 @@ object TopicModule { ) } } -} \ No newline at end of file +} diff --git a/feature/topic/api/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/topic/api/TopicViewModelTest.kt b/feature/topic/impl/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl/TopicViewModelTest.kt similarity index 99% rename from feature/topic/api/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/topic/api/TopicViewModelTest.kt rename to feature/topic/impl/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl/TopicViewModelTest.kt index 152e582d6..1bbf844c1 100644 --- a/feature/topic/api/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/topic/api/TopicViewModelTest.kt +++ b/feature/topic/impl/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl/TopicViewModelTest.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.google.samples.apps.nowinandroid.feature.topic.api +package com.google.samples.apps.nowinandroid.feature.topic.impl import com.google.samples.apps.nowinandroid.core.data.repository.CompositeUserNewsResourceRepository import com.google.samples.apps.nowinandroid.core.model.data.FollowableTopic diff --git a/lint/README.md b/lint/README.md new file mode 100644 index 000000000..fc62e80f8 --- /dev/null +++ b/lint/README.md @@ -0,0 +1,3 @@ +# :lint module +## Dependency graph +![Dependency graph](../docs/images/graphs/dep_graph_lint.svg) diff --git a/ui-test-hilt-manifest/README.md b/ui-test-hilt-manifest/README.md new file mode 100644 index 000000000..c448e26d3 --- /dev/null +++ b/ui-test-hilt-manifest/README.md @@ -0,0 +1,3 @@ +# :ui-test-hilt-manifest module +## Dependency graph +![Dependency graph](../docs/images/graphs/dep_graph_ui_test_hilt_manifest.svg)