From 5a60dab1d5ead7a94d9d86cecc563210fed4b4bf Mon Sep 17 00:00:00 2001 From: Christian Schneppe Date: Wed, 17 May 2017 21:58:46 +0200 Subject: use mam reference instead of timestamp --- .../messenger/services/MessageArchiveService.java | 90 +++++++++++----------- 1 file changed, 44 insertions(+), 46 deletions(-) (limited to 'src/main/java/de/pixart/messenger/services/MessageArchiveService.java') diff --git a/src/main/java/de/pixart/messenger/services/MessageArchiveService.java b/src/main/java/de/pixart/messenger/services/MessageArchiveService.java index 5a5b0e9a1..e90bb8d07 100644 --- a/src/main/java/de/pixart/messenger/services/MessageArchiveService.java +++ b/src/main/java/de/pixart/messenger/services/MessageArchiveService.java @@ -1,7 +1,6 @@ package de.pixart.messenger.services; import android.util.Log; -import android.util.Pair; import java.math.BigInteger; import java.util.ArrayList; @@ -19,6 +18,7 @@ import de.pixart.messenger.xml.Element; import de.pixart.messenger.xmpp.OnAdvancedStreamFeaturesLoaded; import de.pixart.messenger.xmpp.OnIqPacketReceived; import de.pixart.messenger.xmpp.jid.Jid; +import de.pixart.messenger.xmpp.mam.MamReference; import de.pixart.messenger.xmpp.stanzas.IqPacket; public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded { @@ -46,34 +46,26 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded { } } } - final Pair lastMessageReceived = mXmppConnectionService.databaseBackend.getLastMessageReceived(account); - final Pair lastClearDate = mXmppConnectionService.databaseBackend.getLastClearDate(account); - long startCatchup; - final String reference; - if (lastMessageReceived != null && lastMessageReceived.first >= lastClearDate.first) { - startCatchup = lastMessageReceived.first; - reference = lastMessageReceived.second; - } else { - startCatchup = lastClearDate.first; - reference = null; - } - startCatchup = Math.max(startCatchup,mXmppConnectionService.getAutomaticMessageDeletionDate()); + MamReference mamReference = MamReference.max( + mXmppConnectionService.databaseBackend.getLastMessageReceived(account), + mXmppConnectionService.databaseBackend.getLastClearDate(account) + ); + mamReference = MamReference.max(mamReference, mXmppConnectionService.getAutomaticMessageDeletionDate()); long endCatchup = account.getXmppConnection().getLastSessionEstablished(); final Query query; - if (startCatchup == 0) { + if (mamReference.getTimestamp() == 0) { return; - } else if (endCatchup - startCatchup >= Config.MAM_MAX_CATCHUP) { - startCatchup = endCatchup - Config.MAM_MAX_CATCHUP; + } else if (endCatchup - mamReference.getTimestamp() >= Config.MAM_MAX_CATCHUP) { + long startCatchup = endCatchup - Config.MAM_MAX_CATCHUP; List conversations = mXmppConnectionService.getConversations(); for (Conversation conversation : conversations) { - if (conversation.getMode() == Conversation.MODE_SINGLE && conversation.getAccount() == account && startCatchup > conversation.getLastMessageTransmitted()) { + if (conversation.getMode() == Conversation.MODE_SINGLE && conversation.getAccount() == account && startCatchup > conversation.getLastMessageTransmitted().getTimestamp()) { this.query(conversation, startCatchup, true); } } - query = new Query(account, startCatchup, endCatchup); + query = new Query(account, new MamReference(startCatchup), endCatchup); } else { - query = new Query(account, startCatchup, endCatchup); - query.reference = reference; + query = new Query(account, mamReference, endCatchup); } synchronized (this.queries) { this.queries.add(query); @@ -82,9 +74,9 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded { } public void catchupMUC(final Conversation conversation) { - if (conversation.getLastMessageTransmitted() < 0 && conversation.countMessages() == 0) { + if (conversation.getLastMessageTransmitted().getTimestamp() < 0 && conversation.countMessages() == 0) { query(conversation, - 0, + new MamReference(0), System.currentTimeMillis(), true); } else { @@ -96,9 +88,9 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded { } public Query query(final Conversation conversation) { - if (conversation.getLastMessageTransmitted() < 0 && conversation.countMessages() == 0) { + if (conversation.getLastMessageTransmitted().getTimestamp() < 0 && conversation.countMessages() == 0) { return query(conversation, - 0, + new MamReference(0), System.currentTimeMillis(), false); } else { @@ -113,22 +105,27 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded { return this.query(conversation, conversation.getLastMessageTransmitted(), end, allowCatchup); } - public Query query(Conversation conversation, long start, long end, boolean allowCatchup) { + public Query query(Conversation conversation, MamReference start, long end, boolean allowCatchup) { synchronized (this.queries) { final Query query; - final long startActual = Math.max(start, mXmppConnectionService.getAutomaticMessageDeletionDate()); - if (start == 0) { + final MamReference startActual = MamReference.max(start, mXmppConnectionService.getAutomaticMessageDeletionDate()); + if (start.getTimestamp() == 0) { query = new Query(conversation, startActual, end, false); + query.reference = conversation.getFirstMamReference(); } else { - long maxCatchup = Math.max(startActual, System.currentTimeMillis() - Config.MAM_MAX_CATCHUP); - if (maxCatchup > startActual) { - Query reverseCatchup = new Query(conversation, startActual, maxCatchup, false); - this.queries.add(reverseCatchup); - this.execute(reverseCatchup); + if (allowCatchup) { + MamReference maxCatchup = MamReference.max(startActual, System.currentTimeMillis() - Config.MAM_MAX_CATCHUP); + if (maxCatchup.greaterThan(startActual)) { + Query reverseCatchup = new Query(conversation, startActual, maxCatchup.getTimestamp(), false); + this.queries.add(reverseCatchup); + this.execute(reverseCatchup); + } + query = new Query(conversation, maxCatchup, end, allowCatchup); + } else { + query = new Query(conversation, startActual, end, false); } - query = new Query(conversation, maxCatchup, end, allowCatchup); } - if (start > end) { + if (start.greaterThan(end)) { return null; } this.queries.add(query); @@ -304,27 +301,26 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded { private boolean catchup = true; - public Query(Conversation conversation, long start, long end) { - this(conversation.getAccount(), start, end); + public Query(Conversation conversation, MamReference start, long end, boolean catchup) { + this(conversation.getAccount(), catchup ? start : start.timeOnly(), end); this.conversation = conversation; - } - - public Query(Conversation conversation, long start, long end, boolean catchup) { - this(conversation, start, end); this.pagingOrder = catchup ? PagingOrder.NORMAL : PagingOrder.REVERSE; this.catchup = catchup; } - public Query(Account account, long start, long end) { + public Query(Account account, MamReference start, long end) { this.account = account; - this.start = start; + if (start.getReference() != null) { + this.reference = start.getReference(); + } else { + this.start = start.getTimestamp(); + } this.end = end; this.queryId = new BigInteger(50, mXmppConnectionService.getRNG()).toString(32); } private Query page(String reference) { - Query query = new Query(this.account, this.start, this.end); - query.reference = reference; + Query query = new Query(this.account, new MamReference(this.start, reference), this.end); query.conversation = conversation; query.totalCount = totalCount; query.actualCount = actualCount; @@ -444,8 +440,10 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded { builder.append(getWith().toString()); } } - builder.append(", start="); - builder.append(AbstractGenerator.getTimestamp(this.start)); + if (this.start != 0) { + builder.append(", start="); + builder.append(AbstractGenerator.getTimestamp(this.start)); + } builder.append(", end="); builder.append(AbstractGenerator.getTimestamp(this.end)); builder.append(", order="+pagingOrder.toString()); -- cgit v1.2.3