From eeca86e5426c6a2e70839cb6e83988e8b1a3832a Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 23 Mar 2026 13:16:32 -0400 Subject: [PATCH] Fixes comparator to avoid Comparison method violates its general contract! --- .../loggedIn/relays/eventsync/EventSync.kt | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/eventsync/EventSync.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/eventsync/EventSync.kt index a03e6d619..fe2efdfe1 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/eventsync/EventSync.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/eventsync/EventSync.kt @@ -155,11 +155,21 @@ class EventSync( val inboxTargets: Map = emptyMap(), val dmTargets: Map = emptyMap(), ) { - companion object { - val DefaultOrder = compareByDescending { it.eventsFound.value }.thenByDescending { it.status.value == ConnectionStatus.Completed } - } + val sortedCompletedRelays = + completedRelays.values.let { + // precompute to avoid: Comparison method violates its general contract - val sortedCompletedRelays = completedRelays.values.sortedWith(DefaultOrder) + val orderCacheEventsFound = it.associateWith { it.eventsFound.value } + val orderCacheCompleted = it.associateWith { it.status.value == ConnectionStatus.Completed } + val orderComparator = + compareByDescending { + orderCacheEventsFound[it] + }.thenByDescending { + orderCacheCompleted[it] + } + + it.sortedWith(orderComparator) + } constructor( runningRelays: List,