Message.java revision 2421dc8d6d0b4c727ab7ab0e5ce730f415089e86
13ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira/** 23ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira * Copyright (c) 2012, Google Inc. 33ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira * 43ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira * Licensed under the Apache License, Version 2.0 (the "License"); 53ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira * you may not use this file except in compliance with the License. 63ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira * You may obtain a copy of the License at 73ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira * 83ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira * http://www.apache.org/licenses/LICENSE-2.0 93ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira * 103ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira * Unless required by applicable law or agreed to in writing, software 113ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira * distributed under the License is distributed on an "AS IS" BASIS, 123ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira * See the License for the specific language governing permissions and 143ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira * limitations under the License. 153ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira */ 163ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira 173ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereirapackage com.android.mail.providers; 183ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira 193233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huangimport android.content.AsyncQueryHandler; 203233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huangimport android.content.ContentValues; 213ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereiraimport android.database.Cursor; 22cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereiraimport android.net.Uri; 233ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereiraimport android.os.Parcel; 243ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereiraimport android.os.Parcelable; 25cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereiraimport android.text.TextUtils; 263ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira 27bec5115726f24733a0a1577caaf05fb6e9ef9c6fMarc Blankimport com.android.mail.browse.ConversationCursor; 28bec5115726f24733a0a1577caaf05fb6e9ef9c6fMarc Blankimport com.android.mail.providers.UIProvider.ConversationColumns; 2926846d859a4714ff90ea02dba251a54cac1f1e9fMarc Blankimport com.android.mail.providers.UIProvider.MessageColumns; 30bec5115726f24733a0a1577caaf05fb6e9ef9c6fMarc Blankimport com.android.mail.ui.ConversationViewFragment.MessageCursor; 3126846d859a4714ff90ea02dba251a54cac1f1e9fMarc Blankimport com.android.mail.utils.Utils; 3226846d859a4714ff90ea02dba251a54cac1f1e9fMarc Blank 335a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huangimport java.util.List; 345a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang 353ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira 363ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereirapublic class Message implements Parcelable { 373ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public long id; 383ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public long serverId; 39cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira public Uri uri; 4026846d859a4714ff90ea02dba251a54cac1f1e9fMarc Blank public String conversationUri; 413ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public String subject; 423ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public String snippet; 433ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public String from; 443ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public String to; 453ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public String cc; 463ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public String bcc; 473ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public String replyTo; 483ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public long dateReceivedMs; 493ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public String bodyHtml; 503ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public String bodyText; 513ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public boolean embedsExternalResources; 523ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public String refMessageId; 533ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public int draftType; 543ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public boolean appendRefMessageContent; 553ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public boolean hasAttachments; 56cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira public Uri attachmentListUri; 573ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public long messageFlags; 58f944e9655562e321aff52fe5f437e1d2fa2950a9Mindy Pereira public String joinedAttachmentInfos; 597ed1c1122c5677344a1ce176be2c03972fed26f5Mindy Pereira public String saveUri; 607ed1c1122c5677344a1ce176be2c03972fed26f5Mindy Pereira public String sendUri; 61104f729c284f9b7b31a251350252f8ae31d09f86Paul Westbrook public boolean alwaysShowImages; 62d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang public boolean read; 63d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang public boolean starred; 644dbbf9f91da20d89b13d412038c0b19b91983f8cMindy Pereira public int quotedTextOffset; 655a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang public String attachmentsJson; 665a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang 675a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang private transient String[] mToAddresses = null; 685a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang private transient String[] mCcAddresses = null; 695a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang private transient String[] mBccAddresses = null; 705a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang private transient String[] mReplyToAddresses = null; 713ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira 725a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang private transient List<Attachment> mAttachments = null; 73bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook 74bec5115726f24733a0a1577caaf05fb6e9ef9c6fMarc Blank // While viewing a list of messages, points to the MessageCursor that contains it 75bec5115726f24733a0a1577caaf05fb6e9ef9c6fMarc Blank private transient MessageCursor mMessageCursor = null; 76bec5115726f24733a0a1577caaf05fb6e9ef9c6fMarc Blank 773ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira @Override 783ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public int describeContents() { 793ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira return 0; 803ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira } 813ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira 823ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira @Override 833233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang public boolean equals(Object o) { 843233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang if (o == null || !(o instanceof Message)) { 853233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang return false; 863233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang } 873233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang final Uri otherUri = ((Message) o).uri; 883233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang if (uri == null) { 893233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang return (otherUri == null); 903233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang } 913233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang return uri.equals(otherUri); 923233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang } 933233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang 943233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang @Override 953233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang public int hashCode() { 963233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang return uri == null ? 0 : uri.hashCode(); 973233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang } 983233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang 993233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang @Override 1003ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public void writeToParcel(Parcel dest, int flags) { 1013ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira dest.writeLong(id); 1023ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira dest.writeLong(serverId); 103cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira dest.writeParcelable(uri, 0); 10426846d859a4714ff90ea02dba251a54cac1f1e9fMarc Blank dest.writeString(conversationUri); 1053ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira dest.writeString(subject); 1063ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira dest.writeString(snippet); 1073ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira dest.writeString(from); 1083ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira dest.writeString(to); 1093ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira dest.writeString(cc); 1103ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira dest.writeString(bcc); 1113ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira dest.writeString(replyTo); 1123ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira dest.writeLong(dateReceivedMs); 1133ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira dest.writeString(bodyHtml); 1143ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira dest.writeString(bodyText); 1153ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira dest.writeInt(embedsExternalResources ? 1 : 0); 1163ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira dest.writeString(refMessageId); 1173ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira dest.writeInt(draftType); 1183ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira dest.writeInt(appendRefMessageContent ? 1 : 0); 1193ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira dest.writeInt(hasAttachments ? 1 : 0); 120cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira dest.writeParcelable(attachmentListUri, 0); 1213ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira dest.writeLong(messageFlags); 122f944e9655562e321aff52fe5f437e1d2fa2950a9Mindy Pereira dest.writeString(joinedAttachmentInfos); 1237ed1c1122c5677344a1ce176be2c03972fed26f5Mindy Pereira dest.writeString(saveUri); 1247ed1c1122c5677344a1ce176be2c03972fed26f5Mindy Pereira dest.writeString(sendUri); 125104f729c284f9b7b31a251350252f8ae31d09f86Paul Westbrook dest.writeInt(alwaysShowImages ? 1 : 0); 1264dbbf9f91da20d89b13d412038c0b19b91983f8cMindy Pereira dest.writeInt(quotedTextOffset); 1272421dc8d6d0b4c727ab7ab0e5ce730f415089e86Mindy Pereira dest.writeString(attachmentsJson); 1283ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira } 1293ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira 1303ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira private Message(Parcel in) { 1313ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira id = in.readLong(); 1323ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira serverId = in.readLong(); 133cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira uri = in.readParcelable(null); 13426846d859a4714ff90ea02dba251a54cac1f1e9fMarc Blank conversationUri = in.readString(); 1353ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira subject = in.readString(); 1363ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira snippet = in.readString(); 1373ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira from = in.readString(); 1383ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira to = in.readString(); 1393ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira cc = in.readString(); 1403ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira bcc = in.readString(); 1413ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira replyTo = in.readString(); 1423ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira dateReceivedMs = in.readLong(); 1433ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira bodyHtml = in.readString(); 1443ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira bodyText = in.readString(); 1453ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira embedsExternalResources = in.readInt() != 0; 1463ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira refMessageId = in.readString(); 1473ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira draftType = in.readInt(); 1483ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira appendRefMessageContent = in.readInt() != 0; 1493ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira hasAttachments = in.readInt() != 0; 150cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira attachmentListUri = in.readParcelable(null); 1513ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira messageFlags = in.readLong(); 152f944e9655562e321aff52fe5f437e1d2fa2950a9Mindy Pereira joinedAttachmentInfos = in.readString(); 1537ed1c1122c5677344a1ce176be2c03972fed26f5Mindy Pereira saveUri = in.readString(); 1547ed1c1122c5677344a1ce176be2c03972fed26f5Mindy Pereira sendUri = in.readString(); 155104f729c284f9b7b31a251350252f8ae31d09f86Paul Westbrook alwaysShowImages = in.readInt() != 0; 1564dbbf9f91da20d89b13d412038c0b19b91983f8cMindy Pereira quotedTextOffset = in.readInt(); 1572421dc8d6d0b4c727ab7ab0e5ce730f415089e86Mindy Pereira attachmentsJson = in.readString(); 158104f729c284f9b7b31a251350252f8ae31d09f86Paul Westbrook } 159104f729c284f9b7b31a251350252f8ae31d09f86Paul Westbrook 160104f729c284f9b7b31a251350252f8ae31d09f86Paul Westbrook public Message() { 161104f729c284f9b7b31a251350252f8ae31d09f86Paul Westbrook 1623ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira } 1633ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira 1643ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira @Override 1653ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public String toString() { 1663ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira return "[message id=" + id + "]"; 1673ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira } 1683ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira 1693ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public static final Creator<Message> CREATOR = new Creator<Message>() { 1703ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira 1713ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira @Override 1723ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public Message createFromParcel(Parcel source) { 1733ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira return new Message(source); 1743ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira } 1753ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira 1763ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira @Override 1773ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira public Message[] newArray(int size) { 1783ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira return new Message[size]; 1793ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira } 1803ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira 1813ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira }; 1823ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira 183bec5115726f24733a0a1577caaf05fb6e9ef9c6fMarc Blank public Message(MessageCursor cursor) { 184bec5115726f24733a0a1577caaf05fb6e9ef9c6fMarc Blank this((Cursor)cursor); 185bec5115726f24733a0a1577caaf05fb6e9ef9c6fMarc Blank // Only set message cursor if appropriate 186bec5115726f24733a0a1577caaf05fb6e9ef9c6fMarc Blank mMessageCursor = cursor; 187bec5115726f24733a0a1577caaf05fb6e9ef9c6fMarc Blank } 188bec5115726f24733a0a1577caaf05fb6e9ef9c6fMarc Blank 189a831b2f1ba6d3c18d5e54563df8bae1f589c4257Mindy Pereira public Message(Cursor cursor) { 1903ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira if (cursor != null) { 1913ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira id = cursor.getLong(UIProvider.MESSAGE_ID_COLUMN); 1923ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira serverId = cursor.getLong(UIProvider.MESSAGE_SERVER_ID_COLUMN); 193cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira String message = cursor.getString(UIProvider.MESSAGE_URI_COLUMN); 194cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira uri = !TextUtils.isEmpty(message) ? Uri.parse(message) : null; 19526846d859a4714ff90ea02dba251a54cac1f1e9fMarc Blank conversationUri = cursor.getString(UIProvider.MESSAGE_CONVERSATION_URI_COLUMN); 1963ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira subject = cursor.getString(UIProvider.MESSAGE_SUBJECT_COLUMN); 1973ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira snippet = cursor.getString(UIProvider.MESSAGE_SNIPPET_COLUMN); 1983ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira from = cursor.getString(UIProvider.MESSAGE_FROM_COLUMN); 1993ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira to = cursor.getString(UIProvider.MESSAGE_TO_COLUMN); 2003ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira cc = cursor.getString(UIProvider.MESSAGE_CC_COLUMN); 2013ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira bcc = cursor.getString(UIProvider.MESSAGE_BCC_COLUMN); 2023ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira replyTo = cursor.getString(UIProvider.MESSAGE_REPLY_TO_COLUMN); 2033ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira dateReceivedMs = cursor.getLong(UIProvider.MESSAGE_DATE_RECEIVED_MS_COLUMN); 2043ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira bodyHtml = cursor.getString(UIProvider.MESSAGE_BODY_HTML_COLUMN); 2053ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira bodyText = cursor.getString(UIProvider.MESSAGE_BODY_TEXT_COLUMN); 2063ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira embedsExternalResources = cursor 2073ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira .getInt(UIProvider.MESSAGE_EMBEDS_EXTERNAL_RESOURCES_COLUMN) != 0; 2083ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira refMessageId = cursor.getString(UIProvider.MESSAGE_REF_MESSAGE_ID_COLUMN); 2093ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira draftType = cursor.getInt(UIProvider.MESSAGE_DRAFT_TYPE_COLUMN); 2103ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira appendRefMessageContent = cursor 2113ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira .getInt(UIProvider.MESSAGE_APPEND_REF_MESSAGE_CONTENT_COLUMN) != 0; 2123ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira hasAttachments = cursor.getInt(UIProvider.MESSAGE_HAS_ATTACHMENTS_COLUMN) != 0; 2137bb27253d9eb377d13da55b67b0babd047eca367Mindy Pereira final String attachmentsUri = cursor 2147bb27253d9eb377d13da55b67b0babd047eca367Mindy Pereira .getString(UIProvider.MESSAGE_ATTACHMENT_LIST_URI_COLUMN); 2157bb27253d9eb377d13da55b67b0babd047eca367Mindy Pereira attachmentListUri = hasAttachments && !TextUtils.isEmpty(attachmentsUri) ? Uri 2167bb27253d9eb377d13da55b67b0babd047eca367Mindy Pereira .parse(attachmentsUri) : null; 2173ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira messageFlags = cursor.getLong(UIProvider.MESSAGE_FLAGS_COLUMN); 218f944e9655562e321aff52fe5f437e1d2fa2950a9Mindy Pereira joinedAttachmentInfos = cursor 219f944e9655562e321aff52fe5f437e1d2fa2950a9Mindy Pereira .getString(UIProvider.MESSAGE_JOINED_ATTACHMENT_INFOS_COLUMN); 2207ed1c1122c5677344a1ce176be2c03972fed26f5Mindy Pereira saveUri = cursor 2217ed1c1122c5677344a1ce176be2c03972fed26f5Mindy Pereira .getString(UIProvider.MESSAGE_SAVE_URI_COLUMN); 2227ed1c1122c5677344a1ce176be2c03972fed26f5Mindy Pereira sendUri = cursor 2237ed1c1122c5677344a1ce176be2c03972fed26f5Mindy Pereira .getString(UIProvider.MESSAGE_SEND_URI_COLUMN); 224d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang alwaysShowImages = cursor.getInt(UIProvider.MESSAGE_ALWAYS_SHOW_IMAGES_COLUMN) != 0; 225d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang read = cursor.getInt(UIProvider.MESSAGE_READ_COLUMN) != 0; 226d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang starred = cursor.getInt(UIProvider.MESSAGE_STARRED_COLUMN) != 0; 2274dbbf9f91da20d89b13d412038c0b19b91983f8cMindy Pereira quotedTextOffset = cursor.getInt(UIProvider.QUOTED_TEXT_OFFSET_COLUMN); 2285a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang attachmentsJson = cursor.getString(UIProvider.MESSAGE_ATTACHMENTS_COLUMN); 2293ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira } 2303ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira } 2310a22047bb6c54d8f1ce980762f75908e35b08c3dAndy Huang 232bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook public synchronized String[] getToAddresses() { 233bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook if (mToAddresses == null) { 234bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook mToAddresses = Utils.splitCommaSeparatedString(to); 235bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook } 236bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook return mToAddresses; 237bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook } 238bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook 239bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook public synchronized String[] getCcAddresses() { 240bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook if (mCcAddresses == null) { 241bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook mCcAddresses = Utils.splitCommaSeparatedString(cc); 242bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook } 243bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook return mCcAddresses; 244bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook } 245bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook 246bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook public synchronized String[] getBccAddresses() { 247bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook if (mBccAddresses == null) { 248bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook mBccAddresses = Utils.splitCommaSeparatedString(bcc); 249bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook } 250bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook return mBccAddresses; 251bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook } 252bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook 253bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook public synchronized String[] getReplyToAddresses() { 254bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook if (mReplyToAddresses == null) { 255bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook mReplyToAddresses = Utils.splitCommaSeparatedString(replyTo); 256bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook } 257bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook return mReplyToAddresses; 258bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook } 2593233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang 2605a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang public synchronized List<Attachment> getAttachments() { 2615a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang if (mAttachments == null && attachmentsJson != null) { 2625a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang mAttachments = Attachment.fromJSONArray(attachmentsJson); 2635a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang } 2645a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang return mAttachments; 2655a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang } 2665a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang 2673233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang /** 2683233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang * Returns whether a "Show Pictures" button should initially appear for this message. If the 2693233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang * button is shown, the message must also block all non-local images in the body. Inversely, if 2703233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang * the button is not shown, the message must show all images within (or else the user would be 2713233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang * stuck with no images and no way to reveal them). 2723233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang * 2733233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang * @return true if a "Show Pictures" button should appear. 2743233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang */ 2753233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang public boolean shouldShowImagePrompt() { 2763233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang return embedsExternalResources && !alwaysShowImages; 2773233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang } 2783233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang 2793233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang /** 2803233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang * Helper method to command a provider to mark all messages from this sender with the 2813233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang * {@link MessageColumns#ALWAYS_SHOW_IMAGES} flag set. 2823233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang * 2833233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang * @param handler a caller-provided handler to run the query on 2843233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang * @param token (optional) token to identify the command to the handler 2853233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang * @param cookie (optional) cookie to pass to the handler 2863233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang */ 2873233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang public void markAlwaysShowImages(AsyncQueryHandler handler, int token, Object cookie) { 2883233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang final ContentValues values = new ContentValues(1); 2893233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang values.put(UIProvider.MessageColumns.ALWAYS_SHOW_IMAGES, 1); 2903233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang 2913233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang handler.startUpdate(token, cookie, uri, values, null, null); 2923233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang } 2933233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang 294d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang /** 295d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang * Helper method to command a provider to star/unstar this message. 296d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang * 297d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang * @param starred whether to star or unstar the message 298d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang * @param handler a caller-provided handler to run the query on 299d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang * @param token (optional) token to identify the command to the handler 300d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang * @param cookie (optional) cookie to pass to the handler 301d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang */ 302d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang public void star(boolean starred, AsyncQueryHandler handler, int token, Object cookie) { 303bec5115726f24733a0a1577caaf05fb6e9ef9c6fMarc Blank this.starred = starred; 304bec5115726f24733a0a1577caaf05fb6e9ef9c6fMarc Blank boolean conversationStarred = starred; 305bec5115726f24733a0a1577caaf05fb6e9ef9c6fMarc Blank // If we're unstarring, we need to find out if the conversation is still starred 306bec5115726f24733a0a1577caaf05fb6e9ef9c6fMarc Blank if (mMessageCursor != null && !starred) { 307bec5115726f24733a0a1577caaf05fb6e9ef9c6fMarc Blank conversationStarred = mMessageCursor.isConversationStarred(); 308bec5115726f24733a0a1577caaf05fb6e9ef9c6fMarc Blank } 309bec5115726f24733a0a1577caaf05fb6e9ef9c6fMarc Blank // Update the conversation cursor so that changes are reflected simultaneously 310bec5115726f24733a0a1577caaf05fb6e9ef9c6fMarc Blank ConversationCursor.setConversationColumn(conversationUri, ConversationColumns.STARRED, 311bec5115726f24733a0a1577caaf05fb6e9ef9c6fMarc Blank conversationStarred); 312d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang final ContentValues values = new ContentValues(1); 313d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang values.put(UIProvider.MessageColumns.STARRED, starred ? 1 : 0); 314d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang 315d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang handler.startUpdate(token, cookie, uri, values, null, null); 316d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang } 317d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang 3183ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira} 319