Skip to content

Commit b85823d

Browse files
committed
Refactor Interests to ListDetailScene
1 parent cb8afd8 commit b85823d

File tree

41 files changed

+149
-110
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+149
-110
lines changed

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,24 +88,24 @@ dependencies {
8888
implementation(projects.core.designsystem)
8989
implementation(projects.core.data)
9090
implementation(projects.core.model)
91-
implementation(projects.core.navigation)
9291
implementation(projects.core.analytics)
9392
implementation(projects.core.navigation)
9493
implementation(projects.sync.work)
9594

9695
implementation(libs.androidx.activity.compose)
9796
implementation(libs.androidx.compose.material3)
98-
implementation(libs.androidx.navigation3.runtime)
9997
implementation(libs.androidx.navigation3.ui)
10098
implementation(libs.androidx.compose.material3.adaptive)
10199
implementation(libs.androidx.compose.material3.adaptive.layout)
102100
implementation(libs.androidx.compose.material3.adaptive.navigation)
101+
implementation(libs.androidx.compose.material3.adaptive.navigation3)
103102
implementation(libs.androidx.compose.material3.windowSizeClass)
104103
implementation(libs.androidx.compose.runtime.tracing)
105104
implementation(libs.androidx.core.ktx)
106105
implementation(libs.androidx.core.splashscreen)
107106
implementation(libs.androidx.hilt.navigation.compose)
108107
implementation(libs.androidx.lifecycle.runtimeCompose)
108+
implementation(libs.androidx.lifecycle.viewModel.navigation3)
109109
implementation(libs.androidx.navigation.compose)
110110
implementation(libs.androidx.profileinstaller)
111111
implementation(libs.androidx.tracing.ktx)

app/src/main/kotlin/com/google/samples/apps/nowinandroid/MainActivity.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme
4444
import com.google.samples.apps.nowinandroid.core.ui.LocalTimeZone
4545
import com.google.samples.apps.nowinandroid.navigation.LocalEntryProviderBuilder
4646
import com.google.samples.apps.nowinandroid.core.navigation.NiaBackStack
47+
import com.google.samples.apps.nowinandroid.core.navigation.NiaBackStackKey
4748
import com.google.samples.apps.nowinandroid.ui.NiaApp
4849
import com.google.samples.apps.nowinandroid.ui.rememberNiaAppState
4950
import com.google.samples.apps.nowinandroid.util.isSystemInDarkTheme
@@ -81,7 +82,7 @@ class MainActivity : ComponentActivity() {
8182
lateinit var niaBackStack: NiaBackStack
8283

8384
@Inject
84-
lateinit var entryProviderBuilders: Set<@JvmSuppressWildcards EntryProviderBuilder<Any>.() -> Unit>
85+
lateinit var entryProviderBuilders: Set<@JvmSuppressWildcards EntryProviderBuilder<NiaBackStackKey>.() -> Unit>
8586

8687
override fun onCreate(savedInstanceState: Bundle?) {
8788
val splashScreen = installSplashScreen()

app/src/main/kotlin/com/google/samples/apps/nowinandroid/di/BackStackProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import dagger.hilt.components.SingletonComponent
2626

2727
@Module
2828
@InstallIn(SingletonComponent::class)
29-
object NiaAppNavigation {
29+
object BackStackProvider {
3030
@Provides
3131
@Singleton
3232
fun provideNiaBackStack(): NiaBackStack =

app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/NiaNavDisplay.kt

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,35 @@
1616

1717
package com.google.samples.apps.nowinandroid.navigation
1818

19+
import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi
20+
import androidx.compose.material3.adaptive.navigation3.rememberListDetailSceneStrategy
1921
import androidx.compose.runtime.Composable
2022
import androidx.compose.runtime.compositionLocalOf
21-
import androidx.compose.runtime.snapshots.SnapshotStateList
23+
import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
2224
import androidx.navigation3.runtime.EntryProviderBuilder
23-
import androidx.navigation3.runtime.NavEntryDecorator
2425
import androidx.navigation3.runtime.entryProvider
26+
import androidx.navigation3.runtime.rememberSavedStateNavEntryDecorator
2527
import androidx.navigation3.ui.NavDisplay
28+
import androidx.navigation3.ui.rememberSceneSetupNavEntryDecorator
2629
import com.google.samples.apps.nowinandroid.core.navigation.NiaBackStack
30+
import com.google.samples.apps.nowinandroid.core.navigation.NiaBackStackKey
2731

32+
@OptIn(ExperimentalMaterial3AdaptiveApi::class)
2833
@Composable
2934
fun NiaNavDisplay(
3035
niaBackStack: NiaBackStack,
3136
) {
37+
val listDetailStrategy = rememberListDetailSceneStrategy<NiaBackStackKey>()
38+
3239
NavDisplay(
3340
backStack = niaBackStack.backStack,
41+
sceneStrategy = listDetailStrategy,
3442
onBack = { niaBackStack.removeLast() },
43+
entryDecorators = listOf(
44+
rememberSceneSetupNavEntryDecorator(),
45+
rememberSavedStateNavEntryDecorator(),
46+
rememberViewModelStoreNavEntryDecorator(),
47+
),
3548
entryProvider = entryProvider {
3649
LocalEntryProviderBuilder.current.forEach { builder ->
3750
builder()
@@ -40,6 +53,6 @@ fun NiaNavDisplay(
4053
)
4154
}
4255

43-
internal val LocalEntryProviderBuilder = compositionLocalOf<Set<@JvmSuppressWildcards EntryProviderBuilder<Any>.() -> Unit>> {
56+
internal val LocalEntryProviderBuilder = compositionLocalOf<Set<EntryProviderBuilder<NiaBackStackKey>.() -> Unit>> {
4457
emptySet()
4558
}

app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import androidx.compose.runtime.Composable
2020
import androidx.compose.ui.Modifier
2121
import androidx.navigation.compose.NavHost
2222
import com.google.samples.apps.nowinandroid.feature.bookmarks.api.navigation.bookmarksScreen
23-
import com.google.samples.apps.nowinandroid.feature.foryou.api.navigation.ForYouBaseRoute
23+
import com.google.samples.apps.nowinandroid.feature.foryou.api.navigation.ForYouRoute
2424
import com.google.samples.apps.nowinandroid.feature.foryou.api.navigation.forYouSection
2525
import com.google.samples.apps.nowinandroid.feature.interests.api.navigation.navigateToInterests
2626
import com.google.samples.apps.nowinandroid.feature.search.api.navigation.searchScreen
@@ -46,7 +46,7 @@ fun NiaNavHost(
4646
val navController = appState.navController
4747
NavHost(
4848
navController = navController,
49-
startDestination = ForYouBaseRoute,
49+
startDestination = ForYouRoute,
5050
modifier = modifier,
5151
) {
5252
forYouSection(

app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/TopLevelDestination.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ import androidx.annotation.StringRes
2020
import androidx.compose.ui.graphics.vector.ImageVector
2121
import com.google.samples.apps.nowinandroid.R
2222
import com.google.samples.apps.nowinandroid.core.designsystem.icon.NiaIcons
23+
import com.google.samples.apps.nowinandroid.core.navigation.NiaBackStackKey
2324
import com.google.samples.apps.nowinandroid.feature.bookmarks.api.navigation.BookmarksRoute
24-
import com.google.samples.apps.nowinandroid.feature.foryou.api.navigation.ForYouBaseRoute
2525
import com.google.samples.apps.nowinandroid.feature.foryou.api.navigation.ForYouRoute
2626
import com.google.samples.apps.nowinandroid.feature.interests.api.navigation.InterestsRoute
2727
import kotlin.reflect.KClass
@@ -49,17 +49,15 @@ enum class TopLevelDestination(
4949
@StringRes val iconTextId: Int,
5050
@StringRes val titleTextId: Int,
5151
val route: KClass<*>,
52-
val baseRoute: KClass<*> = route,
53-
val key: Any
52+
val key: NiaBackStackKey
5453
) {
5554
FOR_YOU(
5655
selectedIcon = NiaIcons.Upcoming,
5756
unselectedIcon = NiaIcons.UpcomingBorder,
5857
iconTextId = forYouR.string.feature_foryou_api_title,
5958
titleTextId = R.string.app_name,
6059
route = ForYouRoute::class,
61-
baseRoute = ForYouBaseRoute::class,
62-
key = ForYouBaseRoute
60+
key = ForYouRoute
6361
),
6462
BOOKMARKS(
6563
selectedIcon = NiaIcons.Bookmarks,
@@ -78,3 +76,5 @@ enum class TopLevelDestination(
7876
key = InterestsRoute(null)
7977
),
8078
}
79+
80+
internal val TopLevelDestinations = TopLevelDestination.entries.associateBy { dest -> dest.key }

app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaApp.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ internal fun NiaApp(
137137
) {
138138
val unreadDestinations by appState.topLevelDestinationsWithUnreadResources
139139
.collectAsStateWithLifecycle()
140-
val currentTopLevelKey = appState.currentTopLevelDestination
140+
val currentTopLevelKey = appState.currentTopLevelDestination!!.key
141141

142142

143143
if (showSettingsDialog) {
@@ -152,10 +152,7 @@ internal fun NiaApp(
152152
navigationSuiteItems = {
153153
appState.topLevelDestinations.forEach { destination ->
154154
val hasUnread = unreadDestinations.contains(destination)
155-
// val selected = currentDestination
156-
// .isRouteInHierarchy(destination.baseRoute)
157155
val selected = destination.key == currentTopLevelKey
158-
println("cfok destination:$destination, currentDest:$currentTopLevelKey")
159156
item(
160157
selected = selected,
161158
onClick = { appState.navigateToTopLevelDestination(destination) },

app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import com.google.samples.apps.nowinandroid.navigation.TopLevelDestination
3535
import com.google.samples.apps.nowinandroid.navigation.TopLevelDestination.BOOKMARKS
3636
import com.google.samples.apps.nowinandroid.navigation.TopLevelDestination.FOR_YOU
3737
import com.google.samples.apps.nowinandroid.navigation.TopLevelDestination.INTERESTS
38+
import com.google.samples.apps.nowinandroid.navigation.TopLevelDestinations
3839
import kotlinx.coroutines.CoroutineScope
3940
import kotlinx.coroutines.flow.SharingStarted
4041
import kotlinx.coroutines.flow.StateFlow
@@ -98,12 +99,7 @@ class NiaAppState(
9899
// }
99100

100101
val currentTopLevelDestination: TopLevelDestination?
101-
@Composable get() {
102-
return TopLevelDestination.entries.firstOrNull { topLevelDestination ->
103-
topLevelDestination.key == niaBackStack.currentTopLevelKey
104-
// currentDestination?.hasRoute(route = topLevelDestination.route) == true
105-
}
106-
}
102+
@Composable get() = TopLevelDestinations[niaBackStack.currentTopLevelKey]
107103

108104
val isOffline = networkMonitor.isOnline
109105
.map(Boolean::not)

core/navigation/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ plugins {
44
}
55

66
dependencies {
7-
implementation(libs.androidx.navigation3.runtime)
7+
api(libs.androidx.navigation3.runtime)
88
}

core/navigation/src/main/kotlin/com/google/samples/apps/nowinandroid/core/navigation/NiaBackStack.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ import javax.inject.Inject
2626
import kotlin.collections.remove
2727

2828
class NiaBackStack @Inject constructor(
29-
startKey: Any,
29+
startKey: NiaBackStackKey,
3030
) {
3131
val backStack = mutableStateListOf(startKey)
3232

3333
// Maintain a stack for each top level route
34-
private var topLevelStacks : LinkedHashMap<Any, SnapshotStateList<Any>> = linkedMapOf(
34+
private var topLevelStacks : LinkedHashMap<NiaBackStackKey, SnapshotStateList<NiaBackStackKey>> = linkedMapOf(
3535
startKey to mutableStateListOf(startKey)
3636
)
3737

@@ -48,7 +48,7 @@ class NiaBackStack @Inject constructor(
4848
addAll(topLevelStacks.flatMap { it.value })
4949
}
5050

51-
fun navigateToTopLevelDestination(key: Any){
51+
fun navigateToTopLevelDestination(key: NiaBackStackKey){
5252
// If the top level doesn't exist, add it
5353
if (topLevelStacks[key] == null){
5454
topLevelStacks.put(key, mutableStateListOf(key))
@@ -64,8 +64,7 @@ class NiaBackStack @Inject constructor(
6464
updateBackStack()
6565
}
6666

67-
fun navigate(key: Any){
68-
println("cfok navigate $key")
67+
fun navigate(key: NiaBackStackKey){
6968
topLevelStacks[currentTopLevelKey]?.add(key)
7069
updateBackStack()
7170
}
@@ -77,5 +76,6 @@ class NiaBackStack @Inject constructor(
7776
currentTopLevelKey = topLevelStacks.keys.last()
7877
updateBackStack()
7978
}
79+
}
8080

81-
}
81+
interface NiaBackStackKey

0 commit comments

Comments
 (0)