From 3ed3e18b3850c6b06e5fcec8a9f614771dfabdd4 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Sat, 14 Sep 2024 22:19:02 -0500 Subject: [PATCH] Cache known gateways --- .../siacs/conversations/entities/Account.java | 21 +++++++++++++++++++ .../siacs/conversations/entities/Contact.java | 6 ++++++ .../services/XmppConnectionService.java | 2 ++ 3 files changed, 29 insertions(+) diff --git a/src/main/java/eu/siacs/conversations/entities/Account.java b/src/main/java/eu/siacs/conversations/entities/Account.java index 4737ce6ec09c364efb011189fa1abc1d2bc9e605..d943d12db4012e41800ea0ff9927fa402a56ee12 100644 --- a/src/main/java/eu/siacs/conversations/entities/Account.java +++ b/src/main/java/eu/siacs/conversations/entities/Account.java @@ -10,6 +10,7 @@ import androidx.core.graphics.ColorUtils; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; +import com.google.common.collect.HashMultimap; import org.json.JSONException; import org.json.JSONObject; @@ -112,6 +113,7 @@ public class Account extends AbstractEntity implements AvatarService.Avatarable private String fastMechanism; private String fastToken; private Integer color = null; + private final HashMultimap gateways = HashMultimap.create(); public Account(final Jid jid, final String password) { this( @@ -649,6 +651,25 @@ public class Account extends AbstractEntity implements AvatarService.Avatarable return this.roster; } + public void refreshCapsFor(Contact contact) { + for (final var k : 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 getBookmarks() { synchronized (this.bookmarks) { return ImmutableList.copyOf(this.bookmarks.values()); diff --git a/src/main/java/eu/siacs/conversations/entities/Contact.java b/src/main/java/eu/siacs/conversations/entities/Contact.java index f9098beb55c97d9f74cf41b8688de6342bb4f1b4..f4677da331d5010a9741ea27da1761394734d004 100644 --- a/src/main/java/eu/siacs/conversations/entities/Contact.java +++ b/src/main/java/eu/siacs/conversations/entities/Contact.java @@ -298,11 +298,13 @@ public class Contact implements ListItem, Blockable { public void removePresence(final String resource) { this.presences.removePresence(resource); + refreshCaps(); } public void clearPresences() { this.presences.clearPresences(); this.resetOption(Options.PENDING_SUBSCRIPTION_REQUEST); + refreshCaps(); } public Presence.Status getShownStatus() { @@ -737,6 +739,10 @@ public class Contact implements ListItem, Blockable { return !Objects.equals(previous, this.rtpCapability); } + public void refreshCaps() { + account.refreshCapsFor(this); + } + public RtpCapability.Capability getRtpCapability() { return this.rtpCapability == null ? RtpCapability.Capability.NONE : this.rtpCapability; } diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index a86c20e8ded868380e98c8dc0f08268c8af9f440..962901f6bd41519ab550e6a6ab0cf4fba33488cd 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -5629,6 +5629,7 @@ public class XmppConnectionService extends Service { if (contact.refreshRtpCapability()) { syncRoster(account); } + contact.refreshCaps(); if (disco.hasIdentity("gateway", "pstn")) { contact.registerAsPhoneAccount(this); mQuickConversationsService.considerSyncBackground(false); @@ -5696,6 +5697,7 @@ public class XmppConnectionService extends Service { } if (serviceDiscoverySet) { rosterNeedsSync |= contact.refreshRtpCapability(); + contact.refreshCaps(); } } if (rosterNeedsSync) {