From de2ec503da6a817769ce919986b723c6fa28473f Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sat, 18 Feb 2023 19:13:43 -0500 Subject: [PATCH] Keeps Note level in a thread cached for ordering notes. --- .../java/com/vitorpamplona/amethyst/model/Note.kt | 13 +++++++++---- .../amethyst/ui/dal/ThreadFeedFilter.kt | 3 ++- .../amethyst/ui/screen/loggedIn/ThreadScreen.kt | 4 ++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt index 820f7b992..cea6e6134 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt @@ -73,25 +73,30 @@ class Note(val idHex: String) { .format(DateTimeFormatter.ofPattern("uuuu-MM-dd-HH:mm:ss")) } - fun replyLevelSignature(): String { + /** + * This method caches signatures during each execution to avoid recalculation in longer threads + */ + fun replyLevelSignature(cachedSignatures: MutableMap = mutableMapOf()): String { val replyTo = replyTo if (replyTo == null || replyTo.isEmpty()) { return "/" + formattedDateTime(event?.createdAt ?: 0) + ";" } return replyTo - .map { it.replyLevelSignature() } + .map { + cachedSignatures[it] ?: it.replyLevelSignature(cachedSignatures).apply { cachedSignatures.put(it, this) } + } .maxBy { it.length }.removeSuffix(";") + "/" + formattedDateTime(event?.createdAt ?: 0) + ";" } - fun replyLevel(): Int { + fun replyLevel(cachedLevels: MutableMap = mutableMapOf()): Int { val replyTo = replyTo if (replyTo == null || replyTo.isEmpty()) { return 0 } return replyTo.maxOf { - it.replyLevel() + cachedLevels[it] ?: it.replyLevel(cachedLevels).apply { cachedLevels.put(it, this) } } + 1 } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ThreadFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ThreadFeedFilter.kt index 46740b416..afeae1d74 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ThreadFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ThreadFeedFilter.kt @@ -9,9 +9,10 @@ object ThreadFeedFilter: FeedFilter() { var noteId: String? = null override fun feed(): List { + val cachedSignatures: MutableMap = mutableMapOf() val eventsToWatch = noteId?.let { ThreadAssembler().findThreadFor(it) } ?: emptySet() // Currently orders by date of each event, descending, at each level of the reply stack - val order = compareByDescending { it.replyLevelSignature() } + val order = compareByDescending { it.replyLevelSignature(cachedSignatures) } return eventsToWatch.sortedWith(order) } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ThreadScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ThreadScreen.kt index 8bc2384ec..0669ba6e0 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ThreadScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ThreadScreen.kt @@ -26,11 +26,11 @@ fun ThreadScreen(noteId: String?, accountViewModel: AccountViewModel, navControl val lifeCycleOwner = LocalLifecycleOwner.current if (account != null && noteId != null) { - ThreadFeedFilter.loadThread(noteId) - NostrThreadDataSource.loadThread(noteId) val feedViewModel: NostrThreadFeedViewModel = viewModel() LaunchedEffect(Unit) { + ThreadFeedFilter.loadThread(noteId) + NostrThreadDataSource.loadThread(noteId) feedViewModel.invalidateData() }