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
122 changes: 42 additions & 80 deletions app/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,42 +11,19 @@ config:
nodePlacementStrategy: SIMPLE
---
graph TB
subgraph :feature
direction TB
subgraph :feature:settings
direction TB
:feature:settings:impl[impl]:::android-library
end
subgraph :feature:foryou
direction TB
:feature:foryou:api[api]:::android-library
:feature:foryou:impl[impl]:::android-library
end
subgraph :feature:bookmarks
direction TB
:feature:bookmarks:api[api]:::android-library
:feature:bookmarks:impl[impl]:::android-library
end
subgraph :feature:search
direction TB
:feature:search:api[api]:::android-library
:feature:search:impl[impl]:::android-library
end
subgraph :feature:interests
direction TB
:feature:interests:api[api]:::android-library
:feature:interests:impl[impl]:::android-library
end
subgraph :feature:topic
direction TB
:feature:topic:api[api]:::android-library
:feature:topic:impl[impl]:::android-library
end
end
subgraph :sync
direction TB
:sync:work[work]:::android-library
end
subgraph :feature
direction TB
:feature:bookmarks[bookmarks]:::android-feature
:feature:foryou[foryou]:::android-feature
:feature:interests[interests]:::android-feature
:feature:search[search]:::android-feature
:feature:settings[settings]:::android-feature
:feature:topic[topic]:::android-feature
end
subgraph :core
direction TB
:core:analytics[analytics]:::android-library
Expand All @@ -63,6 +40,7 @@ graph TB
:core:notifications[notifications]:::android-library
:core:ui[ui]:::android-library
end
:navigation[navigation]:::android-library
:benchmarks[benchmarks]:::android-test
:app[app]:::android-application

Expand All @@ -72,18 +50,10 @@ graph TB
:app -.-> :core:data
:app -.-> :core:designsystem
:app -.-> :core:model
:app -.-> :core:navigation
:app -.-> :core:ui
:app -.-> :feature:bookmarks:api
:app -.-> :feature:bookmarks:impl
:app -.-> :feature:foryou:api
:app -.-> :feature:foryou:impl
:app -.-> :feature:interests:api
:app -.-> :feature:interests:impl
:app -.-> :feature:search:api
:app -.-> :feature:search:impl
:app -.-> :feature:settings:impl
:app -.-> :feature:topic:api
:app -.-> :feature:topic:impl
:app -.-> :feature:settings
:app -.-> :navigation
:app -.-> :sync:work
:benchmarks -.->|testedApks| :app
:core:data -.-> :core:analytics
Expand All @@ -105,43 +75,35 @@ graph TB
:core:ui --> :core:analytics
:core:ui --> :core:designsystem
:core:ui --> :core:model
:feature:bookmarks:api --> :core:navigation
:feature:bookmarks:impl -.-> :core:data
:feature:bookmarks:impl -.-> :core:designsystem
:feature:bookmarks:impl -.-> :core:ui
:feature:bookmarks:impl -.-> :feature:bookmarks:api
:feature:bookmarks:impl -.-> :feature:topic:api
:feature:foryou:api --> :core:navigation
:feature:foryou:impl -.-> :core:designsystem
:feature:foryou:impl -.-> :core:domain
:feature:foryou:impl -.-> :core:notifications
:feature:foryou:impl -.-> :core:ui
:feature:foryou:impl -.-> :feature:foryou:api
:feature:foryou:impl -.-> :feature:topic:api
:feature:interests:api --> :core:navigation
:feature:interests:impl -.-> :core:designsystem
:feature:interests:impl -.-> :core:domain
:feature:interests:impl -.-> :core:ui
:feature:interests:impl -.-> :feature:interests:api
:feature:interests:impl -.-> :feature:topic:api
:feature:search:api -.-> :core:domain
:feature:search:api --> :core:navigation
:feature:search:impl -.-> :core:designsystem
:feature:search:impl -.-> :core:domain
:feature:search:impl -.-> :core:ui
:feature:search:impl -.-> :feature:interests:api
:feature:search:impl -.-> :feature:search:api
:feature:search:impl -.-> :feature:topic:api
:feature:settings:impl -.-> :core:data
:feature:settings:impl -.-> :core:designsystem
:feature:settings:impl -.-> :core:ui
:feature:topic:api -.-> :core:designsystem
:feature:topic:api --> :core:navigation
:feature:topic:api -.-> :core:ui
:feature:topic:impl -.-> :core:data
:feature:topic:impl -.-> :core:designsystem
:feature:topic:impl -.-> :core:ui
:feature:topic:impl -.-> :feature:topic:api
:feature:bookmarks -.-> :core:data
:feature:bookmarks -.-> :core:designsystem
:feature:bookmarks -.-> :core:ui
:feature:bookmarks -.-> :feature:topic
:feature:foryou -.-> :core:designsystem
:feature:foryou -.-> :core:domain
:feature:foryou -.-> :core:notifications
:feature:foryou -.-> :core:ui
:feature:interests -.-> :core:designsystem
:feature:interests -.-> :core:domain
:feature:interests -.-> :core:ui
:feature:search -.-> :core:designsystem
:feature:search -.-> :core:domain
:feature:search -.-> :core:ui
:feature:settings -.-> :core:data
:feature:settings -.-> :core:designsystem
:feature:settings -.-> :core:ui
:feature:topic -.-> :core:data
:feature:topic -.-> :core:designsystem
:feature:topic -.-> :core:ui
:navigation -.-> :core:designsystem
:navigation -.-> :core:model
:navigation -.-> :core:navigation
:navigation -.-> :feature:bookmarks
:navigation -.-> :feature:foryou
:navigation -.-> :feature:interests
:navigation -.-> :feature:search
:navigation -.-> :feature:settings
:navigation -.-> :feature:topic
:sync:work -.-> :core:analytics
:sync:work -.-> :core:data
:sync:work -.-> :core:notifications
Expand Down
34 changes: 20 additions & 14 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ android {
versionName = "0.1.2" // X.Y.Z; X = Major, Y = minor, Z = Patch level

// Custom test runner to set up Hilt dependency graph
testInstrumentationRunner = "com.google.samples.apps.nowinandroid.core.testing.NiaTestRunner"
testInstrumentationRunner =
"com.google.samples.apps.nowinandroid.core.testing.NiaTestRunner"
}

