MAM: update previously sent messages with server msg id during mam query

This commit is contained in:
Daniel Gultsch 2017-12-02 20:52:30 +01:00
parent fc8a5641db
commit ffb3eeb913
2 changed files with 32 additions and 6 deletions

View File

@ -804,15 +804,19 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
return this.bookmark; return this.bookmark;
} }
public boolean hasDuplicateMessage(Message message) { public Message findDuplicateMessage(Message message) {
synchronized (this.messages) { synchronized (this.messages) {
for (int i = this.messages.size() - 1; i >= 0; --i) { for (int i = this.messages.size() - 1; i >= 0; --i) {
if (this.messages.get(i).similar(message)) { if (this.messages.get(i).similar(message)) {
return true; return this.messages.get(i);
} }
} }
} }
return false; return null;
}
public boolean hasDuplicateMessage(Message message) {
return findDuplicateMessage(message) != null;
} }
public Message findSentMessageWithBody(String body) { public Message findSentMessageWithBody(String body) {

View File

@ -474,6 +474,14 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
if (query == null && extractChatState(mXmppConnectionService.find(account, counterpart.toBareJid()), isTypeGroupChat, packet)) { if (query == null && extractChatState(mXmppConnectionService.find(account, counterpart.toBareJid()), isTypeGroupChat, packet)) {
mXmppConnectionService.updateConversationUi(); mXmppConnectionService.updateConversationUi();
} }
if (query != null && status == Message.STATUS_SEND && remoteMsgId != null) {
Message previouslySent = conversation.findSentMessageWithUuid(remoteMsgId);
if (previouslySent != null && previouslySent.getServerMsgId() == null && serverMsgId != null) {
previouslySent.setServerMsgId(serverMsgId);
mXmppConnectionService.databaseBackend.updateMessage(previouslySent);
Log.d(Config.LOGTAG,account.getJid().toBareJid()+": encountered previously sent OMEMO message without serverId. updating...");
}
}
return; return;
} }
if (conversationMultiMode) { if (conversationMultiMode) {
@ -577,10 +585,24 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
boolean checkForDuplicates = (isTypeGroupChat && packet.hasChild("delay", "urn:xmpp:delay")) boolean checkForDuplicates = (isTypeGroupChat && packet.hasChild("delay", "urn:xmpp:delay"))
|| message.getType() == Message.TYPE_PRIVATE || message.getType() == Message.TYPE_PRIVATE
|| message.getServerMsgId() != null; || message.getServerMsgId() != null;
if (checkForDuplicates && conversation.hasDuplicateMessage(message)) { if (checkForDuplicates ) {
Log.d(Config.LOGTAG, "skipping duplicate message from " + message.getCounterpart().toString() + " " + message.getBody()); final Message duplicate = conversation.findDuplicateMessage(message);
if (duplicate != null) {
final boolean serverMsgIdUpdated;
if (duplicate.getStatus() != Message.STATUS_RECEIVED
&& duplicate.getUuid().equals(message.getRemoteMsgId())
&& duplicate.getServerMsgId() == null
&& message.getServerMsgId() != null) {
duplicate.setServerMsgId(message.getServerMsgId());
mXmppConnectionService.databaseBackend.updateMessage(message);
serverMsgIdUpdated = true;
} else {
serverMsgIdUpdated = false;
}
Log.d(Config.LOGTAG, "skipping duplicate message with " + message.getCounterpart()+". serverMsgIdUpdated="+Boolean.toString(serverMsgIdUpdated));
return; return;
} }
}
if (query != null && query.getPagingOrder() == MessageArchiveService.PagingOrder.REVERSE) { if (query != null && query.getPagingOrder() == MessageArchiveService.PagingOrder.REVERSE) {
conversation.prepend(message); conversation.prepend(message);