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.java48
1 files changed, 38 insertions, 10 deletions
diff --git a/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java b/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java
index 4f47cdbe..c77262cb 100644
--- a/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java
+++ b/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java
@@ -4,16 +4,18 @@ import android.util.Log;
import java.math.BigInteger;
import java.util.HashSet;
+import java.util.List;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.xml.Element;
+import eu.siacs.conversations.xmpp.OnAdvancedStreamFeaturesLoaded;
import eu.siacs.conversations.xmpp.OnIqPacketReceived;
import eu.siacs.conversations.xmpp.jid.Jid;
import eu.siacs.conversations.xmpp.stanzas.IqPacket;
-public class MessageArchiveService {
+public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
private final XmppConnectionService mXmppConnectionService;
@@ -28,18 +30,31 @@ public class MessageArchiveService {
final Account account = conversation.getAccount();
long start = conversation.getLastMessageReceived();
long end = account.getXmppConnection().getLastSessionEstablished();
+ if (end - start >= Config.MAX_HISTORY_AGE) {
+ start = end - Config.MAX_HISTORY_AGE;
+ }
final Query query = new Query(conversation, start, end);
this.queries.add(query);
IqPacket packet = this.mXmppConnectionService.getIqGenerator().queryMessageArchiveManagement(query);
this.mXmppConnectionService.sendIqPacket(account, packet, new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
- Log.d(Config.LOGTAG, packet.toString());
+ if (packet.getType() == IqPacket.TYPE_ERROR) {
+ finalizeQuery(query);
+ }
}
});
}
}
+ private void finalizeQuery(Query query) {
+ synchronized (this.queries) {
+ this.queries.remove(query);
+ }
+ query.getConversation().sort();
+ this.mXmppConnectionService.updateConversationUi();
+ }
+
public void processFin(Element fin) {
if (fin == null) {
return;
@@ -48,27 +63,26 @@ public class MessageArchiveService {
if (query == null) {
return;
}
- Log.d(Config.LOGTAG,"fin "+fin.toString());
boolean complete = fin.getAttributeAsBoolean("complete");
Element set = fin.findChild("set","http://jabber.org/protocol/rsm");
Element last = set == null ? null : set.findChild("last");
if (complete || last == null) {
- Log.d(Config.LOGTAG,"completed mam query for "+query.getWith().toString());
- synchronized (this.queries) {
- this.queries.remove(query);
- }
+ final Account account = query.getConversation().getAccount();
+ Log.d(Config.LOGTAG,account.getJid().toBareJid().toString()+": completed mam query for "+query.getWith().toString());
+ this.finalizeQuery(query);
} else {
- Query nextQuery = query.next(last == null ? null : last.getContent());
+ final Query nextQuery = query.next(last == null ? null : last.getContent());
IqPacket packet = this.mXmppConnectionService.getIqGenerator().queryMessageArchiveManagement(nextQuery);
synchronized (this.queries) {
this.queries.remove(query);
this.queries.add(nextQuery);
}
- Log.d(Config.LOGTAG,packet.toString());
this.mXmppConnectionService.sendIqPacket(query.getConversation().getAccount(),packet,new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
- Log.d(Config.LOGTAG,packet.toString());
+ if (packet.getType() == IqPacket.TYPE_ERROR) {
+ finalizeQuery(nextQuery);
+ }
}
});
}
@@ -88,6 +102,20 @@ public class MessageArchiveService {
}
}
+ @Override
+ public void onAdvancedStreamFeaturesAvailable(Account account) {
+ if (account.getXmppConnection() != null && account.getXmppConnection().getFeatures().mam()) {
+ List<Conversation> conversations = mXmppConnectionService.getConversations();
+ for (Conversation conversation : conversations) {
+ if (conversation.getMode() == Conversation.MODE_SINGLE && conversation.getAccount() == account) {
+ this.query(conversation);
+ }
+ }
+ } else {
+ Log.d(Config.LOGTAG,"no mam available");
+ }
+ }
+
public class Query {
private long start;
private long end;