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

add delivery receipts for private muc msgs & enable update last-seen for muc-msgs
This commit is contained in:
Daniel Gultsch 2015-03-19 18:47:33 +01:00
commit 382bcc4cb5
4 changed files with 24 additions and 8 deletions

View file

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

View file

@ -49,6 +49,11 @@ public abstract class AbstractParser {
protected void updateLastseen(final Element packet, final Account account, protected void updateLastseen(final Element packet, final Account account,
final boolean presenceOverwrite) { final boolean presenceOverwrite) {
final Jid from = packet.getAttributeAsJid("from"); 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 String presence = from == null || from.isBareJid() ? "" : from.getResourcepart();
final Contact contact = account.getRoster().getContact(from); final Contact contact = account.getRoster().getContact(from);
final long timestamp = getTimestamp(packet); final long timestamp = getTimestamp(packet);

View file

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

View file

@ -2041,7 +2041,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
return null; return null;
} }
for (Conversation conversation : getConversations()) { 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); final Message message = conversation.findSentMessageWithUuid(uuid);
if (message != null) { if (message != null) {
markMessage(message, status); markMessage(message, status);