Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 14 additions & 8 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -67,12 +67,17 @@ android {
}

dependencies {
implementation(projects.feature.interests)
implementation(projects.feature.foryou)
implementation(projects.feature.bookmarks)
implementation(projects.feature.topic)
implementation(projects.feature.search)
implementation(projects.feature.settings)
implementation(projects.feature.interests.api)
implementation(projects.feature.interests.impl)
implementation(projects.feature.foryou.api)
implementation(projects.feature.foryou.impl)
implementation(projects.feature.bookmarks.api)
implementation(projects.feature.bookmarks.impl)
implementation(projects.feature.topic.api)
implementation(projects.feature.topic.impl)
implementation(projects.feature.search.api)
implementation(projects.feature.search.impl)
implementation(projects.feature.settings.api)

implementation(projects.core.common)
implementation(projects.core.ui)
Expand All @@ -84,16 +89,17 @@ dependencies {

implementation(libs.androidx.activity.compose)
implementation(libs.androidx.compose.material3)
implementation(libs.androidx.navigation3.ui)
implementation(libs.androidx.compose.material3.adaptive)
implementation(libs.androidx.compose.material3.adaptive.layout)
implementation(libs.androidx.compose.material3.adaptive.navigation)
implementation(libs.androidx.compose.material3.adaptive.navigation3)
implementation(libs.androidx.compose.material3.windowSizeClass)
implementation(libs.androidx.compose.runtime.tracing)
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.core.splashscreen)
implementation(libs.androidx.hilt.navigation.compose)
implementation(libs.androidx.lifecycle.runtimeCompose)
implementation(libs.androidx.navigation.compose)
implementation(libs.androidx.lifecycle.viewModel.navigation3)
implementation(libs.androidx.profileinstaller)
implementation(libs.androidx.tracing.ktx)
implementation(libs.androidx.window.core)
Expand Down
161 changes: 87 additions & 74 deletions app/dependencies/prodReleaseRuntimeClasspath.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
androidx.activity:activity-compose:1.9.3
androidx.activity:activity-ktx:1.9.3
androidx.activity:activity:1.9.3
androidx.activity:activity-compose:1.12.0-SNAPSHOT
androidx.activity:activity-ktx:1.12.0-SNAPSHOT
androidx.activity:activity:1.12.0-SNAPSHOT
androidx.annotation:annotation-experimental:1.4.1
androidx.annotation:annotation-jvm:1.9.1
androidx.annotation:annotation:1.9.1
Expand All @@ -10,23 +10,25 @@ androidx.arch.core:core-common:2.2.0
androidx.arch.core:core-runtime:2.2.0
androidx.autofill:autofill:1.0.0
androidx.browser:browser:1.8.0
androidx.collection:collection-jvm:1.5.0-beta03
androidx.collection:collection-ktx:1.5.0-beta03
androidx.collection:collection:1.5.0-beta03
androidx.compose.animation:animation-android:1.8.0-beta02
androidx.compose.animation:animation-core-android:1.8.0-beta02
androidx.compose.animation:animation-core:1.8.0-beta02
androidx.compose.animation:animation:1.8.0-beta02
androidx.compose.foundation:foundation-android:1.8.0-beta02
androidx.compose.foundation:foundation-layout-android:1.8.0-beta02
androidx.compose.foundation:foundation-layout:1.8.0-beta02
androidx.compose.foundation:foundation:1.8.0-beta02
androidx.compose.material3.adaptive:adaptive-android:1.1.0-rc01
androidx.compose.material3.adaptive:adaptive-layout-android:1.1.0-rc01
androidx.compose.material3.adaptive:adaptive-layout:1.1.0-rc01
androidx.compose.material3.adaptive:adaptive-navigation-android:1.1.0-rc01
androidx.compose.material3.adaptive:adaptive-navigation:1.1.0-rc01
androidx.compose.material3.adaptive:adaptive:1.1.0-rc01
androidx.collection:collection-jvm:1.5.0
androidx.collection:collection-ktx:1.5.0
androidx.collection:collection:1.5.0
androidx.compose.animation:animation-android:1.9.0-beta01
androidx.compose.animation:animation-core-android:1.9.0-beta01
androidx.compose.animation:animation-core:1.9.0-beta01
androidx.compose.animation:animation:1.9.0-beta01
androidx.compose.foundation:foundation-android:1.9.0-beta01
androidx.compose.foundation:foundation-layout-android:1.9.0-beta01
androidx.compose.foundation:foundation-layout:1.9.0-beta01
androidx.compose.foundation:foundation:1.9.0-beta01
androidx.compose.material3.adaptive:adaptive-android:1.2.0-SNAPSHOT
androidx.compose.material3.adaptive:adaptive-layout-android:1.2.0-SNAPSHOT
androidx.compose.material3.adaptive:adaptive-layout:1.2.0-SNAPSHOT
androidx.compose.material3.adaptive:adaptive-navigation-android:1.2.0-SNAPSHOT
androidx.compose.material3.adaptive:adaptive-navigation3-android:1.0.0-SNAPSHOT
androidx.compose.material3.adaptive:adaptive-navigation3:1.0.0-SNAPSHOT
androidx.compose.material3.adaptive:adaptive-navigation:1.2.0-SNAPSHOT
androidx.compose.material3.adaptive:adaptive:1.2.0-SNAPSHOT
androidx.compose.material3:material3-adaptive-navigation-suite-android:1.4.0-alpha08
androidx.compose.material3:material3-adaptive-navigation-suite:1.4.0-alpha08
androidx.compose.material3:material3-android:1.4.0-alpha08
Expand All @@ -39,31 +41,34 @@ androidx.compose.material:material-icons-extended-android:1.7.8
androidx.compose.material:material-icons-extended:1.7.8
androidx.compose.material:material-ripple-android:1.8.0-beta02
androidx.compose.material:material-ripple:1.8.0-beta02
androidx.compose.runtime:runtime-android:1.8.0-beta02
androidx.compose.runtime:runtime-saveable-android:1.8.0-beta02
androidx.compose.runtime:runtime-saveable:1.8.0-beta02
androidx.compose.runtime:runtime-tracing:1.8.0-beta02
androidx.compose.runtime:runtime:1.8.0-beta02
androidx.compose.ui:ui-android:1.8.0-beta02
androidx.compose.ui:ui-geometry-android:1.8.0-beta02
androidx.compose.ui:ui-geometry:1.8.0-beta02
androidx.compose.ui:ui-graphics-android:1.8.0-beta02
androidx.compose.ui:ui-graphics:1.8.0-beta02
androidx.compose.ui:ui-text-android:1.8.0-beta02
androidx.compose.ui:ui-text:1.8.0-beta02
androidx.compose.ui:ui-tooling-preview-android:1.8.0-beta02
androidx.compose.ui:ui-tooling-preview:1.8.0-beta02
androidx.compose.ui:ui-unit-android:1.8.0-beta02
androidx.compose.ui:ui-unit:1.8.0-beta02
androidx.compose.ui:ui-util-android:1.8.0-beta02
androidx.compose.ui:ui-util:1.8.0-beta02
androidx.compose.ui:ui:1.8.0-beta02
androidx.compose.runtime:runtime-android:1.9.0-beta03
androidx.compose.runtime:runtime-annotation-android:1.9.0-beta03
androidx.compose.runtime:runtime-annotation:1.9.0-beta03
androidx.compose.runtime:runtime-saveable-android:1.9.0-beta03
androidx.compose.runtime:runtime-saveable:1.9.0-beta03
androidx.compose.runtime:runtime-tracing:1.9.0-beta03
androidx.compose.runtime:runtime:1.9.0-beta03
androidx.compose.ui:ui-android:1.9.0-beta03
androidx.compose.ui:ui-geometry-android:1.9.0-beta03
androidx.compose.ui:ui-geometry:1.9.0-beta03
androidx.compose.ui:ui-graphics-android:1.9.0-beta03
androidx.compose.ui:ui-graphics:1.9.0-beta03
androidx.compose.ui:ui-text-android:1.9.0-beta03
androidx.compose.ui:ui-text:1.9.0-beta03
androidx.compose.ui:ui-tooling-preview-android:1.9.0-beta03
androidx.compose.ui:ui-tooling-preview:1.9.0-beta03
androidx.compose.ui:ui-unit-android:1.9.0-beta03
androidx.compose.ui:ui-unit:1.9.0-beta03
androidx.compose.ui:ui-util-android:1.9.0-beta03
androidx.compose.ui:ui-util:1.9.0-beta03
androidx.compose.ui:ui:1.9.0-beta03
androidx.compose:compose-bom-alpha:2025.02.00
androidx.concurrent:concurrent-futures-ktx:1.1.0
androidx.concurrent:concurrent-futures:1.1.0
androidx.core:core-ktx:1.15.0
androidx.core:core-ktx:1.16.0
androidx.core:core-splashscreen:1.0.1
androidx.core:core:1.15.0
androidx.core:core-viewtree:1.0.0
androidx.core:core:1.16.0
androidx.cursoradapter:cursoradapter:1.0.0
androidx.customview:customview-poolingcontainer:1.0.0
androidx.customview:customview:1.0.0
Expand All @@ -87,39 +92,45 @@ androidx.graphics:graphics-path:1.0.1
androidx.graphics:graphics-shapes-android:1.0.1
androidx.graphics:graphics-shapes:1.0.1
androidx.hilt:hilt-common:1.2.0
androidx.hilt:hilt-navigation-compose:1.2.0
androidx.hilt:hilt-navigation:1.2.0
androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0-alpha02
androidx.hilt:hilt-lifecycle-viewmodel:1.3.0-alpha02
androidx.hilt:hilt-work:1.2.0
androidx.interpolator:interpolator:1.0.0
androidx.legacy:legacy-support-core-utils:1.0.0
androidx.lifecycle:lifecycle-common-java8:2.8.7
androidx.lifecycle:lifecycle-common-jvm:2.8.7
androidx.lifecycle:lifecycle-common:2.8.7
androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7
androidx.lifecycle:lifecycle-livedata-core:2.8.7
androidx.lifecycle:lifecycle-livedata:2.8.7
androidx.lifecycle:lifecycle-process:2.8.7
androidx.lifecycle:lifecycle-runtime-android:2.8.7
androidx.lifecycle:lifecycle-runtime-compose-android:2.8.7
androidx.lifecycle:lifecycle-runtime-compose:2.8.7
androidx.lifecycle:lifecycle-runtime-ktx-android:2.8.7
androidx.lifecycle:lifecycle-runtime-ktx:2.8.7
androidx.lifecycle:lifecycle-runtime:2.8.7
androidx.lifecycle:lifecycle-service:2.8.7
androidx.lifecycle:lifecycle-viewmodel-android:2.8.7
androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.7
androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7
androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7
androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7
androidx.lifecycle:lifecycle-viewmodel:2.8.7
androidx.lifecycle:lifecycle-common-java8:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-common-jvm:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-common:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-livedata-core-ktx:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-livedata-core:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-livedata:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-process:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-runtime-android:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-runtime-compose-android:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-runtime-compose:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-runtime-ktx-android:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-runtime-ktx:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-runtime:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-service:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-viewmodel-android:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-viewmodel-compose-android:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-viewmodel-compose:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-viewmodel-ktx:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-viewmodel-navigation3-android:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-viewmodel-navigation3:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-viewmodel-savedstate-android:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-viewmodel-savedstate:2.10.0-SNAPSHOT
androidx.lifecycle:lifecycle-viewmodel:2.10.0-SNAPSHOT
androidx.loader:loader:1.0.0
androidx.localbroadcastmanager:localbroadcastmanager:1.0.0
androidx.metrics:metrics-performance:1.0.0-beta01
androidx.navigation:navigation-common-ktx:2.8.5
androidx.navigation:navigation-common:2.8.5
androidx.navigation:navigation-compose:2.8.5
androidx.navigation:navigation-runtime-ktx:2.8.5
androidx.navigation:navigation-runtime:2.8.5
androidx.navigation3:navigation3-runtime-android:1.0.0-SNAPSHOT
androidx.navigation3:navigation3-runtime:1.0.0-SNAPSHOT
androidx.navigation3:navigation3-ui-android:1.0.0-SNAPSHOT
androidx.navigation3:navigation3-ui:1.0.0-SNAPSHOT
androidx.navigationevent:navigationevent-android:1.0.0-SNAPSHOT
androidx.navigationevent:navigationevent-compose-android:1.0.0-SNAPSHOT
androidx.navigationevent:navigationevent-compose:1.0.0-SNAPSHOT
androidx.navigationevent:navigationevent:1.0.0-SNAPSHOT
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
Expand All @@ -130,8 +141,11 @@ androidx.room:room-common:2.7.2
androidx.room:room-ktx:2.7.2
androidx.room:room-runtime-android:2.7.2
androidx.room:room-runtime:2.7.2
androidx.savedstate:savedstate-ktx:1.2.1
androidx.savedstate:savedstate:1.2.1
androidx.savedstate:savedstate-android:1.4.0-SNAPSHOT
androidx.savedstate:savedstate-compose-android:1.4.0-SNAPSHOT
androidx.savedstate:savedstate-compose:1.4.0-SNAPSHOT
androidx.savedstate:savedstate-ktx:1.4.0-SNAPSHOT
androidx.savedstate:savedstate:1.4.0-SNAPSHOT
androidx.sqlite:sqlite-android:2.5.1
androidx.sqlite:sqlite-framework-android:2.5.1
androidx.sqlite:sqlite-framework:2.5.1
Expand All @@ -144,10 +158,9 @@ androidx.vectordrawable:vectordrawable-animated:1.1.0
androidx.vectordrawable:vectordrawable:1.1.0
androidx.versionedparcelable:versionedparcelable:1.1.1
androidx.viewpager:viewpager:1.0.0
androidx.window.extensions.core:core:1.0.0
androidx.window:window-core-android:1.3.0
androidx.window:window-core:1.3.0
androidx.window:window:1.3.0
androidx.window:window-core-android:1.4.0-rc01
androidx.window:window-core:1.4.0-rc01
androidx.window:window:1.4.0-rc01
androidx.work:work-runtime-ktx:2.10.0
androidx.work:work-runtime:2.10.0
com.caverock:androidsvg-aar:1.4
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package com.google.samples.apps.nowinandroid.ui

import androidx.compose.ui.semantics.SemanticsActions.ScrollBy
import androidx.compose.ui.test.assertCountEquals
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertIsOn
import androidx.compose.ui.test.assertIsSelected
import androidx.compose.ui.test.hasTestTag
Expand All @@ -39,18 +40,20 @@ import com.google.samples.apps.nowinandroid.core.data.repository.NewsRepository
import com.google.samples.apps.nowinandroid.core.data.repository.TopicsRepository
import com.google.samples.apps.nowinandroid.core.model.data.Topic
import com.google.samples.apps.nowinandroid.core.rules.GrantPostNotificationsPermissionRule
import com.google.samples.apps.nowinandroid.feature.interests.impl.LIST_PANE_TEST_TAG
import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking
import org.junit.Before
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import javax.inject.Inject
import com.google.samples.apps.nowinandroid.feature.bookmarks.R as BookmarksR
import com.google.samples.apps.nowinandroid.feature.foryou.R as FeatureForyouR
import com.google.samples.apps.nowinandroid.feature.search.R as FeatureSearchR
import com.google.samples.apps.nowinandroid.feature.settings.R as SettingsR
import com.google.samples.apps.nowinandroid.feature.bookmarks.api.R as BookmarksR
import com.google.samples.apps.nowinandroid.feature.foryou.api.R as FeatureForyouR
import com.google.samples.apps.nowinandroid.feature.search.api.R as FeatureSearchR
import com.google.samples.apps.nowinandroid.feature.settings.api.R as SettingsR

/**
* Tests all the navigation flows that are handled by the navigation library.
Expand Down Expand Up @@ -83,12 +86,12 @@ class NavigationTest {
lateinit var newsRepository: NewsRepository

// The strings used for matching in these tests
private val navigateUp by composeTestRule.stringResource(FeatureForyouR.string.feature_foryou_navigate_up)
private val forYou by composeTestRule.stringResource(FeatureForyouR.string.feature_foryou_title)
private val interests by composeTestRule.stringResource(FeatureSearchR.string.feature_search_interests)
private val navigateUp by composeTestRule.stringResource(FeatureForyouR.string.feature_foryou_api_navigate_up)
private val forYou by composeTestRule.stringResource(FeatureForyouR.string.feature_foryou_api_title)
private val interests by composeTestRule.stringResource(FeatureSearchR.string.feature_search_api_interests)
private val sampleTopic = "Headlines"
private val appName by composeTestRule.stringResource(R.string.app_name)
private val saved by composeTestRule.stringResource(BookmarksR.string.feature_bookmarks_title)
private val saved by composeTestRule.stringResource(BookmarksR.string.feature_bookmarks_api_title)
private val settings by composeTestRule.stringResource(SettingsR.string.feature_settings_top_app_bar_action_icon_description)
private val brand by composeTestRule.stringResource(SettingsR.string.feature_settings_brand_android)
private val ok by composeTestRule.stringResource(SettingsR.string.feature_settings_dismiss_dialog_button_text)
Expand Down Expand Up @@ -252,6 +255,9 @@ class NavigationTest {
}
}

// TODO decide if backStack should preserve previous stacks when navigating back to home tab (ForYou)
// https://github.com/android/nowinandroid/issues/1937
@Ignore
@Test
fun navigationBar_multipleBackStackInterests() {
composeTestRule.apply {
Expand All @@ -261,12 +267,14 @@ class NavigationTest {
val topic = runBlocking {
topicsRepository.getTopics().first().sortedBy(Topic::name).last()
}
onNodeWithTag("interests:topics").performScrollToNode(hasText(topic.name))
onNodeWithTag(LIST_PANE_TEST_TAG).performScrollToNode(hasText(topic.name))
onNodeWithText(topic.name).performClick()

// Verify the topic is still shown
onNodeWithTag("topic:${topic.id}").assertIsDisplayed()

// Switch tab
onNodeWithText(forYou).performClick()

// Come back to Interests
onNodeWithText(interests).performClick()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.metrics.performance.JankStats
import androidx.navigation3.runtime.EntryProviderBuilder
import androidx.tracing.trace
import com.google.samples.apps.nowinandroid.MainActivityUiState.Loading
import com.google.samples.apps.nowinandroid.core.analytics.AnalyticsHelper
Expand All @@ -40,6 +41,8 @@ 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.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
Expand Down Expand Up @@ -72,9 +75,13 @@ class MainActivity : ComponentActivity() {

@Inject
lateinit var userNewsResourceRepository: UserNewsResourceRepository

private val viewModel: MainActivityViewModel by viewModels()

private val backStackViewModel: NiaBackStackViewModel by viewModels()

@Inject
lateinit var entryProviderBuilders: Set<@JvmSuppressWildcards EntryProviderBuilder<NiaNavKey>.() -> Unit>

override fun onCreate(savedInstanceState: Bundle?) {
val splashScreen = installSplashScreen()
super.onCreate(savedInstanceState)
Expand Down Expand Up @@ -137,6 +144,7 @@ class MainActivity : ComponentActivity() {
networkMonitor = networkMonitor,
userNewsResourceRepository = userNewsResourceRepository,
timeZoneMonitor = timeZoneMonitor,
niaBackStack = backStackViewModel.niaBackStack,
)

val currentTimeZone by appState.currentTimeZone.collectAsStateWithLifecycle()
Expand All @@ -150,7 +158,10 @@ class MainActivity : ComponentActivity() {
androidTheme = themeSettings.androidTheme,
disableDynamicTheming = themeSettings.disableDynamicTheming,
) {
NiaApp(appState)
NiaApp(
appState,
entryProviderBuilders,
)
}
}
}
Expand Down
Loading
Loading