From c39b81a033dd79907e25edce40ba99cef22ca586 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Wed, 8 Mar 2023 20:43:21 -0500 Subject: [PATCH] Reply to message instead of just quote If you want an editable quote you can still copy to clipboard + paste as quote. This commit works at a protocol level, but there is no UI to show that you are replying or to let you cancel a reply. --- .../conversations/entities/Conversation.java | 9 +++++++ .../siacs/conversations/entities/Message.java | 24 +++++++++++++++++++ .../ui/ConversationFragment.java | 10 ++++++-- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index 2d70af3906f9d269a78619e9a4b03b35202c0d44..8382af89a349663ae58d045cbe573672f7b4262b 100644 --- a/src/main/java/eu/siacs/conversations/entities/Conversation.java +++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java @@ -170,6 +170,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl protected Element thread = null; protected boolean lockThread = false; protected boolean userSelectedThread = false; + protected Message replyTo = null; public Conversation(final String name, final Account account, final Jid contactJid, final int mode) { @@ -671,6 +672,14 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl return this.userSelectedThread; } + public void setReplyTo(Message m) { + this.replyTo = m; + } + + public Message getReplyTo() { + return this.replyTo; + } + public boolean isRead() { synchronized (this.messages) { for(final Message message : Lists.reverse(this.messages)) { diff --git a/src/main/java/eu/siacs/conversations/entities/Message.java b/src/main/java/eu/siacs/conversations/entities/Message.java index 40939cb4bcb4efd028467a693cc2a34d226aee74..76c9d1cdec6eb4f997e256ad480b7c5b10d7e982 100644 --- a/src/main/java/eu/siacs/conversations/entities/Message.java +++ b/src/main/java/eu/siacs/conversations/entities/Message.java @@ -47,6 +47,7 @@ import eu.siacs.conversations.crypto.axolotl.FingerprintStatus; import eu.siacs.conversations.http.URL; import eu.siacs.conversations.services.AvatarService; import eu.siacs.conversations.ui.util.PresenceSelector; +import eu.siacs.conversations.ui.util.QuoteHelper; import eu.siacs.conversations.utils.CryptoHelper; import eu.siacs.conversations.utils.Emoticons; import eu.siacs.conversations.utils.GeoHelper; @@ -379,6 +380,22 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable return values; } + public Message reply() { + Message m = new Message(conversation, QuoteHelper.quote(getBody()) + "\n", ENCRYPTION_NONE); + m.setThread(getThread()); + m.addPayload( + new Element("reply", "urn:xmpp:reply:0") + .setAttribute("to", getCounterpart()) + .setAttribute("id", conversation.getMode() == Conversation.MODE_MULTI ? getServerMsgId() : getRemoteMsgId()) + ); + final Element fallback = new Element("fallback", "urn:xmpp:fallback:0").setAttribute("for", "urn:xmpp:reply:0"); + fallback.addChild("body", "urn:xmpp:fallback:0") + .setAttribute("start", "0") + .setAttribute("end", "" + m.body.length()); + m.addPayload(fallback); + return m; + } + public String getConversationUuid() { return conversationUuid; } @@ -450,6 +467,13 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable this.treatAsDownloadable = null; } + public synchronized void appendBody(String append) { + this.body += append; + this.isGeoUri = null; + this.isEmojisOnly = null; + this.treatAsDownloadable = null; + } + public String getSubject() { return subject; } diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index 69f9ca493e33c8c314570c75c233d62baff5284c..579cd6b645e47e414c6593a0abce0d6222cc31f5 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -893,7 +893,13 @@ public class ConversationFragment extends XmppFragment } final Message message; if (conversation.getCorrectingMessage() == null) { - message = new Message(conversation, body, conversation.getNextEncryption()); + if (conversation.getReplyTo() != null) { + message = conversation.getReplyTo().reply(); + message.appendBody(body); + message.setEncryption(conversation.getNextEncryption()); + } else { + message = new Message(conversation, body, conversation.getNextEncryption()); + } message.setThread(conversation.getThread()); Message.configurePrivateMessage(message); } else { @@ -1358,7 +1364,7 @@ public class ConversationFragment extends XmppFragment private void quoteMessage(Message message) { setThread(message.getThread()); conversation.setUserSelectedThread(true); - quoteText(MessageUtils.prepareQuote(message)); + conversation.setReplyTo(message); } private void setThread(Element thread) {