From 9c053dce8d5d9ad58b0e4646747ce51db2a443b3 Mon Sep 17 00:00:00 2001 From: Christian Schneppe Date: Fri, 13 Apr 2018 22:03:54 +0200 Subject: make receipt handling work with out of order receipts --- .../java/de/pixart/messenger/parser/MessageParser.java | 6 +++--- .../pixart/messenger/services/MessageArchiveService.java | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 4 deletions(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/pixart/messenger/parser/MessageParser.java b/src/main/java/de/pixart/messenger/parser/MessageParser.java index 33ef59ef1..0f8e23aa6 100644 --- a/src/main/java/de/pixart/messenger/parser/MessageParser.java +++ b/src/main/java/de/pixart/messenger/parser/MessageParser.java @@ -804,7 +804,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece String id = received.getAttribute("id"); if (packet.fromAccount(account)) { if (query != null && id != null && packet.getTo() != null) { - query.pendingReceiptRequests.remove(new ReceiptRequest(packet.getTo(), id)); + query.removePendingReceiptRequest(new ReceiptRequest(packet.getTo(), id)); } } else { mXmppConnectionService.markMessage(account, from.asBareJid(), received.getAttribute("id"), Message.STATUS_SEND_RECEIVED); @@ -899,9 +899,9 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece packet.getType()); mXmppConnectionService.sendMessagePacket(account, receipt); } - } else { + } else { //just catchup?? if (request) { - query.pendingReceiptRequests.add(new ReceiptRequest(packet.getFrom(), packet.getId())); + query.addPendingReceiptRequest(new ReceiptRequest(packet.getFrom(), packet.getId())); } } } diff --git a/src/main/java/de/pixart/messenger/services/MessageArchiveService.java b/src/main/java/de/pixart/messenger/services/MessageArchiveService.java index 7158c3b1f..a20c7fc49 100644 --- a/src/main/java/de/pixart/messenger/services/MessageArchiveService.java +++ b/src/main/java/de/pixart/messenger/services/MessageArchiveService.java @@ -323,6 +323,7 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded { private void processPostponed(Query query) { query.account.getAxolotlService().processPostponed(); + query.pendingReceiptRequests.removeAll(query.receiptRequests); Log.d(Config.LOGTAG, query.getAccount().getJid().asBareJid() + ": found " + query.pendingReceiptRequests.size() + " pending receipt requests"); Iterator iterator = query.pendingReceiptRequests.iterator(); while (iterator.hasNext()) { @@ -359,7 +360,8 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded { } public class Query { - public HashSet pendingReceiptRequests = new HashSet<>(); + private HashSet pendingReceiptRequests = new HashSet<>(); + private HashSet receiptRequests = new HashSet<>(); private int totalCount = 0; private int actualCount = 0; private int actualInThisQuery = 0; @@ -398,11 +400,22 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded { query.totalCount = totalCount; query.actualCount = actualCount; query.pendingReceiptRequests = pendingReceiptRequests; + query.receiptRequests = receiptRequests; query.callback = callback; query.catchup = catchup; return query; } + public void removePendingReceiptRequest(ReceiptRequest receiptRequest) { + if (!this.pendingReceiptRequests.remove(receiptRequest)) { + this.receiptRequests.add(receiptRequest); + } + } + + public void addPendingReceiptRequest(ReceiptRequest receiptRequest) { + this.pendingReceiptRequests.add(receiptRequest); + } + public boolean isLegacy() { if (conversation == null || conversation.getMode() == Conversation.MODE_SINGLE) { return account.getXmppConnection().getFeatures().mamLegacy(); -- cgit v1.2.3