properly clean up timed out mam queries

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/parser/MessageParser.java           |  2 
src/main/java/eu/siacs/conversations/services/MessageArchiveService.java | 19 
2 files changed, 18 insertions(+), 3 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/parser/MessageParser.java 🔗

@@ -425,7 +425,7 @@ public class MessageParser extends AbstractParser implements
 					mXmppConnectionService.sendMessagePacket(account, receipt);
 				}
 			}
-			if (account.getXmppConnection() != null && account.getXmppConnection().getFeatures().advancedStreamFeaturesLoaded()) {
+			if (account.isOnlineAndConnected() && query == null) {
 				if (conversation.setLastMessageTransmitted(System.currentTimeMillis())) {
 					mXmppConnectionService.updateConversation(conversation);
 				}

src/main/java/eu/siacs/conversations/services/MessageArchiveService.java 🔗

@@ -35,7 +35,15 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
 		this.mXmppConnectionService = service;
 	}
 
-	public void catchup(final Account account) {
+	private void catchup(final Account account) {
+		synchronized (this.queries) {
+			for(Iterator<Query> iterator = this.queries.iterator(); iterator.hasNext();) {
+				Query query = iterator.next();
+				if (query.getAccount() == account) {
+					iterator.remove();
+				}
+			}
+		}
 		long startCatchup = getLastMessageTransmitted(account);
 		long endCatchup = account.getXmppConnection().getLastSessionEstablished();
 		if (startCatchup == 0) {
@@ -131,7 +139,14 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
 			this.mXmppConnectionService.sendIqPacket(account, packet, new OnIqPacketReceived() {
 				@Override
 				public void onIqPacketReceived(Account account, IqPacket packet) {
-					if (packet.getType() != IqPacket.TYPE.RESULT) {
+					if (packet.getType() == IqPacket.TYPE.TIMEOUT) {
+						synchronized (MessageArchiveService.this.queries) {
+							MessageArchiveService.this.queries.remove(query);
+							if (query.hasCallback()) {
+								query.callback();
+							}
+						}
+					} else if (packet.getType() != IqPacket.TYPE.RESULT) {
 						Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": error executing mam: " + packet.toString());
 						finalizeQuery(query);
 					}