diff --git a/src/main/java/eu/siacs/conversations/parser/PresenceParser.java b/src/main/java/eu/siacs/conversations/parser/PresenceParser.java index 57511058efe03628fae9e48d1ec9be6f6c037988..c56262ed1a475c8423e2522b2635bcdb3e7afbc0 100644 --- a/src/main/java/eu/siacs/conversations/parser/PresenceParser.java +++ b/src/main/java/eu/siacs/conversations/parser/PresenceParser.java @@ -419,6 +419,7 @@ public class PresenceParser extends AbstractParser if (contact.setLastseen(AbstractParser.parseTimestamp(packet, 0L, true))) { contact.flagInactive(); } + getManager(DiscoManager.class).clear(from); if (from.isBareJid()) { contact.clearPresences(); } else { diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 687339108ded64da19dad7423f569918ba82a2d8..dec7cc36e73c2d67f93670067b91955f360441d6 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -4209,6 +4209,10 @@ public class XmppConnectionService extends Service { conversation.getAccount().getJid().asBareJid() + ": leaving muc " + conversation.getJid()); + final var connection = account.getXmppConnection(); + if (connection != null) { + connection.getManager(DiscoManager.class).clear(conversation.getJid().asBareJid()); + } } else { synchronized (account.pendingConferenceLeaves) { account.pendingConferenceLeaves.add(conversation); diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java index f5d34ca26314a7f58bdd53b3060536602e475930..3aa8f6b197a8338d9b451b8ca030f3b09c41d55a 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java @@ -216,6 +216,9 @@ public class XmppConnection implements Runnable { this.mXmppConnectionService = service; this.appSettings = mXmppConnectionService.getAppSettings(); this.presenceListener = new PresenceParser(service, this); + // TODO rename this to Iq request handler (it handles only IQ get and set; throw assert + // error in handler just to be safe) + // TODO requires roster and blocking not to be handled by this this.unregisteredIqListener = new IqParser(service, this); this.messageListener = new MessageParser(service, this); this.bindListener = new BindProcessor(service, this); diff --git a/src/main/java/eu/siacs/conversations/xmpp/manager/DiscoManager.java b/src/main/java/eu/siacs/conversations/xmpp/manager/DiscoManager.java index b5776c0aff718d40bc03bbf22eba5bf1f0b19786..bd52f3d28cfb9cc9d290f766fea56dd372e24b8f 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/manager/DiscoManager.java +++ b/src/main/java/eu/siacs/conversations/xmpp/manager/DiscoManager.java @@ -440,6 +440,22 @@ public class DiscoManager extends AbstractManager { } } + public void clear(final Jid address) { + synchronized (this.entityInformation) { + if (address.isFullJid()) { + this.entityInformation.remove(address); + } else { + final var iterator = this.entityInformation.entrySet().iterator(); + while (iterator.hasNext()) { + final var entry = iterator.next(); + if (entry.getKey().asBareJid().equals(address)) { + iterator.remove(); + } + } + } + } + } + public static final class CapsHashMismatchException extends IllegalStateException { public CapsHashMismatchException(final String message) { super(message);