Message.java revision 233f562368e4e3af9ca86b16d1b0a151df6157ea
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;
25e623a0f6e3caa9cafec913cf826e946628833517Andy Huangimport android.provider.BaseColumns;
26014ea4c15d147794789b9c5bf4e243fa08781ad9Andy Huangimport android.text.Html;
27014ea4c15d147794789b9c5bf4e243fa08781ad9Andy Huangimport android.text.SpannedString;
28cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereiraimport android.text.TextUtils;
295ed6311d6beb968e83585a43d7cdf5909e0a2cf6mindypimport android.text.util.Rfc822Token;
305ed6311d6beb968e83585a43d7cdf5909e0a2cf6mindypimport android.text.util.Rfc822Tokenizer;
313ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira
3226846d859a4714ff90ea02dba251a54cac1f1e9fMarc Blankimport com.android.mail.providers.UIProvider.MessageColumns;
3326846d859a4714ff90ea02dba251a54cac1f1e9fMarc Blankimport com.android.mail.utils.Utils;
34cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huangimport com.google.common.base.Objects;
3526846d859a4714ff90ea02dba251a54cac1f1e9fMarc Blank
369ab47b16e0189d219c16e2eddfbd66c741c01229Andy Huangimport java.util.Collections;
375a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huangimport java.util.List;
3841dca185f7683b36bdafd9520c0648c897a95834Paul Westbrookimport java.util.regex.Pattern;
395a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang
403ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira
413ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereirapublic class Message implements Parcelable {
42e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
4341dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook     * Regex pattern used to look for any inline images in message bodies, including Gmail-hosted
4441dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook     * relative-URL images, Gmail emoticons, and any external inline images (although we usually
4541dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook     * count on the server to detect external images).
4641dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook     */
4741dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook    private static Pattern INLINE_IMAGE_PATTERN = Pattern.compile("<img\\s+[^>]*src=",
4841dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook            Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
4941dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook
5041dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook    /**
51e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see BaseColumns#_ID
52e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
533ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    public long id;
54e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
55e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#SERVER_ID
56e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
57d47877e3860ea4249eddb3f6efefbc6cd39f2320Andy Huang    public String serverId;
58e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
59e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#URI
60e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
61cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira    public Uri uri;
62e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
63e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#CONVERSATION_ID
64e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
65daa06aba887e8e3748453f45ae52c1e571fe9f2eAndy Huang    public Uri conversationUri;
66e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
67e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#SUBJECT
68e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
693ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    public String subject;
70e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
71e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#SNIPPET
72e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
733ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    public String snippet;
74e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
75e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#FROM
76e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
773ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    public String from;
78e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
79e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#TO
80e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
813ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    public String to;
82e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
83e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#CC
84e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
853ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    public String cc;
86e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
87e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#BCC
88e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
893ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    public String bcc;
90e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
91e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#REPLY_TO
92e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
933ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    public String replyTo;
94e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
95e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#DATE_RECEIVED_MS
96e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
973ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    public long dateReceivedMs;
98e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
99e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#BODY_HTML
100e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
1013ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    public String bodyHtml;
102e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
103e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#BODY_TEXT
104e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
1053ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    public String bodyText;
106e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
107e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#EMBEDS_EXTERNAL_RESOURCES
108e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
1093ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    public boolean embedsExternalResources;
110e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
111e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#REF_MESSAGE_ID
112e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
1133ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    public String refMessageId;
114e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
115e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#DRAFT_TYPE
116e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
1173ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    public int draftType;
118e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
119e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#APPEND_REF_MESSAGE_CONTENT
120e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
1213ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    public boolean appendRefMessageContent;
122e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
123e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#HAS_ATTACHMENTS
124e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
1253ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    public boolean hasAttachments;
126e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
127e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#ATTACHMENT_LIST_URI
128e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
129cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira    public Uri attachmentListUri;
130e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
131e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#MESSAGE_FLAGS
132e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
1333ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    public long messageFlags;
134e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
135e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#SAVE_MESSAGE_URI
136e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
1377ed1c1122c5677344a1ce176be2c03972fed26f5Mindy Pereira    public String saveUri;
138e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
139e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#SEND_MESSAGE_URI
140e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
1417ed1c1122c5677344a1ce176be2c03972fed26f5Mindy Pereira    public String sendUri;
142e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
143e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#ALWAYS_SHOW_IMAGES
144e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
145104f729c284f9b7b31a251350252f8ae31d09f86Paul Westbrook    public boolean alwaysShowImages;
146e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
147e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#READ
148e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
149d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang    public boolean read;
150e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
151e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#STARRED
152e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
153d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang    public boolean starred;
154e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
155e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#QUOTE_START_POS
156e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
1574dbbf9f91da20d89b13d412038c0b19b91983f8cMindy Pereira    public int quotedTextOffset;
158e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
159e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#ATTACHMENTS
160e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
1615a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang    public String attachmentsJson;
162e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
163e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#MESSAGE_ACCOUNT_URI
164e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
16562de1b104635b09e7f00b0941268ba1fa5460ddbMindy Pereira    public Uri accountUri;
166e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
167e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.MessageColumns#EVENT_INTENT_URI
168e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
1693842af9e8ba90ebf5b75dc5018bbfdfb2e044f99Marc Blank    public Uri eventIntentUri;
170d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein    /**
171d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein     * @see UIProvider.MessageColumns#SPAM_WARNING_STRING
172d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein     */
1733b08c51ec46794b3c22c8649eb86bf77c72e0d9aAndrew Sapperstein    public String spamWarningString;
174d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein    /**
175d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein     * @see UIProvider.MessageColumns#SPAM_WARNING_LEVEL
176d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein     */
1773b08c51ec46794b3c22c8649eb86bf77c72e0d9aAndrew Sapperstein    public int spamWarningLevel;
178d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein    /**
179d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein     * @see UIProvider.MessageColumns#SPAM_WARNING_LINK_TYPE
180d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein     */
1813b08c51ec46794b3c22c8649eb86bf77c72e0d9aAndrew Sapperstein    public int spamLinkType;
182d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein    /**
183d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein     * @see UIProvider.MessageColumns#VIA_DOMAIN
184d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein     */
185d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein    public String viaDomain;
18647aa9c991b33c722a6ba1946fc02e0aba17bc1c9Andy Huang    /**
18747aa9c991b33c722a6ba1946fc02e0aba17bc1c9Andy Huang     * @see UIProvider.MessageColumns#IS_SENDING
18847aa9c991b33c722a6ba1946fc02e0aba17bc1c9Andy Huang     */
18947aa9c991b33c722a6ba1946fc02e0aba17bc1c9Andy Huang    public boolean isSending;
1905a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang
191d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein    private transient String[] mFromAddresses = null;
1925a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang    private transient String[] mToAddresses = null;
1935a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang    private transient String[] mCcAddresses = null;
1945a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang    private transient String[] mBccAddresses = null;
1955a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang    private transient String[] mReplyToAddresses = null;
1963ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira
1975a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang    private transient List<Attachment> mAttachments = null;
198845f87e34179bcbb2862c09572576ab775be472dmindyp
1993ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    @Override
2003ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    public int describeContents() {
2013ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        return 0;
2023ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    }
2033ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira
2043ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    @Override
2053233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang    public boolean equals(Object o) {
206cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang        return this == o || (o != null && o instanceof Message
207cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang                && Objects.equal(uri, ((Message) o).uri));
2083233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang    }
2093233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang
2103233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang    @Override
2113233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang    public int hashCode() {
2123233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang        return uri == null ? 0 : uri.hashCode();
2133233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang    }
2143233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang
2153233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang    @Override
2163ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    public void writeToParcel(Parcel dest, int flags) {
2173ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        dest.writeLong(id);
218d47877e3860ea4249eddb3f6efefbc6cd39f2320Andy Huang        dest.writeString(serverId);
219cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira        dest.writeParcelable(uri, 0);
220daa06aba887e8e3748453f45ae52c1e571fe9f2eAndy Huang        dest.writeParcelable(conversationUri, 0);
2213ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        dest.writeString(subject);
2223ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        dest.writeString(snippet);
2233ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        dest.writeString(from);
2243ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        dest.writeString(to);
2253ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        dest.writeString(cc);
2263ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        dest.writeString(bcc);
2273ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        dest.writeString(replyTo);
2283ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        dest.writeLong(dateReceivedMs);
2293ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        dest.writeString(bodyHtml);
2303ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        dest.writeString(bodyText);
2313ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        dest.writeInt(embedsExternalResources ? 1 : 0);
2323ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        dest.writeString(refMessageId);
2333ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        dest.writeInt(draftType);
2343ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        dest.writeInt(appendRefMessageContent ? 1 : 0);
2353ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        dest.writeInt(hasAttachments ? 1 : 0);
236cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira        dest.writeParcelable(attachmentListUri, 0);
2373ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        dest.writeLong(messageFlags);
2387ed1c1122c5677344a1ce176be2c03972fed26f5Mindy Pereira        dest.writeString(saveUri);
2397ed1c1122c5677344a1ce176be2c03972fed26f5Mindy Pereira        dest.writeString(sendUri);
240104f729c284f9b7b31a251350252f8ae31d09f86Paul Westbrook        dest.writeInt(alwaysShowImages ? 1 : 0);
2414dbbf9f91da20d89b13d412038c0b19b91983f8cMindy Pereira        dest.writeInt(quotedTextOffset);
2422421dc8d6d0b4c727ab7ab0e5ce730f415089e86Mindy Pereira        dest.writeString(attachmentsJson);
24362de1b104635b09e7f00b0941268ba1fa5460ddbMindy Pereira        dest.writeParcelable(accountUri, 0);
2443842af9e8ba90ebf5b75dc5018bbfdfb2e044f99Marc Blank        dest.writeParcelable(eventIntentUri, 0);
2453b08c51ec46794b3c22c8649eb86bf77c72e0d9aAndrew Sapperstein        dest.writeString(spamWarningString);
2463b08c51ec46794b3c22c8649eb86bf77c72e0d9aAndrew Sapperstein        dest.writeInt(spamWarningLevel);
2473b08c51ec46794b3c22c8649eb86bf77c72e0d9aAndrew Sapperstein        dest.writeInt(spamLinkType);
248d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein        dest.writeString(viaDomain);
24947aa9c991b33c722a6ba1946fc02e0aba17bc1c9Andy Huang        dest.writeInt(isSending ? 1 : 0);
2503ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    }
2513ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira
2523ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    private Message(Parcel in) {
2533ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        id = in.readLong();
254d47877e3860ea4249eddb3f6efefbc6cd39f2320Andy Huang        serverId = in.readString();
255cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira        uri = in.readParcelable(null);
256daa06aba887e8e3748453f45ae52c1e571fe9f2eAndy Huang        conversationUri = in.readParcelable(null);
2573ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        subject = in.readString();
2583ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        snippet = in.readString();
2593ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        from = in.readString();
2603ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        to = in.readString();
2613ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        cc = in.readString();
2623ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        bcc = in.readString();
2633ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        replyTo = in.readString();
2643ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        dateReceivedMs = in.readLong();
2653ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        bodyHtml = in.readString();
2663ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        bodyText = in.readString();
2673ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        embedsExternalResources = in.readInt() != 0;
2683ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        refMessageId = in.readString();
2693ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        draftType = in.readInt();
2703ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        appendRefMessageContent = in.readInt() != 0;
2713ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        hasAttachments = in.readInt() != 0;
272cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira        attachmentListUri = in.readParcelable(null);
2733ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        messageFlags = in.readLong();
2747ed1c1122c5677344a1ce176be2c03972fed26f5Mindy Pereira        saveUri = in.readString();
2757ed1c1122c5677344a1ce176be2c03972fed26f5Mindy Pereira        sendUri = in.readString();
276104f729c284f9b7b31a251350252f8ae31d09f86Paul Westbrook        alwaysShowImages = in.readInt() != 0;
2774dbbf9f91da20d89b13d412038c0b19b91983f8cMindy Pereira        quotedTextOffset = in.readInt();
2782421dc8d6d0b4c727ab7ab0e5ce730f415089e86Mindy Pereira        attachmentsJson = in.readString();
27962de1b104635b09e7f00b0941268ba1fa5460ddbMindy Pereira        accountUri = in.readParcelable(null);
2803842af9e8ba90ebf5b75dc5018bbfdfb2e044f99Marc Blank        eventIntentUri = in.readParcelable(null);
2813b08c51ec46794b3c22c8649eb86bf77c72e0d9aAndrew Sapperstein        spamWarningString = in.readString();
2823b08c51ec46794b3c22c8649eb86bf77c72e0d9aAndrew Sapperstein        spamWarningLevel = in.readInt();
2833b08c51ec46794b3c22c8649eb86bf77c72e0d9aAndrew Sapperstein        spamLinkType = in.readInt();
284d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein        viaDomain = in.readString();
28547aa9c991b33c722a6ba1946fc02e0aba17bc1c9Andy Huang        isSending = in.readInt() != 0;
286104f729c284f9b7b31a251350252f8ae31d09f86Paul Westbrook    }
287104f729c284f9b7b31a251350252f8ae31d09f86Paul Westbrook
288104f729c284f9b7b31a251350252f8ae31d09f86Paul Westbrook    public Message() {
289104f729c284f9b7b31a251350252f8ae31d09f86Paul Westbrook
2903ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    }
2913ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira
2923ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    @Override
2933ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    public String toString() {
2943ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        return "[message id=" + id + "]";
2953ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    }
2963ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira
2973ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    public static final Creator<Message> CREATOR = new Creator<Message>() {
2983ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira
2993ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        @Override
3003ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        public Message createFromParcel(Parcel source) {
3013ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira            return new Message(source);
3023ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        }
3033ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira
3043ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        @Override
3053ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        public Message[] newArray(int size) {
3063ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira            return new Message[size];
3073ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        }
3083ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira
3093ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    };
3103ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira
311a831b2f1ba6d3c18d5e54563df8bae1f589c4257Mindy Pereira    public Message(Cursor cursor) {
3123ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        if (cursor != null) {
3133ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira            id = cursor.getLong(UIProvider.MESSAGE_ID_COLUMN);
314d47877e3860ea4249eddb3f6efefbc6cd39f2320Andy Huang            serverId = cursor.getString(UIProvider.MESSAGE_SERVER_ID_COLUMN);
315daa06aba887e8e3748453f45ae52c1e571fe9f2eAndy Huang            final String messageUriStr = cursor.getString(UIProvider.MESSAGE_URI_COLUMN);
316daa06aba887e8e3748453f45ae52c1e571fe9f2eAndy Huang            uri = !TextUtils.isEmpty(messageUriStr) ? Uri.parse(messageUriStr) : null;
317daa06aba887e8e3748453f45ae52c1e571fe9f2eAndy Huang            final String convUriStr = cursor.getString(UIProvider.MESSAGE_CONVERSATION_URI_COLUMN);
318daa06aba887e8e3748453f45ae52c1e571fe9f2eAndy Huang            conversationUri = !TextUtils.isEmpty(convUriStr) ? Uri.parse(convUriStr) : null;
3193ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira            subject = cursor.getString(UIProvider.MESSAGE_SUBJECT_COLUMN);
3203ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira            snippet = cursor.getString(UIProvider.MESSAGE_SNIPPET_COLUMN);
3213ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira            from = cursor.getString(UIProvider.MESSAGE_FROM_COLUMN);
3223ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira            to = cursor.getString(UIProvider.MESSAGE_TO_COLUMN);
3233ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira            cc = cursor.getString(UIProvider.MESSAGE_CC_COLUMN);
3243ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira            bcc = cursor.getString(UIProvider.MESSAGE_BCC_COLUMN);
3253ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira            replyTo = cursor.getString(UIProvider.MESSAGE_REPLY_TO_COLUMN);
3263ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira            dateReceivedMs = cursor.getLong(UIProvider.MESSAGE_DATE_RECEIVED_MS_COLUMN);
3273ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira            bodyHtml = cursor.getString(UIProvider.MESSAGE_BODY_HTML_COLUMN);
3283ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira            bodyText = cursor.getString(UIProvider.MESSAGE_BODY_TEXT_COLUMN);
3293ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira            embedsExternalResources = cursor
3303ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira                    .getInt(UIProvider.MESSAGE_EMBEDS_EXTERNAL_RESOURCES_COLUMN) != 0;
3313ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira            refMessageId = cursor.getString(UIProvider.MESSAGE_REF_MESSAGE_ID_COLUMN);
3323ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira            draftType = cursor.getInt(UIProvider.MESSAGE_DRAFT_TYPE_COLUMN);
3333ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira            appendRefMessageContent = cursor
3343ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira                    .getInt(UIProvider.MESSAGE_APPEND_REF_MESSAGE_CONTENT_COLUMN) != 0;
3353ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira            hasAttachments = cursor.getInt(UIProvider.MESSAGE_HAS_ATTACHMENTS_COLUMN) != 0;
3367bb27253d9eb377d13da55b67b0babd047eca367Mindy Pereira            final String attachmentsUri = cursor
3377bb27253d9eb377d13da55b67b0babd047eca367Mindy Pereira                    .getString(UIProvider.MESSAGE_ATTACHMENT_LIST_URI_COLUMN);
3387bb27253d9eb377d13da55b67b0babd047eca367Mindy Pereira            attachmentListUri = hasAttachments && !TextUtils.isEmpty(attachmentsUri) ? Uri
3397bb27253d9eb377d13da55b67b0babd047eca367Mindy Pereira                    .parse(attachmentsUri) : null;
3403ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira            messageFlags = cursor.getLong(UIProvider.MESSAGE_FLAGS_COLUMN);
3417ed1c1122c5677344a1ce176be2c03972fed26f5Mindy Pereira            saveUri = cursor
3427ed1c1122c5677344a1ce176be2c03972fed26f5Mindy Pereira                    .getString(UIProvider.MESSAGE_SAVE_URI_COLUMN);
3437ed1c1122c5677344a1ce176be2c03972fed26f5Mindy Pereira            sendUri = cursor
3447ed1c1122c5677344a1ce176be2c03972fed26f5Mindy Pereira                    .getString(UIProvider.MESSAGE_SEND_URI_COLUMN);
345d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang            alwaysShowImages = cursor.getInt(UIProvider.MESSAGE_ALWAYS_SHOW_IMAGES_COLUMN) != 0;
346d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang            read = cursor.getInt(UIProvider.MESSAGE_READ_COLUMN) != 0;
347d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang            starred = cursor.getInt(UIProvider.MESSAGE_STARRED_COLUMN) != 0;
3484dbbf9f91da20d89b13d412038c0b19b91983f8cMindy Pereira            quotedTextOffset = cursor.getInt(UIProvider.QUOTED_TEXT_OFFSET_COLUMN);
3495a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang            attachmentsJson = cursor.getString(UIProvider.MESSAGE_ATTACHMENTS_COLUMN);
35062de1b104635b09e7f00b0941268ba1fa5460ddbMindy Pereira            String accountUriString = cursor.getString(UIProvider.MESSAGE_ACCOUNT_URI_COLUMN);
35162de1b104635b09e7f00b0941268ba1fa5460ddbMindy Pereira            accountUri = !TextUtils.isEmpty(accountUriString) ? Uri.parse(accountUriString) : null;
3523842af9e8ba90ebf5b75dc5018bbfdfb2e044f99Marc Blank            eventIntentUri =
3533842af9e8ba90ebf5b75dc5018bbfdfb2e044f99Marc Blank                    Utils.getValidUri(cursor.getString(UIProvider.MESSAGE_EVENT_INTENT_COLUMN));
3543b08c51ec46794b3c22c8649eb86bf77c72e0d9aAndrew Sapperstein            spamWarningString =
3553b08c51ec46794b3c22c8649eb86bf77c72e0d9aAndrew Sapperstein                    cursor.getString(UIProvider.MESSAGE_SPAM_WARNING_STRING_ID_COLUMN);
3563b08c51ec46794b3c22c8649eb86bf77c72e0d9aAndrew Sapperstein            spamWarningLevel = cursor.getInt(UIProvider.MESSAGE_SPAM_WARNING_LEVEL_COLUMN);
3573b08c51ec46794b3c22c8649eb86bf77c72e0d9aAndrew Sapperstein            spamLinkType = cursor.getInt(UIProvider.MESSAGE_SPAM_WARNING_LINK_TYPE_COLUMN);
358d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein            viaDomain = cursor.getString(UIProvider.MESSAGE_VIA_DOMAIN_COLUMN);
35947aa9c991b33c722a6ba1946fc02e0aba17bc1c9Andy Huang            isSending = cursor.getInt(UIProvider.MESSAGE_IS_SENDING_COLUMN) != 0;
3603ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira        }
3613ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira    }
3620a22047bb6c54d8f1ce980762f75908e35b08c3dAndy Huang
363a71f1f3368f26b6627512298f64484611fd6b0e8Andy Huang    public boolean isFlaggedReplied() {
364a71f1f3368f26b6627512298f64484611fd6b0e8Andy Huang        return (messageFlags & UIProvider.MessageFlags.REPLIED) ==
365a71f1f3368f26b6627512298f64484611fd6b0e8Andy Huang                UIProvider.MessageFlags.REPLIED;
366a71f1f3368f26b6627512298f64484611fd6b0e8Andy Huang    }
367a71f1f3368f26b6627512298f64484611fd6b0e8Andy Huang
368a71f1f3368f26b6627512298f64484611fd6b0e8Andy Huang    public boolean isFlaggedForwarded() {
369a71f1f3368f26b6627512298f64484611fd6b0e8Andy Huang        return (messageFlags & UIProvider.MessageFlags.FORWARDED) ==
370a71f1f3368f26b6627512298f64484611fd6b0e8Andy Huang                UIProvider.MessageFlags.FORWARDED;
371a71f1f3368f26b6627512298f64484611fd6b0e8Andy Huang    }
372a71f1f3368f26b6627512298f64484611fd6b0e8Andy Huang
373a71f1f3368f26b6627512298f64484611fd6b0e8Andy Huang    public boolean isFlaggedCalendarInvite() {
374a71f1f3368f26b6627512298f64484611fd6b0e8Andy Huang        return (messageFlags & UIProvider.MessageFlags.CALENDAR_INVITE) ==
375a71f1f3368f26b6627512298f64484611fd6b0e8Andy Huang                UIProvider.MessageFlags.CALENDAR_INVITE;
376a71f1f3368f26b6627512298f64484611fd6b0e8Andy Huang    }
377a71f1f3368f26b6627512298f64484611fd6b0e8Andy Huang
378d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein    public synchronized String[] getFromAddresses() {
379d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein        if (mFromAddresses == null) {
3805ed6311d6beb968e83585a43d7cdf5909e0a2cf6mindyp            mFromAddresses = tokenizeAddresses(from);
381d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein        }
382d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein        return mFromAddresses;
383d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein    }
384d5b369b324a22d28b63def902eefaf6591edf004Andrew Sapperstein
385bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook    public synchronized String[] getToAddresses() {
386bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook        if (mToAddresses == null) {
3875ed6311d6beb968e83585a43d7cdf5909e0a2cf6mindyp            mToAddresses = tokenizeAddresses(to);
388bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook        }
389bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook        return mToAddresses;
390bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook    }
391bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook
392bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook    public synchronized String[] getCcAddresses() {
393bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook        if (mCcAddresses == null) {
3945ed6311d6beb968e83585a43d7cdf5909e0a2cf6mindyp            mCcAddresses = tokenizeAddresses(cc);
395bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook        }
396bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook        return mCcAddresses;
397bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook    }
398bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook
399bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook    public synchronized String[] getBccAddresses() {
400bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook        if (mBccAddresses == null) {
4015ed6311d6beb968e83585a43d7cdf5909e0a2cf6mindyp            mBccAddresses = tokenizeAddresses(bcc);
402bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook        }
403bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook        return mBccAddresses;
404bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook    }
405bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook
406bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook    public synchronized String[] getReplyToAddresses() {
407bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook        if (mReplyToAddresses == null) {
4085ed6311d6beb968e83585a43d7cdf5909e0a2cf6mindyp            mReplyToAddresses = tokenizeAddresses(replyTo);
409bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook        }
410bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook        return mReplyToAddresses;
411bb87b7fa57f25fc9cee1f572dd253f33f58f81daPaul Westbrook    }
4123233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang
413233f562368e4e3af9ca86b16d1b0a151df6157eaPaul Westbrook    public static String[] tokenizeAddresses(String addresses) {
4145ed6311d6beb968e83585a43d7cdf5909e0a2cf6mindyp        if (TextUtils.isEmpty(addresses)) {
4155ed6311d6beb968e83585a43d7cdf5909e0a2cf6mindyp            return new String[0];
4165ed6311d6beb968e83585a43d7cdf5909e0a2cf6mindyp        }
417845f87e34179bcbb2862c09572576ab775be472dmindyp        Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(addresses);
4185ed6311d6beb968e83585a43d7cdf5909e0a2cf6mindyp        String[] strings = new String[tokens.length];
4195ed6311d6beb968e83585a43d7cdf5909e0a2cf6mindyp        for (int i = 0; i < tokens.length;i++) {
4205ed6311d6beb968e83585a43d7cdf5909e0a2cf6mindyp            strings[i] = tokens[i].toString();
4215ed6311d6beb968e83585a43d7cdf5909e0a2cf6mindyp        }
4225ed6311d6beb968e83585a43d7cdf5909e0a2cf6mindyp        return strings;
4235ed6311d6beb968e83585a43d7cdf5909e0a2cf6mindyp    }
4245a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang    public synchronized List<Attachment> getAttachments() {
4259ab47b16e0189d219c16e2eddfbd66c741c01229Andy Huang        if (mAttachments == null) {
4269ab47b16e0189d219c16e2eddfbd66c741c01229Andy Huang            if (attachmentsJson != null) {
4279ab47b16e0189d219c16e2eddfbd66c741c01229Andy Huang                mAttachments = Attachment.fromJSONArray(attachmentsJson);
4289ab47b16e0189d219c16e2eddfbd66c741c01229Andy Huang            } else {
4299ab47b16e0189d219c16e2eddfbd66c741c01229Andy Huang                mAttachments = Collections.emptyList();
4309ab47b16e0189d219c16e2eddfbd66c741c01229Andy Huang            }
4315a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang        }
4325a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang        return mAttachments;
4335a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang    }
4345a9290731bf565538a9cf91892346c7a6f4da0ecAndy Huang
4353233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang    /**
4363233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang     * Returns whether a "Show Pictures" button should initially appear for this message. If the
4373233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang     * button is shown, the message must also block all non-local images in the body. Inversely, if
4383233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang     * the button is not shown, the message must show all images within (or else the user would be
4393233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang     * stuck with no images and no way to reveal them).
4403233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang     *
4413233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang     * @return true if a "Show Pictures" button should appear.
4423233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang     */
4433233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang    public boolean shouldShowImagePrompt() {
44441dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook        return !alwaysShowImages && embedsExternalResources();
44541dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook    }
44641dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook
44741dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook    private boolean embedsExternalResources() {
44841dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook        return embedsExternalResources ||
44941dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook                (!TextUtils.isEmpty(bodyHtml) && INLINE_IMAGE_PATTERN.matcher(bodyHtml).find());
4503233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang    }
4513233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang
4523233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang    /**
4533233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang     * Helper method to command a provider to mark all messages from this sender with the
4543233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang     * {@link MessageColumns#ALWAYS_SHOW_IMAGES} flag set.
4553233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang     *
4563233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang     * @param handler a caller-provided handler to run the query on
4573233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang     * @param token (optional) token to identify the command to the handler
4583233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang     * @param cookie (optional) cookie to pass to the handler
4593233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang     */
4603233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang    public void markAlwaysShowImages(AsyncQueryHandler handler, int token, Object cookie) {
461839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        alwaysShowImages = true;
4623233bff8ae08a56543c9f5abf1bc6ab38f0574ceAndy Huang
463d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang        final ContentValues values = new ContentValues(1);
464839ada22ea84251dde3305003d2f8fc5bf14914eAndy Huang        values.put(UIProvider.MessageColumns.ALWAYS_SHOW_IMAGES, 1);
465d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang
466d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang        handler.startUpdate(token, cookie, uri, values, null, null);
467d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang    }
468d8e249ee7abb0e1ad24e17e4e299736d4a150936Andy Huang
469014ea4c15d147794789b9c5bf4e243fa08781ad9Andy Huang    public String getBodyAsHtml() {
470014ea4c15d147794789b9c5bf4e243fa08781ad9Andy Huang        String body = "";
471014ea4c15d147794789b9c5bf4e243fa08781ad9Andy Huang        if (!TextUtils.isEmpty(bodyHtml)) {
472014ea4c15d147794789b9c5bf4e243fa08781ad9Andy Huang            body = bodyHtml;
473014ea4c15d147794789b9c5bf4e243fa08781ad9Andy Huang        } else if (!TextUtils.isEmpty(bodyText)) {
474014ea4c15d147794789b9c5bf4e243fa08781ad9Andy Huang            body = Html.toHtml(new SpannedString(bodyText));
475014ea4c15d147794789b9c5bf4e243fa08781ad9Andy Huang        }
476014ea4c15d147794789b9c5bf4e243fa08781ad9Andy Huang        return body;
477014ea4c15d147794789b9c5bf4e243fa08781ad9Andy Huang    }
478014ea4c15d147794789b9c5bf4e243fa08781ad9Andy Huang
4793ce64e7ceb6246130342385d91550bcf33b31cc8Mindy Pereira}
480