diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index 9119fe2e0b0399042d0a2c7b025dca4c2f014d35..4a91d0f0afaaf06faf563da00014ecd3b8fabecf 100644 --- a/src/main/java/eu/siacs/conversations/entities/Conversation.java +++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java @@ -573,15 +573,32 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl return reactionEmoji; } + public long loadMoreTimestamp() { + if (messages.size() < 1) return 0; + if (getLockThread() && messages.size() > 5000) return 0; + + if (messages.get(0).getType() == Message.TYPE_STATUS && messages.size() >= 2) { + return messages.get(1).getTimeSent(); + } else { + return messages.get(0).getTimeSent(); + } + } + public void populateWithMessages(final List messages) { synchronized (this.messages) { messages.clear(); messages.addAll(this.messages); } - for (Iterator iterator = messages.iterator(); iterator.hasNext(); ) { - Message m = iterator.next(); - if (m.wasMergedIntoPrevious() || (getLockThread() && (m.getThread() == null || !m.getThread().getContent().equals(getThread().getContent())))) { + Set extraIds = new HashSet<>(); + for (ListIterator iterator = messages.listIterator(messages.size()); iterator.hasPrevious(); ) { + Message m = iterator.previous(); + if (m.wasMergedIntoPrevious() || (getLockThread() && !extraIds.contains(m.replyId()) && (m.getThread() == null || !m.getThread().getContent().equals(getThread().getContent())))) { iterator.remove(); + } else if (getLockThread() && m.getThread() != null) { + Element reply = m.getReply(); + if (reply != null && reply.getAttribute("id") != null) extraIds.add(reply.getAttribute("id")); + Element reactions = m.getReactions(); + if (reactions != null && reactions.getAttribute("id") != null) extraIds.add(reactions.getAttribute("id")); } } } diff --git a/src/main/java/eu/siacs/conversations/entities/Message.java b/src/main/java/eu/siacs/conversations/entities/Message.java index 5ec8dfd04f96e08308c3ab44457ddfa2a6458716..206168d3df96fa708ec03f70a7766691946bca73 100644 --- a/src/main/java/eu/siacs/conversations/entities/Message.java +++ b/src/main/java/eu/siacs/conversations/entities/Message.java @@ -437,6 +437,18 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable return null; } + public Element getReply() { + if (this.payloads == null) return null; + + for (Element el : this.payloads) { + if (el.getName().equals("reply") && el.getNamespace().equals("urn:xmpp:reply:0")) { + return el; + } + } + + return null; + } + public String getConversationUuid() { return conversationUuid; } diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index d50fbe4b848c1cbd70c5221a8fb3cb7b8ccf9b62..e919f3f3cd66e87e9a82a9d117a8e7315df2def4 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java @@ -668,6 +668,9 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece el.setAttribute("xmlns", "jabber:client"); message.addPayload(el); } + if (el.getName().equals("reply") && el.getNamespace() != null && el.getNamespace().equals("urn:xmpp:reply:0")) { + message.addPayload(el); + } } if (conversationMultiMode) { message.setMucUser(conversation.getMucOptions().findUserByFullJid(counterpart)); diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index 757b6596f5f587ca4258dfe5070004f905c28263..a855dcadaea336eef80b2fa5557fd60a5a8eb1b0 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -295,13 +295,7 @@ public class ConversationFragment extends XmppFragment && conversation != null && conversation.messagesLoaded.compareAndSet(true, false) && messageList.size() > 0) { - long timestamp; - if (messageList.get(0).getType() == Message.TYPE_STATUS - && messageList.size() >= 2) { - timestamp = messageList.get(1).getTimeSent(); - } else { - timestamp = messageList.get(0).getTimeSent(); - } + long timestamp = conversation.loadMoreTimestamp(); activity.xmppConnectionService.loadMoreMessages( conversation, timestamp,