Change summary
  src/main/java/eu/siacs/conversations/entities/Conversation.java          |  6 
src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java    |  8 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java |  7 
src/main/java/eu/siacs/conversations/ui/ConversationFragment.java        | 18 
4 files changed, 36 insertions(+), 3 deletions(-)
  Detailed changes
  
  
    
    @@ -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);
  
  
  
    
    @@ -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()};
  
  
  
    
    @@ -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);
     }
  
  
  
    
    @@ -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);