dismiss notification only if displayed id matches last remote id

This commit is contained in:
Daniel Gultsch 2020-06-24 12:12:35 +02:00
parent fada3a63c9
commit 13d8eb1c7e
2 changed files with 30 additions and 8 deletions

View file

@ -7,6 +7,7 @@ import android.support.annotation.Nullable;
import android.text.TextUtils;
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.Lists;
import org.json.JSONArray;
import org.json.JSONException;
@ -169,6 +170,22 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
return first;
}
public String findMostRecentRemoteDisplayableId() {
final boolean multi = mode == Conversation.MODE_MULTI;
synchronized (this.messages) {
for(final Message message : Lists.reverse(this.messages)) {
if (message.getStatus() == Message.STATUS_RECEIVED) {
final String serverMsgId = message.getServerMsgId();
if (serverMsgId != null && multi) {
return serverMsgId;
}
return message.getRemoteMsgId();
}
}
}
return null;
}
public Message findUnsentMessageWithUuid(String uuid) {
synchronized (this.messages) {
for (final Message message : this.messages) {

View file

@ -837,9 +837,9 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
if (Namespace.JINGLE_MESSAGE.equals(child.getNamespace()) && JINGLE_MESSAGE_ELEMENT_NAMES.contains(child.getName())) {
final String action = child.getName();
final String sessionId = child.getAttribute("id");
if (sessionId == null) {
break;
}
if (sessionId == null) {
break;
}
if (query == null) {
if (serverMsgId == null) {
serverMsgId = extractStanzaId(account, packet);
@ -952,7 +952,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
final String id = displayed.getAttribute("id");
final Jid sender = InvalidJid.getNullForInvalid(displayed.getAttributeAsJid("sender"));
if (packet.fromAccount(account) && !selfAddressed) {
dismissNotification(account, counterpart, query);
dismissNotification(account, counterpart, query, id);
if (query == null) {
activateGracePeriod(account);
}
@ -993,7 +993,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
message = message.prev();
}
if (displayedMessage != null && selfAddressed) {
dismissNotification(account, counterpart, query);
dismissNotification(account, counterpart, query, id);
}
}
}
@ -1018,10 +1018,15 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
}
}
private void dismissNotification(Account account, Jid counterpart, MessageArchiveService.Query query) {
Conversation conversation = mXmppConnectionService.find(account, counterpart.asBareJid());
private void dismissNotification(Account account, Jid counterpart, MessageArchiveService.Query query, final String id) {
final Conversation conversation = mXmppConnectionService.find(account, counterpart.asBareJid());
if (conversation != null && (query == null || query.isCatchup())) {
mXmppConnectionService.markRead(conversation); //TODO only mark messages read that are older than timestamp
final String displayableId = conversation.findMostRecentRemoteDisplayableId();
if (displayableId != null && displayableId.equals(id)) {
mXmppConnectionService.markRead(conversation);
} else {
Log.w(Config.LOGTAG, account.getJid().asBareJid() + ": received dismissing display marker that did not match our last id in that conversation");
}
}
}