diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ServiceManager.kt b/app/src/main/java/com/vitorpamplona/amethyst/ServiceManager.kt index d4f2efd81..48b7fc4f4 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ServiceManager.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ServiceManager.kt @@ -125,6 +125,7 @@ object ServiceManager { LocalCache.pruneHiddenMessages(it) LocalCache.pruneContactLists(accounts) LocalCache.pruneRepliesAndReactions(accounts) + LocalCache.prunePastVersionsOfReplaceables() } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index d6d7311a5..f1be3b36c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -1192,6 +1192,44 @@ object LocalCache { } } + fun prunePastVersionsOfReplaceables() { + val toBeRemoved = notes.filter { + val noteEvent = it.value.event + if (noteEvent is AddressableEvent) { + noteEvent.createdAt() < (addressables[noteEvent.address().toTag()]?.event?.createdAt() ?: 0) + } else { + false + } + }.values + + val childrenToBeRemoved = mutableListOf() + + toBeRemoved.forEach { + notes.remove(it.idHex) + + val newerVersion = addressables[(it.event as? AddressableEvent)?.address()?.toTag()] + if (newerVersion != null) { + it.moveAllReferencesTo(newerVersion) + } + + it.replyTo?.forEach { masterNote -> + masterNote.removeReply(it) + masterNote.removeBoost(it) + masterNote.removeReaction(it) + masterNote.removeZap(it) + masterNote.clearEOSE() // allows reloading of these events + } + + childrenToBeRemoved.addAll(it.removeAllChildNotes()) + } + + removeChildrenOf(childrenToBeRemoved) + + if (toBeRemoved.size > 1) { + println("PRUNE: ${toBeRemoved.size} old version of addressables removed.") + } + } + fun pruneRepliesAndReactions(accounts: Set) { checkNotInMainThread() @@ -1216,12 +1254,15 @@ object LocalCache { masterNote.removeBoost(it) masterNote.removeReaction(it) masterNote.removeZap(it) + masterNote.removeReport(it) masterNote.clearEOSE() // allows reloading of these events } childrenToBeRemoved.addAll(it.removeAllChildNotes()) } + removeChildrenOf(childrenToBeRemoved) + if (toBeRemoved.size > 1) { println("PRUNE: ${toBeRemoved.size} thread replies removed.") }