From 101bd8570363e546db9bf97ed1d543f4cc2f26cb Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Mon, 16 Dec 2024 23:31:05 -0500 Subject: [PATCH] Fix for concurrent modification --- .../services/QuickConversationsService.java | 4 +-- .../siacs/conversations/entities/Account.java | 26 +++++++++++-------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/cheogram/java/eu/siacs/conversations/services/QuickConversationsService.java b/src/cheogram/java/eu/siacs/conversations/services/QuickConversationsService.java index d58e590cf0eab0eab2e59078db03eaf5c029eefb..cf79c67c755b6f970a621f06616a9e2949aba52f 100644 --- a/src/cheogram/java/eu/siacs/conversations/services/QuickConversationsService.java +++ b/src/cheogram/java/eu/siacs/conversations/services/QuickConversationsService.java @@ -114,8 +114,8 @@ public class QuickConversationsService extends AbstractQuickConversationsService protected Set gateways(final Account account) { return Stream.concat( - ImmutableList.copyOf(account.getGateways("pstn")).stream(), - ImmutableList.copyOf(account.getGateways("sms")).stream() + account.getGateways("pstn").stream(), + account.getGateways("sms").stream() ).map(a -> a.getJid().asBareJid().toString()).collect(Collectors.toSet()); } diff --git a/src/main/java/eu/siacs/conversations/entities/Account.java b/src/main/java/eu/siacs/conversations/entities/Account.java index 6c7f3ea985ab778687af43896aa1ec61e487130f..a5831a520b52404dab31f432a26b608b64f28966 100644 --- a/src/main/java/eu/siacs/conversations/entities/Account.java +++ b/src/main/java/eu/siacs/conversations/entities/Account.java @@ -662,22 +662,26 @@ public class Account extends AbstractEntity implements AvatarService.Avatarable } public void refreshCapsFor(Contact contact) { - for (final var k : new HashSet<>(gateways.keySet())) { - gateways.remove(k, contact); - } - for (final var p : contact.getPresences().getPresences()) { - final var disco = p.getServiceDiscoveryResult(); - if (disco == null) continue; - for (final var identity : disco.getIdentities()) { - if ("gateway".equals(identity.getCategory())) { - gateways.put(identity.getType(), contact); + synchronized (gateways) { + for (final var k : new HashSet<>(gateways.keySet())) { + gateways.remove(k, contact); + } + for (final var p : contact.getPresences().getPresences()) { + final var disco = p.getServiceDiscoveryResult(); + if (disco == null) continue; + for (final var identity : disco.getIdentities()) { + if ("gateway".equals(identity.getCategory())) { + gateways.put(identity.getType(), contact); + } } } } } - public Set getGateways(final String type) { - return gateways.get(type); + public Collection getGateways(final String type) { + synchronized (gateways) { + return ImmutableList.copyOf(gateways.get(type)); + } } public Collection getBookmarks() {