aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/main/java/de/pixart/messenger/entities/Conversation.java4
-rw-r--r--src/main/java/de/pixart/messenger/parser/MessageParser.java2
-rw-r--r--src/main/java/de/pixart/messenger/services/MessageArchiveService.java29
-rw-r--r--src/main/java/de/pixart/messenger/ui/ConversationFragment.java4
4 files changed, 24 insertions, 15 deletions
diff --git a/src/main/java/de/pixart/messenger/entities/Conversation.java b/src/main/java/de/pixart/messenger/entities/Conversation.java
index 223e26dd2..b41805987 100644
--- a/src/main/java/de/pixart/messenger/entities/Conversation.java
+++ b/src/main/java/de/pixart/messenger/entities/Conversation.java
@@ -991,9 +991,9 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
}
}
- public void prepend(Message message) {
+ public void prepend(int offset, Message message) {
synchronized (this.messages) {
- this.messages.add(0, message);
+ this.messages.add(Math.min(offset, this.messages.size()), message);
}
}
diff --git a/src/main/java/de/pixart/messenger/parser/MessageParser.java b/src/main/java/de/pixart/messenger/parser/MessageParser.java
index f0b804306..5a95c89bd 100644
--- a/src/main/java/de/pixart/messenger/parser/MessageParser.java
+++ b/src/main/java/de/pixart/messenger/parser/MessageParser.java
@@ -626,7 +626,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
}
if (query != null && query.getPagingOrder() == MessageArchiveService.PagingOrder.REVERSE) {
- conversation.prepend(message);
+ conversation.prepend(query.getActualInThisQuery(), message);
} else {
conversation.add(message);
}
diff --git a/src/main/java/de/pixart/messenger/services/MessageArchiveService.java b/src/main/java/de/pixart/messenger/services/MessageArchiveService.java
index 277ede64d..8611bf873 100644
--- a/src/main/java/de/pixart/messenger/services/MessageArchiveService.java
+++ b/src/main/java/de/pixart/messenger/services/MessageArchiveService.java
@@ -184,7 +184,7 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
}
}
} else if (packet.getType() == IqPacket.TYPE.RESULT && fin != null) {
- processFin(fin);
+ processFin(query, fin);
} else if (packet.getType() == IqPacket.TYPE.RESULT && query.isLegacy()) {
//do nothing
} else {
@@ -254,18 +254,15 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
public void processFinLegacy(Element fin, Jid from) {
Query query = findQuery(fin.getAttribute("queryid"));
if (query != null && query.validFrom(from)) {
- processFin(fin);
+ processFin(query, fin);
}
}
- public void processFin(Element fin) {
- Query query = findQuery(fin.getAttribute("queryid"));
- if (query == null) {
- return;
- }
+ private void processFin(Query query, Element fin) {
boolean complete = fin.getAttributeAsBoolean("complete");
Element set = fin.findChild("set", "http://jabber.org/protocol/rsm");
Element last = set == null ? null : set.findChild("last");
+ String count = set == null ? null : set.findChildContent("count");
Element first = set == null ? null : set.findChild("first");
Element relevant = query.getPagingOrder() == PagingOrder.NORMAL ? last : first;
boolean abort = (!query.isCatchup() && query.getTotalCount() >= Config.PAGE_SIZE) || query.getTotalCount() >= Config.MAM_MAX_MESSAGES;
@@ -273,9 +270,17 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
query.getConversation().setFirstMamReference(first == null ? null : first.getContent());
}
if (complete || relevant == null || abort) {
- final boolean done = (complete || query.getActualMessageCount() == 0) && !query.isCatchup();
+ boolean done = !query.isCatchup();
+ if (count != null && !query.isCatchup()) {
+ try {
+ done = Integer.parseInt(count) <= query.getTotalCount();
+ } catch (NumberFormatException e) {
+ done = false;
+ }
+ }
+ done = done || (query.getActualMessageCount() == 0 && !query.isCatchup());
this.finalizeQuery(query, done);
- Log.d(Config.LOGTAG, query.getAccount().getJid().toBareJid() + ": finished mam after " + query.getTotalCount() + "(" + query.getActualMessageCount() + ") messages. messages left=" + Boolean.toString(!done));
+ Log.d(Config.LOGTAG, query.getAccount().getJid().toBareJid() + ": finished mam after " + query.getTotalCount() + "(" + query.getActualMessageCount() + ") messages. messages left=" + Boolean.toString(!done) + " count=" + count);
if (query.isCatchup() && query.getActualMessageCount() > 0) {
mXmppConnectionService.getNotificationService().finishBacklog(true,query.getAccount());
}
@@ -330,6 +335,7 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
public class Query {
private int totalCount = 0;
private int actualCount = 0;
+ private int actualInThisQuery = 0;
private long start;
private long end;
private String queryId;
@@ -453,6 +459,7 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
}
public void incrementActualMessageCount() {
+ this.actualInThisQuery++;
this.actualCount++;
}
@@ -464,6 +471,10 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
return this.actualCount;
}
+ public int getActualInThisQuery() {
+ return this.actualInThisQuery;
+ }
+
public boolean validFrom(Jid from) {
if (muc()) {
return getWith().equals(from);
diff --git a/src/main/java/de/pixart/messenger/ui/ConversationFragment.java b/src/main/java/de/pixart/messenger/ui/ConversationFragment.java
index a9bb9319f..e73f30211 100644
--- a/src/main/java/de/pixart/messenger/ui/ConversationFragment.java
+++ b/src/main/java/de/pixart/messenger/ui/ConversationFragment.java
@@ -1446,9 +1446,7 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
if (!ReadByMarker.contains(marker, addedMarkers)) {
addedMarkers.add(marker); //may be put outside this condition. set should do dedup anyway
MucOptions.User user = mucOptions.findUser(marker);
- if (user != null && !users.contains(user)) {
- shownMarkers.add(user);
- }
+ shownMarkers.add(user);
}
}
final ReadByMarker markerForSender = ReadByMarker.from(messageList.get(i));