diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index 0ed2256bc8c28d94d7acb979429c5c4c68605c1d..5cfad042b4b127e32c2369942c78e3c465259b0e 100644 --- a/src/main/java/eu/siacs/conversations/entities/Conversation.java +++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java @@ -312,7 +312,8 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl public String findMostRecentRemoteDisplayableId() { final boolean multi = mode == Conversation.MODE_MULTI; synchronized (this.messages) { - for (final Message message : Lists.reverse(this.messages)) { + for (int i = messages.size() - 1; i >= 0; --i) { + final Message message = messages.get(i); if (message.getSubject() != null && !message.isOOb() && (message.getRawBody() == null || message.getRawBody().length() == 0)) continue; if ((message.getRawBody() == null || "".equals(message.getRawBody()) || " ".equals(message.getRawBody())) && message.getReply() != null && message.edited() && message.getHtml() != null) continue; if (asReaction(message) != null) continue; @@ -342,7 +343,8 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl public Message getLastEditableMessage() { synchronized (this.messages) { - for (final Message message : Lists.reverse(this.messages)) { + for (int i = messages.size() - 1; i >= 0; --i) { + final Message message = messages.get(i); if (message.isEditable()) { if (message.isGeoUri() || message.getType() != Message.TYPE_TEXT) { return null; @@ -882,7 +884,15 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl public long getSortableTime() { Draft draft = getDraft(); - long messageTime = getLatestMessage().getTimeReceived(); + final long messageTime; + synchronized (this.messages) { + if (this.messages.size() == 0) { + messageTime = Math.max(getCreated(), getLastClearHistory().getTimestamp()); + } else { + messageTime = this.messages.get(this.messages.size() - 1).getTimeReceived(); + } + } + if (draft == null) { return messageTime; } else { @@ -953,19 +963,20 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl public Message getLatestMessage() { synchronized (this.messages) { - for(final Message message : Lists.reverse(this.messages)) { + for (int i = messages.size() - 1; i >= 0; --i) { + final Message message = messages.get(i); if (message.getSubject() != null && !message.isOOb() && (message.getRawBody() == null || message.getRawBody().length() == 0)) continue; - if (asReaction(message) != null) continue; if ((message.getRawBody() == null || "".equals(message.getRawBody()) || " ".equals(message.getRawBody())) && message.getReply() != null && message.edited() && message.getHtml() != null) continue; + if (asReaction(message) != null) continue; return message; } - - Message message = new Message(this, "", Message.ENCRYPTION_NONE); - message.setType(Message.TYPE_STATUS); - message.setTime(Math.max(getCreated(), getLastClearHistory().getTimestamp())); - message.setTimeReceived(Math.max(getCreated(), getLastClearHistory().getTimestamp())); - return message; } + + Message message = new Message(this, "", Message.ENCRYPTION_NONE); + message.setType(Message.TYPE_STATUS); + message.setTime(Math.max(getCreated(), getLastClearHistory().getTimestamp())); + message.setTimeReceived(Math.max(getCreated(), getLastClearHistory().getTimestamp())); + return message; } public @NonNull @@ -1127,7 +1138,15 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl public @Nullable Draft getDraft() { long timestamp = getLongAttribute(ATTRIBUTE_NEXT_MESSAGE_TIMESTAMP, 0); - if (timestamp > getLatestMessage().getTimeSent()) { + final long messageTime; + synchronized (this.messages) { + if (this.messages.size() == 0) { + messageTime = Math.max(getCreated(), getLastClearHistory().getTimestamp()); + } else { + messageTime = this.messages.get(this.messages.size() - 1).getTimeSent(); + } + } + if (timestamp > messageTime) { String message = getAttribute(ATTRIBUTE_NEXT_MESSAGE); if (!TextUtils.isEmpty(message) && timestamp != 0) { return new Draft(message, timestamp); @@ -1424,7 +1443,8 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl public int unreadCount(XmppConnectionService xmppConnectionService) { synchronized (this.messages) { int count = 0; - for(final Message message : Lists.reverse(this.messages)) { + for (int i = messages.size() - 1; i >= 0; --i) { + final Message message = messages.get(i); if (message.getSubject() != null && !message.isOOb() && (message.getRawBody() == null || message.getRawBody().length() == 0)) continue; if (asReaction(message) != null) continue; if ((message.getRawBody() == null || "".equals(message.getRawBody()) || " ".equals(message.getRawBody())) && message.getReply() != null && message.edited() && message.getHtml() != null) continue;