From 1b80981bc4436dd63bcf6888f85ddcce88df40e2 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Sun, 12 May 2024 22:38:33 -0500 Subject: [PATCH] Edit or remove message that is waiting Don't send a stanza to update it, since the original was never sent --- .../conversations/entities/Conversation.java | 6 ++++++ .../persistance/DatabaseBackend.java | 8 ++++++++ .../services/XmppConnectionService.java | 7 +++++++ .../conversations/ui/ConversationFragment.java | 18 +++++++++++++++--- 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index 40e3c7c2ee60bb3cc5c4f9538bcc6d8c9d23cbe4..98c041a8cb1f5ec43727f61ef83b9359326937b4 100644 --- a/src/main/java/eu/siacs/conversations/entities/Conversation.java +++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java @@ -1256,6 +1256,12 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl } } + public void remove(Message message) { + synchronized (this.messages) { + this.messages.remove(message); + } + } + public void add(Message message) { synchronized (this.messages) { this.messages.add(message); diff --git a/src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java b/src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java index e2b5361c2e7f0141b1cbf9db45b18edd5513d1f8..7e85563905c95f0320adda0f319c1dc2c709a10b 100644 --- a/src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java +++ b/src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java @@ -1351,6 +1351,14 @@ public class DatabaseBackend extends SQLiteOpenHelper { db.update("cheogram." + Message.TABLENAME, message.getCheogramContentValues(), Message.UUID + "=?", args) == 1; } + + public boolean deleteMessage(String uuid) { + SQLiteDatabase db = this.getWritableDatabase(); + String[] args = {uuid}; + return db.delete(Message.TABLENAME, Message.UUID + "=?", args) == 1 && + db.delete("cheogram." + Message.TABLENAME, Message.UUID + "=?", args) == 1; + } + public void readRoster(Roster roster) { final SQLiteDatabase db = this.getReadableDatabase(); final String[] args = {roster.getAccount().getUuid()}; diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 67efebbbea89bc2806b831a050ecc41c3631fac4..4bb4989c8f4a8e4b23b4286c319a519de551eae2 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -4349,6 +4349,13 @@ public class XmppConnectionService extends Service { return mBinder; } + public void deleteMessage(Message message) { + mScheduledMessages.remove(message.getUuid()); + databaseBackend.deleteMessage(message.getUuid()); + ((Conversation) message.getConversation()).remove(message); + updateConversationUi(); + } + public void updateMessage(Message message) { updateMessage(message, true); } diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index b79cdf8dbb74b86661b96d4444828d20f807c41b..772bdc39bb3b999bfe6a2a68f70172e34d8ae72c 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -1003,9 +1003,17 @@ public class ConversationFragment extends XmppFragment message.setBody(hasSubject && body.length() == 0 ? null : body); if (hasSubject) message.setSubject(binding.textinputSubject.getText().toString()); message.setThread(conversation.getThread()); - message.putEdited(message.getUuid(), message.getServerMsgId()); - message.setServerMsgId(null); - message.setUuid(UUID.randomUUID().toString()); + if (message.getStatus() == Message.STATUS_WAITING) { + if (sendAt != null) message.setTime(sendAt); + activity.xmppConnectionService.updateMessage(message); + setupReply(null); + messageSent(); + return; + } else { + message.putEdited(message.getUuid(), message.getServerMsgId()); + message.setServerMsgId(null); + message.setUuid(UUID.randomUUID().toString()); + } } if (sendAt != null) message.setTime(sendAt); switch (conversation.getNextEncryption()) { @@ -1810,6 +1818,10 @@ public class ConversationFragment extends XmppFragment while (message.mergeable(message.next())) { message = message.next(); } + if (message.getStatus() == Message.STATUS_WAITING || message.getStatus() == Message.STATUS_OFFERED) { + activity.xmppConnectionService.deleteMessage(message); + return; + } Element reactions = message.getReactions(); if (reactions != null) { final Message previousReaction = conversation.findMessageReactingTo(reactions.getAttribute("id"), null);