LegacyConversions.java revision 936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2
13f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler/* 23f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Copyright (C) 2009 The Android Open Source Project 33f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * 43f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Licensed under the Apache License, Version 2.0 (the "License"); 53f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * you may not use this file except in compliance with the License. 63f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * You may obtain a copy of the License at 73f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * 83f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * http://www.apache.org/licenses/LICENSE-2.0 93f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * 103f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Unless required by applicable law or agreed to in writing, software 113f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * distributed under the License is distributed on an "AS IS" BASIS, 123f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * See the License for the specific language governing permissions and 143f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * limitations under the License. 153f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler */ 163f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 173f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerpackage com.android.email; 183f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 193f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.Address; 202ac94a9cc254ff0a4c17407eb1bda31d433ef651Andrew Stadlerimport com.android.email.mail.Flag; 213f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.Message; 223f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.MessagingException; 233f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.Part; 243f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.internet.MimeHeader; 253f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.internet.MimeUtility; 263f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.provider.AttachmentProvider; 273f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.provider.EmailContent; 283f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.provider.EmailContent.Attachment; 293f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.provider.EmailContent.AttachmentColumns; 303f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 313f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport org.apache.commons.io.IOUtils; 323f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 333f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport android.content.ContentUris; 343f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport android.content.ContentValues; 353f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport android.content.Context; 363f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport android.net.Uri; 373f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 383f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport java.io.File; 393f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport java.io.FileOutputStream; 403f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport java.io.IOException; 413f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport java.io.InputStream; 423f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport java.util.ArrayList; 433f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport java.util.Date; 443f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 453f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerpublic class LegacyConversions { 463f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 473f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler /** 483f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Copy field-by-field from a "store" message to a "provider" message 493f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @param message The message we've just downloaded 503f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @param localMessage The message we'd like to write into the DB 513f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @result true if dirty (changes were made) 523f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler */ 533f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler public static boolean updateMessageFields(EmailContent.Message localMessage, Message message, 543f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler long accountId, long mailboxId) throws MessagingException { 553f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 563f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Address[] from = message.getFrom(); 573f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Address[] to = message.getRecipients(Message.RecipientType.TO); 583f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Address[] cc = message.getRecipients(Message.RecipientType.CC); 593f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Address[] bcc = message.getRecipients(Message.RecipientType.BCC); 603f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Address[] replyTo = message.getReplyTo(); 613f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String subject = message.getSubject(); 623f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Date sentDate = message.getSentDate(); 633f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 643f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (from != null && from.length > 0) { 653f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mDisplayName = from[0].toFriendly(); 663f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 673f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (sentDate != null) { 683f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mTimeStamp = sentDate.getTime(); 693f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 703f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (subject != null) { 713f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mSubject = subject; 723f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 732ac94a9cc254ff0a4c17407eb1bda31d433ef651Andrew Stadler localMessage.mFlagRead = message.isSet(Flag.SEEN); 743f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 753f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // Keep the message in the "unloaded" state until it has (at least) a display name. 763f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // This prevents early flickering of empty messages in POP download. 773f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (localMessage.mFlagLoaded != EmailContent.Message.LOADED) { 783f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (localMessage.mDisplayName == null || "".equals(localMessage.mDisplayName)) { 793f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mFlagLoaded = EmailContent.Message.NOT_LOADED; 803f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } else { 813f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mFlagLoaded = EmailContent.Message.PARTIALLY_LOADED; 823f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 833f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 842ac94a9cc254ff0a4c17407eb1bda31d433ef651Andrew Stadler localMessage.mFlagFavorite = message.isSet(Flag.FLAGGED); 853f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public boolean mFlagAttachment = false; 863f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public int mFlags = 0; 87936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler 883f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mServerId = message.getUid(); 893f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public int mServerIntId; 903f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public String mClientId; 913f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public String mMessageId; 92936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler 933f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public long mBodyKey; 943f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mMailboxKey = mailboxId; 953f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mAccountKey = accountId; 96936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler 973f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (from != null && from.length > 0) { 983f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mFrom = Address.pack(from); 993f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1003f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1013f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mTo = Address.pack(to); 1023f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mCc = Address.pack(cc); 1033f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mBcc = Address.pack(bcc); 1043f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mReplyTo = Address.pack(replyTo); 1053f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1063f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public String mText; 1073f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public String mHtml; 108936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler// public String mTextReply; 109936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler// public String mHtmlReply; 110936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler 1113f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// // Can be used while building messages, but is NOT saved by the Provider 1123f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// transient public ArrayList<Attachment> mAttachments = null; 1133f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1143f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler return true; 1153f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1163f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1173f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler /** 1183f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Copy body text (plain and/or HTML) from MimeMessage to provider Message 1193f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler */ 1203f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler public static boolean updateBodyFields(EmailContent.Body body, 1213f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler EmailContent.Message localMessage, ArrayList<Part> viewables) 1223f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler throws MessagingException { 1233f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1243f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler body.mMessageKey = localMessage.mId; 1253f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1263f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler StringBuffer sbHtml = new StringBuffer(); 1273f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler StringBuffer sbText = new StringBuffer(); 1283f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler for (Part viewable : viewables) { 1293f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String text = MimeUtility.getTextFromPart(viewable); 1303f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if ("text/html".equalsIgnoreCase(viewable.getMimeType())) { 1313f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (sbHtml.length() > 0) { 1323f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler sbHtml.append('\n'); 1333f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1343f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler sbHtml.append(text); 1353f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } else { 1363f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (sbText.length() > 0) { 1373f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler sbText.append('\n'); 1383f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1393f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler sbText.append(text); 1403f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1413f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1423f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1433f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // write the combined data to the body part 1443f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (sbText.length() != 0) { 1453f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler body.mTextContent = sbText.toString(); 1463f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1473f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (sbHtml.length() != 0) { 1483f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler body.mHtmlContent = sbHtml.toString(); 1493f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1503f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler return true; 1513f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1523f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1533f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler /** 1543f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Copy attachments from MimeMessage to provider Message. 1553f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * 1563f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @param context a context for file operations 1573f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @param localMessage the attachments will be built against this message 158936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler * @param attachments the attachments to add 1593f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @throws IOException 1603f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler */ 1613f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler public static void updateAttachments(Context context, EmailContent.Message localMessage, 1623f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler ArrayList<Part> attachments) throws MessagingException, IOException { 1633f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mAttachments = null; 1643f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler for (Part attachmentPart : attachments) { 1653f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler addOneAttachment(context, localMessage, attachmentPart); 1663f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1673f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1683f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1693f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler /** 1703f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Add a single attachment part to the message 1713f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * 1723f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * TODO: This will simply add to any existing attachments - could this ever happen? If so, 1733f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * change it to find existing attachments and delete/merge them. 1743f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * TODO: Take a closer look at encoding and deal with it if necessary. 1753f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * 1763f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @param context a context for file operations 1773f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @param localMessage the attachments will be built against this message 1783f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @param part a single attachment part from POP or IMAP 1793f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @throws IOException 1803f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler */ 1813f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler private static void addOneAttachment(Context context, EmailContent.Message localMessage, 1823f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Part part) throws MessagingException, IOException { 1833f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1843f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Attachment localAttachment = new Attachment(); 1853f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1863f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // Transfer fields from mime format to provider format 1873f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String contentType = MimeUtility.unfoldAndDecode(part.getContentType()); 1883f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String name = MimeUtility.getHeaderParameter(contentType, "name"); 1893f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (name == null) { 1903f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String contentDisposition = MimeUtility.unfoldAndDecode(part.getContentType()); 1913f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler name = MimeUtility.getHeaderParameter(contentDisposition, "filename"); 1923f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1933f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1943f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // Try to pull size from disposition (if not downloaded) 1953f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler long size = 0; 1963f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String disposition = part.getDisposition(); 1973f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (disposition != null) { 1983f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String s = MimeUtility.getHeaderParameter(disposition, "size"); 1993f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (s != null) { 2003f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler size = Long.parseLong(s); 2013f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 2023f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 2033f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2043f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // Get partId for unloaded IMAP attachments (if any) 2053f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // This is only provided (and used) when we have structure but not the actual attachment 2063f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String[] partIds = part.getHeader(MimeHeader.HEADER_ANDROID_ATTACHMENT_STORE_DATA); 207936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler String partId = partIds != null ? partIds[0] : null; 2083f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2093f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.mFileName = MimeUtility.getHeaderParameter(contentType, "name"); 2103f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.mMimeType = part.getMimeType(); 2113f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.mSize = size; // May be reset below if file handled 2123f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.mContentId = part.getContentId(); 2133f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.mContentUri = null; // Will be set when file is saved 2143f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.mMessageKey = localMessage.mId; 2153f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.mLocation = partId; 2163f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.mEncoding = "B"; // TODO - convert other known encodings 2173f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2183f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // Save the attachment (so far) in order to obtain an id 2193f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.save(context); 2203f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2213f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // If an attachment body was actually provided, we need to write the file now 2220d1078363581db8caded06cf94e729e88a88761aAndrew Stadler saveAttachmentBody(context, part, localAttachment, localMessage.mAccountKey); 2230d1078363581db8caded06cf94e729e88a88761aAndrew Stadler 2240d1078363581db8caded06cf94e729e88a88761aAndrew Stadler if (localMessage.mAttachments == null) { 2250d1078363581db8caded06cf94e729e88a88761aAndrew Stadler localMessage.mAttachments = new ArrayList<Attachment>(); 2260d1078363581db8caded06cf94e729e88a88761aAndrew Stadler } 2270d1078363581db8caded06cf94e729e88a88761aAndrew Stadler localMessage.mAttachments.add(localAttachment); 2280d1078363581db8caded06cf94e729e88a88761aAndrew Stadler localMessage.mFlagAttachment = true; 2290d1078363581db8caded06cf94e729e88a88761aAndrew Stadler } 2300d1078363581db8caded06cf94e729e88a88761aAndrew Stadler 2310d1078363581db8caded06cf94e729e88a88761aAndrew Stadler /** 2320d1078363581db8caded06cf94e729e88a88761aAndrew Stadler * Save the body part of a single attachment, to a file in the attachments directory. 2330d1078363581db8caded06cf94e729e88a88761aAndrew Stadler */ 2340d1078363581db8caded06cf94e729e88a88761aAndrew Stadler public static void saveAttachmentBody(Context context, Part part, Attachment localAttachment, 2350d1078363581db8caded06cf94e729e88a88761aAndrew Stadler long accountId) throws MessagingException, IOException { 2363f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (part.getBody() != null) { 2373f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler long attachmentId = localAttachment.mId; 2383f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2393f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler InputStream in = part.getBody().getInputStream(); 2403f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2413f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler File saveIn = AttachmentProvider.getAttachmentDirectory(context, accountId); 2423f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (!saveIn.exists()) { 2433f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler saveIn.mkdirs(); 2443f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 2453f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler File saveAs = AttachmentProvider.getAttachmentFilename(context, accountId, 2463f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler attachmentId); 2473f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler saveAs.createNewFile(); 2483f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler FileOutputStream out = new FileOutputStream(saveAs); 2493f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler long copySize = IOUtils.copy(in, out); 2503f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler in.close(); 2513f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler out.close(); 2523f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2533f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // update the attachment with the extra information we now know 2543f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String contentUriString = AttachmentProvider.getAttachmentUri( 2553f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler accountId, attachmentId).toString(); 2563f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2573f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.mSize = copySize; 2583f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.mContentUri = contentUriString; 2593f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2603f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // update the attachment in the database as well 2613f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler ContentValues cv = new ContentValues(); 2623f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler cv.put(AttachmentColumns.SIZE, copySize); 2633f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler cv.put(AttachmentColumns.CONTENT_URI, contentUriString); 2643f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Uri uri = ContentUris.withAppendedId(Attachment.CONTENT_URI, attachmentId); 2653f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler context.getContentResolver().update(uri, cv, null, null); 2663f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 2673f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 2680d1078363581db8caded06cf94e729e88a88761aAndrew Stadler 2693f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler} 270