Home | History | Annotate | Download | only in utility
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.emailcommon.utility;
     18 
     19 import com.android.emailcommon.internet.MimeHeader;
     20 import com.android.emailcommon.internet.MimeUtility;
     21 import com.android.emailcommon.mail.MessagingException;
     22 import com.android.emailcommon.mail.Part;
     23 import com.android.emailcommon.provider.EmailContent;
     24 
     25 import android.text.TextUtils;
     26 
     27 import java.util.ArrayList;
     28 
     29 public class ConversionUtilities {
     30     /**
     31      * Values for HEADER_ANDROID_BODY_QUOTED_PART to tag body parts
     32      */
     33     public static final String BODY_QUOTED_PART_REPLY = "quoted-reply";
     34     public static final String BODY_QUOTED_PART_FORWARD = "quoted-forward";
     35     public static final String BODY_QUOTED_PART_INTRO = "quoted-intro";
     36 
     37     /**
     38      * Helper function to append text to a StringBuffer, creating it if necessary.
     39      * Optimization:  The majority of the time we are *not* appending - we should have a path
     40      * that deals with single strings.
     41      */
     42     private static StringBuffer appendTextPart(StringBuffer sb, String newText) {
     43         if (newText == null) {
     44             return sb;
     45         }
     46         else if (sb == null) {
     47             sb = new StringBuffer(newText);
     48         } else {
     49             if (sb.length() > 0) {
     50                 sb.append('\n');
     51             }
     52             sb.append(newText);
     53         }
     54         return sb;
     55     }
     56 
     57     /**
     58      * Copy body text (plain and/or HTML) from MimeMessage to provider Message
     59      */
     60     public static boolean updateBodyFields(EmailContent.Body body,
     61             EmailContent.Message localMessage, ArrayList<Part> viewables)
     62     throws MessagingException {
     63 
     64         body.mMessageKey = localMessage.mId;
     65 
     66         StringBuffer sbHtml = null;
     67         StringBuffer sbText = null;
     68         StringBuffer sbHtmlReply = null;
     69         StringBuffer sbTextReply = null;
     70         StringBuffer sbIntroText = null;
     71 
     72         for (Part viewable : viewables) {
     73             String text = MimeUtility.getTextFromPart(viewable);
     74             String[] replyTags = viewable.getHeader(MimeHeader.HEADER_ANDROID_BODY_QUOTED_PART);
     75             String replyTag = null;
     76             if (replyTags != null && replyTags.length > 0) {
     77                 replyTag = replyTags[0];
     78             }
     79             // Deploy text as marked by the various tags
     80             boolean isHtml = "text/html".equalsIgnoreCase(viewable.getMimeType());
     81 
     82             if (replyTag != null) {
     83                 boolean isQuotedReply = BODY_QUOTED_PART_REPLY.equalsIgnoreCase(replyTag);
     84                 boolean isQuotedForward = BODY_QUOTED_PART_FORWARD.equalsIgnoreCase(replyTag);
     85                 boolean isQuotedIntro = BODY_QUOTED_PART_INTRO.equalsIgnoreCase(replyTag);
     86 
     87                 if (isQuotedReply || isQuotedForward) {
     88                     if (isHtml) {
     89                         sbHtmlReply = appendTextPart(sbHtmlReply, text);
     90                     } else {
     91                         sbTextReply = appendTextPart(sbTextReply, text);
     92                     }
     93                     // Set message flags as well
     94                     localMessage.mFlags &= ~EmailContent.Message.FLAG_TYPE_MASK;
     95                     localMessage.mFlags |= isQuotedReply
     96                         ? EmailContent.Message.FLAG_TYPE_REPLY
     97                             : EmailContent.Message.FLAG_TYPE_FORWARD;
     98                     continue;
     99                 }
    100                 if (isQuotedIntro) {
    101                     sbIntroText = appendTextPart(sbIntroText, text);
    102                     continue;
    103                 }
    104             }
    105 
    106             // Most of the time, just process regular body parts
    107             if (isHtml) {
    108                 sbHtml = appendTextPart(sbHtml, text);
    109             } else {
    110                 sbText = appendTextPart(sbText, text);
    111             }
    112         }
    113 
    114         // write the combined data to the body part
    115         if (!TextUtils.isEmpty(sbText)) {
    116             String text = sbText.toString();
    117             body.mTextContent = text;
    118             localMessage.mSnippet = TextUtilities.makeSnippetFromPlainText(text);
    119         }
    120         if (!TextUtils.isEmpty(sbHtml)) {
    121             String text = sbHtml.toString();
    122             body.mHtmlContent = text;
    123             if (localMessage.mSnippet == null) {
    124                 localMessage.mSnippet = TextUtilities.makeSnippetFromHtmlText(text);
    125             }
    126         }
    127         if (sbHtmlReply != null && sbHtmlReply.length() != 0) {
    128             body.mHtmlReply = sbHtmlReply.toString();
    129         }
    130         if (sbTextReply != null && sbTextReply.length() != 0) {
    131             body.mTextReply = sbTextReply.toString();
    132         }
    133         if (sbIntroText != null && sbIntroText.length() != 0) {
    134             body.mIntroText = sbIntroText.toString();
    135         }
    136         return true;
    137     }
    138 }
    139