Search in sources :

Example 36 with Attachment

use of com.fsck.k9.activity.misc.Attachment in project k-9 by k9mail.

the class MessageContainerView method renderAttachments.

public void renderAttachments(MessageViewInfo messageViewInfo) {
    if (messageViewInfo.attachments != null) {
        for (AttachmentViewInfo attachment : messageViewInfo.attachments) {
            attachments.put(attachment.internalUri, attachment);
            if (attachment.inlineAttachment) {
                continue;
            }
            AttachmentView view = (AttachmentView) mInflater.inflate(R.layout.message_view_attachment, mAttachments, false);
            view.setCallback(attachmentCallback);
            view.setAttachment(attachment);
            attachmentViewMap.put(attachment, view);
            mAttachments.addView(view);
        }
    }
    if (messageViewInfo.extraAttachments != null) {
        for (AttachmentViewInfo attachment : messageViewInfo.extraAttachments) {
            attachments.put(attachment.internalUri, attachment);
            if (attachment.inlineAttachment) {
                continue;
            }
            LockedAttachmentView view = (LockedAttachmentView) mInflater.inflate(R.layout.message_view_attachment_locked, mAttachments, false);
            view.setCallback(attachmentCallback);
            view.setAttachment(attachment);
            // attachments.put(attachment, view);
            mAttachments.addView(view);
        }
    }
}
Also used : AttachmentViewInfo(com.fsck.k9.mailstore.AttachmentViewInfo)

Example 37 with Attachment

use of com.fsck.k9.activity.misc.Attachment in project k-9 by k9mail.

the class MessageExtractor method findViewablesAndAttachments.

/**
 * Traverse the MIME tree of a message and extract viewable parts.
 */
public static void findViewablesAndAttachments(Part part, @Nullable List<Viewable> outputViewableParts, @Nullable List<Part> outputNonViewableParts) throws MessagingException {
    boolean skipSavingNonViewableParts = outputNonViewableParts == null;
    boolean skipSavingViewableParts = outputViewableParts == null;
    if (skipSavingNonViewableParts && skipSavingViewableParts) {
        throw new IllegalArgumentException("method was called but no output is to be collected - this a bug!");
    }
    Body body = part.getBody();
    if (body instanceof Multipart) {
        Multipart multipart = (Multipart) body;
        if (isSameMimeType(part.getMimeType(), "multipart/alternative")) {
            /*
                 * For multipart/alternative parts we try to find a text/plain and a text/html
                 * child. Everything else we find is put into 'attachments'.
                 */
            List<Viewable> text = findTextPart(multipart, true);
            Set<Part> knownTextParts = getParts(text);
            List<Viewable> html = findHtmlPart(multipart, knownTextParts, outputNonViewableParts, true);
            if (skipSavingViewableParts) {
                return;
            }
            if (!text.isEmpty() || !html.isEmpty()) {
                Alternative alternative = new Alternative(text, html);
                outputViewableParts.add(alternative);
            }
        } else if (isSameMimeType(part.getMimeType(), "multipart/signed")) {
            if (multipart.getCount() > 0) {
                BodyPart bodyPart = multipart.getBodyPart(0);
                findViewablesAndAttachments(bodyPart, outputViewableParts, outputNonViewableParts);
            }
        } else {
            // For all other multipart parts we recurse to grab all viewable children.
            for (Part bodyPart : multipart.getBodyParts()) {
                findViewablesAndAttachments(bodyPart, outputViewableParts, outputNonViewableParts);
            }
        }
    } else if (body instanceof Message && !("attachment".equalsIgnoreCase(getContentDisposition(part)))) {
        if (skipSavingViewableParts) {
            return;
        }
        /*
             * We only care about message/rfc822 parts whose Content-Disposition header has a value
             * other than "attachment".
             */
        Message message = (Message) body;
        // We add the Message object so we can extract the filename later.
        outputViewableParts.add(new MessageHeader(part, message));
        // Recurse to grab all viewable parts and attachments from that message.
        findViewablesAndAttachments(message, outputViewableParts, outputNonViewableParts);
    } else if (isPartTextualBody(part)) {
        if (skipSavingViewableParts) {
            return;
        }
        String mimeType = part.getMimeType();
        Viewable viewable;
        if (isSameMimeType(mimeType, "text/plain")) {
            viewable = new Text(part);
        } else {
            viewable = new Html(part);
        }
        outputViewableParts.add(viewable);
    } else if (isSameMimeType(part.getMimeType(), "application/pgp-signature")) {
    // ignore this type explicitly
    } else if (isSameMimeType(part.getMimeType(), "text/rfc822-headers")) {
    // ignore this type explicitly
    } else {
        if (skipSavingNonViewableParts) {
            return;
        }
        // Everything else is treated as attachment.
        outputNonViewableParts.add(part);
    }
}
Also used : BodyPart(com.fsck.k9.mail.BodyPart) Multipart(com.fsck.k9.mail.Multipart) Alternative(com.fsck.k9.mail.internet.Viewable.Alternative) Message(com.fsck.k9.mail.Message) Html(com.fsck.k9.mail.internet.Viewable.Html) Text(com.fsck.k9.mail.internet.Viewable.Text) Part(com.fsck.k9.mail.Part) BodyPart(com.fsck.k9.mail.BodyPart) MessageHeader(com.fsck.k9.mail.internet.Viewable.MessageHeader) Body(com.fsck.k9.mail.Body)

