From 490997281a1ca98d1c4eb0a5fae712c1c1361d18 Mon Sep 17 00:00:00 2001 From: Don Turner Date: Fri, 3 May 2024 13:23:01 +0100 Subject: [PATCH] Update to alpha08, use toRoute to obtain destination inside VM Change-Id: I72f617c594b5e0ae272cf94d2d7288446153420a --- .../InterestsListDetailScreen.kt | 12 ++------ .../feature/interests/InterestsScreen.kt | 5 +--- .../feature/interests/InterestsViewModel.kt | 29 +++++++++---------- .../navigation/InterestsNavigation.kt | 16 ++++++++-- .../feature/topic/TopicViewModel.kt | 5 ++-- gradle/libs.versions.toml | 2 +- 6 files changed, 32 insertions(+), 37 deletions(-) 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 2d5197299..f899164f8 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 @@ -36,6 +36,7 @@ import androidx.navigation.compose.rememberNavController import androidx.navigation.navArgument import com.google.samples.apps.nowinandroid.feature.interests.InterestsRoute import com.google.samples.apps.nowinandroid.feature.interests.navigation.INTERESTS_ROUTE +import com.google.samples.apps.nowinandroid.feature.interests.navigation.InterestsDestination 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.navigateToTopic @@ -47,16 +48,7 @@ import kotlinx.serialization.Serializable @Serializable object DetailPaneNavHostDestination fun NavGraphBuilder.interestsListDetailScreen() { - composable( - route = INTERESTS_ROUTE, - arguments = listOf( - navArgument(TOPIC_ID_ARG) { - type = NavType.StringType - defaultValue = null - nullable = true - }, - ), - ) { + composable{ InterestsListDetailScreen() } } diff --git a/feature/interests/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/InterestsScreen.kt b/feature/interests/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/InterestsScreen.kt index 468550878..4678c28b2 100644 --- a/feature/interests/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/InterestsScreen.kt +++ b/feature/interests/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/InterestsScreen.kt @@ -46,10 +46,7 @@ fun InterestsRoute( InterestsScreen( uiState = uiState, followTopic = viewModel::followTopic, - onTopicClick = { - viewModel.onTopicClick(it) - onTopicClick(it) - }, + onTopicClick = onTopicClick, highlightSelectedTopic = highlightSelectedTopic, modifier = modifier, ) diff --git a/feature/interests/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel.kt b/feature/interests/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel.kt index b369ac5ab..cd1625c17 100644 --- a/feature/interests/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel.kt +++ b/feature/interests/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel.kt @@ -19,47 +19,44 @@ package com.google.samples.apps.nowinandroid.feature.interests import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import androidx.navigation.toRoute import com.google.samples.apps.nowinandroid.core.data.repository.UserDataRepository import com.google.samples.apps.nowinandroid.core.domain.GetFollowableTopicsUseCase import com.google.samples.apps.nowinandroid.core.domain.TopicSortField import com.google.samples.apps.nowinandroid.core.model.data.FollowableTopic +import com.google.samples.apps.nowinandroid.feature.interests.navigation.InterestsDestination import com.google.samples.apps.nowinandroid.feature.interests.navigation.TOPIC_ID_ARG import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel class InterestsViewModel @Inject constructor( - private val savedStateHandle: SavedStateHandle, + savedStateHandle: SavedStateHandle, val userDataRepository: UserDataRepository, getFollowableTopics: GetFollowableTopicsUseCase, ) : ViewModel() { - val selectedTopicId: StateFlow = savedStateHandle.getStateFlow(TOPIC_ID_ARG, null) + private val interestsDestination : InterestsDestination = savedStateHandle.toRoute() - val uiState: StateFlow = combine( - selectedTopicId, - getFollowableTopics(sortBy = TopicSortField.NAME), - InterestsUiState::Interests, - ).stateIn( - scope = viewModelScope, - started = SharingStarted.WhileSubscribed(5_000), - initialValue = InterestsUiState.Loading, - ) + val uiState: StateFlow = + getFollowableTopics(sortBy = TopicSortField.NAME).map { topics -> + InterestsUiState.Interests(interestsDestination.topicId, topics) + }.stateIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(5_000), + initialValue = InterestsUiState.Loading, + ) fun followTopic(followedTopicId: String, followed: Boolean) { viewModelScope.launch { userDataRepository.setTopicIdFollowed(followedTopicId, followed) } } - - fun onTopicClick(topicId: String?) { - savedStateHandle[TOPIC_ID_ARG] = topicId - } } sealed interface InterestsUiState { diff --git a/feature/interests/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/navigation/InterestsNavigation.kt b/feature/interests/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/navigation/InterestsNavigation.kt index 8a0f2d130..e25c662c0 100644 --- a/feature/interests/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/navigation/InterestsNavigation.kt +++ b/feature/interests/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/navigation/InterestsNavigation.kt @@ -23,12 +23,15 @@ import androidx.navigation.NavType import androidx.navigation.compose.composable import androidx.navigation.navArgument import com.google.samples.apps.nowinandroid.feature.interests.InterestsRoute +import kotlinx.serialization.Serializable const val TOPIC_ID_ARG = "topicId" const val INTERESTS_ROUTE_BASE = "interests_route" const val INTERESTS_ROUTE = "$INTERESTS_ROUTE_BASE?$TOPIC_ID_ARG={$TOPIC_ID_ARG}" -fun NavController.navigateToInterests(topicId: String? = null, navOptions: NavOptions? = null) { +@Serializable data class InterestsDestination(val topicId: String?) + +fun NavController.navigateToInterestsOld(topicId: String? = null, navOptions: NavOptions? = null) { val route = if (topicId != null) { "${INTERESTS_ROUTE_BASE}?${TOPIC_ID_ARG}=$topicId" } else { @@ -37,7 +40,12 @@ fun NavController.navigateToInterests(topicId: String? = null, navOptions: NavOp navigate(route, navOptions) } -fun NavGraphBuilder.interestsScreen( +fun NavController.navigateToInterests(topicId: String? = null, navOptions: NavOptions? = null) { + navigate(route = InterestsDestination(topicId), navOptions) +} + + +/*fun NavGraphBuilder.interestsScreenOld( onTopicClick: (String) -> Unit, ) { composable( @@ -52,4 +60,6 @@ fun NavGraphBuilder.interestsScreen( ) { InterestsRoute(onTopicClick = onTopicClick) } -} +}*/ + + diff --git a/feature/topic/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModel.kt b/feature/topic/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModel.kt index 9dc30f9bb..5de77ccd1 100644 --- a/feature/topic/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModel.kt +++ b/feature/topic/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModel.kt @@ -19,6 +19,7 @@ package com.google.samples.apps.nowinandroid.feature.topic import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import androidx.navigation.toRoute import com.google.samples.apps.nowinandroid.core.data.repository.NewsResourceQuery import com.google.samples.apps.nowinandroid.core.data.repository.TopicsRepository import com.google.samples.apps.nowinandroid.core.data.repository.UserDataRepository @@ -47,9 +48,7 @@ class TopicViewModel @Inject constructor( userNewsResourceRepository: UserNewsResourceRepository, ) : ViewModel() { - // TODO: Remove when alpha08 is released - private val topicDestination = TopicDestination(savedStateHandle["id"]!!) - //private val topicDestination : TopicDestination = savedStateHandle.toRoute() + private val topicDestination : TopicDestination = savedStateHandle.toRoute() val topicId = topicDestination.id diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 46ae30127..ecb56a963 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -21,7 +21,7 @@ androidxLifecycle = "2.7.0" androidxMacroBenchmark = "1.2.2" androidxMetrics = "1.0.0-alpha04" #androidxNavigation = "2.8.0-SNAPSHOT" -androidxNavigation = "2.8.0-alpha07" +androidxNavigation = "2.8.0-alpha08" androidxProfileinstaller = "1.3.1" androidxTestCore = "1.5.0" androidxTestExt = "1.1.5"