From f80446c3d6c96d220a14b449f49ed1dc31cc8225 Mon Sep 17 00:00:00 2001 From: Rohit Karadkar Date: Tue, 9 Jun 2026 10:33:20 +0530 Subject: [PATCH] fix: restore UserNewsResource flat-properties structure to preserve equals() semantics Storing newsResource+userData directly as data class fields caused equals() to compare userData.shouldHideOnboarding, breaking ForYouViewModelTest. Restored the original internal primary constructor with flat computed fields, adding bookmarkNote as an additional flat property. Co-Authored-By: Claude --- .../core/model/data/UserNewsResource.kt | 43 +++++++++++-------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/core/model/src/main/kotlin/com/google/samples/apps/nowinandroid/core/model/data/UserNewsResource.kt b/core/model/src/main/kotlin/com/google/samples/apps/nowinandroid/core/model/data/UserNewsResource.kt index 833608ea5..d8ba47d5a 100644 --- a/core/model/src/main/kotlin/com/google/samples/apps/nowinandroid/core/model/data/UserNewsResource.kt +++ b/core/model/src/main/kotlin/com/google/samples/apps/nowinandroid/core/model/data/UserNewsResource.kt @@ -22,28 +22,37 @@ import kotlinx.datetime.Instant * A [NewsResource] with additional user information such as whether the user is following the * news resource's topics and whether they have saved (bookmarked) this news resource. */ -data class UserNewsResource( - val newsResource: NewsResource, - val userData: UserData, +data class UserNewsResource internal constructor( + val id: String, + val title: String, + val content: String, + val url: String, + val headerImageUrl: String?, + val publishDate: Instant, + val type: String, + val followableTopics: List, + val isSaved: Boolean, + val hasBeenViewed: Boolean, + val bookmarkNote: String?, ) { - val id: String get() = newsResource.id - val title: String get() = newsResource.title - val content: String get() = newsResource.content - val url: String get() = newsResource.url - val headerImageUrl: String? get() = newsResource.headerImageUrl - val publishDate: Instant get() = newsResource.publishDate - val type: String get() = newsResource.type - val followableTopics: List - get() = newsResource.topics.map { topic -> + constructor(newsResource: NewsResource, userData: UserData) : this( + id = newsResource.id, + title = newsResource.title, + content = newsResource.content, + url = newsResource.url, + headerImageUrl = newsResource.headerImageUrl, + publishDate = newsResource.publishDate, + type = newsResource.type, + followableTopics = newsResource.topics.map { topic -> FollowableTopic( topic = topic, isFollowed = topic.id in userData.followedTopics, ) - } - val isSaved: Boolean get() = newsResource.id in userData.bookmarkedNewsResources - val hasBeenViewed: Boolean get() = newsResource.id in userData.viewedNewsResources - val bookmarkNote: String? - get() = userData.bookmarkNotes[newsResource.id].takeIf { !it.isNullOrBlank() } + }, + isSaved = newsResource.id in userData.bookmarkedNewsResources, + hasBeenViewed = newsResource.id in userData.viewedNewsResources, + bookmarkNote = userData.bookmarkNotes[newsResource.id].takeIf { !it.isNullOrBlank() }, + ) } fun List.mapToUserNewsResources(userData: UserData): List =