17922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein/*
27922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * Copyright (C) 2011 The Android Open Source Project
37922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein *
47922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * Licensed under the Apache License, Version 2.0 (the "License");
57922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * you may not use this file except in compliance with the License.
67922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * You may obtain a copy of the License at
77922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein *
87922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein *      http://www.apache.org/licenses/LICENSE-2.0
97922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein *
107922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * Unless required by applicable law or agreed to in writing, software
117922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * distributed under the License is distributed on an "AS IS" BASIS,
127922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * See the License for the specific language governing permissions and
147922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * limitations under the License.
157922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein */
167922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein
177922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sappersteinpackage com.android.emailcommon.utility;
187922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein
197922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sappersteinimport com.android.emailcommon.internet.MimeHeader;
207922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sappersteinimport com.android.emailcommon.internet.MimeUtility;
217922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sappersteinimport com.android.emailcommon.mail.MessagingException;
227922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sappersteinimport com.android.emailcommon.mail.Part;
237922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein
247922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sappersteinimport android.text.TextUtils;
257922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein
267922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sappersteinimport java.util.ArrayList;
277922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein
287922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sappersteinpublic class ConversionUtilities {
297922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein    /**
307922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein     * Helper function to append text to a StringBuffer, creating it if necessary.
317922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein     * Optimization:  The majority of the time we are *not* appending - we should have a path
327922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein     * that deals with single strings.
337922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein     */
347922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein    private static StringBuffer appendTextPart(StringBuffer sb, String newText) {
357922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        if (newText == null) {
367922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein            return sb;
377922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        }
387922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        else if (sb == null) {
397922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein            sb = new StringBuffer(newText);
407922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        } else {
417922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein            if (sb.length() > 0) {
427922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein                sb.append('\n');
437922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein            }
447922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein            sb.append(newText);
457922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        }
467922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        return sb;
477922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein    }
487922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein
497922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein    /**
507922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein     * Plain-Old-Data class to return parsed body data from
517922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein     * {@link ConversionUtilities#parseBodyFields}
527922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein     */
537922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein    public static class BodyFieldData {
547922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        public String textContent;
557922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        public String htmlContent;
567922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        public String snippet;
577922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        public boolean isQuotedReply;
587922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        public boolean isQuotedForward;
597922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein    }
607922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein
617922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein    /**
627922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein     * Parse body text (plain and/or HTML) from MimeMessage to {@link BodyFieldData}.
637922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein     */
647922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein    public static BodyFieldData parseBodyFields(ArrayList<Part> viewables)
657922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein    throws MessagingException {
667922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        final BodyFieldData data = new BodyFieldData();
677922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        StringBuffer sbHtml = null;
687922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        StringBuffer sbText = null;
697922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein
707922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        for (Part viewable : viewables) {
717922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein            String text = MimeUtility.getTextFromPart(viewable);
727922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein            // Deploy text as marked by the various tags
737922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein            boolean isHtml = "text/html".equalsIgnoreCase(viewable.getMimeType());
747922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein
757922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein            // Most of the time, just process regular body parts
767922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein            if (isHtml) {
777922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein                sbHtml = appendTextPart(sbHtml, text);
787922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein            } else {
797922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein                sbText = appendTextPart(sbText, text);
807922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein            }
817922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        }
827922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein
837922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        // write the combined data to the body part
847922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        if (!TextUtils.isEmpty(sbText)) {
857922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein            String text = sbText.toString();
867922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein            data.textContent = text;
877922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein            data.snippet = TextUtilities.makeSnippetFromPlainText(text);
887922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        }
897922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        if (!TextUtils.isEmpty(sbHtml)) {
907922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein            String text = sbHtml.toString();
917922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein            data.htmlContent = text;
927922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein            if (data.snippet == null) {
937922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein                data.snippet = TextUtilities.makeSnippetFromHtmlText(text);
947922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein            }
957922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        }
967922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein        return data;
977922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein    }
987922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein}
99