diff --git a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesStreamUseCase.kt b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesStreamUseCase.kt index a5cce3a65..a8c8caa39 100644 --- a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesStreamUseCase.kt +++ b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetSaveableNewsResourcesStreamUseCase.kt @@ -39,6 +39,10 @@ class GetSaveableNewsResourcesStreamUseCase @Inject constructor( it.bookmarkedNewsResources } + private val followedTopicsIdStream = userDataRepository.userDataStream.map { + it.followedTopics + } + /** * Returns a list of SaveableNewsResources which match the supplied set of topic ids or author * ids. @@ -60,18 +64,26 @@ class GetSaveableNewsResourcesStreamUseCase @Inject constructor( filterTopicIds = filterTopicIds, filterAuthorIds = filterAuthorIds ) - }.mapToSaveableNewsResources(bookmarkedNewsResourcesStream) + }.mapToSaveableNewsResources( + bookmarkedNewsResourcesStream, + followedTopicsIdStream + ) } private fun Flow>.mapToSaveableNewsResources( - savedNewsResourceIdsStream: Flow> + savedNewsResourceIdsStream: Flow>, + followedTopicIdsStream: Flow> ): Flow> = - filterNot { it.isEmpty() } - .combine(savedNewsResourceIdsStream) { newsResources, savedNewsResourceIds -> - newsResources.map { newsResource -> - SaveableNewsResource( - newsResource = newsResource, - isSaved = savedNewsResourceIds.contains(newsResource.id) - ) - } + combine( + filterNot { it.isEmpty() }, + savedNewsResourceIdsStream, + followedTopicIdsStream + ) { newsResources, savedNewsResourceIds, followedTopicIds -> + newsResources.map { newsResource -> + SaveableNewsResource( + newsResource = newsResource, + isSaved = savedNewsResourceIds.contains(newsResource.id), + followedTopicIds = followedTopicIds + ) } + } diff --git a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/SaveableNewsResource.kt b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/SaveableNewsResource.kt index 6850d421f..84bb3eba0 100644 --- a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/SaveableNewsResource.kt +++ b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/SaveableNewsResource.kt @@ -24,4 +24,5 @@ import com.google.samples.apps.nowinandroid.core.model.data.NewsResource data class SaveableNewsResource( val newsResource: NewsResource, val isSaved: Boolean, + val followedTopicIds: Set ) diff --git a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsFeed.kt b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsFeed.kt index 32308bd63..615eb7c66 100644 --- a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsFeed.kt +++ b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsFeed.kt @@ -57,6 +57,7 @@ fun LazyGridScope.newsFeed( NewsResourceCardExpanded( newsResource = saveableNewsResource.newsResource, isBookmarked = saveableNewsResource.isSaved, + followedTopicIds = saveableNewsResource.followedTopicIds, onClick = { ContextCompat.startActivity(context, launchResourceIntent, null) }, onToggleBookmark = { onNewsResourcesCheckedChanged( @@ -113,8 +114,9 @@ fun NewsFeedContentPreview() { feedState = NewsFeedUiState.Success( previewNewsResources.map { SaveableNewsResource( - it, - false + newsResource = it, + isSaved = false, + followedTopicIds = emptySet() ) } ), diff --git a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt index 36e5ff60a..ff456938f 100644 --- a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt +++ b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt @@ -81,6 +81,7 @@ import kotlinx.datetime.toJavaInstant fun NewsResourceCardExpanded( newsResource: NewsResource, isBookmarked: Boolean, + followedTopicIds: Set, onToggleBookmark: () -> Unit, onClick: () -> Unit, modifier: Modifier = Modifier @@ -123,7 +124,7 @@ fun NewsResourceCardExpanded( Spacer(modifier = Modifier.height(12.dp)) NewsResourceShortDescription(newsResource.content) Spacer(modifier = Modifier.height(12.dp)) - NewsResourceTopics(newsResource.topics) + NewsResourceTopics(newsResource.topics, followedTopicIds) } } } @@ -267,6 +268,7 @@ fun NewsResourceShortDescription( @Composable fun NewsResourceTopics( topics: List, + followedTopicIds: Set, modifier: Modifier = Modifier ) { // Store the ID of the Topic which has its "following" menu expanded, if any. @@ -280,7 +282,7 @@ fun NewsResourceTopics( for (topic in topics) { NiaTopicTag( expanded = expandedTopicId == topic.id, - followed = true, // ToDo: Check if topic is followed + followed = followedTopicIds.contains(topic.id), // ToDo: Check if topic is followed onDropMenuToggle = { show -> expandedTopicId = if (show) topic.id else null }, @@ -321,6 +323,7 @@ fun ExpandedNewsResourcePreview() { NewsResourceCardExpanded( newsResource = previewNewsResources[0], isBookmarked = true, + followedTopicIds = emptySet(), onToggleBookmark = {}, onClick = {} ) diff --git a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardList.kt b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardList.kt index 25a7bd2dc..c9ccf3e7b 100644 --- a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardList.kt +++ b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardList.kt @@ -54,6 +54,7 @@ fun LazyListScope.newsResourceCardItems( NewsResourceCardExpanded( newsResource = newsResource, isBookmarked = isBookmarkedMapper(item), + followedTopicIds = emptySet(), //TODO onToggleBookmark = { onToggleBookmark(item) }, onClick = { when (onItemClick) { diff --git a/feature/author/src/main/java/com/google/samples/apps/nowinandroid/feature/author/AuthorScreen.kt b/feature/author/src/main/java/com/google/samples/apps/nowinandroid/feature/author/AuthorScreen.kt index 114b4c438..3b18fd096 100644 --- a/feature/author/src/main/java/com/google/samples/apps/nowinandroid/feature/author/AuthorScreen.kt +++ b/feature/author/src/main/java/com/google/samples/apps/nowinandroid/feature/author/AuthorScreen.kt @@ -246,6 +246,7 @@ fun AuthorScreenPopulated() { SaveableNewsResource( newsResource = newsResource, isSaved = index % 2 == 0, + followedTopicIds = emptySet() ) } ), diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt index 4651e1204..6b09b2ef7 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt @@ -399,7 +399,11 @@ fun ForYouScreenPopulatedFeed() { onboardingUiState = OnboardingUiState.NotShown, feedState = NewsFeedUiState.Success( feed = previewNewsResources.map { - SaveableNewsResource(it, false) + SaveableNewsResource( + it, + isSaved = false, + followedTopicIds = emptySet() + ) } ), onTopicCheckedChanged = { _, _ -> }, @@ -421,7 +425,11 @@ fun ForYouScreenOfflinePopulatedFeed() { onboardingUiState = OnboardingUiState.NotShown, feedState = NewsFeedUiState.Success( feed = previewNewsResources.map { - SaveableNewsResource(it, false) + SaveableNewsResource( + newsResource = it, + isSaved = false, + followedTopicIds = emptySet() + ) } ), onTopicCheckedChanged = { _, _ -> }, @@ -446,8 +454,12 @@ fun ForYouScreenTopicSelection() { ), feedState = NewsFeedUiState.Success( feed = previewNewsResources.map { - SaveableNewsResource(it, false) - } + SaveableNewsResource( + newsResource = it, + isSaved = false, + followedTopicIds = emptySet() + ) + }, ), onTopicCheckedChanged = { _, _ -> }, onAuthorCheckedChanged = { _, _ -> }, @@ -486,8 +498,12 @@ fun ForYouScreenPopulatedAndLoading() { onboardingUiState = OnboardingUiState.Loading, feedState = NewsFeedUiState.Success( feed = previewNewsResources.map { - SaveableNewsResource(it, false) - } + SaveableNewsResource( + newsResource = it, + isSaved = false, + followedTopicIds = emptySet() + ) + }, ), onTopicCheckedChanged = { _, _ -> }, onAuthorCheckedChanged = { _, _ -> }, diff --git a/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt b/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt index 58c572ade..56be5c42f 100644 --- a/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt +++ b/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt @@ -257,6 +257,7 @@ fun TopicScreenPopulated() { SaveableNewsResource( newsResource = newsResource, isSaved = index % 2 == 0, + followedTopicIds = emptySet() ) } ),