From 76df70c6f67880dd552c7671a3969686db83c1d3 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 11:10:17 -0400 Subject: [PATCH] Making sure filters return similar orders when two posts are published at the same time. --- .../main/java/com/vitorpamplona/amethyst/model/Channel.kt | 2 +- .../amethyst/ui/dal/BookmarkPrivateFeedFilter.kt | 2 +- .../amethyst/ui/dal/BookmarkPublicFeedFilter.kt | 2 +- .../vitorpamplona/amethyst/ui/dal/ChannelFeedFilter.kt | 4 ++-- .../vitorpamplona/amethyst/ui/dal/ChatroomFeedFilter.kt | 4 ++-- .../amethyst/ui/dal/ChatroomListKnownFeedFilter.kt | 6 +++--- .../amethyst/ui/dal/ChatroomListNewFeedFilter.kt | 4 ++-- .../vitorpamplona/amethyst/ui/dal/HashtagFeedFilter.kt | 2 +- .../amethyst/ui/dal/HomeConversationsFeedFilter.kt | 2 +- .../amethyst/ui/dal/HomeNewThreadFeedFilter.kt | 2 +- .../amethyst/ui/dal/NotificationFeedFilter.kt | 2 +- .../vitorpamplona/amethyst/ui/dal/PeopleListFeedFilter.kt | 2 +- .../amethyst/ui/dal/UserProfileBookmarksFeedFilter.kt | 2 +- .../amethyst/ui/dal/UserProfileConversationsFeedFilter.kt | 2 +- .../amethyst/ui/dal/UserProfileNewThreadFeedFilter.kt | 2 +- .../amethyst/ui/dal/UserProfileReportsFeedFilter.kt | 2 +- .../vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt | 8 ++++---- .../amethyst/ui/screen/loggedIn/SearchScreen.kt | 2 +- 18 files changed, 26 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Channel.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Channel.kt index 7716d04cc..ceae0d729 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Channel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Channel.kt @@ -57,7 +57,7 @@ class Channel(val idHex: String) { fun pruneOldAndHiddenMessages(account: Account): Set { val important = notes.values .filter { it.author?.let { it1 -> account.isHidden(it1) } == false } - .sortedBy { it.createdAt() } + .sortedWith(compareBy({ it.createdAt() }, { it.idHex })) .reversed() .take(1000) .toSet() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPrivateFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPrivateFeedFilter.kt index 7f049c882..49cb27fbb 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPrivateFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPrivateFeedFilter.kt @@ -19,7 +19,7 @@ object BookmarkPrivateFeedFilter : FeedFilter() { ?.map { LocalCache.getOrCreateAddressableNote(it) } ?: emptyList() return notes.plus(addresses).toSet() - .sortedBy { it.createdAt() } + .sortedWith(compareBy({ it.createdAt() }, { it.idHex })) .reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPublicFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPublicFeedFilter.kt index 3bc368f1f..779be607e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPublicFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPublicFeedFilter.kt @@ -14,7 +14,7 @@ object BookmarkPublicFeedFilter : FeedFilter() { val addresses = bookmarks?.taggedAddresses()?.map { LocalCache.getOrCreateAddressableNote(it) } ?: emptyList() return notes.plus(addresses).toSet() - .sortedBy { it.createdAt() } + .sortedWith(compareBy({ it.createdAt() }, { it.idHex })) .reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChannelFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChannelFeedFilter.kt index 74a104ae4..21ea7ef48 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChannelFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChannelFeedFilter.kt @@ -21,7 +21,7 @@ object ChannelFeedFilter : AdditiveFeedFilter() { return channel.notes .values .filter { account.isAcceptable(it) } - .sortedBy { it.createdAt() } + .sortedWith(compareBy({ it.createdAt() }, { it.idHex })) .reversed() } @@ -35,6 +35,6 @@ object ChannelFeedFilter : AdditiveFeedFilter() { } override fun sort(collection: Set): List { - return collection.sortedBy { it.createdAt() }.reversed() + return collection.sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomFeedFilter.kt index 3cdb265f7..2aa617fe0 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomFeedFilter.kt @@ -28,7 +28,7 @@ object ChatroomFeedFilter : AdditiveFeedFilter() { return messages.roomMessages .filter { myAccount.isAcceptable(it) } - .sortedBy { it.createdAt() } + .sortedWith(compareBy({ it.createdAt() }, { it.idHex })) .reversed() } @@ -50,6 +50,6 @@ object ChatroomFeedFilter : AdditiveFeedFilter() { } override fun sort(collection: Set): List { - return collection.sortedBy { it.createdAt() }.reversed() + return collection.sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListKnownFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListKnownFeedFilter.kt index 812872134..66d44afe4 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListKnownFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListKnownFeedFilter.kt @@ -19,20 +19,20 @@ object ChatroomListKnownFeedFilter : FeedFilter() { val privateMessages = messagingWith.mapNotNull { it -> privateChatrooms[it] ?.roomMessages - ?.sortedBy { it.createdAt() } + ?.sortedWith(compareBy({ it.createdAt() }, { it.idHex })) ?.lastOrNull { it.event != null } } val publicChannels = account.followingChannels().map { it -> it.notes.values .filter { account.isAcceptable(it) } - .sortedBy { it.createdAt() } + .sortedWith(compareBy({ it.createdAt() }, { it.idHex })) .lastOrNull { it.event != null } } return (privateMessages + publicChannels) .filterNotNull() - .sortedBy { it.createdAt() } + .sortedWith(compareBy({ it.createdAt() }, { it.idHex })) .reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListNewFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListNewFeedFilter.kt index 4ca7334e5..a69e6c60d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListNewFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListNewFeedFilter.kt @@ -19,12 +19,12 @@ object ChatroomListNewFeedFilter : FeedFilter() { val privateMessages = messagingWith.mapNotNull { it -> privateChatrooms[it] ?.roomMessages - ?.sortedBy { it.createdAt() } + ?.sortedWith(compareBy({ it.createdAt() }, { it.idHex })) ?.lastOrNull { it.event != null } } return privateMessages - .sortedBy { it.createdAt() } + .sortedWith(compareBy({ it.createdAt() }, { it.idHex })) .reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HashtagFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HashtagFeedFilter.kt index 97775bfb9..5f5106c84 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HashtagFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HashtagFeedFilter.kt @@ -44,6 +44,6 @@ object HashtagFeedFilter : AdditiveFeedFilter() { } override fun sort(collection: Set): List { - return collection.sortedBy { it.createdAt() }.reversed() + return collection.sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeConversationsFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeConversationsFeedFilter.kt index a5cda41b9..e7bf4b9ae 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeConversationsFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeConversationsFeedFilter.kt @@ -34,6 +34,6 @@ object HomeConversationsFeedFilter : AdditiveFeedFilter() { } override fun sort(collection: Set): List { - return collection.sortedBy { it.createdAt() }.reversed() + return collection.sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeNewThreadFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeNewThreadFeedFilter.kt index 055513180..6519bc634 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeNewThreadFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeNewThreadFeedFilter.kt @@ -41,6 +41,6 @@ object HomeNewThreadFeedFilter : AdditiveFeedFilter() { } override fun sort(collection: Set): List { - return collection.sortedBy { it.createdAt() }.reversed() + return collection.sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/NotificationFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/NotificationFeedFilter.kt index ea06b0771..4aad1f481 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/NotificationFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/NotificationFeedFilter.kt @@ -41,7 +41,7 @@ object NotificationFeedFilter : AdditiveFeedFilter() { } override fun sort(collection: Set): List { - return collection.sortedBy { it.createdAt() }.reversed() + return collection.sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() } fun tagsAnEventByUser(note: Note, author: User): Boolean { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/PeopleListFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/PeopleListFeedFilter.kt index 11263ffc8..46bf82fe9 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/PeopleListFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/PeopleListFeedFilter.kt @@ -19,7 +19,7 @@ object PeopleListFeedFilter : FeedFilter() { .toSet() return lists - .sortedBy { it.createdAt() } + .sortedWith(compareBy({ it.createdAt() }, { it.idHex })) .reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileBookmarksFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileBookmarksFeedFilter.kt index b2c0829fa..837b77f12 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileBookmarksFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileBookmarksFeedFilter.kt @@ -25,7 +25,7 @@ object UserProfileBookmarksFeedFilter : FeedFilter() { return (notes + addresses) .filter { account.isAcceptable(it) } - .sortedBy { it.createdAt() } + .sortedWith(compareBy({ it.createdAt() }, { it.idHex })) .reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileConversationsFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileConversationsFeedFilter.kt index 681865c78..8d8f559c2 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileConversationsFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileConversationsFeedFilter.kt @@ -16,7 +16,7 @@ object UserProfileConversationsFeedFilter : FeedFilter() { override fun feed(): List { return user?.notes ?.filter { account?.isAcceptable(it) == true && !it.isNewThread() } - ?.sortedBy { it.createdAt() } + ?.sortedWith(compareBy({ it.createdAt() }, { it.idHex })) ?.reversed() ?: emptyList() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileNewThreadFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileNewThreadFeedFilter.kt index 13d197421..87e2e642a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileNewThreadFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileNewThreadFeedFilter.kt @@ -23,7 +23,7 @@ object UserProfileNewThreadFeedFilter : FeedFilter() { return user?.notes ?.plus(longFormNotes) ?.filter { account?.isAcceptable(it) == true && it.isNewThread() } - ?.sortedBy { it.createdAt() } + ?.sortedWith(compareBy({ it.createdAt() }, { it.idHex })) ?.reversed() ?: emptyList() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileReportsFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileReportsFeedFilter.kt index 50716ac5b..12badf519 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileReportsFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileReportsFeedFilter.kt @@ -14,7 +14,7 @@ object UserProfileReportsFeedFilter : FeedFilter() { return user?.reports ?.values ?.flatten() - ?.sortedBy { it.createdAt() } + ?.sortedWith(compareBy({ it.createdAt() }, { it.idHex })) ?.reversed() ?: emptyList() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt index 47feb186d..075419deb 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt @@ -59,7 +59,7 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { if (newCards.isNotEmpty()) { lastNotes = notes lastAccount = (localFilter as? NotificationFeedFilter)?.account - updateFeed((oldNotesState.feed.value + newCards).distinctBy { it.id() }.sortedBy { it.createdAt() }.reversed()) + updateFeed((oldNotesState.feed.value + newCards).distinctBy { it.id() }.sortedWith(compareBy({ it.createdAt() }, { it.id() })).reversed()) } } else { val cards = convertToCard(notes) @@ -129,7 +129,7 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { val reactionsInCard = reactionsPerEvent[baseNote] ?: emptyList() val zapsInCard = zapsPerEvent[baseNote] ?: emptyMap() - val singleList = (boostsInCard + zapsInCard.values + reactionsInCard).sortedBy { it.createdAt() }.reversed() + val singleList = (boostsInCard + zapsInCard.values + reactionsInCard).sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() singleList.chunked(50).map { chunk -> MultiSetCard( baseNote, @@ -157,7 +157,7 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { } } - return (multiCards + textNoteCards + userZaps).sortedBy { it.createdAt() }.reversed() + return (multiCards + textNoteCards + userZaps).sortedWith(compareBy({ it.createdAt() }, { it.id() })).reversed() } private fun updateFeed(notes: List) { @@ -190,7 +190,7 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { if (newCards.isNotEmpty()) { lastNotes = lastNotesCopy + newItems lastAccount = (localFilter as? NotificationFeedFilter)?.account - updateFeed((oldNotesState.feed.value + newCards).distinctBy { it.id() }.sortedBy { it.createdAt() }.reversed()) + updateFeed((oldNotesState.feed.value + newCards).distinctBy { it.id() }.sortedWith(compareBy({ it.createdAt() }, { it.id() })).reversed()) } } else { // Refresh Everything diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt index 9cd24bf61..d37de7787 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt @@ -157,7 +157,7 @@ class SearchBarViewModel : ViewModel() { hashtagResults.value = findHashtags(searchValue) searchResults.value = LocalCache.findUsersStartingWith(searchValue) - searchResultsNotes.value = LocalCache.findNotesStartingWith(searchValue).sortedBy { it.createdAt() }.reversed() + searchResultsNotes.value = LocalCache.findNotesStartingWith(searchValue).sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() searchResultsChannels.value = LocalCache.findChannelsStartingWith(searchValue) }