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