diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 28ec373b7..265ff2ba5 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,26 +1,25 @@ -_Thanks for submitting a pull request. Please include the following information._ +**DO NOT CREATE A PULL REQUEST WITHOUT READING THESE INSTRUCTIONS** -**What I have done and why** +## Instructions +Thanks for submitting a pull request. To accept your pull request we need you do a few things: + +**If this is your first pull request** -_Include a summary of what your pull request contains, and why you have made these changes._ +- [Sign the contributors license agreement](https://cla.developers.google.com/) -Fixes # +**Ensure tests pass and code is formatted correctly** -**How I'm testing it** +- Run local tests on the `DemoDebug` variant by running `./gradlew testDemoDebug` +- Fix code formatting: `./gradlew --init-script gradle/init.gradle.kts spotlessApply` -_Choose at least one:_ -- Unit tests -- UI tests -- Screenshot tests -- N/A _(provide justification)_ +**Add a description** -**Do tests pass?** -- [ ] Run local tests on `DemoDebug` variant: `./gradlew testDemoDebug` -- [ ] Check formatting: `./gradlew --init-script gradle/init.gradle.kts spotlessApply` +We need to know what you've done and why you've done it. Include a summary of what your pull request contains, and why you have made these changes. Include links to any relevant issues which it fixes. -**Is this your first pull request?** -- [ ] [Sign the CLA](https://cla.developers.google.com/) -- [ ] Run `./tools/setup.sh` -- [ ] Import the code formatting style as explained in [the setup script](/tools/setup.sh#L40). +[Here's an example](https://github.com/android/nowinandroid/pull/1257). +**NOW DELETE THIS LINE AND EVERYTHING ABOVE IT** + +**What I have done and why** +\ diff --git a/.github/workflows/Build.yaml b/.github/workflows/Build.yaml index d1ead0e50..5bf03b47a 100644 --- a/.github/workflows/Build.yaml +++ b/.github/workflows/Build.yaml @@ -128,6 +128,13 @@ jobs: name: local-test-results path: '**/build/test-results/test*UnitTest/**.xml' + - name: Upload screenshot results (PNG) + if: always() + uses: actions/upload-artifact@v4 + with: + name: screenshot-test-results + path: '**/build/outputs/roborazzi/*_compare.png' + - name: Check lint run: ./gradlew :app:lintProdRelease :app-nia-catalog:lintRelease :lint:lint diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml index e50d05e53..b18b41faa 100644 --- a/.github/workflows/Release.yml +++ b/.github/workflows/Release.yml @@ -19,6 +19,7 @@ jobs: ls /dev/kvm - name: Checkout + uses: actions/checkout@v4 - name: Copy CI gradle.properties diff --git a/app-nia-catalog/dependencies/releaseRuntimeClasspath.txt b/app-nia-catalog/dependencies/releaseRuntimeClasspath.txt index 8a4bff7ab..686e709ed 100644 --- a/app-nia-catalog/dependencies/releaseRuntimeClasspath.txt +++ b/app-nia-catalog/dependencies/releaseRuntimeClasspath.txt @@ -1,6 +1,6 @@ -androidx.activity:activity-compose:1.8.0 -androidx.activity:activity-ktx:1.8.0 -androidx.activity:activity:1.8.0 +androidx.activity:activity-compose:1.8.2 +androidx.activity:activity-ktx:1.8.2 +androidx.activity:activity:1.8.2 androidx.annotation:annotation-experimental:1.4.0 androidx.annotation:annotation-jvm:1.7.1 androidx.annotation:annotation:1.7.1 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index afd37736f..355ec42c0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -113,9 +113,10 @@ dependencies { testImplementation(projects.core.dataTest) testImplementation(projects.core.testing) + testImplementation(projects.sync.syncTest) testImplementation(libs.androidx.compose.ui.test) + testImplementation(libs.androidx.work.testing) testImplementation(libs.hilt.android.testing) - testImplementation(libs.work.testing) testDemoImplementation(libs.robolectric) testDemoImplementation(libs.roborazzi) diff --git a/app/dependencies/prodReleaseRuntimeClasspath.txt b/app/dependencies/prodReleaseRuntimeClasspath.txt index 7cd6df2d2..6544acde6 100644 --- a/app/dependencies/prodReleaseRuntimeClasspath.txt +++ b/app/dependencies/prodReleaseRuntimeClasspath.txt @@ -1,6 +1,6 @@ -androidx.activity:activity-compose:1.8.0 -androidx.activity:activity-ktx:1.8.0 -androidx.activity:activity:1.8.0 +androidx.activity:activity-compose:1.8.2 +androidx.activity:activity-ktx:1.8.2 +androidx.activity:activity:1.8.2 androidx.annotation:annotation-experimental:1.4.0 androidx.annotation:annotation-jvm:1.8.0-beta01 androidx.annotation:annotation:1.8.0-beta01 @@ -17,10 +17,10 @@ androidx.compose.animation:animation-android:1.7.0-alpha06 androidx.compose.animation:animation-core-android:1.7.0-alpha06 androidx.compose.animation:animation-core:1.7.0-alpha06 androidx.compose.animation:animation:1.7.0-alpha06 -androidx.compose.foundation:foundation-android:1.6.3 -androidx.compose.foundation:foundation-layout-android:1.6.3 -androidx.compose.foundation:foundation-layout:1.6.3 -androidx.compose.foundation:foundation:1.6.3 +androidx.compose.foundation:foundation-android:1.7.0-alpha06 +androidx.compose.foundation:foundation-layout-android:1.7.0-alpha06 +androidx.compose.foundation:foundation-layout:1.7.0-alpha06 +androidx.compose.foundation:foundation:1.7.0-alpha06 androidx.compose.material3.adaptive:adaptive-android:1.0.0-alpha10 androidx.compose.material3.adaptive:adaptive-layout-android:1.0.0-alpha10 androidx.compose.material3.adaptive:adaptive-layout:1.0.0-alpha10 @@ -103,11 +103,11 @@ androidx.lifecycle:lifecycle-viewmodel:2.8.0-alpha04 androidx.loader:loader:1.0.0 androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 androidx.metrics:metrics-performance:1.0.0-alpha04 -androidx.navigation:navigation-common-ktx:2.7.4 -androidx.navigation:navigation-common:2.7.4 -androidx.navigation:navigation-compose:2.7.4 -androidx.navigation:navigation-runtime-ktx:2.7.4 -androidx.navigation:navigation-runtime:2.7.4 +androidx.navigation:navigation-common-ktx:2.8.0-alpha06 +androidx.navigation:navigation-common:2.8.0-alpha06 +androidx.navigation:navigation-compose:2.8.0-alpha06 +androidx.navigation:navigation-runtime-ktx:2.8.0-alpha06 +androidx.navigation:navigation-runtime:2.8.0-alpha06 androidx.print:print:1.0.0 androidx.privacysandbox.ads:ads-adservices-java:1.0.0-beta05 androidx.privacysandbox.ads:ads-adservices:1.0.0-beta05 @@ -188,8 +188,8 @@ com.google.guava:failureaccess:1.0.1 com.google.guava:guava:31.1-android com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava com.google.j2objc:j2objc-annotations:1.3 -com.google.protobuf:protobuf-javalite:3.25.2 -com.google.protobuf:protobuf-kotlin-lite:3.25.2 +com.google.protobuf:protobuf-javalite:4.26.0 +com.google.protobuf:protobuf-kotlin-lite:4.26.0 com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0 com.squareup.okhttp3:logging-interceptor:4.12.0 com.squareup.okhttp3:okhttp:4.12.0 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 8cbabc247..4c8232a26 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 @@ -16,6 +16,7 @@ package com.google.samples.apps.nowinandroid.ui +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.WindowInsets @@ -199,15 +200,7 @@ internal fun NiaApp( ) } - NiaNavHost( - appState = appState, - onShowSnackbar = { message, action -> - snackbarHostState.showSnackbar( - message = message, - actionLabel = action, - duration = Short, - ) == ActionPerformed - }, + Box( modifier = if (shouldShowTopAppBar) { Modifier.consumeWindowInsets( WindowInsets.safeDrawing.only(WindowInsetsSides.Top), @@ -215,7 +208,18 @@ internal fun NiaApp( } else { Modifier }, - ) + ) { + NiaNavHost( + appState = appState, + onShowSnackbar = { message, action -> + snackbarHostState.showSnackbar( + message = message, + actionLabel = action, + duration = Short, + ) == ActionPerformed + }, + ) + } } // TODO: We may want to add padding or spacer when the snackbar is shown so that diff --git a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/interests2pane/Interests2PaneViewModel.kt b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/interests2pane/Interests2PaneViewModel.kt index d618c2d47..40ce9c116 100644 --- a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/interests2pane/Interests2PaneViewModel.kt +++ b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/interests2pane/Interests2PaneViewModel.kt @@ -27,7 +27,8 @@ import javax.inject.Inject class Interests2PaneViewModel @Inject constructor( private val savedStateHandle: SavedStateHandle, ) : ViewModel() { - val selectedTopicId: StateFlow = savedStateHandle.getStateFlow(TOPIC_ID_ARG, null) + val selectedTopicId: StateFlow = + savedStateHandle.getStateFlow(TOPIC_ID_ARG, savedStateHandle[TOPIC_ID_ARG]) fun onTopicClick(topicId: String?) { savedStateHandle[TOPIC_ID_ARG] = topicId diff --git a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/interests2pane/InterestsListDetailScreen.kt b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/interests2pane/InterestsListDetailScreen.kt index 4cc4345ef..ada4e49d1 100644 --- a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/interests2pane/InterestsListDetailScreen.kt +++ b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/interests2pane/InterestsListDetailScreen.kt @@ -18,14 +18,21 @@ package com.google.samples.apps.nowinandroid.ui.interests2pane import androidx.activity.compose.BackHandler import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi +import androidx.compose.material3.adaptive.layout.AnimatedPane import androidx.compose.material3.adaptive.layout.ListDetailPaneScaffold import androidx.compose.material3.adaptive.layout.ListDetailPaneScaffoldRole import androidx.compose.material3.adaptive.layout.PaneAdaptedValue +import androidx.compose.material3.adaptive.layout.ThreePaneScaffoldDestinationItem import androidx.compose.material3.adaptive.navigation.ThreePaneScaffoldNavigator import androidx.compose.material3.adaptive.navigation.rememberListDetailPaneScaffoldNavigator import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.key +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.Saver +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavGraphBuilder @@ -39,8 +46,10 @@ import com.google.samples.apps.nowinandroid.feature.interests.navigation.INTERES import com.google.samples.apps.nowinandroid.feature.interests.navigation.TOPIC_ID_ARG import com.google.samples.apps.nowinandroid.feature.topic.TopicDetailPlaceholder import com.google.samples.apps.nowinandroid.feature.topic.navigation.TOPIC_ROUTE +import com.google.samples.apps.nowinandroid.feature.topic.navigation.createTopicRoute import com.google.samples.apps.nowinandroid.feature.topic.navigation.navigateToTopic import com.google.samples.apps.nowinandroid.feature.topic.navigation.topicScreen +import java.util.UUID private const val DETAIL_PANE_NAVHOST_ROUTE = "detail_pane_route" @@ -76,17 +85,42 @@ internal fun InterestsListDetailScreen( selectedTopicId: String?, onTopicClick: (String) -> Unit, ) { - val listDetailNavigator = rememberListDetailPaneScaffoldNavigator() + val listDetailNavigator = rememberListDetailPaneScaffoldNavigator( + initialDestinationHistory = listOfNotNull( + ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.List), + ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail).takeIf { + selectedTopicId != null + }, + ), + ) BackHandler(listDetailNavigator.canNavigateBack()) { listDetailNavigator.navigateBack() } - val nestedNavController = rememberNavController() + var nestedNavHostStartDestination by remember { + mutableStateOf(selectedTopicId?.let(::createTopicRoute) ?: TOPIC_ROUTE) + } + var nestedNavKey by rememberSaveable( + stateSaver = Saver({ it.toString() }, UUID::fromString), + ) { + mutableStateOf(UUID.randomUUID()) + } + val nestedNavController = key(nestedNavKey) { + rememberNavController() + } fun onTopicClickShowDetailPane(topicId: String) { onTopicClick(topicId) - nestedNavController.navigateToTopic(topicId) { - popUpTo(DETAIL_PANE_NAVHOST_ROUTE) + if (listDetailNavigator.isDetailPaneVisible()) { + // If the detail pane was visible, then use the nestedNavController navigate call + // directly + nestedNavController.navigateToTopic(topicId) { + popUpTo(DETAIL_PANE_NAVHOST_ROUTE) + } + } else { + // Otherwise, recreate the NavHost entirely, and start at the new destination + nestedNavHostStartDestination = createTopicRoute(topicId) + nestedNavKey = UUID.randomUUID() } listDetailNavigator.navigateTo(ListDetailPaneScaffoldRole.Detail) } @@ -95,34 +129,34 @@ internal fun InterestsListDetailScreen( value = listDetailNavigator.scaffoldValue, directive = listDetailNavigator.scaffoldDirective, listPane = { - InterestsRoute( - onTopicClick = ::onTopicClickShowDetailPane, - highlightSelectedTopic = listDetailNavigator.isDetailPaneVisible(), - ) - }, - detailPane = { - NavHost( - navController = nestedNavController, - startDestination = TOPIC_ROUTE, - route = DETAIL_PANE_NAVHOST_ROUTE, - ) { - topicScreen( - showBackButton = !listDetailNavigator.isListPaneVisible(), - onBackClick = listDetailNavigator::navigateBack, + AnimatedPane { + InterestsRoute( onTopicClick = ::onTopicClickShowDetailPane, + highlightSelectedTopic = listDetailNavigator.isDetailPaneVisible(), ) - composable(route = TOPIC_ROUTE) { - TopicDetailPlaceholder() + } + }, + detailPane = { + AnimatedPane { + key(nestedNavKey) { + NavHost( + navController = nestedNavController, + startDestination = nestedNavHostStartDestination, + route = DETAIL_PANE_NAVHOST_ROUTE, + ) { + topicScreen( + showBackButton = !listDetailNavigator.isListPaneVisible(), + onBackClick = listDetailNavigator::navigateBack, + onTopicClick = ::onTopicClickShowDetailPane, + ) + composable(route = TOPIC_ROUTE) { + TopicDetailPlaceholder() + } + } } } }, ) - LaunchedEffect(Unit) { - if (selectedTopicId != null) { - // Initial topic ID was provided when navigating to Interests, so show its details. - onTopicClickShowDetailPane(selectedTopicId) - } - } } @OptIn(ExperimentalMaterial3AdaptiveApi::class) 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 e84335246..32bdfe9d9 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 @@ -16,7 +16,6 @@ package com.google.samples.apps.nowinandroid.ui -import android.util.Log import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi import androidx.compose.material3.windowsizeclass.WindowSizeClass import androidx.compose.runtime.CompositionLocalProvider @@ -28,10 +27,6 @@ import androidx.compose.ui.test.onRoot import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.dp -import androidx.test.platform.app.InstrumentationRegistry -import androidx.work.Configuration -import androidx.work.testing.SynchronousExecutor -import androidx.work.testing.WorkManagerTestInitHelper import com.github.takahirom.roborazzi.captureRoboImage import com.google.samples.apps.nowinandroid.core.data.repository.TopicsRepository import com.google.samples.apps.nowinandroid.core.data.repository.UserDataRepository @@ -109,17 +104,6 @@ class NiaAppScreenSizesScreenshotTests { @Before fun setup() { - val config = Configuration.Builder() - .setMinimumLoggingLevel(Log.DEBUG) - .setExecutor(SynchronousExecutor()) - .build() - - // Initialize WorkManager for instrumentation tests. - WorkManagerTestInitHelper.initializeTestWorkManager( - InstrumentationRegistry.getInstrumentation().context, - config, - ) - hiltRule.inject() // Configure user data 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 c3ad18591..ab67f8399 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 @@ -16,13 +16,14 @@ package com.google.samples.apps.nowinandroid.ui -import android.util.Log import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.material3.SnackbarDuration.Indefinite import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi import androidx.compose.material3.windowsizeclass.WindowSizeClass +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.test.DeviceConfigurationOverride import androidx.compose.ui.test.ForcedSize import androidx.compose.ui.test.junit4.createAndroidComposeRule @@ -30,10 +31,6 @@ import androidx.compose.ui.test.onRoot import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.dp -import androidx.test.platform.app.InstrumentationRegistry -import androidx.work.Configuration -import androidx.work.testing.SynchronousExecutor -import androidx.work.testing.WorkManagerTestInitHelper import com.github.takahirom.roborazzi.captureRoboImage import com.google.samples.apps.nowinandroid.core.data.repository.TopicsRepository import com.google.samples.apps.nowinandroid.core.data.repository.UserNewsResourceRepository @@ -60,6 +57,7 @@ import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config import org.robolectric.annotation.GraphicsMode import org.robolectric.annotation.LooperMode +import java.util.TimeZone import javax.inject.Inject /** @@ -112,17 +110,6 @@ class SnackbarScreenshotTests { @Before fun setup() { - val config = Configuration.Builder() - .setMinimumLoggingLevel(Log.DEBUG) - .setExecutor(SynchronousExecutor()) - .build() - - // Initialize WorkManager for instrumentation tests. - WorkManagerTestInitHelper.initializeTestWorkManager( - InstrumentationRegistry.getInstrumentation().context, - config, - ) - hiltRule.inject() // Configure user data @@ -135,6 +122,12 @@ class SnackbarScreenshotTests { } } + @Before + fun setTimeZone() { + // Make time zone deterministic in tests + TimeZone.setDefault(TimeZone.getTimeZone("UTC")) + } + @Test fun phone_noSnackbar() { val snackbarHostState = SnackbarHostState() @@ -207,22 +200,27 @@ class SnackbarScreenshotTests { ) { lateinit var scope: CoroutineScope composeTestRule.setContent { - scope = rememberCoroutineScope() - - DeviceConfigurationOverride( - DeviceConfigurationOverride.ForcedSize(DpSize(width, height)), + CompositionLocalProvider( + // Replaces images with placeholders + LocalInspectionMode provides true, ) { - BoxWithConstraints { - val appState = rememberNiaAppState( - windowSizeClass = WindowSizeClass.calculateFromSize( - DpSize(maxWidth, maxHeight), - ), - networkMonitor = networkMonitor, - userNewsResourceRepository = userNewsResourceRepository, - timeZoneMonitor = timeZoneMonitor, - ) - NiaTheme { - NiaApp(appState, snackbarHostState, false, {}, {}) + scope = rememberCoroutineScope() + + DeviceConfigurationOverride( + DeviceConfigurationOverride.ForcedSize(DpSize(width, height)), + ) { + BoxWithConstraints { + val appState = rememberNiaAppState( + windowSizeClass = WindowSizeClass.calculateFromSize( + DpSize(maxWidth, maxHeight), + ), + networkMonitor = networkMonitor, + userNewsResourceRepository = userNewsResourceRepository, + timeZoneMonitor = timeZoneMonitor, + ) + NiaTheme { + NiaApp(appState, snackbarHostState, false, {}, {}) + } } } } diff --git a/app/src/testDemo/screenshots/snackbar_compact_medium.png b/app/src/testDemo/screenshots/snackbar_compact_medium.png index 70d15deb3..147c9ce6b 100644 Binary files a/app/src/testDemo/screenshots/snackbar_compact_medium.png and b/app/src/testDemo/screenshots/snackbar_compact_medium.png differ diff --git a/app/src/testDemo/screenshots/snackbar_compact_medium_noSnackbar.png b/app/src/testDemo/screenshots/snackbar_compact_medium_noSnackbar.png index 9c3eb133d..2767ff9b5 100644 Binary files a/app/src/testDemo/screenshots/snackbar_compact_medium_noSnackbar.png and b/app/src/testDemo/screenshots/snackbar_compact_medium_noSnackbar.png differ diff --git a/app/src/testDemo/screenshots/snackbar_expanded_expanded.png b/app/src/testDemo/screenshots/snackbar_expanded_expanded.png index e4c7520ab..5360d68de 100644 Binary files a/app/src/testDemo/screenshots/snackbar_expanded_expanded.png and b/app/src/testDemo/screenshots/snackbar_expanded_expanded.png differ diff --git a/app/src/testDemo/screenshots/snackbar_medium_medium.png b/app/src/testDemo/screenshots/snackbar_medium_medium.png index a9f131fd7..b60112101 100644 Binary files a/app/src/testDemo/screenshots/snackbar_medium_medium.png and b/app/src/testDemo/screenshots/snackbar_medium_medium.png differ diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt index 234313e1f..e38c5b300 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt @@ -57,6 +57,7 @@ internal fun Project.configureAndroidCompose( kotlinOptions { freeCompilerArgs += buildComposeMetricsParameters() freeCompilerArgs += stabilityConfiguration() + freeCompilerArgs += strongSkippingConfiguration() } } } @@ -84,6 +85,7 @@ private fun Project.buildComposeMetricsParameters(): List { "plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=" + reportsFolder.absolutePath ) } + return metricParameters.toList() } @@ -91,3 +93,8 @@ private fun Project.stabilityConfiguration() = listOf( "-P", "plugin:androidx.compose.compiler.plugins.kotlin:stabilityConfigurationPath=${project.rootDir.absolutePath}/compose_compiler_config.conf", ) + +private fun Project.strongSkippingConfiguration() = listOf( + "-P", + "plugin:androidx.compose.compiler.plugins.kotlin:experimentalStrongSkipping=true", +) diff --git a/compose_compiler_config.conf b/compose_compiler_config.conf index 2341256f4..d47946206 100644 --- a/compose_compiler_config.conf +++ b/compose_compiler_config.conf @@ -2,5 +2,10 @@ // It allows us to define classes that our not part of our codebase without wrapping them in a stable class. // For more information, check https://developer.android.com/jetpack/compose/performance/stability/fix#configuration-file +// We always use immutable classes for our data model, to avoid running the Compose compiler +// in the module we declare it to be stable here. +com.google.samples.apps.nowinandroid.core.model.data.* + +// Java standard library classes java.time.ZoneId java.time.ZoneOffset diff --git a/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt b/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt index e9599c555..b2a642cf9 100644 --- a/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt +++ b/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt @@ -26,57 +26,68 @@ import android.net.NetworkRequest.Builder import android.os.Build.VERSION import android.os.Build.VERSION_CODES import androidx.core.content.getSystemService +import androidx.tracing.trace +import com.google.samples.apps.nowinandroid.core.network.Dispatcher +import com.google.samples.apps.nowinandroid.core.network.NiaDispatchers.IO import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.conflate +import kotlinx.coroutines.flow.flowOn import javax.inject.Inject internal class ConnectivityManagerNetworkMonitor @Inject constructor( @ApplicationContext private val context: Context, + @Dispatcher(IO) private val ioDispatcher: CoroutineDispatcher, ) : NetworkMonitor { override val isOnline: Flow = callbackFlow { - val connectivityManager = context.getSystemService() - if (connectivityManager == null) { - channel.trySend(false) - channel.close() - return@callbackFlow - } + trace("NetworkMonitor.callbackFlow") { + val connectivityManager = context.getSystemService() + if (connectivityManager == null) { + channel.trySend(false) + channel.close() + return@callbackFlow + } - /** - * The callback's methods are invoked on changes to *any* network matching the [NetworkRequest], - * not just the active network. So we can simply track the presence (or absence) of such [Network]. - */ - val callback = object : NetworkCallback() { + /** + * The callback's methods are invoked on changes to *any* network matching the [NetworkRequest], + * not just the active network. So we can simply track the presence (or absence) of such [Network]. + */ + val callback = object : NetworkCallback() { - private val networks = mutableSetOf() + private val networks = mutableSetOf() - override fun onAvailable(network: Network) { - networks += network - channel.trySend(true) - } + override fun onAvailable(network: Network) { + networks += network + channel.trySend(true) + } - override fun onLost(network: Network) { - networks -= network - channel.trySend(networks.isNotEmpty()) + override fun onLost(network: Network) { + networks -= network + channel.trySend(networks.isNotEmpty()) + } } - } - val request = Builder() - .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - .build() - connectivityManager.registerNetworkCallback(request, callback) + trace("NetworkMonitor.registerNetworkCallback") { + val request = Builder() + .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + .build() + connectivityManager.registerNetworkCallback(request, callback) + } - /** - * Sends the latest connectivity status to the underlying channel. - */ - channel.trySend(connectivityManager.isCurrentlyConnected()) + /** + * Sends the latest connectivity status to the underlying channel. + */ + channel.trySend(connectivityManager.isCurrentlyConnected()) - awaitClose { - connectivityManager.unregisterNetworkCallback(callback) + awaitClose { + connectivityManager.unregisterNetworkCallback(callback) + } } } + .flowOn(ioDispatcher) .conflate() @Suppress("DEPRECATION") diff --git a/docs/images/graphs/dep_graph_app.svg b/docs/images/graphs/dep_graph_app.svg index 57a592a8e..8a94310b2 100644 --- a/docs/images/graphs/dep_graph_app.svg +++ b/docs/images/graphs/dep_graph_app.svg @@ -1,463 +1,383 @@ - - - - - -G - - - -:app - -:app - - - -:feature:interests - -:feature:interests - - - -:app->:feature:interests - - - - - -:feature:foryou - -:feature:foryou - - - -:app->:feature:foryou - - - - - -:feature:bookmarks - -:feature:bookmarks - - - -:app->:feature:bookmarks - - - - - -:feature:topic - -:feature:topic - - - -:app->:feature:topic - - - - - -:feature:search - -:feature:search - - - -:app->:feature:search - - - - - -:feature:settings - -:feature:settings - - - -:app->:feature:settings - - - - - -:core:common - -:core:common - - - -:app->:core:common - - - - - -:core:ui - -:core:ui - - - -:app->:core:ui - - - - - -:core:designsystem - -:core:designsystem - - - -:app->:core:designsystem - - - - - -:core:data - -:core:data - - - -:app->:core:data - - - - - -:core:model - -:core:model - - - -:app->:core:model - - - - - -:core:analytics - -:core:analytics - - - -:app->:core:analytics - - - - - -:sync:work - -:sync:work - - - -:app->:sync:work - - - - - -:feature:interests->:core:ui - - - - - -:feature:interests->:core:designsystem - - - - - -:feature:interests->:core:data - - - - - -:core:domain - -:core:domain - - - -:feature:interests->:core:domain - - - - - -:feature:foryou->:core:ui - - - - - -:feature:foryou->:core:designsystem - - - - - -:feature:foryou->:core:data - - - - - -:feature:foryou->:core:domain - - - - - -:feature:bookmarks->:core:ui - - - - - -:feature:bookmarks->:core:designsystem - - - - - -:feature:bookmarks->:core:data - - - - - -:feature:topic->:core:ui - - - - - -:feature:topic->:core:designsystem - - - - - -:feature:topic->:core:data - - - - - -:feature:search->:core:ui - - - - - -:feature:search->:core:designsystem - - - - - -:feature:search->:core:data - - - - - -:feature:search->:core:domain - - - - - -:feature:settings->:core:ui - - - - - -:feature:settings->:core:designsystem - - - - - -:feature:settings->:core:data - - - - - -:core:ui->:core:designsystem - - - - - -:core:ui->:core:model - - - - - -:core:ui->:core:analytics - - - - - -:core:data->:core:common - - - - - -:core:data->:core:analytics - - - - - -:core:database - -:core:database - - - -:core:data->:core:database - - - - - -:core:datastore - -:core:datastore - - - -:core:data->:core:datastore - - - - - -:core:network - -:core:network - - - -:core:data->:core:network - - - - - -:core:notifications - -:core:notifications - - - -:core:data->:core:notifications - - - - - -:sync:work->:core:data - - - - - -:sync:work->:core:analytics - - - - - -:core:domain->:core:data - - - - - -:core:domain->:core:model - - - - - -:core:database->:core:model - - - - - -:core:datastore->:core:common - - - - - -:core:datastore->:core:model - - - - - -:core:datastore-proto - -:core:datastore-proto - - - -:core:datastore->:core:datastore-proto - - - - - -:core:network->:core:common - - - - - -:core:network->:core:model - - - - - -:core:notifications->:core:common - - - - - -:core:notifications->:core:model - - - - + + + + G + + + :app + + :app + + + :feature:interests + + :feature:interests + + + :app->:feature:interests + + + + + :feature:foryou + + :feature:foryou + + + :app->:feature:foryou + + + + + :feature:bookmarks + + :feature:bookmarks + + + :app->:feature:bookmarks + + + + + :feature:topic + + :feature:topic + + + :app->:feature:topic + + + + + :feature:search + + :feature:search + + + :app->:feature:search + + + + + :feature:settings + + :feature:settings + + + :app->:feature:settings + + + + + :core:common + + :core:common + + + :app->:core:common + + + + + :core:ui + + :core:ui + + + :app->:core:ui + + + + + :core:designsystem + + :core:designsystem + + + :app->:core:designsystem + + + + + :core:data + + :core:data + + + :app->:core:data + + + + + :core:model + + :core:model + + + :app->:core:model + + + + + :core:analytics + + :core:analytics + + + :app->:core:analytics + + + + + :sync:work + + :sync:work + + + :app->:sync:work + + + + + :feature:interests->:core:ui + + + + + :feature:interests->:core:designsystem + + + + + :feature:interests->:core:data + + + + + :core:domain + + :core:domain + + + :feature:interests->:core:domain + + + + + :feature:foryou->:core:ui + + + + + :feature:foryou->:core:designsystem + + + + + :feature:foryou->:core:data + + + + + :feature:foryou->:core:domain + + + + + :feature:bookmarks->:core:ui + + + + + :feature:bookmarks->:core:designsystem + + + + + :feature:bookmarks->:core:data + + + + + :feature:topic->:core:ui + + + + + :feature:topic->:core:designsystem + + + + + :feature:topic->:core:data + + + + + :feature:search->:core:ui + + + + + :feature:search->:core:designsystem + + + + + :feature:search->:core:data + + + + + :feature:search->:core:domain + + + + + :feature:settings->:core:ui + + + + + :feature:settings->:core:designsystem + + + + + :feature:settings->:core:data + + + + + :core:ui->:core:designsystem + + + + + :core:ui->:core:model + + + + + :core:ui->:core:analytics + + + + + :core:data->:core:common + + + + + :core:data->:core:analytics + + + + + :core:database + + :core:database + + + :core:data->:core:database + + + + + :core:datastore + + :core:datastore + + + :core:data->:core:datastore + + + + + :core:network + + :core:network + + + :core:data->:core:network + + + + + :core:notifications + + :core:notifications + + + :core:data->:core:notifications + + + + + :sync:work->:core:data + + + + + :sync:work->:core:analytics + + + + + :core:domain->:core:data + + + + + :core:domain->:core:model + + + + + :core:database->:core:model + + + + + :core:datastore->:core:common + + + + + :core:datastore->:core:model + + + + + :core:datastore-proto + + :core:datastore-proto + + + :core:datastore->:core:datastore-proto + + + + + :core:network->:core:common + + + + + :core:network->:core:model + + + + + :core:notifications->:core:common + + + + + :core:notifications->:core:model + + + + diff --git a/docs/images/graphs/dep_graph_app_nia_catalog.svg b/docs/images/graphs/dep_graph_app_nia_catalog.svg index b58415cef..fa7cfca5a 100644 --- a/docs/images/graphs/dep_graph_app_nia_catalog.svg +++ b/docs/images/graphs/dep_graph_app_nia_catalog.svg @@ -1,73 +1,58 @@ - - - - - -G - - - -:app-nia-catalog - -:app-nia-catalog - - - -:core:designsystem - -:core:designsystem - - - -:app-nia-catalog->:core:designsystem - - - - - -:core:ui - -:core:ui - - - -:app-nia-catalog->:core:ui - - - - - -:core:ui->:core:designsystem - - - - - -:core:analytics - -:core:analytics - - - -:core:ui->:core:analytics - - - - - -:core:model - -:core:model - - - -:core:ui->:core:model - - - - + + + + G + + + :app-nia-catalog + + :app-nia-catalog + + + :core:designsystem + + :core:designsystem + + + :app-nia-catalog->:core:designsystem + + + + + :core:ui + + :core:ui + + + :app-nia-catalog->:core:ui + + + + + :core:ui->:core:designsystem + + + + + :core:analytics + + :core:analytics + + + :core:ui->:core:analytics + + + + + :core:model + + :core:model + + + :core:ui->:core:model + + + + diff --git a/docs/images/graphs/dep_graph_core_analytics.svg b/docs/images/graphs/dep_graph_core_analytics.svg index ac21c0707..9cb11e4eb 100644 --- a/docs/images/graphs/dep_graph_core_analytics.svg +++ b/docs/images/graphs/dep_graph_core_analytics.svg @@ -1,19 +1,13 @@ - - - - - -G - - - -:core:analytics - -:core:analytics - - + + + + G + + + :core:analytics + + :core:analytics + + diff --git a/docs/images/graphs/dep_graph_core_common.svg b/docs/images/graphs/dep_graph_core_common.svg index c91f33853..a1cdcb610 100644 --- a/docs/images/graphs/dep_graph_core_common.svg +++ b/docs/images/graphs/dep_graph_core_common.svg @@ -1,19 +1,13 @@ - - - - - -G - - - -:core:common - -:core:common - - + + + + G + + + :core:common + + :core:common + + diff --git a/docs/images/graphs/dep_graph_core_data.svg b/docs/images/graphs/dep_graph_core_data.svg index cacf03a1f..8637b06ee 100644 --- a/docs/images/graphs/dep_graph_core_data.svg +++ b/docs/images/graphs/dep_graph_core_data.svg @@ -1,151 +1,123 @@ - - - - - -G - - - -:core:data - -:core:data - - - -:core:common - -:core:common - - - -:core:data->:core:common - - - - - -:core:database - -:core:database - - - -:core:data->:core:database - - - - - -:core:datastore - -:core:datastore - - - -:core:data->:core:datastore - - - - - -:core:network - -:core:network - - - -:core:data->:core:network - - - - - -:core:analytics - -:core:analytics - - - -:core:data->:core:analytics - - - - - -:core:notifications - -:core:notifications - - - -:core:data->:core:notifications - - - - - -:core:model - -:core:model - - - -:core:database->:core:model - - - - - -:core:datastore->:core:common - - - - - -:core:datastore->:core:model - - - - - -:core:datastore-proto - -:core:datastore-proto - - - -:core:datastore->:core:datastore-proto - - - - - -:core:network->:core:common - - - - - -:core:network->:core:model - - - - - -:core:notifications->:core:common - - - - - -:core:notifications->:core:model - - - - + + + + G + + + :core:data + + :core:data + + + :core:common + + :core:common + + + :core:data->:core:common + + + + + :core:database + + :core:database + + + :core:data->:core:database + + + + + :core:datastore + + :core:datastore + + + :core:data->:core:datastore + + + + + :core:network + + :core:network + + + :core:data->:core:network + + + + + :core:analytics + + :core:analytics + + + :core:data->:core:analytics + + + + + :core:notifications + + :core:notifications + + + :core:data->:core:notifications + + + + + :core:model + + :core:model + + + :core:database->:core:model + + + + + :core:datastore->:core:common + + + + + :core:datastore->:core:model + + + + + :core:datastore-proto + + :core:datastore-proto + + + :core:datastore->:core:datastore-proto + + + + + :core:network->:core:common + + + + + :core:network->:core:model + + + + + :core:notifications->:core:common + + + + + :core:notifications->:core:model + + + + diff --git a/docs/images/graphs/dep_graph_core_data_test.svg b/docs/images/graphs/dep_graph_core_data_test.svg index 162c83f10..798696c11 100644 --- a/docs/images/graphs/dep_graph_core_data_test.svg +++ b/docs/images/graphs/dep_graph_core_data_test.svg @@ -1,163 +1,133 @@ - - - - - -G - - - -:core:data-test - -:core:data-test - - - -:core:data - -:core:data - - - -:core:data-test->:core:data - - - - - -:core:common - -:core:common - - - -:core:data->:core:common - - - - - -:core:database - -:core:database - - - -:core:data->:core:database - - - - - -:core:datastore - -:core:datastore - - - -:core:data->:core:datastore - - - - - -:core:network - -:core:network - - - -:core:data->:core:network - - - - - -:core:analytics - -:core:analytics - - - -:core:data->:core:analytics - - - - - -:core:notifications - -:core:notifications - - - -:core:data->:core:notifications - - - - - -:core:model - -:core:model - - - -:core:database->:core:model - - - - - -:core:datastore->:core:common - - - - - -:core:datastore->:core:model - - - - - -:core:datastore-proto - -:core:datastore-proto - - - -:core:datastore->:core:datastore-proto - - - - - -:core:network->:core:common - - - - - -:core:network->:core:model - - - - - -:core:notifications->:core:common - - - - - -:core:notifications->:core:model - - - - + + + + G + + + :core:data-test + + :core:data-test + + + :core:data + + :core:data + + + :core:data-test->:core:data + + + + + :core:common + + :core:common + + + :core:data->:core:common + + + + + :core:database + + :core:database + + + :core:data->:core:database + + + + + :core:datastore + + :core:datastore + + + :core:data->:core:datastore + + + + + :core:network + + :core:network + + + :core:data->:core:network + + + + + :core:analytics + + :core:analytics + + + :core:data->:core:analytics + + + + + :core:notifications + + :core:notifications + + + :core:data->:core:notifications + + + + + :core:model + + :core:model + + + :core:database->:core:model + + + + + :core:datastore->:core:common + + + + + :core:datastore->:core:model + + + + + :core:datastore-proto + + :core:datastore-proto + + + :core:datastore->:core:datastore-proto + + + + + :core:network->:core:common + + + + + :core:network->:core:model + + + + + :core:notifications->:core:common + + + + + :core:notifications->:core:model + + + + diff --git a/docs/images/graphs/dep_graph_core_database.svg b/docs/images/graphs/dep_graph_core_database.svg index 9e907b96f..dd3aef7ee 100644 --- a/docs/images/graphs/dep_graph_core_database.svg +++ b/docs/images/graphs/dep_graph_core_database.svg @@ -1,31 +1,23 @@ - - - - - -G - - - -:core:database - -:core:database - - - -:core:model - -:core:model - - - -:core:database->:core:model - - - - + + + + G + + + :core:database + + :core:database + + + :core:model + + :core:model + + + :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 cfcf78db2..3bf13d087 100644 --- a/docs/images/graphs/dep_graph_core_datastore.svg +++ b/docs/images/graphs/dep_graph_core_datastore.svg @@ -1,55 +1,43 @@ - - - - - -G - - - -:core:datastore - -:core:datastore - - - -:core:datastore-proto - -:core:datastore-proto - - - -:core:datastore->:core:datastore-proto - - - - - -:core:model - -:core:model - - - -:core:datastore->:core:model - - - - - -:core:common - -:core:common - - - -:core:datastore->:core:common - - - - + + + + G + + + :core:datastore + + :core:datastore + + + :core:datastore-proto + + :core:datastore-proto + + + :core:datastore->:core:datastore-proto + + + + + :core:model + + :core:model + + + :core:datastore->:core:model + + + + + :core:common + + :core:common + + + :core:datastore->: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 d572d0ea7..fd3bba9b6 100644 --- a/docs/images/graphs/dep_graph_core_datastore_proto.svg +++ b/docs/images/graphs/dep_graph_core_datastore_proto.svg @@ -1,19 +1,13 @@ - - - - - -G - - - -:core:datastore-proto - -:core:datastore-proto - - + + + + G + + + :core:datastore-proto + + :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 ca8d3f84b..e42e5e795 100644 --- a/docs/images/graphs/dep_graph_core_datastore_test.svg +++ b/docs/images/graphs/dep_graph_core_datastore_test.svg @@ -1,73 +1,58 @@ - - - - - -G - - - -:core:datastore-test - -:core:datastore-test - - - -:core:common - -:core:common - - - -:core:datastore-test->:core:common - - - - - -:core:datastore - -:core:datastore - - - -:core:datastore-test->:core:datastore - - - - - -:core:datastore->:core:common - - - - - -:core:datastore-proto - -:core:datastore-proto - - - -:core:datastore->:core:datastore-proto - - - - - -:core:model - -:core:model - - - -:core:datastore->:core:model - - - - + + + + G + + + :core:datastore-test + + :core:datastore-test + + + :core:common + + :core:common + + + :core:datastore-test->:core:common + + + + + :core:datastore + + :core:datastore + + + :core:datastore-test->:core:datastore + + + + + :core:datastore->:core:common + + + + + :core:datastore-proto + + :core:datastore-proto + + + :core:datastore->:core:datastore-proto + + + + + :core:model + + :core:model + + + :core:datastore->:core:model + + + + diff --git a/docs/images/graphs/dep_graph_core_designsystem.svg b/docs/images/graphs/dep_graph_core_designsystem.svg index f46f075f0..f33d70705 100644 --- a/docs/images/graphs/dep_graph_core_designsystem.svg +++ b/docs/images/graphs/dep_graph_core_designsystem.svg @@ -1,19 +1,13 @@ - - - - - -G - - - -:core:designsystem - -:core:designsystem - - + + + + G + + + :core:designsystem + + :core:designsystem + + diff --git a/docs/images/graphs/dep_graph_core_domain.svg b/docs/images/graphs/dep_graph_core_domain.svg index 1c97b64e8..68543466c 100644 --- a/docs/images/graphs/dep_graph_core_domain.svg +++ b/docs/images/graphs/dep_graph_core_domain.svg @@ -1,169 +1,138 @@ - - - - - -G - - - -:core:domain - -:core:domain - - - -:core:data - -:core:data - - - -:core:domain->:core:data - - - - - -:core:model - -:core:model - - - -:core:domain->:core:model - - - - - -:core:common - -:core:common - - - -:core:data->:core:common - - - - - -:core:database - -:core:database - - - -:core:data->:core:database - - - - - -:core:datastore - -:core:datastore - - - -:core:data->:core:datastore - - - - - -:core:network - -:core:network - - - -:core:data->:core:network - - - - - -:core:analytics - -:core:analytics - - - -:core:data->:core:analytics - - - - - -:core:notifications - -:core:notifications - - - -:core:data->:core:notifications - - - - - -:core:database->:core:model - - - - - -:core:datastore->:core:model - - - - - -:core:datastore->:core:common - - - - - -:core:datastore-proto - -:core:datastore-proto - - - -:core:datastore->:core:datastore-proto - - - - - -:core:network->:core:model - - - - - -:core:network->:core:common - - - - - -:core:notifications->:core:model - - - - - -:core:notifications->:core:common - - - - + + + + G + + + :core:domain + + :core:domain + + + :core:data + + :core:data + + + :core:domain->:core:data + + + + + :core:model + + :core:model + + + :core:domain->:core:model + + + + + :core:common + + :core:common + + + :core:data->:core:common + + + + + :core:database + + :core:database + + + :core:data->:core:database + + + + + :core:datastore + + :core:datastore + + + :core:data->:core:datastore + + + + + :core:network + + :core:network + + + :core:data->:core:network + + + + + :core:analytics + + :core:analytics + + + :core:data->:core:analytics + + + + + :core:notifications + + :core:notifications + + + :core:data->:core:notifications + + + + + :core:database->:core:model + + + + + :core:datastore->:core:model + + + + + :core:datastore->:core:common + + + + + :core:datastore-proto + + :core:datastore-proto + + + :core:datastore->:core:datastore-proto + + + + + :core:network->:core:model + + + + + :core:network->:core:common + + + + + :core:notifications->:core:model + + + + + :core:notifications->:core:common + + + + diff --git a/docs/images/graphs/dep_graph_core_model.svg b/docs/images/graphs/dep_graph_core_model.svg index 290457d6c..66959f2f1 100644 --- a/docs/images/graphs/dep_graph_core_model.svg +++ b/docs/images/graphs/dep_graph_core_model.svg @@ -1,19 +1,13 @@ - - - - - -G - - - -:core:model - -:core:model - - + + + + G + + + :core:model + + :core:model + + diff --git a/docs/images/graphs/dep_graph_core_network.svg b/docs/images/graphs/dep_graph_core_network.svg index ea804bcff..9902ee8e3 100644 --- a/docs/images/graphs/dep_graph_core_network.svg +++ b/docs/images/graphs/dep_graph_core_network.svg @@ -1,43 +1,33 @@ - - - - - -G - - - -:core:network - -:core:network - - - -:core:common - -:core:common - - - -:core:network->:core:common - - - - - -:core:model - -:core:model - - - -:core:network->:core:model - - - - + + + + G + + + :core:network + + :core:network + + + :core:common + + :core:common + + + :core:network->:core:common + + + + + :core:model + + :core:model + + + :core:network->:core:model + + + + diff --git a/docs/images/graphs/dep_graph_core_notifications.svg b/docs/images/graphs/dep_graph_core_notifications.svg index cf25ca32e..3a1126ca8 100644 --- a/docs/images/graphs/dep_graph_core_notifications.svg +++ b/docs/images/graphs/dep_graph_core_notifications.svg @@ -1,43 +1,33 @@ - - - - - -G - - - -:core:notifications - -:core:notifications - - - -:core:model - -:core:model - - - -:core:notifications->:core:model - - - - - -:core:common - -:core:common - - - -:core:notifications->:core:common - - - - + + + + G + + + :core:notifications + + :core:notifications + + + :core:model + + :core:model + + + :core:notifications->:core:model + + + + + :core:common + + :core:common + + + :core:notifications->: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 e9fc6d48a..8021dcda6 100644 --- a/docs/images/graphs/dep_graph_core_screenshot_testing.svg +++ b/docs/images/graphs/dep_graph_core_screenshot_testing.svg @@ -1,43 +1,33 @@ - - - - - -G - - - -:core:screenshot-testing - -:core:screenshot-testing - - - -:core:common - -:core:common - - - -:core:screenshot-testing->:core:common - - - - - -:core:designsystem - -:core:designsystem - - - -:core:screenshot-testing->:core:designsystem - - - - + + + + G + + + :core:screenshot-testing + + :core:screenshot-testing + + + :core:common + + :core:common + + + :core:screenshot-testing->:core:common + + + + + :core:designsystem + + :core:designsystem + + + :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 29d367e4b..ac1b301aa 100644 --- a/docs/images/graphs/dep_graph_core_testing.svg +++ b/docs/images/graphs/dep_graph_core_testing.svg @@ -1,199 +1,163 @@ - - - - - -G - - - -:core:testing - -:core:testing - - - -:core:analytics - -:core:analytics - - - -:core:testing->:core:analytics - - - - - -:core:data - -:core:data - - - -:core:testing->:core:data - - - - - -:core:model - -:core:model - - - -:core:testing->:core:model - - - - - -:core:notifications - -:core:notifications - - - -:core:testing->:core:notifications - - - - - -:core:common - -:core:common - - - -:core:testing->:core:common - - - - - -:core:designsystem - -:core:designsystem - - - -:core:testing->:core:designsystem - - - - - -:core:data->:core:analytics - - - - - -:core:data->:core:notifications - - - - - -:core:data->:core:common - - - - - -:core:database - -:core:database - - - -:core:data->:core:database - - - - - -:core:datastore - -:core:datastore - - - -:core:data->:core:datastore - - - - - -:core:network - -:core:network - - - -:core:data->:core:network - - - - - -:core:notifications->:core:model - - - - - -:core:notifications->:core:common - - - - - -:core:database->:core:model - - - - - -:core:datastore->:core:model - - - - - -:core:datastore->:core:common - - - - - -:core:datastore-proto - -:core:datastore-proto - - - -:core:datastore->:core:datastore-proto - - - - - -:core:network->:core:model - - - - - -:core:network->:core:common - - - - + + + + G + + + :core:testing + + :core:testing + + + :core:analytics + + :core:analytics + + + :core:testing->:core:analytics + + + + + :core:data + + :core:data + + + :core:testing->:core:data + + + + + :core:model + + :core:model + + + :core:testing->:core:model + + + + + :core:notifications + + :core:notifications + + + :core:testing->:core:notifications + + + + + :core:common + + :core:common + + + :core:testing->:core:common + + + + + :core:designsystem + + :core:designsystem + + + :core:testing->:core:designsystem + + + + + :core:data->:core:analytics + + + + + :core:data->:core:notifications + + + + + :core:data->:core:common + + + + + :core:database + + :core:database + + + :core:data->:core:database + + + + + :core:datastore + + :core:datastore + + + :core:data->:core:datastore + + + + + :core:network + + :core:network + + + :core:data->:core:network + + + + + :core:notifications->:core:model + + + + + :core:notifications->:core:common + + + + + :core:database->:core:model + + + + + :core:datastore->:core:model + + + + + :core:datastore->:core:common + + + + + :core:datastore-proto + + :core:datastore-proto + + + :core:datastore->:core:datastore-proto + + + + + :core:network->:core:model + + + + + :core:network->:core:common + + + + diff --git a/docs/images/graphs/dep_graph_core_ui.svg b/docs/images/graphs/dep_graph_core_ui.svg index 2eba46866..a36dd7031 100644 --- a/docs/images/graphs/dep_graph_core_ui.svg +++ b/docs/images/graphs/dep_graph_core_ui.svg @@ -1,55 +1,43 @@ - - - - - -G - - - -:core:ui - -:core:ui - - - -:core:analytics - -:core:analytics - - - -:core:ui->:core:analytics - - - - - -:core:designsystem - -:core:designsystem - - - -:core:ui->:core:designsystem - - - - - -:core:model - -:core:model - - - -:core:ui->:core:model - - - - + + + + G + + + :core:ui + + :core:ui + + + :core:analytics + + :core:analytics + + + :core:ui->:core:analytics + + + + + :core:designsystem + + :core:designsystem + + + :core:ui->:core:designsystem + + + + + :core:model + + :core:model + + + :core:ui->:core:model + + + + diff --git a/docs/images/graphs/dep_graph_feature_bookmarks.svg b/docs/images/graphs/dep_graph_feature_bookmarks.svg index cfbb86412..8fbe423c2 100644 --- a/docs/images/graphs/dep_graph_feature_bookmarks.svg +++ b/docs/images/graphs/dep_graph_feature_bookmarks.svg @@ -1,205 +1,168 @@ - - - - - -G - - - -:feature:bookmarks - -:feature:bookmarks - - - -:core:ui - -:core:ui - - - -:feature:bookmarks->:core:ui - - - - - -:core:designsystem - -:core:designsystem - - - -:feature:bookmarks->:core:designsystem - - - - - -:core:data - -:core:data - - - -:feature:bookmarks->:core:data - - - - - -:core:ui->:core:designsystem - - - - - -:core:analytics - -:core:analytics - - - -:core:ui->:core:analytics - - - - - -:core:model - -:core:model - - - -:core:ui->:core:model - - - - - -:core:data->:core:analytics - - - - - -:core:common - -:core:common - - - -:core:data->:core:common - - - - - -:core:database - -:core:database - - - -:core:data->:core:database - - - - - -:core:datastore - -:core:datastore - - - -:core:data->:core:datastore - - - - - -:core:network - -:core:network - - - -:core:data->:core:network - - - - - -:core:notifications - -:core:notifications - - - -:core:data->:core:notifications - - - - - -:core:database->:core:model - - - - - -:core:datastore->:core:model - - - - - -:core:datastore->:core:common - - - - - -:core:datastore-proto - -:core:datastore-proto - - - -:core:datastore->:core:datastore-proto - - - - - -:core:network->:core:model - - - - - -:core:network->:core:common - - - - - -:core:notifications->:core:model - - - - - -:core:notifications->:core:common - - - - + + + + G + + + :feature:bookmarks + + :feature:bookmarks + + + :core:ui + + :core:ui + + + :feature:bookmarks->:core:ui + + + + + :core:designsystem + + :core:designsystem + + + :feature:bookmarks->:core:designsystem + + + + + :core:data + + :core:data + + + :feature:bookmarks->:core:data + + + + + :core:ui->:core:designsystem + + + + + :core:analytics + + :core:analytics + + + :core:ui->:core:analytics + + + + + :core:model + + :core:model + + + :core:ui->:core:model + + + + + :core:data->:core:analytics + + + + + :core:common + + :core:common + + + :core:data->:core:common + + + + + :core:database + + :core:database + + + :core:data->:core:database + + + + + :core:datastore + + :core:datastore + + + :core:data->:core:datastore + + + + + :core:network + + :core:network + + + :core:data->:core:network + + + + + :core:notifications + + :core:notifications + + + :core:data->:core:notifications + + + + + :core:database->:core:model + + + + + :core:datastore->:core:model + + + + + :core:datastore->:core:common + + + + + :core:datastore-proto + + :core:datastore-proto + + + :core:datastore->:core:datastore-proto + + + + + :core:network->:core:model + + + + + :core:network->:core:common + + + + + :core:notifications->:core:model + + + + + :core:notifications->:core:common + + + + diff --git a/docs/images/graphs/dep_graph_feature_foryou.svg b/docs/images/graphs/dep_graph_feature_foryou.svg index e196bc7da..6b8af3764 100644 --- a/docs/images/graphs/dep_graph_feature_foryou.svg +++ b/docs/images/graphs/dep_graph_feature_foryou.svg @@ -1,229 +1,188 @@ - - - - - -G - - - -:feature:foryou - -:feature:foryou - - - -:core:ui - -:core:ui - - - -:feature:foryou->:core:ui - - - - - -:core:designsystem - -:core:designsystem - - - -:feature:foryou->:core:designsystem - - - - - -:core:data - -:core:data - - - -:feature:foryou->:core:data - - - - - -:core:domain - -:core:domain - - - -:feature:foryou->:core:domain - - - - - -:core:ui->:core:designsystem - - - - - -:core:analytics - -:core:analytics - - - -:core:ui->:core:analytics - - - - - -:core:model - -:core:model - - - -:core:ui->:core:model - - - - - -:core:data->:core:analytics - - - - - -:core:common - -:core:common - - - -:core:data->:core:common - - - - - -:core:database - -:core:database - - - -:core:data->:core:database - - - - - -:core:datastore - -:core:datastore - - - -:core:data->:core:datastore - - - - - -:core:network - -:core:network - - - -:core:data->:core:network - - - - - -:core:notifications - -:core:notifications - - - -:core:data->:core:notifications - - - - - -:core:domain->:core:data - - - - - -:core:domain->:core:model - - - - - -:core:database->:core:model - - - - - -:core:datastore->:core:model - - - - - -:core:datastore->:core:common - - - - - -:core:datastore-proto - -:core:datastore-proto - - - -:core:datastore->:core:datastore-proto - - - - - -:core:network->:core:model - - - - - -:core:network->:core:common - - - - - -:core:notifications->:core:model - - - - - -:core:notifications->:core:common - - - - + + + + G + + + :feature:foryou + + :feature:foryou + + + :core:ui + + :core:ui + + + :feature:foryou->:core:ui + + + + + :core:designsystem + + :core:designsystem + + + :feature:foryou->:core:designsystem + + + + + :core:data + + :core:data + + + :feature:foryou->:core:data + + + + + :core:domain + + :core:domain + + + :feature:foryou->:core:domain + + + + + :core:ui->:core:designsystem + + + + + :core:analytics + + :core:analytics + + + :core:ui->:core:analytics + + + + + :core:model + + :core:model + + + :core:ui->:core:model + + + + + :core:data->:core:analytics + + + + + :core:common + + :core:common + + + :core:data->:core:common + + + + + :core:database + + :core:database + + + :core:data->:core:database + + + + + :core:datastore + + :core:datastore + + + :core:data->:core:datastore + + + + + :core:network + + :core:network + + + :core:data->:core:network + + + + + :core:notifications + + :core:notifications + + + :core:data->:core:notifications + + + + + :core:domain->:core:data + + + + + :core:domain->:core:model + + + + + :core:database->:core:model + + + + + :core:datastore->:core:model + + + + + :core:datastore->:core:common + + + + + :core:datastore-proto + + :core:datastore-proto + + + :core:datastore->:core:datastore-proto + + + + + :core:network->:core:model + + + + + :core:network->:core:common + + + + + :core:notifications->:core:model + + + + + :core:notifications->:core:common + + + + diff --git a/docs/images/graphs/dep_graph_feature_interests.svg b/docs/images/graphs/dep_graph_feature_interests.svg index 3728cb4f6..b13783a27 100644 --- a/docs/images/graphs/dep_graph_feature_interests.svg +++ b/docs/images/graphs/dep_graph_feature_interests.svg @@ -1,229 +1,188 @@ - - - - - -G - - - -:feature:interests - -:feature:interests - - - -:core:ui - -:core:ui - - - -:feature:interests->:core:ui - - - - - -:core:designsystem - -:core:designsystem - - - -:feature:interests->:core:designsystem - - - - - -:core:data - -:core:data - - - -:feature:interests->:core:data - - - - - -:core:domain - -:core:domain - - - -:feature:interests->:core:domain - - - - - -:core:ui->:core:designsystem - - - - - -:core:analytics - -:core:analytics - - - -:core:ui->:core:analytics - - - - - -:core:model - -:core:model - - - -:core:ui->:core:model - - - - - -:core:data->:core:analytics - - - - - -:core:common - -:core:common - - - -:core:data->:core:common - - - - - -:core:database - -:core:database - - - -:core:data->:core:database - - - - - -:core:datastore - -:core:datastore - - - -:core:data->:core:datastore - - - - - -:core:network - -:core:network - - - -:core:data->:core:network - - - - - -:core:notifications - -:core:notifications - - - -:core:data->:core:notifications - - - - - -:core:domain->:core:data - - - - - -:core:domain->:core:model - - - - - -:core:database->:core:model - - - - - -:core:datastore->:core:model - - - - - -:core:datastore->:core:common - - - - - -:core:datastore-proto - -:core:datastore-proto - - - -:core:datastore->:core:datastore-proto - - - - - -:core:network->:core:model - - - - - -:core:network->:core:common - - - - - -:core:notifications->:core:model - - - - - -:core:notifications->:core:common - - - - + + + + G + + + :feature:interests + + :feature:interests + + + :core:ui + + :core:ui + + + :feature:interests->:core:ui + + + + + :core:designsystem + + :core:designsystem + + + :feature:interests->:core:designsystem + + + + + :core:data + + :core:data + + + :feature:interests->:core:data + + + + + :core:domain + + :core:domain + + + :feature:interests->:core:domain + + + + + :core:ui->:core:designsystem + + + + + :core:analytics + + :core:analytics + + + :core:ui->:core:analytics + + + + + :core:model + + :core:model + + + :core:ui->:core:model + + + + + :core:data->:core:analytics + + + + + :core:common + + :core:common + + + :core:data->:core:common + + + + + :core:database + + :core:database + + + :core:data->:core:database + + + + + :core:datastore + + :core:datastore + + + :core:data->:core:datastore + + + + + :core:network + + :core:network + + + :core:data->:core:network + + + + + :core:notifications + + :core:notifications + + + :core:data->:core:notifications + + + + + :core:domain->:core:data + + + + + :core:domain->:core:model + + + + + :core:database->:core:model + + + + + :core:datastore->:core:model + + + + + :core:datastore->:core:common + + + + + :core:datastore-proto + + :core:datastore-proto + + + :core:datastore->:core:datastore-proto + + + + + :core:network->:core:model + + + + + :core:network->:core:common + + + + + :core:notifications->:core:model + + + + + :core:notifications->:core:common + + + + diff --git a/docs/images/graphs/dep_graph_feature_search.svg b/docs/images/graphs/dep_graph_feature_search.svg index 24c90cb0c..ff299f33f 100644 --- a/docs/images/graphs/dep_graph_feature_search.svg +++ b/docs/images/graphs/dep_graph_feature_search.svg @@ -1,229 +1,188 @@ - - - - - -G - - - -:feature:search - -:feature:search - - - -:core:ui - -:core:ui - - - -:feature:search->:core:ui - - - - - -:core:designsystem - -:core:designsystem - - - -:feature:search->:core:designsystem - - - - - -:core:data - -:core:data - - - -:feature:search->:core:data - - - - - -:core:domain - -:core:domain - - - -:feature:search->:core:domain - - - - - -:core:ui->:core:designsystem - - - - - -:core:analytics - -:core:analytics - - - -:core:ui->:core:analytics - - - - - -:core:model - -:core:model - - - -:core:ui->:core:model - - - - - -:core:data->:core:analytics - - - - - -:core:common - -:core:common - - - -:core:data->:core:common - - - - - -:core:database - -:core:database - - - -:core:data->:core:database - - - - - -:core:datastore - -:core:datastore - - - -:core:data->:core:datastore - - - - - -:core:network - -:core:network - - - -:core:data->:core:network - - - - - -:core:notifications - -:core:notifications - - - -:core:data->:core:notifications - - - - - -:core:domain->:core:data - - - - - -:core:domain->:core:model - - - - - -:core:database->:core:model - - - - - -:core:datastore->:core:model - - - - - -:core:datastore->:core:common - - - - - -:core:datastore-proto - -:core:datastore-proto - - - -:core:datastore->:core:datastore-proto - - - - - -:core:network->:core:model - - - - - -:core:network->:core:common - - - - - -:core:notifications->:core:model - - - - - -:core:notifications->:core:common - - - - + + + + G + + + :feature:search + + :feature:search + + + :core:ui + + :core:ui + + + :feature:search->:core:ui + + + + + :core:designsystem + + :core:designsystem + + + :feature:search->:core:designsystem + + + + + :core:data + + :core:data + + + :feature:search->:core:data + + + + + :core:domain + + :core:domain + + + :feature:search->:core:domain + + + + + :core:ui->:core:designsystem + + + + + :core:analytics + + :core:analytics + + + :core:ui->:core:analytics + + + + + :core:model + + :core:model + + + :core:ui->:core:model + + + + + :core:data->:core:analytics + + + + + :core:common + + :core:common + + + :core:data->:core:common + + + + + :core:database + + :core:database + + + :core:data->:core:database + + + + + :core:datastore + + :core:datastore + + + :core:data->:core:datastore + + + + + :core:network + + :core:network + + + :core:data->:core:network + + + + + :core:notifications + + :core:notifications + + + :core:data->:core:notifications + + + + + :core:domain->:core:data + + + + + :core:domain->:core:model + + + + + :core:database->:core:model + + + + + :core:datastore->:core:model + + + + + :core:datastore->:core:common + + + + + :core:datastore-proto + + :core:datastore-proto + + + :core:datastore->:core:datastore-proto + + + + + :core:network->:core:model + + + + + :core:network->:core:common + + + + + :core:notifications->:core:model + + + + + :core:notifications->:core:common + + + + diff --git a/docs/images/graphs/dep_graph_feature_settings.svg b/docs/images/graphs/dep_graph_feature_settings.svg index 93826715a..1b9648d8b 100644 --- a/docs/images/graphs/dep_graph_feature_settings.svg +++ b/docs/images/graphs/dep_graph_feature_settings.svg @@ -1,205 +1,168 @@ - - - - - -G - - - -:feature:settings - -:feature:settings - - - -:core:ui - -:core:ui - - - -:feature:settings->:core:ui - - - - - -:core:designsystem - -:core:designsystem - - - -:feature:settings->:core:designsystem - - - - - -:core:data - -:core:data - - - -:feature:settings->:core:data - - - - - -:core:ui->:core:designsystem - - - - - -:core:analytics - -:core:analytics - - - -:core:ui->:core:analytics - - - - - -:core:model - -:core:model - - - -:core:ui->:core:model - - - - - -:core:data->:core:analytics - - - - - -:core:common - -:core:common - - - -:core:data->:core:common - - - - - -:core:database - -:core:database - - - -:core:data->:core:database - - - - - -:core:datastore - -:core:datastore - - - -:core:data->:core:datastore - - - - - -:core:network - -:core:network - - - -:core:data->:core:network - - - - - -:core:notifications - -:core:notifications - - - -:core:data->:core:notifications - - - - - -:core:database->:core:model - - - - - -:core:datastore->:core:model - - - - - -:core:datastore->:core:common - - - - - -:core:datastore-proto - -:core:datastore-proto - - - -:core:datastore->:core:datastore-proto - - - - - -:core:network->:core:model - - - - - -:core:network->:core:common - - - - - -:core:notifications->:core:model - - - - - -:core:notifications->:core:common - - - - + + + + G + + + :feature:settings + + :feature:settings + + + :core:ui + + :core:ui + + + :feature:settings->:core:ui + + + + + :core:designsystem + + :core:designsystem + + + :feature:settings->:core:designsystem + + + + + :core:data + + :core:data + + + :feature:settings->:core:data + + + + + :core:ui->:core:designsystem + + + + + :core:analytics + + :core:analytics + + + :core:ui->:core:analytics + + + + + :core:model + + :core:model + + + :core:ui->:core:model + + + + + :core:data->:core:analytics + + + + + :core:common + + :core:common + + + :core:data->:core:common + + + + + :core:database + + :core:database + + + :core:data->:core:database + + + + + :core:datastore + + :core:datastore + + + :core:data->:core:datastore + + + + + :core:network + + :core:network + + + :core:data->:core:network + + + + + :core:notifications + + :core:notifications + + + :core:data->:core:notifications + + + + + :core:database->:core:model + + + + + :core:datastore->:core:model + + + + + :core:datastore->:core:common + + + + + :core:datastore-proto + + :core:datastore-proto + + + :core:datastore->:core:datastore-proto + + + + + :core:network->:core:model + + + + + :core:network->:core:common + + + + + :core:notifications->:core:model + + + + + :core:notifications->:core:common + + + + diff --git a/docs/images/graphs/dep_graph_feature_topic.svg b/docs/images/graphs/dep_graph_feature_topic.svg index cbda3c225..49fe361a8 100644 --- a/docs/images/graphs/dep_graph_feature_topic.svg +++ b/docs/images/graphs/dep_graph_feature_topic.svg @@ -1,205 +1,168 @@ - - - - - -G - - - -:feature:topic - -:feature:topic - - - -:core:ui - -:core:ui - - - -:feature:topic->:core:ui - - - - - -:core:designsystem - -:core:designsystem - - - -:feature:topic->:core:designsystem - - - - - -:core:data - -:core:data - - - -:feature:topic->:core:data - - - - - -:core:ui->:core:designsystem - - - - - -:core:analytics - -:core:analytics - - - -:core:ui->:core:analytics - - - - - -:core:model - -:core:model - - - -:core:ui->:core:model - - - - - -:core:data->:core:analytics - - - - - -:core:common - -:core:common - - - -:core:data->:core:common - - - - - -:core:database - -:core:database - - - -:core:data->:core:database - - - - - -:core:datastore - -:core:datastore - - - -:core:data->:core:datastore - - - - - -:core:network - -:core:network - - - -:core:data->:core:network - - - - - -:core:notifications - -:core:notifications - - - -:core:data->:core:notifications - - - - - -:core:database->:core:model - - - - - -:core:datastore->:core:model - - - - - -:core:datastore->:core:common - - - - - -:core:datastore-proto - -:core:datastore-proto - - - -:core:datastore->:core:datastore-proto - - - - - -:core:network->:core:model - - - - - -:core:network->:core:common - - - - - -:core:notifications->:core:model - - - - - -:core:notifications->:core:common - - - - + + + + G + + + :feature:topic + + :feature:topic + + + :core:ui + + :core:ui + + + :feature:topic->:core:ui + + + + + :core:designsystem + + :core:designsystem + + + :feature:topic->:core:designsystem + + + + + :core:data + + :core:data + + + :feature:topic->:core:data + + + + + :core:ui->:core:designsystem + + + + + :core:analytics + + :core:analytics + + + :core:ui->:core:analytics + + + + + :core:model + + :core:model + + + :core:ui->:core:model + + + + + :core:data->:core:analytics + + + + + :core:common + + :core:common + + + :core:data->:core:common + + + + + :core:database + + :core:database + + + :core:data->:core:database + + + + + :core:datastore + + :core:datastore + + + :core:data->:core:datastore + + + + + :core:network + + :core:network + + + :core:data->:core:network + + + + + :core:notifications + + :core:notifications + + + :core:data->:core:notifications + + + + + :core:database->:core:model + + + + + :core:datastore->:core:model + + + + + :core:datastore->:core:common + + + + + :core:datastore-proto + + :core:datastore-proto + + + :core:datastore->:core:datastore-proto + + + + + :core:network->:core:model + + + + + :core:network->:core:common + + + + + :core:notifications->:core:model + + + + + :core:notifications->:core:common + + + + diff --git a/docs/images/graphs/dep_graph_sync_sync_test.svg b/docs/images/graphs/dep_graph_sync_sync_test.svg index 1e0753393..58a31af19 100644 --- a/docs/images/graphs/dep_graph_sync_sync_test.svg +++ b/docs/images/graphs/dep_graph_sync_sync_test.svg @@ -1,187 +1,153 @@ - - - - - -G - - - -:sync:sync-test - -:sync:sync-test - - - -:core:data - -:core:data - - - -:sync:sync-test->:core:data - - - - - -:sync:work - -:sync:work - - - -:sync:sync-test->:sync:work - - - - - -:core:common - -:core:common - - - -:core:data->:core:common - - - - - -:core:database - -:core:database - - - -:core:data->:core:database - - - - - -:core:datastore - -:core:datastore - - - -:core:data->:core:datastore - - - - - -:core:network - -:core:network - - - -:core:data->:core:network - - - - - -:core:analytics - -:core:analytics - - - -:core:data->:core:analytics - - - - - -:core:notifications - -:core:notifications - - - -:core:data->:core:notifications - - - - - -:sync:work->:core:data - - - - - -:sync:work->:core:analytics - - - - - -:core:model - -:core:model - - - -:core:database->:core:model - - - - - -:core:datastore->:core:common - - - - - -:core:datastore->:core:model - - - - - -:core:datastore-proto - -:core:datastore-proto - - - -:core:datastore->:core:datastore-proto - - - - - -:core:network->:core:common - - - - - -:core:network->:core:model - - - - - -:core:notifications->:core:common - - - - - -:core:notifications->:core:model - - - - + + + + G + + + :sync:sync-test + + :sync:sync-test + + + :core:data + + :core:data + + + :sync:sync-test->:core:data + + + + + :sync:work + + :sync:work + + + :sync:sync-test->:sync:work + + + + + :core:common + + :core:common + + + :core:data->:core:common + + + + + :core:database + + :core:database + + + :core:data->:core:database + + + + + :core:datastore + + :core:datastore + + + :core:data->:core:datastore + + + + + :core:network + + :core:network + + + :core:data->:core:network + + + + + :core:analytics + + :core:analytics + + + :core:data->:core:analytics + + + + + :core:notifications + + :core:notifications + + + :core:data->:core:notifications + + + + + :sync:work->:core:data + + + + + :sync:work->:core:analytics + + + + + :core:model + + :core:model + + + :core:database->:core:model + + + + + :core:datastore->:core:common + + + + + :core:datastore->:core:model + + + + + :core:datastore-proto + + :core:datastore-proto + + + :core:datastore->:core:datastore-proto + + + + + :core:network->:core:common + + + + + :core:network->:core:model + + + + + :core:notifications->:core:common + + + + + :core:notifications->:core:model + + + + diff --git a/docs/images/graphs/dep_graph_sync_work.svg b/docs/images/graphs/dep_graph_sync_work.svg index 6901b5761..2581a10ae 100644 --- a/docs/images/graphs/dep_graph_sync_work.svg +++ b/docs/images/graphs/dep_graph_sync_work.svg @@ -1,169 +1,138 @@ - - - - - -G - - - -:sync:work - -:sync:work - - - -:core:analytics - -:core:analytics - - - -:sync:work->:core:analytics - - - - - -:core:data - -:core:data - - - -:sync:work->:core:data - - - - - -:core:data->:core:analytics - - - - - -:core:common - -:core:common - - - -:core:data->:core:common - - - - - -:core:database - -:core:database - - - -:core:data->:core:database - - - - - -:core:datastore - -:core:datastore - - - -:core:data->:core:datastore - - - - - -:core:network - -:core:network - - - -:core:data->:core:network - - - - - -:core:notifications - -:core:notifications - - - -:core:data->:core:notifications - - - - - -:core:model - -:core:model - - - -:core:database->:core:model - - - - - -:core:datastore->:core:common - - - - - -:core:datastore->:core:model - - - - - -:core:datastore-proto - -:core:datastore-proto - - - -:core:datastore->:core:datastore-proto - - - - - -:core:network->:core:common - - - - - -:core:network->:core:model - - - - - -:core:notifications->:core:common - - - - - -:core:notifications->:core:model - - - - + + + + G + + + :sync:work + + :sync:work + + + :core:analytics + + :core:analytics + + + :sync:work->:core:analytics + + + + + :core:data + + :core:data + + + :sync:work->:core:data + + + + + :core:data->:core:analytics + + + + + :core:common + + :core:common + + + :core:data->:core:common + + + + + :core:database + + :core:database + + + :core:data->:core:database + + + + + :core:datastore + + :core:datastore + + + :core:data->:core:datastore + + + + + :core:network + + :core:network + + + :core:data->:core:network + + + + + :core:notifications + + :core:notifications + + + :core:data->:core:notifications + + + + + :core:model + + :core:model + + + :core:database->:core:model + + + + + :core:datastore->:core:common + + + + + :core:datastore->:core:model + + + + + :core:datastore-proto + + :core:datastore-proto + + + :core:datastore->:core:datastore-proto + + + + + :core:network->:core:common + + + + + :core:network->:core:model + + + + + :core:notifications->:core:common + + + + + :core:notifications->:core:model + + + + diff --git a/feature/topic/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/navigation/TopicNavigation.kt b/feature/topic/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/navigation/TopicNavigation.kt index 41804b634..394c53303 100644 --- a/feature/topic/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/navigation/TopicNavigation.kt +++ b/feature/topic/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/navigation/TopicNavigation.kt @@ -41,13 +41,16 @@ internal class TopicArgs(val topicId: String) { } fun NavController.navigateToTopic(topicId: String, navOptions: NavOptionsBuilder.() -> Unit = {}) { - val encodedId = URLEncoder.encode(topicId, URL_CHARACTER_ENCODING) - val newRoute = "$TOPIC_ROUTE/$encodedId" - navigate(newRoute) { + navigate(createTopicRoute(topicId)) { navOptions() } } +fun createTopicRoute(topicId: String): String { + val encodedId = URLEncoder.encode(topicId, URL_CHARACTER_ENCODING) + return "$TOPIC_ROUTE/$encodedId" +} + fun NavGraphBuilder.topicScreen( showBackButton: Boolean, onBackClick: () -> Unit, diff --git a/generateModuleGraphs.sh b/generateModuleGraphs.sh index fb2d74712..3a826586b 100755 --- a/generateModuleGraphs.sh +++ b/generateModuleGraphs.sh @@ -100,8 +100,11 @@ echo "$module_paths" | while read -r module_path; do -Pmodules.graph.output.gv="/tmp/${file_name}.gv" \ -Pmodules.graph.of.module="${module_path}" "docs/images/graphs/${file_name}.svg" + # Convert to SVG using dot, remove unnecessary comments, and reformat + dot -Tsvg "/tmp/${file_name}.gv" | + sed 's//-->\x0/g' | grep -zv '^