use actual message timestamp instead of delay when updating last seen. fixes #1618

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/parser/AbstractParser.java | 8 +-
src/main/java/eu/siacs/conversations/parser/MessageParser.java  | 7 +-
2 files changed, 8 insertions(+), 7 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/parser/AbstractParser.java 🔗

@@ -11,6 +11,7 @@ import eu.siacs.conversations.entities.Contact;
 import eu.siacs.conversations.services.XmppConnectionService;
 import eu.siacs.conversations.xml.Element;
 import eu.siacs.conversations.xmpp.jid.Jid;
+import eu.siacs.conversations.xmpp.stanzas.AbstractStanza;
 
 public abstract class AbstractParser {
 
@@ -47,14 +48,13 @@ public abstract class AbstractParser {
 		return dateFormat.parse(timestamp);
 	}
 
-	protected void updateLastseen(final Element packet, final Account account, final boolean presenceOverwrite) {
-		updateLastseen(packet, account, packet.getAttributeAsJid("from"), presenceOverwrite);
+	protected void updateLastseen(final AbstractStanza packet, final Account account, final boolean presenceOverwrite) {
+		updateLastseen(getTimestamp(packet), account, packet.getFrom(), presenceOverwrite);
 	}
 
-	protected void updateLastseen(final Element packet, final Account account, final Jid from, final boolean presenceOverwrite) {
+	protected void updateLastseen(long timestamp, final Account account, final Jid from, final boolean presenceOverwrite) {
 		final String presence = from == null || from.isBareJid() ? "" : from.getResourcepart();
 		final Contact contact = account.getRoster().getContact(from);
-		final long timestamp = getTimestamp(packet);
 		if (timestamp >= contact.lastseen.time) {
 			contact.lastseen.time = timestamp;
 			if (!presence.isEmpty() && presenceOverwrite) {

src/main/java/eu/siacs/conversations/parser/MessageParser.java 🔗

@@ -382,13 +382,14 @@ public class MessageParser extends AbstractParser implements
 				Jid trueCounterpart = conversation.getMucOptions().getTrueCounterpart(counterpart.getResourcepart());
 				message.setTrueCounterpart(trueCounterpart);
 				if (trueCounterpart != null) {
-					updateLastseen(packet,account,trueCounterpart,false);
+					updateLastseen(timestamp, account, trueCounterpart, false);
 				}
 				if (!isTypeGroupChat) {
 					message.setType(Message.TYPE_PRIVATE);
 				}
+			} else {
+				updateLastseen(timestamp, account, packet.getFrom(), true);
 			}
-			updateLastseen(packet, account, true);
 			boolean checkForDuplicates = query != null
 					|| (isTypeGroupChat && packet.hasChild("delay","urn:xmpp:delay"))
 					|| message.getType() == Message.TYPE_PRIVATE;
@@ -498,7 +499,7 @@ public class MessageParser extends AbstractParser implements
 					mXmppConnectionService.markRead(conversation);
 				}
 			} else {
-				updateLastseen(packet, account, true);
+				updateLastseen(timestamp, account, packet.getFrom(), true);
 				final Message displayedMessage = mXmppConnectionService.markMessage(account, from.toBareJid(), displayed.getAttribute("id"), Message.STATUS_SEND_DISPLAYED);
 				Message message = displayedMessage == null ? null : displayedMessage.prev();
 				while (message != null