@@ -552,6 +552,18 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
return this.deleted;
}
+ public Element getModerated() {
+ if (this.payloads == null) return null;
+
+ for (Element el : this.payloads) {
+ if (el.getName().equals("moderated") && el.getNamespace().equals("urn:xmpp:message-moderate:0")) {
+ return el;
+ }
+ }
+
+ return null;
+ }
+
public void setDeleted(boolean deleted) {
this.deleted = deleted;
}
@@ -413,7 +413,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
}
final Element mucUserElement = packet.findChild("x", Namespace.MUC_USER);
final String pgpEncrypted = packet.findChildContent("x", "jabber:x:encrypted");
- final Element replaceElement = packet.findChild("replace", "urn:xmpp:message-correct:0");
+ Element replaceElement = packet.findChild("replace", "urn:xmpp:message-correct:0");
Set<Message.FileParams> attachments = new LinkedHashSet<>();
for (Element child : packet.getChildren()) {
// SIMS first so they get preference in the set
@@ -429,13 +429,16 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
}
}
String replacementId = replaceElement == null ? null : replaceElement.getAttribute("id");
- boolean replaceAsRetraction = false;
if (replacementId == null) {
- Element fasten = packet.findChild("apply-to", "urn:xmpp:fasten:0");
- if (fasten != null && (fasten.findChild("retract", "urn:xmpp:message-retract:0") != null || fasten.findChild("moderated", "urn:xmpp:message-moderate:0") != null)) {
- replacementId = fasten.getAttribute("id");
- packet.setBody("");
- replaceAsRetraction = true;
+ final Element fasten = packet.findChild("apply-to", "urn:xmpp:fasten:0");
+ if (fasten != null) {
+ replaceElement = fasten.findChild("retract", "urn:xmpp:message-retract:0");
+ if (replaceElement == null) replaceElement = fasten.findChild("moderated", "urn:xmpp:message-moderate:0");
+ if (replaceElement != null) {
+ final String reason = replaceElement.findChildContent("reason", "urn:xmpp:message-moderate:0");
+ replacementId = fasten.getAttribute("id");
+ packet.setBody(reason == null ? "" : reason);
+ }
}
}
final LocalizedContent body = packet.getBody();
@@ -690,12 +693,13 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
replacedMessage.setBody(message.getBody());
replacedMessage.putEdited(replacedMessage.getRemoteMsgId(), replacedMessage.getServerMsgId());
replacedMessage.setRemoteMsgId(remoteMsgId);
- if (replaceAsRetraction) {
+ if (!replaceElement.getName().equals("replace")) {
mXmppConnectionService.getFileBackend().deleteFile(replacedMessage);
mXmppConnectionService.evictPreview(message.getUuid());
replacedMessage.clearPayloads();
replacedMessage.setFileParams(null);
replacedMessage.setDeleted(true);
+ replacedMessage.addPayload(replaceElement);
}
if (replacedMessage.getServerMsgId() == null || message.getServerMsgId() != null) {
replacedMessage.setServerMsgId(message.getServerMsgId());
@@ -724,7 +728,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
} else {
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": received message correction but verification didn't check out");
}
- } else if (replaceAsRetraction) {
+ } else if (message.getBody() == null || message.getBody().equals("") || message.getBody().equals(" ")) {
return;
}
}