buildTypes {
Expand All @@ -46,8 +47,10 @@ android {
isMinifyEnabled = providers.gradleProperty("minifyWithR8")
.map(String::toBooleanStrict).getOrElse(true)
applicationIdSuffix = NiaBuildType.RELEASE.applicationIdSuffix
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro")
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro",
)

// To publish on the Play store a private signing key is required, but to allow anyone
// who clones the code to sign and run the release variant, use the debug signing key.
Expand All @@ -68,24 +71,16 @@ android {
}

dependencies {
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.impl)
implementation(projects.navigation)
implementation(projects.feature.settings)

implementation(projects.core.common)
implementation(projects.core.ui)
implementation(projects.core.designsystem)
implementation(projects.core.data)
implementation(projects.core.model)
implementation(projects.core.analytics)
implementation(projects.core.navigation)
implementation(projects.sync.work)

implementation(libs.androidx.activity.compose)
Expand Down Expand Up @@ -115,6 +110,11 @@ dependencies {

kspTest(libs.hilt.compiler)

testImplementation(projects.feature.interests)
testImplementation(projects.feature.foryou)
testImplementation(projects.feature.bookmarks)
testImplementation(projects.feature.topic)
testImplementation(projects.feature.search)
testImplementation(projects.core.dataTest)
testImplementation(projects.core.datastoreTest)
testImplementation(libs.hilt.android.testing)
Expand All @@ -130,6 +130,12 @@ dependencies {
androidTestImplementation(projects.core.testing)
androidTestImplementation(projects.core.dataTest)
androidTestImplementation(projects.core.datastoreTest)
androidTestImplementation(projects.feature.interests)
androidTestImplementation(projects.feature.foryou)
androidTestImplementation(projects.feature.bookmarks)
androidTestImplementation(projects.feature.topic)
androidTestImplementation(projects.feature.search)

androidTestImplementation(libs.androidx.test.espresso.core)
androidTestImplementation(libs.androidx.compose.ui.test)
androidTestImplementation(libs.hilt.android.testing)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ 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 com.google.samples.apps.nowinandroid.feature.interests.LIST_PANE_TEST_TAG
import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
import kotlinx.coroutines.flow.first
Expand All @@ -50,10 +50,10 @@ import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import javax.inject.Inject
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.impl.R as SettingsR
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

/**
* Tests all the navigation flows that are handled by the navigation library.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,25 +74,25 @@ import com.google.samples.apps.nowinandroid.core.designsystem.theme.GradientColo
import com.google.samples.apps.nowinandroid.core.designsystem.theme.LocalGradientColors
import com.google.samples.apps.nowinandroid.core.navigation.Navigator
import com.google.samples.apps.nowinandroid.core.navigation.toEntries
import com.google.samples.apps.nowinandroid.feature.bookmarks.impl.navigation.LocalSnackbarHostState
import com.google.samples.apps.nowinandroid.feature.bookmarks.impl.navigation.bookmarksEntry
import com.google.samples.apps.nowinandroid.feature.foryou.api.navigation.ForYouNavKey
import com.google.samples.apps.nowinandroid.feature.foryou.impl.navigation.forYouEntry
import com.google.samples.apps.nowinandroid.feature.interests.impl.navigation.interestsEntry
import com.google.samples.apps.nowinandroid.feature.search.api.navigation.SearchNavKey
import com.google.samples.apps.nowinandroid.feature.search.impl.navigation.searchEntry
import com.google.samples.apps.nowinandroid.feature.settings.impl.SettingsDialog
import com.google.samples.apps.nowinandroid.feature.topic.impl.navigation.topicEntry
import com.google.samples.apps.nowinandroid.feature.settings.SettingsDialog
import com.google.samples.apps.nowinandroid.navigation.TOP_LEVEL_NAV_ITEMS
import com.google.samples.apps.nowinandroid.feature.settings.impl.R as settingsR
import com.google.samples.apps.nowinandroid.navigation.bookmarks.LocalSnackbarHostState
import com.google.samples.apps.nowinandroid.navigation.bookmarks.bookmarksEntry
import com.google.samples.apps.nowinandroid.navigation.foryou.forYouEntry
import com.google.samples.apps.nowinandroid.navigation.interests.interestsEntry
import com.google.samples.apps.nowinandroid.navigation.navigateToSearch
import com.google.samples.apps.nowinandroid.navigation.search.searchEntry
import com.google.samples.apps.nowinandroid.navigation.shouldShowGradientBackground
import com.google.samples.apps.nowinandroid.navigation.topic.topicEntry
import com.google.samples.apps.nowinandroid.feature.settings.R as settingsR

@Composable
fun NiaApp(
appState: NiaAppState,
modifier: Modifier = Modifier,
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo(),
) {
val shouldShowGradientBackground = appState.navigationState.currentTopLevelKey == ForYouNavKey
val shouldShowGradientBackground = appState.navigationState.shouldShowGradientBackground()
var showSettingsDialog by rememberSaveable { mutableStateOf(false) }

NiaBackground(modifier = modifier) {
Expand Down Expand Up @@ -223,8 +223,9 @@ internal fun NiaApp(
if (appState.navigationState.currentKey in appState.navigationState.topLevelKeys) {
shouldShowTopAppBar = true

val destination = TOP_LEVEL_NAV_ITEMS[appState.navigationState.currentTopLevelKey]
?: error("Top level nav item not found for ${appState.navigationState.currentTopLevelKey}")
val destination =
TOP_LEVEL_NAV_ITEMS[appState.navigationState.currentTopLevelKey]
?: error("Top level nav item not found for ${appState.navigationState.currentTopLevelKey}")

NiaTopAppBar(
titleRes = destination.titleTextId,
Expand All @@ -240,7 +241,7 @@ internal fun NiaApp(
containerColor = Color.Transparent,
),
onActionClick = { onTopAppBarActionClick() },
onNavigationClick = { navigator.navigate(SearchNavKey) },
onNavigationClick = { navigator.navigateToSearch() },
)
}

Expand All @@ -257,11 +258,11 @@ internal fun NiaApp(
val listDetailStrategy = rememberListDetailSceneStrategy<NavKey>()

val entryProvider = entryProvider {
forYouEntry(navigator)
bookmarksEntry(navigator)
interestsEntry(navigator)
topicEntry(navigator)
searchEntry(navigator)
forYouEntry(navigator = navigator)
bookmarksEntry(navigator = navigator)
interestsEntry(navigator = navigator)
topicEntry(navigator = navigator)
searchEntry(navigator = navigator)
}

NavDisplay(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,9 @@ import com.google.samples.apps.nowinandroid.core.data.repository.UserNewsResourc
import com.google.samples.apps.nowinandroid.core.data.util.NetworkMonitor
import com.google.samples.apps.nowinandroid.core.data.util.TimeZoneMonitor
import com.google.samples.apps.nowinandroid.core.navigation.NavigationState
import com.google.samples.apps.nowinandroid.core.navigation.rememberNavigationState
import com.google.samples.apps.nowinandroid.core.ui.TrackDisposableJank
import com.google.samples.apps.nowinandroid.feature.bookmarks.api.navigation.BookmarksNavKey
import com.google.samples.apps.nowinandroid.feature.foryou.api.navigation.ForYouNavKey
import com.google.samples.apps.nowinandroid.navigation.TOP_LEVEL_NAV_ITEMS
import com.google.samples.apps.nowinandroid.navigation.getNavigationState
import com.google.samples.apps.nowinandroid.navigation.getTopLevelNavKeysWithUnreadResources
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
Expand All @@ -45,7 +43,7 @@ fun rememberNiaAppState(
timeZoneMonitor: TimeZoneMonitor,
coroutineScope: CoroutineScope = rememberCoroutineScope(),
): NiaAppState {
val navigationState = rememberNavigationState(ForYouNavKey, TOP_LEVEL_NAV_ITEMS.keys)
val navigationState = getNavigationState()

NavigationTrackingSideEffect(navigationState)

Expand Down Expand Up @@ -88,10 +86,7 @@ class NiaAppState(
val topLevelNavKeysWithUnreadResources: StateFlow<Set<NavKey>> =
userNewsResourceRepository.observeAllForFollowedTopics()
.combine(userNewsResourceRepository.observeAllBookmarked()) { forYouNewsResources, bookmarkedNewsResources ->
setOfNotNull(
ForYouNavKey.takeIf { forYouNewsResources.any { !it.hasBeenViewed } },
BookmarksNavKey.takeIf { bookmarkedNewsResources.any { !it.hasBeenViewed } },
)
getTopLevelNavKeysWithUnreadResources(forYouNewsResources, bookmarkedNewsResources)
}
.stateIn(
coroutineScope,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ import com.google.samples.apps.nowinandroid.core.testing.repository.TestNewsRepo
import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserDataRepository
import com.google.samples.apps.nowinandroid.core.testing.util.TestNetworkMonitor
import com.google.samples.apps.nowinandroid.core.testing.util.TestTimeZoneMonitor
import com.google.samples.apps.nowinandroid.feature.bookmarks.api.navigation.BookmarksNavKey
import com.google.samples.apps.nowinandroid.feature.foryou.api.navigation.ForYouNavKey
import com.google.samples.apps.nowinandroid.feature.interests.api.navigation.InterestsNavKey
import com.google.samples.apps.nowinandroid.feature.bookmarks.navigation.BookmarksNavKey
import com.google.samples.apps.nowinandroid.feature.foryou.navigation.ForYouNavKey
import com.google.samples.apps.nowinandroid.feature.interests.navigation.InterestsNavKey
import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.HiltTestApplication
import kotlinx.coroutines.flow.collect
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ 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.testing.util.DefaultRoborazziOptions
import com.google.samples.apps.nowinandroid.feature.bookmarks.impl.navigation.LocalSnackbarHostState
import com.google.samples.apps.nowinandroid.navigation.bookmarks.LocalSnackbarHostState
import com.google.samples.apps.nowinandroid.uitesthiltmanifest.HiltComponentActivity
import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ 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.testing.util.DefaultRoborazziOptions
import com.google.samples.apps.nowinandroid.feature.bookmarks.impl.navigation.LocalSnackbarHostState
import com.google.samples.apps.nowinandroid.navigation.bookmarks.LocalSnackbarHostState
import com.google.samples.apps.nowinandroid.uitesthiltmanifest.HiltComponentActivity
import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
Expand Down
Loading
Loading