Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit de60e0e8 authored by cketti's avatar cketti Committed by GitHub
Browse files

Merge pull request #1835 from k9mail/flowed-display

Support display of format=flowed (rfc2646)
parents df9009e1 a055ed42
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -20,11 +20,13 @@ import com.fsck.k9.mail.Message;
import com.fsck.k9.mail.MessagingException;
import com.fsck.k9.mail.Multipart;
import com.fsck.k9.mail.Part;
import com.fsck.k9.mail.internet.Viewable.Flowed;
import org.apache.commons.io.input.BoundedInputStream;

import static com.fsck.k9.mail.K9MailLib.LOG_TAG;
import static com.fsck.k9.mail.internet.CharsetSupport.fixupCharset;
import static com.fsck.k9.mail.internet.MimeUtility.getHeaderParameter;
import static com.fsck.k9.mail.internet.MimeUtility.isFormatFlowed;
import static com.fsck.k9.mail.internet.MimeUtility.isSameMimeType;
import static com.fsck.k9.mail.internet.Viewable.Alternative;
import static com.fsck.k9.mail.internet.Viewable.Html;
@@ -188,13 +190,17 @@ public class MessageExtractor {
                return;
            }
            String mimeType = part.getMimeType();
            Viewable viewable;
            if (isSameMimeType(mimeType, "text/plain")) {
                Text text = new Text(part);
                outputViewableParts.add(text);
                if (isFormatFlowed(part.getContentType())) {
                    viewable = new Flowed(part);
                } else {
                Html html = new Html(part);
                outputViewableParts.add(html);
                    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 {
+12 −0
Original line number Diff line number Diff line
@@ -25,6 +25,9 @@ import org.apache.james.mime4j.util.MimeUtil;
public class MimeUtility {
    public static final String DEFAULT_ATTACHMENT_MIME_TYPE = "application/octet-stream";
    public static final String K9_SETTINGS_MIME_TYPE = "application/x-k9settings";
    private static final String TEXT_PLAIN = "text/plain";
    private static final String HEADER_PARAM_FORMAT = "format";
    private static final String HEADER_FORMAT_FLOWED = "flowed";

    /*
     * http://www.w3schools.com/media/media_mimeref.asp
@@ -1137,4 +1140,13 @@ public class MimeUtility {
    public static boolean isSameMimeType(String mimeType, String otherMimeType) {
        return mimeType != null && mimeType.equalsIgnoreCase(otherMimeType);
    }

    static boolean isFormatFlowed(String contentType) {
        String mimeType = getHeaderParameter(contentType, null);
        if (isSameMimeType(TEXT_PLAIN, mimeType)) {
            String formatParameter = getHeaderParameter(contentType, HEADER_PARAM_FORMAT);
            return HEADER_FORMAT_FLOWED.equalsIgnoreCase(formatParameter);
        }
        return false;
    }
}
+6 −0
Original line number Diff line number Diff line
@@ -41,6 +41,12 @@ public interface Viewable {
        }
    }

    class Flowed extends Textual {
        public Flowed(Part part) {
            super(part);
        }
    }

    /**
     * Class representing a {@code text/html} part of a message.
     */
+15 −0
Original line number Diff line number Diff line
@@ -133,4 +133,19 @@ public class MimeUtilityTest {
    public void isSameMimeType_withSecondArgumentBeingNull_shouldReturnFalse() throws Exception {
        assertFalse(MimeUtility.isSameMimeType("text/html", null));
    }

    @Test
    public void isFormatFlowed_withTextPlainFormatFlowed__shouldReturnTrue() throws Exception {
        assertTrue(MimeUtility.isFormatFlowed("text/plain; format=flowed"));
    }

    @Test
    public void isFormatFlowed_withTextPlain__shouldReturnFalse() throws Exception {
        assertFalse(MimeUtility.isFormatFlowed("text/plain"));
    }

    @Test
    public void isFormatFlowed_withTextHtmlFormatFlowed__shouldReturnFalse() throws Exception {
        assertFalse(MimeUtility.isFormatFlowed("text/html; format=flowed"));
    }
}
+11 −0
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ import com.fsck.k9.mail.MessagingException;
import com.fsck.k9.mail.Part;
import com.fsck.k9.mail.internet.MessageExtractor;
import com.fsck.k9.mail.internet.Viewable;
import com.fsck.k9.mail.internet.Viewable.Flowed;
import com.fsck.k9.mailstore.util.FlowedMessageUtils;
import com.fsck.k9.message.extractors.AttachmentInfoExtractor;
import com.fsck.k9.ui.crypto.MessageCryptoAnnotations;
import com.fsck.k9.ui.crypto.MessageCryptoSplitter;
@@ -224,8 +226,13 @@ public class MessageViewInfoExtractor {
            String t = MessageExtractor.getTextFromPart(part);
            if (t == null) {
                t = "";
            } else if (viewable instanceof Flowed) {
                t = FlowedMessageUtils.deflow(t, false);
                t = HtmlConverter.textToHtml(t);
            } else if (viewable instanceof Text) {
                t = HtmlConverter.textToHtml(t);
            } else if (!(viewable instanceof Html)) {
                throw new IllegalStateException("unhandled case!");
            }
            html.append(t);
        } else if (viewable instanceof Alternative) {
@@ -257,6 +264,10 @@ public class MessageViewInfoExtractor {
                t = "";
            } else if (viewable instanceof Html) {
                t = HtmlConverter.htmlToText(t);
            } else if (viewable instanceof Flowed) {
                t = FlowedMessageUtils.deflow(t, false);
            } else if (!(viewable instanceof Text)) {
                throw new IllegalStateException("unhandled case!");
            }
            text.append(t);
        } else if (viewable instanceof Alternative) {
Loading