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