diff --git a/app/src/main/java/eu/faircode/email/AdapterAttachment.java b/app/src/main/java/eu/faircode/email/AdapterAttachment.java index 94bf4e9992..580e5d2e19 100644 --- a/app/src/main/java/eu/faircode/email/AdapterAttachment.java +++ b/app/src/main/java/eu/faircode/email/AdapterAttachment.java @@ -366,8 +366,7 @@ public class AdapterAttachment extends RecyclerView.Adapter aparts = parts.getAttachmentParts(); + // Get message parts + MessageHelper helper = new MessageHelper((MimeMessage) imessage, context); + MessageHelper.MessageParts parts = helper.getMessageParts(); - if (attachment.sequence > aparts.size()) - throw new IllegalArgumentException("Invalid attachment sequence=" + attachment.sequence + "/" + aparts.size()); - Part apart = aparts.get(attachment.sequence - 1).part; - if (!deletePart(icopy, apart)) - throw new IllegalArgumentException("Attachment part not found"); + // Download attachment + parts.downloadAttachment(context, attachment, folder); - ifolder.appendMessages(new Message[]{icopy}); + if (attachment.size != null) + EntityLog.log(context, "Operation attachment size=" + attachment.size); + } - imessage.setFlag(Flags.Flag.DELETED, true); - expunge(context, ifolder, Arrays.asList(imessage)); - } else { - // Get message parts - MessageHelper helper = new MessageHelper((MimeMessage) imessage, context); - MessageHelper.MessageParts parts = helper.getMessageParts(); + private static void onDetach(Context context, JSONArray jargs, EntityFolder folder, EntityMessage message, EntityOperation op, IMAPFolder ifolder) throws JSONException, MessagingException, IOException { + DB db = DB.getInstance(context); - // Download attachment - parts.downloadAttachment(context, attachment, folder); + long id = jargs.getLong(0); - if (attachment.size != null) - EntityLog.log(context, "Operation attachment size=" + attachment.size); - } + if (message.uid == null) + throw new IllegalArgumentException("Delete attachments uid missing"); + + // Get message + Message imessage = ifolder.getMessageByUID(message.uid); + if (imessage == null) + throw new MessageRemovedException(); + + String msgid = EntityMessage.generateMessageId(); + MimeMessage icopy = new MimeMessageEx((MimeMessage) imessage, msgid); + MessageHelper helper = new MessageHelper(icopy, context); + MessageHelper.MessageParts parts = helper.getMessageParts(); + List aparts = parts.getAttachmentParts(); + + List attachments = db.attachment().getAttachments(message.id); + for (EntityAttachment attachment : attachments) + if (attachment.id.equals(id) && BuildConfig.DEBUG) { + Part apart = aparts.get(attachment.sequence - 1).part; + if (!deletePart(icopy, apart)) + throw new IllegalArgumentException("Attachment part not found"); + } + + ifolder.appendMessages(new Message[]{icopy}); + + imessage.setFlag(Flags.Flag.DELETED, true); + expunge(context, ifolder, Arrays.asList(imessage)); } static boolean deletePart(Part part, Part attachment) throws MessagingException, IOException { diff --git a/app/src/main/java/eu/faircode/email/EntityOperation.java b/app/src/main/java/eu/faircode/email/EntityOperation.java index 71b537a510..ca9ca1bac2 100644 --- a/app/src/main/java/eu/faircode/email/EntityOperation.java +++ b/app/src/main/java/eu/faircode/email/EntityOperation.java @@ -97,6 +97,7 @@ public class EntityOperation { static final String RAW = "raw"; static final String BODY = "body"; static final String ATTACHMENT = "attachment"; + static final String DETACH = "detach"; static final String SYNC = "sync"; static final String SUBSCRIBE = "subscribe"; static final String SEND = "send"; @@ -525,11 +526,11 @@ public class EntityOperation { } } */ - } else if (ATTACHMENT.equals(name)) { - boolean delete = jargs.optBoolean(1, false); - if (!delete) - db.attachment().setProgress(jargs.getLong(0), 0); - } + } else if (ATTACHMENT.equals(name)) + db.attachment().setProgress(jargs.getLong(0), 0); + + else if (DETACH.equals(name)) + db.message().setMessageUiHide(message.id, true); queue(context, message.account, message.folder, message.id, name, jargs);