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" }