aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/eu/siacs/conversations/services/MessageArchiveService.java')
-rw-r--r--src/main/java/eu/siacs/conversations/services/MessageArchiveService.java77
1 files changed, 52 insertions, 25 deletions
diff --git a/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java b/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java
index e86ca573..4400105e 100644
--- a/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java
+++ b/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java
@@ -1,5 +1,8 @@
package eu.siacs.conversations.services;
+import android.util.Log;
+import android.util.Pair;
+
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashSet;
@@ -35,7 +38,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) {
@@ -54,21 +65,33 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
this.execute(query);
}
- private long getLastMessageTransmitted(final Account account) {
- long timestamp = 0;
- for(final Conversation conversation : mXmppConnectionService.getConversations()) {
- if (conversation.getAccount() == account) {
- long tmp = conversation.getLastMessageTransmitted();
- if (tmp > timestamp) {
- timestamp = tmp;
- }
- }
+ public void catchupMUC(final Conversation conversation) {
+ if (conversation.getLastMessageTransmitted() < 0 && conversation.countMessages() == 0) {
+ query(conversation,
+ 0,
+ System.currentTimeMillis());
+ } else {
+ query(conversation,
+ conversation.getLastMessageTransmitted(),
+ System.currentTimeMillis());
}
- return timestamp;
+ }
+
+ private long getLastMessageTransmitted(final Account account) {
+ Pair<Long,String> pair = mXmppConnectionService.databaseBackend.getLastMessageReceived(account);
+ return pair == null ? 0 : pair.first;
}
public Query query(final Conversation conversation) {
- return query(conversation,conversation.getAccount().getXmppConnection().getLastSessionEstablished());
+ if (conversation.getLastMessageTransmitted() < 0 && conversation.countMessages() == 0) {
+ return query(conversation,
+ 0,
+ System.currentTimeMillis());
+ } else {
+ return query(conversation,
+ conversation.getLastMessageTransmitted(),
+ conversation.getAccount().getXmppConnection().getLastSessionEstablished());
+ }
}
public Query query(final Conversation conversation, long end) {
@@ -111,7 +134,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.ERROR) {
+ 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) {
Logging.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": error executing mam: " + packet.toString());
finalizeQuery(query);
}
@@ -131,25 +161,19 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
final Conversation conversation = query.getConversation();
if (conversation != null) {
conversation.sort();
- if (conversation.setLastMessageTransmitted(query.getEnd())) {
- this.mXmppConnectionService.databaseBackend.updateConversation(conversation);
- }
- if (query.hasCallback()) {
- query.callback();
- } else {
- conversation.setHasMessagesLeftOnServer(query.getMessageCount() > 0);
- this.mXmppConnectionService.updateConversationUi();
- }
} else {
for(Conversation tmp : this.mXmppConnectionService.getConversations()) {
if (tmp.getAccount() == query.getAccount()) {
tmp.sort();
- if (tmp.setLastMessageTransmitted(query.getEnd())) {
- this.mXmppConnectionService.databaseBackend.updateConversation(tmp);
- }
}
}
}
+ if (query.hasCallback()) {
+ query.callback();
+ } else {
+ conversation.setHasMessagesLeftOnServer(query.getMessageCount() > 0);
+ this.mXmppConnectionService.updateConversationUi();
+ }
}
public boolean queryInProgress(Conversation conversation, XmppConnectionService.OnMoreMessagesLoaded callback) {
@@ -183,6 +207,9 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
if (complete || relevant == null || abort) {
this.finalizeQuery(query);
Logging.d(Config.LOGTAG,query.getAccount().getJid().toBareJid().toString()+": finished mam after "+query.getTotalCount()+" messages");
+ if (query.getWith() == null && query.getMessageCount() > 0) {
+ mXmppConnectionService.getNotificationService().finishBacklog(true);
+ }
} else {
final Query nextQuery;
if (query.getPagingOrder() == PagingOrder.NORMAL) {