diff --git a/core/model/build.gradle.kts b/core/model/build.gradle.kts index 55b49beb7..433d8c2ee 100644 --- a/core/model/build.gradle.kts +++ b/core/model/build.gradle.kts @@ -15,9 +15,16 @@ */ plugins { - id("nowinandroid.jvm.library") + id("nowinandroid.android.library") +} + +android { + namespace = "com.google.samples.apps.nowinandroid.model" } dependencies { implementation(libs.kotlinx.datetime) + val composeBom = platform(libs.androidx.compose.bom) + implementation(composeBom) + implementation(libs.androidx.compose.runtime) } diff --git a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/FollowableTopic.kt b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/FollowableTopic.kt index cef319c5f..bc2c3d6bb 100644 --- a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/FollowableTopic.kt +++ b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/FollowableTopic.kt @@ -16,9 +16,12 @@ package com.google.samples.apps.nowinandroid.core.model.data +import androidx.compose.runtime.Stable + /** * A [topic] with the additional information for whether or not it is followed. */ +@Stable data class FollowableTopic( // TODO consider changing to UserTopic and flattening val topic: Topic, val isFollowed: Boolean, 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 eaa0c58fa..b54ebad6b 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 @@ -62,6 +62,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.toArgb @@ -109,12 +110,15 @@ internal fun ForYouRoute( val isSyncing by viewModel.isSyncing.collectAsStateWithLifecycle() val deepLinkedUserNewsResource by viewModel.deepLinkedNewsResource.collectAsStateWithLifecycle() + val onTopicCheckedChangedRem: (String, Boolean) -> Unit = + remember { viewModel::updateTopicSelection } + ForYouScreen( isSyncing = isSyncing, onboardingUiState = onboardingUiState, feedState = feedState, deepLinkedUserNewsResource = deepLinkedUserNewsResource, - onTopicCheckedChanged = viewModel::updateTopicSelection, + onTopicCheckedChanged = onTopicCheckedChangedRem, onDeepLinkOpened = viewModel::onDeepLinkOpened, onTopicClick = onTopicClick, saveFollowedTopics = viewModel::dismissOnboarding, @@ -259,9 +263,9 @@ private fun LazyGridScope.onboarding( style = MaterialTheme.typography.bodyMedium, ) TopicSelection( - onboardingUiState, - onTopicCheckedChanged, - Modifier.padding(bottom = 8.dp), + onboardingUiState = onboardingUiState, + onTopicCheckedChanged = onTopicCheckedChanged, + modifier = Modifier.padding(bottom = 8.dp), ) // Done button Row( diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState.kt index 58f4f1683..c9043ccfd 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState.kt @@ -16,11 +16,13 @@ package com.google.samples.apps.nowinandroid.feature.foryou +import androidx.compose.runtime.Stable import com.google.samples.apps.nowinandroid.core.model.data.FollowableTopic /** * A sealed hierarchy describing the onboarding state for the for you screen. */ +@Stable sealed interface OnboardingUiState { /** * The onboarding state is loading. @@ -40,6 +42,7 @@ sealed interface OnboardingUiState { /** * There is a onboarding state, with the given lists of topics. */ + @Stable data class Shown( val topics: List, ) : OnboardingUiState {