Example 38 with Attachment

use of com.fsck.k9.activity.misc.Attachment in project k-9 by k9mail.

the class MessageExtractor method findHtmlPart.

/**
 * Search the children of a {@link Multipart} for {@code text/html} parts.
 * Every part that is not a {@code text/html} we want to display, we add to 'attachments'.
 *
 * @param multipart The {@code Multipart} to search through.
 * @param knownTextParts A set of {@code text/plain} parts that shouldn't be added to 'attachments'.
 * @param outputNonViewableParts A list that will receive the parts that are considered attachments.
 * @param directChild If {@code true}, this method will add all {@code text/html} parts except the first
 *         found to 'attachments'.
 *
 * @return A list of {@link Text} viewables.
 *
 * @throws MessagingException In case of an error.
 */
private static List<Viewable> findHtmlPart(Multipart multipart, Set<Part> knownTextParts, @Nullable List<Part> outputNonViewableParts, boolean directChild) throws MessagingException {
    boolean saveNonViewableParts = outputNonViewableParts != null;
    List<Viewable> viewables = new ArrayList<>();
    boolean partFound = false;
    for (Part part : multipart.getBodyParts()) {
        Body body = part.getBody();
        if (body instanceof Multipart) {
            Multipart innerMultipart = (Multipart) body;
            if (directChild && partFound) {
                if (saveNonViewableParts) {
                    // We already found our text/html part. Now we're only looking for attachments.
                    findAttachments(innerMultipart, knownTextParts, outputNonViewableParts);
                }
            } else {
                /*
                     * Recurse to find HTML parts. Since this is a multipart that is a child of a
                     * multipart/alternative we don't want to stop after the first text/html part
                     * we find. This will allow to get all text parts for constructions like this:
                     *
                     * 1. multipart/alternative
                     * 1.1. text/plain
                     * 1.2. multipart/mixed
                     * 1.2.1. text/html
                     * 1.2.2. text/html
                     * 1.3. image/jpeg
                     */
                List<Viewable> htmlViewables = findHtmlPart(innerMultipart, knownTextParts, outputNonViewableParts, false);
                if (!htmlViewables.isEmpty()) {
                    partFound = true;
                    viewables.addAll(htmlViewables);
                }
            }
        } else if (!(directChild && partFound) && isPartTextualBody(part) && isSameMimeType(part.getMimeType(), "text/html")) {
            Html html = new Html(part);
            viewables.add(html);
            partFound = true;
        } else if (!knownTextParts.contains(part)) {
            if (saveNonViewableParts) {
                // Only add this part as attachment if it's not a viewable text/plain part found earlier
                outputNonViewableParts.add(part);
            }
        }
    }
    return viewables;
}
Also used : Multipart(com.fsck.k9.mail.Multipart) Part(com.fsck.k9.mail.Part) BodyPart(com.fsck.k9.mail.BodyPart) ArrayList(java.util.ArrayList) Html(com.fsck.k9.mail.internet.Viewable.Html) Body(com.fsck.k9.mail.Body)

Aggregations

Test (org.junit.Test)12 Attachment (com.fsck.k9.activity.misc.Attachment)9 MimeBodyPart (com.fsck.k9.mail.internet.MimeBodyPart)9 MimeMessage (com.fsck.k9.mail.internet.MimeMessage)9 RobolectricTest (com.fsck.k9.RobolectricTest)8 MessagingException (com.fsck.k9.mail.MessagingException)7 Body (com.fsck.k9.mail.Body)6 BodyPart (com.fsck.k9.mail.BodyPart)6 Part (com.fsck.k9.mail.Part)6 InlineAttachment (com.fsck.k9.activity.misc.InlineAttachment)5 Multipart (com.fsck.k9.mail.Multipart)4 MimeMultipart (com.fsck.k9.mail.internet.MimeMultipart)4 AttachmentViewInfo (com.fsck.k9.mailstore.AttachmentViewInfo)4 File (java.io.File)4 ArrayList (java.util.ArrayList)4 TextBody (com.fsck.k9.mail.internet.TextBody)3 SQLiteException (android.database.sqlite.SQLiteException)2 Uri (android.net.Uri)2 Address (com.fsck.k9.mail.Address)2 Html (com.fsck.k9.mail.internet.Viewable.Html)2