diff --git a/android/build.gradle.kts b/android/build.gradle.kts index 285a270f..569127a2 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -66,6 +66,7 @@ dependencies { implementation(libs.androidx.work.runtime.ktx) implementation(libs.coil) implementation(libs.copydown) + implementation(libs.kotlinx.collections.immutable) implementation(libs.kotlinx.coroutines.core) implementation(libs.sqldelight.extensions.coroutines) } diff --git a/android/lint-baseline.xml b/android/lint-baseline.xml index 7089b70f..1809332c 100644 --- a/android/lint-baseline.xml +++ b/android/lint-baseline.xml @@ -53,26 +53,4 @@ file="src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png"/> - - - - - - - - diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt index 6895491b..2fc8929c 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt @@ -55,6 +55,8 @@ import dev.msfjarvis.claw.common.ui.decorations.ClawAppBar import dev.msfjarvis.claw.common.ui.surfaceColorAtNavigationBarElevation import dev.msfjarvis.claw.common.urllauncher.UrlLauncher import dev.msfjarvis.claw.common.user.UserProfile +import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.persistentMapOf import kotlinx.coroutines.launch @OptIn( @@ -82,7 +84,7 @@ fun LobstersApp( val hottestPosts = viewModel.hottestPosts.collectAsLazyPagingItems() val newestPosts = viewModel.newestPosts.collectAsLazyPagingItems() - val savedPosts by viewModel.savedPosts.collectAsState(emptyMap()) + val savedPosts by viewModel.savedPosts.collectAsState(persistentMapOf()) LobstersTheme( dynamicColor = true, @@ -92,7 +94,7 @@ fun LobstersApp( val systemBarsColor = MaterialTheme.colorScheme.surfaceColorAtNavigationBarElevation() val backgroundColor = MaterialTheme.colorScheme.background val navItems = - listOf( + persistentListOf( NavigationItem( label = "Hottest", route = Destinations.Hottest.route, diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/decorations/ClawNavigationBar.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/decorations/ClawNavigationBar.kt index db30e014..9f05f959 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/decorations/ClawNavigationBar.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/decorations/ClawNavigationBar.kt @@ -1,5 +1,5 @@ /* - * Copyright © 2022 Harsh Shandilya. + * Copyright © 2022-2023 Harsh Shandilya. * Use of this source code is governed by an MIT-style * license that can be found in the LICENSE file or at * https://opensource.org/licenses/MIT. @@ -23,13 +23,14 @@ import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.platform.testTag import androidx.navigation.NavController import dev.msfjarvis.claw.android.ui.navigation.Destinations +import kotlinx.collections.immutable.ImmutableList private const val AnimationDuration = 100 @Composable fun ClawNavigationBar( navController: NavController, - items: List, + items: ImmutableList, isVisible: Boolean, modifier: Modifier = Modifier, ) { diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/DatabasePosts.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/DatabasePosts.kt index f50d1cf4..c8b0d1fe 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/DatabasePosts.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/DatabasePosts.kt @@ -17,11 +17,12 @@ import dev.msfjarvis.claw.common.posts.PostActions import dev.msfjarvis.claw.common.ui.decorations.MonthHeader import dev.msfjarvis.claw.database.local.SavedPost import java.time.Month +import kotlinx.collections.immutable.ImmutableMap @OptIn(ExperimentalFoundationApi::class) @Composable fun DatabasePosts( - items: Map>, + items: ImmutableMap>, listState: LazyListState, postActions: PostActions, modifier: Modifier = Modifier, diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt index e175427c..89182bd6 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt @@ -25,6 +25,8 @@ import java.io.IOException import java.net.HttpURLConnection import java.time.Month import javax.inject.Inject +import kotlinx.collections.immutable.ImmutableMap +import kotlinx.collections.immutable.toImmutableMap import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map @@ -62,9 +64,9 @@ constructor( val savedPosts get() = savedPostsFlow.map(::mapSavedPosts) - private fun mapSavedPosts(items: List): Map> { + private fun mapSavedPosts(items: List): ImmutableMap> { val sorted = items.sortedByDescending { post -> post.createdAt.toLocalDateTime() } - return sorted.groupBy { post -> post.createdAt.toLocalDateTime().month } + return sorted.groupBy { post -> post.createdAt.toLocalDateTime().month }.toImmutableMap() } suspend fun isPostSaved(post: SavedPost): Boolean { diff --git a/common/build.gradle.kts b/common/build.gradle.kts index a83df239..cbab04a5 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -36,6 +36,7 @@ dependencies { implementation(libs.compose.richtext.markdown) implementation(libs.compose.richtext.material3) implementation(libs.compose.richtext.ui) + implementation(libs.kotlinx.collections.immutable) implementation(libs.kotlinx.coroutines.core) testImplementation(kotlin("test-junit")) testImplementation(libs.testparameterinjector) diff --git a/common/lint-baseline.xml b/common/lint-baseline.xml index d6d3acb2..0722790e 100644 --- a/common/lint-baseline.xml +++ b/common/lint-baseline.xml @@ -1,15 +1,4 @@ - - - - diff --git a/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/CommentEntry.kt b/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/CommentEntry.kt index 1e967d2c..1bb4ecda 100644 --- a/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/CommentEntry.kt +++ b/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/CommentEntry.kt @@ -48,6 +48,7 @@ import dev.msfjarvis.claw.model.LinkMetadata import dev.msfjarvis.claw.model.LobstersPostDetails import java.time.Instant import java.time.temporal.TemporalAccessor +import kotlinx.collections.immutable.toImmutableList @Composable internal fun CommentsHeader( @@ -71,7 +72,7 @@ internal fun CommentsHeader( verticalArrangement = Arrangement.spacedBy(8.dp), ) { PostTitle(title = postDetails.title) - TagRow(tags = postDetails.tags) + TagRow(tags = postDetails.tags.toImmutableList()) Spacer(Modifier.height(4.dp)) if (linkMetadata.url.isNotBlank()) { diff --git a/common/src/main/kotlin/dev/msfjarvis/claw/common/posts/LobstersCard.kt b/common/src/main/kotlin/dev/msfjarvis/claw/common/posts/LobstersCard.kt index 2ccba7db..c6cb6c54 100644 --- a/common/src/main/kotlin/dev/msfjarvis/claw/common/posts/LobstersCard.kt +++ b/common/src/main/kotlin/dev/msfjarvis/claw/common/posts/LobstersCard.kt @@ -47,6 +47,8 @@ import com.google.accompanist.flowlayout.FlowRow import dev.msfjarvis.claw.common.res.ClawIcons import dev.msfjarvis.claw.common.ui.NetworkImage import dev.msfjarvis.claw.database.local.SavedPost +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList @Composable @OptIn(ExperimentalFoundationApi::class) @@ -104,7 +106,7 @@ fun LobstersCard( fun PostDetails(post: SavedPost, modifier: Modifier = Modifier) { Column(modifier = modifier, verticalArrangement = Arrangement.spacedBy(8.dp)) { PostTitle(title = post.title) - TagRow(tags = post.tags) + TagRow(tags = post.tags.toImmutableList()) Spacer(Modifier.height(4.dp)) Submitter( text = AnnotatedString("Submitted by ${post.submitterName}"), @@ -201,7 +203,7 @@ private fun CommentsButton( @Composable internal fun TagRow( - tags: List, + tags: ImmutableList, modifier: Modifier = Modifier, ) { FlowRow( diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e80c0cb8..8ec65f64 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -69,6 +69,7 @@ javax-inject = "javax.inject:javax.inject:1" jsoup = "org.jsoup:jsoup:1.15.4" kotest-assertions-core = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest" } kotest-runner-junit5 = { module = "io.kotest:kotest-runner-junit5", version.ref = "kotest" } +kotlinx-collections-immutable = "org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.5" kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" } kotlinx-serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "serialization" } kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization" }