Merge pull request #1042 from BrianBlade/FIXES_muc-dlrs_muc-lastseen

Daniel Gultsch created

add delivery receipts for private muc msgs & enable update last-seen for muc-msgs

Change summary

src/main/java/eu/siacs/conversations/generator/MessageGenerator.java     |  3 
src/main/java/eu/siacs/conversations/parser/AbstractParser.java          |  5 
src/main/java/eu/siacs/conversations/parser/MessageParser.java           | 22 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java |  2 
4 files changed, 24 insertions(+), 8 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/generator/MessageGenerator.java 🔗

@@ -35,6 +35,9 @@ public class MessageGenerator extends AbstractGenerator {
 		} else if (message.getType() == Message.TYPE_PRIVATE) {
 			packet.setTo(message.getCounterpart());
 			packet.setType(MessagePacket.TYPE_CHAT);
+			if (this.mXmppConnectionService.indicateReceived()) {
+				packet.addChild("request", "urn:xmpp:receipts");
+			}
 		} else {
 			packet.setTo(message.getCounterpart().toBareJid());
 			packet.setType(MessagePacket.TYPE_GROUPCHAT);

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

@@ -49,6 +49,11 @@ public abstract class AbstractParser {
 	protected void updateLastseen(final Element packet, final Account account,
 			final boolean presenceOverwrite) {
 		final Jid from = packet.getAttributeAsJid("from");
+		updateLastseen(packet, account, from, presenceOverwrite);
+	}
+
+	protected void updateLastseen(final Element packet, 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);

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

@@ -44,12 +44,11 @@ public class MessageParser extends AbstractParser implements
 	}
 
 	private Message parseChat(MessagePacket packet, Account account) {
-        final Jid jid = packet.getFrom();
+		final Jid jid = packet.getFrom();
 		if (jid == null) {
 			return null;
 		}
 		Conversation conversation = mXmppConnectionService.findOrCreateConversation(account, jid.toBareJid(), false);
-		updateLastseen(packet, account, true);
 		String pgpBody = getPgpBody(packet);
 		Message finishedMessage;
 		if (pgpBody != null) {
@@ -64,13 +63,18 @@ public class MessageParser extends AbstractParser implements
 		finishedMessage.markable = isMarkable(packet);
 		if (conversation.getMode() == Conversation.MODE_MULTI
 				&& !jid.isBareJid()) {
+			final Jid trueCounterpart = conversation.getMucOptions()
+					.getTrueCounterpart(jid.getResourcepart());
+			if (trueCounterpart != null) {
+				updateLastseen(packet, account, trueCounterpart, true);
+			}
 			finishedMessage.setType(Message.TYPE_PRIVATE);
-			finishedMessage.setTrueCounterpart(conversation.getMucOptions()
-					.getTrueCounterpart(jid.getResourcepart()));
+			finishedMessage.setTrueCounterpart(trueCounterpart);
 			if (conversation.hasDuplicateMessage(finishedMessage)) {
 				return null;
 			}
-
+		} else {
+			updateLastseen(packet, account, true);
 		}
 		finishedMessage.setCounterpart(jid);
 		finishedMessage.setTime(getTimestamp(packet));
@@ -89,7 +93,7 @@ public class MessageParser extends AbstractParser implements
 				.findOrCreateConversation(account, from.toBareJid(), false);
 		String presence;
 		if (from.isBareJid()) {
-            presence = "";
+			presence = "";
 		} else {
 			presence = from.getResourcepart();
 		}
@@ -153,7 +157,7 @@ public class MessageParser extends AbstractParser implements
 
 	private Message parseGroupchat(MessagePacket packet, Account account) {
 		int status;
-        final Jid from = packet.getFrom();
+		final Jid from = packet.getFrom();
 		if (from == null) {
 			return null;
 		}
@@ -163,6 +167,10 @@ public class MessageParser extends AbstractParser implements
 		}
 		Conversation conversation = mXmppConnectionService
 				.findOrCreateConversation(account, from.toBareJid(), true);
+		final Jid trueCounterpart = conversation.getMucOptions().getTrueCounterpart(from.getResourcepart());
+		if (trueCounterpart != null) {
+			updateLastseen(packet, account, trueCounterpart.toBareJid(), true);
+		}
 		if (packet.hasChild("subject")) {
 			conversation.setHasMessagesLeftOnServer(true);
 			conversation.getMucOptions().setSubject(packet.findChild("subject").getContent());

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java 🔗

@@ -2041,7 +2041,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
 			return null;
 		}
 		for (Conversation conversation : getConversations()) {
-			if (conversation.getJid().equals(recipient) && conversation.getAccount() == account) {
+			if (conversation.getJid().toBareJid().equals(recipient) && conversation.getAccount() == account) {
 				final Message message = conversation.findSentMessageWithUuid(uuid);
 				if (message != null) {
 					markMessage(message, status);