Conversation.java revision 94033deeb31df739a27fce15887a3f0a2e808b12
1732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang/**
2732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * Copyright (c) 2012, Google Inc.
3732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang *
4732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * Licensed under the Apache License, Version 2.0 (the "License");
5732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * you may not use this file except in compliance with the License.
6732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * You may obtain a copy of the License at
7732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang *
8732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang *     http://www.apache.org/licenses/LICENSE-2.0
9732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang *
10732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * Unless required by applicable law or agreed to in writing, software
11732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * distributed under the License is distributed on an "AS IS" BASIS,
12732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * See the License for the specific language governing permissions and
14732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * limitations under the License.
15732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang */
16732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
17732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangpackage com.android.mail.providers;
18732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
191bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huangimport android.content.ContentValues;
20bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereiraimport android.content.Context;
21732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.database.Cursor;
22732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.net.Uri;
237f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huangimport android.os.Bundle;
24732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.os.Parcel;
25732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.os.Parcelable;
26e623a0f6e3caa9cafec913cf826e946628833517Andy Huangimport android.provider.BaseColumns;
275c765b9c5dd8a9a9421260ba8b46d06073391c73Mindy Pereiraimport android.text.TextUtils;
28732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
29bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereiraimport com.android.mail.R;
305f578144cc01738d5f9988d61674a643df19fdaeScott Kennedyimport com.android.mail.browse.ConversationCursor;
315f578144cc01738d5f9988d61674a643df19fdaeScott Kennedyimport com.android.mail.content.CursorCreator;
32ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereiraimport com.android.mail.providers.UIProvider.ConversationColumns;
331367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrookimport com.android.mail.providers.UIProvider.ConversationCursorCommand;
345f578144cc01738d5f9988d61674a643df19fdaeScott Kennedyimport com.android.mail.ui.ConversationCursorLoader;
359e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huangimport com.android.mail.utils.LogTag;
369e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huangimport com.android.mail.utils.LogUtils;
37a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blankimport com.google.common.collect.ImmutableList;
38d198fa7ddb2d0c730847af34f06aa2e940b2537dMark Weiimport com.google.common.collect.Lists;
39a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank
4000ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereiraimport java.util.ArrayList;
41440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwalimport java.util.Collection;
42440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwalimport java.util.Collections;
43b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huangimport java.util.List;
44440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal
45732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangpublic class Conversation implements Parcelable {
46f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank    public static final int NO_POSITION = -1;
47732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
489e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang    private static final String LOG_TAG = LogTag.getLogTag();
499e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang
50820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook    private static final String EMPTY_STRING = "";
51820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook
52e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
53e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see BaseColumns#_ID
54e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
55edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    public final long id;
56e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
57e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#URI
58e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
59edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    public final Uri uri;
60e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
61e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#SUBJECT
62e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
63edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    public final String subject;
64e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
65e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#DATE_RECEIVED_MS
66e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
67edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    public final long dateMs;
68e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
69e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#HAS_ATTACHMENTS
70e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
71edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    public final boolean hasAttachments;
72e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
73479505d71969e26b0785d8e0e1b81108731cf827Mark Wei     * Union of attachmentPreviewUri0 and attachmentPreviewUri1
74479505d71969e26b0785d8e0e1b81108731cf827Mark Wei     */
75479505d71969e26b0785d8e0e1b81108731cf827Mark Wei    public transient ArrayList<String> attachmentPreviews;
76479505d71969e26b0785d8e0e1b81108731cf827Mark Wei    /**
77479505d71969e26b0785d8e0e1b81108731cf827Mark Wei     * @see UIProvider.ConversationColumns#ATTACHMENT_PREVIEW_URI0
78479505d71969e26b0785d8e0e1b81108731cf827Mark Wei     */
79479505d71969e26b0785d8e0e1b81108731cf827Mark Wei    public String attachmentPreviewUri0;
80479505d71969e26b0785d8e0e1b81108731cf827Mark Wei    /**
81479505d71969e26b0785d8e0e1b81108731cf827Mark Wei     * @see UIProvider.ConversationColumns#ATTACHMENT_PREVIEW_URI1
82479505d71969e26b0785d8e0e1b81108731cf827Mark Wei     */
83479505d71969e26b0785d8e0e1b81108731cf827Mark Wei    public String attachmentPreviewUri1;
84479505d71969e26b0785d8e0e1b81108731cf827Mark Wei    /**
85479505d71969e26b0785d8e0e1b81108731cf827Mark Wei     * @see UIProvider.ConversationColumns#ATTACHMENT_PREVIEW_STATES
86479505d71969e26b0785d8e0e1b81108731cf827Mark Wei     */
87edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    public final int attachmentPreviewStates;
88479505d71969e26b0785d8e0e1b81108731cf827Mark Wei    /**
89479505d71969e26b0785d8e0e1b81108731cf827Mark Wei     * @see UIProvider.ConversationColumns#ATTACHMENT_PREVIEWS_COUNT
90479505d71969e26b0785d8e0e1b81108731cf827Mark Wei     */
91edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    public final int attachmentPreviewsCount;
92479505d71969e26b0785d8e0e1b81108731cf827Mark Wei    /**
93e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#MESSAGE_LIST_URI
94e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
95edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    public final Uri messageListUri;
96e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
97e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#SENDING_STATE
98e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
99edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    public final int sendingState;
100e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
101e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#PRIORITY
102e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
1034db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira    public int priority;
104e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
105e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#READ
106e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
107c8a994227b9c686d88ee05840544162711a85712Marc Blank    public boolean read;
108e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
109d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy     * @see UIProvider.ConversationColumns#SEEN
110d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy     */
111d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy    public boolean seen;
112d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy    /**
113e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#STARRED
114e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
115c8a994227b9c686d88ee05840544162711a85712Marc Blank    public boolean starred;
116e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
117e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#RAW_FOLDERS
118e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
119b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang    private FolderList rawFolders;
120e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
121e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#FLAGS
122e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
12322657529437c160dec072115c5982409306c1313Mindy Pereira    public int convFlags;
124e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
125e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#PERSONAL_LEVEL
126e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
127edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    public final int personalLevel;
128e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
129e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#SPAM
130e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
131edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    public final boolean spam;
132e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
133e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#MUTED
134e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
135edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    public final boolean muted;
136e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
13776b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook     * @see UIProvider.ConversationColumns#PHISHING
13876b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook     */
139edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    public final boolean phishing;
14076b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook    /**
141e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#COLOR
142e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
143edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    public final int color;
144e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
145e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#ACCOUNT_URI
146e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
147edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    public final Uri accountUri;
148648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira    /**
149648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira     * @see UIProvider.ConversationColumns#CONVERSATION_INFO
150648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira     */
151edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    public final ConversationInfo conversationInfo;
15241dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook    /**
153cebcc64fbd69618ff89f9fac0bfe9b9e7d7ce104Paul Westbrook     * @see UIProvider.ConversationColumns#CONVERSATION_BASE_URI
15441dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook     */
155edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    public final Uri conversationBaseUri;
156f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang    /**
157f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang     * @see UIProvider.ConversationColumns#REMOTE
158f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang     */
159edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    public final boolean isRemote;
160c92dc65f64e8b09ee78ba2fa799d7d3627373913Alan Lau    /**
161c92dc65f64e8b09ee78ba2fa799d7d3627373913Alan Lau     * @see UIProvider.ConversationColumns#ORDER_KEY
162c92dc65f64e8b09ee78ba2fa799d7d3627373913Alan Lau     */
163c92dc65f64e8b09ee78ba2fa799d7d3627373913Alan Lau    public final long orderKey;
16422657529437c160dec072115c5982409306c1313Mindy Pereira
165dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy    /**
166dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy     * Used within the UI to indicate the adapter position of this conversation
167dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy     *
168dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy     * @deprecated Keeping this in sync with the desired value is a not always done properly, is a
169dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy     *             source of bugs, and is a bad idea in general. Do not trust this value. Try to
170dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy     *             migrate code away from using it.
171dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy     */
172dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy    @Deprecated
173f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank    public transient int position;
174648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira    // Used within the UI to indicate that a Conversation should be removed from
175648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira    // the ConversationCursor when executing an update, e.g. the the
176648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira    // Conversation is no longer in the ConversationList for the current folder,
177648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira    // that is it's now in some other folder(s)
178ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank    public transient boolean localDeleteOnUpdate;
179732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
180cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang    private transient boolean viewed;
181cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang
182928308d6b10d353493492ad05e0227f960ddaa7eJames Lemieux    private static String sBadgeAndSubject;
1832909b7442130800d6c6c20c1227d65295262f03emindyp
184e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    // Constituents of convFlags below
185648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira    // Flag indicating that the item has been deleted, but will continue being
186648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira    // shown in the list Delete/Archive of a mostly-dead item will NOT propagate
187648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira    // the delete/archive, but WILL remove the item from the cursor
188e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    public static final int FLAG_MOSTLY_DEAD = 1 << 0;
189e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank
190440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    /** An immutable, empty conversation list */
191440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    public static final Collection<Conversation> EMPTY = Collections.emptyList();
192440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal
193732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    @Override
194732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public int describeContents() {
195732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        return 0;
196732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
197732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
198732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    @Override
199732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public void writeToParcel(Parcel dest, int flags) {
200732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dest.writeLong(id);
201c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank        dest.writeParcelable(uri, flags);
202732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dest.writeString(subject);
203732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dest.writeLong(dateMs);
204f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang        dest.writeInt(hasAttachments ? 1 : 0);
205cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira        dest.writeParcelable(messageListUri, 0);
2064db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        dest.writeInt(sendingState);
2074db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        dest.writeInt(priority);
208f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang        dest.writeInt(read ? 1 : 0);
209d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        dest.writeInt(seen ? 1 : 0);
210f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang        dest.writeInt(starred ? 1 : 0);
211b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang        dest.writeParcelable(rawFolders, 0);
21222657529437c160dec072115c5982409306c1313Mindy Pereira        dest.writeInt(convFlags);
21322657529437c160dec072115c5982409306c1313Mindy Pereira        dest.writeInt(personalLevel);
214863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        dest.writeInt(spam ? 1 : 0);
21576b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook        dest.writeInt(phishing ? 1 : 0);
216863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        dest.writeInt(muted ? 1 : 0);
21792939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank        dest.writeInt(color);
218a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank        dest.writeParcelable(accountUri, 0);
219351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang        dest.writeParcelable(conversationInfo, 0);
22041dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook        dest.writeParcelable(conversationBaseUri, 0);
221f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang        dest.writeInt(isRemote ? 1 : 0);
222479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        dest.writeString(attachmentPreviewUri0);
223479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        dest.writeString(attachmentPreviewUri1);
224479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        dest.writeInt(attachmentPreviewStates);
225479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        dest.writeInt(attachmentPreviewsCount);
226c92dc65f64e8b09ee78ba2fa799d7d3627373913Alan Lau        dest.writeLong(orderKey);
227732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
228732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
229351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang    private Conversation(Parcel in, ClassLoader loader) {
230732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        id = in.readLong();
231c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank        uri = in.readParcelable(null);
232732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        subject = in.readString();
233732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dateMs = in.readLong();
234f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang        hasAttachments = (in.readInt() != 0);
235cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira        messageListUri = in.readParcelable(null);
2364db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        sendingState = in.readInt();
2374db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        priority = in.readInt();
238f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang        read = (in.readInt() != 0);
239d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        seen = (in.readInt() != 0);
240f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang        starred = (in.readInt() != 0);
241b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang        rawFolders = in.readParcelable(loader);
24222657529437c160dec072115c5982409306c1313Mindy Pereira        convFlags = in.readInt();
24322657529437c160dec072115c5982409306c1313Mindy Pereira        personalLevel = in.readInt();
244863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        spam = in.readInt() != 0;
24576b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook        phishing = in.readInt() != 0;
246863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        muted = in.readInt() != 0;
24792939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank        color = in.readInt();
248a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank        accountUri = in.readParcelable(null);
249f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank        position = NO_POSITION;
250ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank        localDeleteOnUpdate = false;
251351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang        conversationInfo = in.readParcelable(loader);
25241dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook        conversationBaseUri = in.readParcelable(null);
253f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang        isRemote = in.readInt() != 0;
254479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        attachmentPreviews = null;
255479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        attachmentPreviewUri0 = in.readString();
256479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        attachmentPreviewUri1 = in.readString();
257479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        attachmentPreviewStates = in.readInt();
258479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        attachmentPreviewsCount = in.readInt();
259c92dc65f64e8b09ee78ba2fa799d7d3627373913Alan Lau        orderKey = in.readLong();
260732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
261732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
262732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    @Override
263732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public String toString() {
2649e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang        // log extra info at DEBUG level or finer
2659e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang        final StringBuilder sb = new StringBuilder("[conversation id=");
2669e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang        sb.append(id);
2679e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang        if (LogUtils.isLoggable(LOG_TAG, LogUtils.DEBUG)) {
2689e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang            sb.append(", subject=");
2699e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang            sb.append(subject);
2709e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang        }
2719e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang        sb.append("]");
2729e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang        return sb.toString();
273732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
274732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
275351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang    public static final ClassLoaderCreator<Conversation> CREATOR =
276351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang            new ClassLoaderCreator<Conversation>() {
277732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
278732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        @Override
279732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        public Conversation createFromParcel(Parcel source) {
280351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang            return new Conversation(source, null);
281351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang        }
282351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang
283351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang        @Override
284351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang        public Conversation createFromParcel(Parcel source, ClassLoader loader) {
285351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang            return new Conversation(source, loader);
286732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        }
287732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
288732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        @Override
289732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        public Conversation[] newArray(int size) {
290732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang            return new Conversation[size];
291732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        }
292732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
293732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    };
294732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
295acf6039a23382f18c35f6b487d90d53cb67b5858Mindy Pereira    public static final Uri MOVE_CONVERSATIONS_URI = Uri.parse("content://moveconversations");
296acf6039a23382f18c35f6b487d90d53cb67b5858Mindy Pereira
297ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira    /**
298ae7e6a0786a2d890b77c783d7ac39a90523b8154mindyp     * The column that needs to be updated to change the folders for a conversation.
299ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira     */
30000ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira    public static final String UPDATE_FOLDER_COLUMN = ConversationColumns.RAW_FOLDERS;
301ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira
302a831b2f1ba6d3c18d5e54563df8bae1f589c4257Mindy Pereira    public Conversation(Cursor cursor) {
303edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        if (cursor == null) {
304edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            throw new IllegalArgumentException("Creating conversation from null cursor");
305edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
306edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        id = cursor.getLong(UIProvider.CONVERSATION_ID_COLUMN);
307edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        uri = Uri.parse(cursor.getString(UIProvider.CONVERSATION_URI_COLUMN));
308edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        dateMs = cursor.getLong(UIProvider.CONVERSATION_DATE_RECEIVED_MS_COLUMN);
309edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        final String subj = cursor.getString(UIProvider.CONVERSATION_SUBJECT_COLUMN);
310edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        // Don't allow null subject
311edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        if (subj == null) {
312edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            subject = "";
313edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        } else {
314edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            subject = subj;
315732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        }
316edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        hasAttachments = cursor.getInt(UIProvider.CONVERSATION_HAS_ATTACHMENTS_COLUMN) != 0;
317edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        String messageList = cursor.getString(UIProvider.CONVERSATION_MESSAGE_LIST_URI_COLUMN);
318edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        messageListUri = !TextUtils.isEmpty(messageList) ? Uri.parse(messageList) : null;
319edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        sendingState = cursor.getInt(UIProvider.CONVERSATION_SENDING_STATE_COLUMN);
320edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        priority = cursor.getInt(UIProvider.CONVERSATION_PRIORITY_COLUMN);
321edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        read = cursor.getInt(UIProvider.CONVERSATION_READ_COLUMN) != 0;
322edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        seen = cursor.getInt(UIProvider.CONVERSATION_SEEN_COLUMN) != 0;
323edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        starred = cursor.getInt(UIProvider.CONVERSATION_STARRED_COLUMN) != 0;
324edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        rawFolders = readRawFolders(cursor);
325edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        convFlags = cursor.getInt(UIProvider.CONVERSATION_FLAGS_COLUMN);
326edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        personalLevel = cursor.getInt(UIProvider.CONVERSATION_PERSONAL_LEVEL_COLUMN);
327edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        spam = cursor.getInt(UIProvider.CONVERSATION_IS_SPAM_COLUMN) != 0;
328edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        phishing = cursor.getInt(UIProvider.CONVERSATION_IS_PHISHING_COLUMN) != 0;
329edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        muted = cursor.getInt(UIProvider.CONVERSATION_MUTED_COLUMN) != 0;
330edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        color = cursor.getInt(UIProvider.CONVERSATION_COLOR_COLUMN);
331edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        String account = cursor.getString(UIProvider.CONVERSATION_ACCOUNT_URI_COLUMN);
332edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        accountUri = !TextUtils.isEmpty(account) ? Uri.parse(account) : null;
333edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        position = NO_POSITION;
334edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        localDeleteOnUpdate = false;
335edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        conversationInfo = readConversationInfo(cursor);
336edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        if (conversationInfo == null) {
337edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            LogUtils.wtf(LOG_TAG, "Null conversation info from cursor");
338edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
339edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        final String conversationBase =
340edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                cursor.getString(UIProvider.CONVERSATION_BASE_URI_COLUMN);
341edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        conversationBaseUri = !TextUtils.isEmpty(conversationBase) ?
342edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                Uri.parse(conversationBase) : null;
343edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        isRemote = cursor.getInt(UIProvider.CONVERSATION_REMOTE_COLUMN) != 0;
344edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        attachmentPreviews = null;
345edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        attachmentPreviewUri0 = cursor.getString(
346edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                UIProvider.CONVERSATION_ATTACHMENT_PREVIEW_URI0_COLUMN);
347edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        attachmentPreviewUri1 = cursor.getString(
348edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                UIProvider.CONVERSATION_ATTACHMENT_PREVIEW_URI1_COLUMN);
349edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        attachmentPreviewStates = cursor.getInt(
350edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                UIProvider.CONVERSATION_ATTACHMENT_PREVIEW_STATES_COLUMN);
351edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        attachmentPreviewsCount = cursor.getInt(
352edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                UIProvider.CONVERSATION_ATTACHMENT_PREVIEWS_COUNT_COLUMN);
353c92dc65f64e8b09ee78ba2fa799d7d3627373913Alan Lau        orderKey = cursor.getLong(UIProvider.CONVERSATION_ORDER_KEY_COLUMN);
354732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
355732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
3561bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang    public Conversation(Conversation other) {
3571bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        if (other == null) {
358edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            throw new IllegalArgumentException("Copying null conversation");
3591bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        }
3601bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang
3611bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        id = other.id;
3621bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        uri = other.uri;
3631bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        dateMs = other.dateMs;
3641bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        subject = other.subject;
3651bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        hasAttachments = other.hasAttachments;
3661bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        messageListUri = other.messageListUri;
3671bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        sendingState = other.sendingState;
3681bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        priority = other.priority;
3691bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        read = other.read;
3701bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        seen = other.seen;
3711bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        starred = other.starred;
3721bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        rawFolders = other.rawFolders; // FolderList is immutable, shallow copy is OK
3731bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        convFlags = other.convFlags;
3741bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        personalLevel = other.personalLevel;
3751bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        spam = other.spam;
3761bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        phishing = other.phishing;
3771bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        muted = other.muted;
3781bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        color = other.color;
3791bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        accountUri = other.accountUri;
3801bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        position = other.position;
3811bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        localDeleteOnUpdate = other.localDeleteOnUpdate;
3821bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        // although ConversationInfo is mutable (see ConversationInfo.markRead), applyCachedValues
3831bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        // will overwrite this if cached changes exist anyway, so a shallow copy is OK
3841bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        conversationInfo = other.conversationInfo;
3851bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        conversationBaseUri = other.conversationBaseUri;
3861bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        isRemote = other.isRemote;
387479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        attachmentPreviews = null;
388479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        attachmentPreviewUri0 = other.attachmentPreviewUri0;
389479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        attachmentPreviewUri1 = other.attachmentPreviewUri1;
390479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        attachmentPreviewStates = other.attachmentPreviewStates;
391479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        attachmentPreviewsCount = other.attachmentPreviewsCount;
392c92dc65f64e8b09ee78ba2fa799d7d3627373913Alan Lau        orderKey = other.orderKey;
3931bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang    }
3941bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang
395f59d01c3116dc2adde97a5b52aa6094144c2d315Andrew Sapperstein    private Conversation(long id, Uri uri, String subject, long dateMs,
396edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            boolean hasAttachment, Uri messageListUri,
397edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            int sendingState, int priority, boolean read,
398d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy            boolean seen, boolean starred, FolderList rawFolders, int convFlags, int personalLevel,
399d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy            boolean spam, boolean phishing, boolean muted, Uri accountUri,
400479505d71969e26b0785d8e0e1b81108731cf827Mark Wei            ConversationInfo conversationInfo, Uri conversationBase, boolean isRemote,
401479505d71969e26b0785d8e0e1b81108731cf827Mark Wei            String attachmentPreviewUri0, String attachmentPreviewUri1, int attachmentPreviewStates,
402c92dc65f64e8b09ee78ba2fa799d7d3627373913Alan Lau            int attachmentPreviewsCount, String permalink, long orderKey) {
403edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        if (conversationInfo == null) {
404edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            throw new IllegalArgumentException("Null conversationInfo");
405edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
406edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.id = id;
407edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.uri = uri;
408edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.subject = subject;
409edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.dateMs = dateMs;
410edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.hasAttachments = hasAttachment;
411edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.messageListUri = messageListUri;
412edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.sendingState = sendingState;
413edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.priority = priority;
414edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.read = read;
415edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.seen = seen;
416edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.starred = starred;
417edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.rawFolders = rawFolders;
418edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.convFlags = convFlags;
419edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.personalLevel = personalLevel;
420edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.spam = spam;
421edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.phishing = phishing;
422edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.muted = muted;
423edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.color = 0;
424edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.accountUri = accountUri;
425edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.conversationInfo = conversationInfo;
426edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.conversationBaseUri = conversationBase;
427edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.isRemote = isRemote;
428edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.attachmentPreviews = null;
429edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.attachmentPreviewUri0 = attachmentPreviewUri0;
430edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.attachmentPreviewUri1 = attachmentPreviewUri1;
431edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.attachmentPreviewStates = attachmentPreviewStates;
432edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.attachmentPreviewsCount = attachmentPreviewsCount;
433c92dc65f64e8b09ee78ba2fa799d7d3627373913Alan Lau        this.orderKey = orderKey;
434edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    }
435edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
436edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    public static class Builder {
437edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private long mId;
438edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private Uri mUri;
439edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private String mSubject;
440edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private long mDateMs;
441edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private boolean mHasAttachments;
442edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private Uri mMessageListUri;
443edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private int mSendingState;
444edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private int mPriority;
445edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private boolean mRead;
446edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private boolean mSeen;
447edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private boolean mStarred;
448edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private FolderList mRawFolders;
449edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private int mConvFlags;
450edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private int mPersonalLevel;
451edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private boolean mSpam;
452edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private boolean mPhishing;
453edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private boolean mMuted;
454edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private Uri mAccountUri;
455edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private ConversationInfo mConversationInfo;
456edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private Uri mConversationBaseUri;
457edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private boolean mIsRemote;
458edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private String mAttachmentPreviewUri0;
459edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private String mAttachmentPreviewUri1;
460edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private int mAttachmentPreviewStates;
461edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private int mAttachmentPreviewsCount;
462f59d01c3116dc2adde97a5b52aa6094144c2d315Andrew Sapperstein        private String mPermalink;
463c92dc65f64e8b09ee78ba2fa799d7d3627373913Alan Lau        private long mOrderKey;
464edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
465edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setId(long id) {
466edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mId = id;
467edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
468edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
469edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
470edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setUri(Uri uri) {
471edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mUri = uri;
472edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
473edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
474edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
475edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setSubject(String subject) {
476edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mSubject = subject;
477edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
478edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
479edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
480edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setDateMs(long dateMs) {
481edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mDateMs = dateMs;
482edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
483edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
484edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
485edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setHasAttachments(boolean hasAttachments) {
486edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mHasAttachments = hasAttachments;
487edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
488edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
489edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
490edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setMessageListUri(Uri messageListUri) {
491edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mMessageListUri = messageListUri;
492edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
493edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
494edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
495edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setSendingState(int sendingState) {
496edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mSendingState = sendingState;
497edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
498edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
499edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
500edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setPriority(int priority) {
501edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mPriority = priority;
502edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
503edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
504edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
505edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setRead(boolean read) {
506edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mRead = read;
507edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
508edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
509edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
510edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setSeen(boolean seen) {
511edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mSeen = seen;
512edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
513edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
514edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
515edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setStarred(boolean starred) {
516edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mStarred = starred;
517edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
518edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
519edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
520edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setRawFolders(FolderList rawFolders) {
521edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mRawFolders = rawFolders;
522edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
523edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
524edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
525edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setConvFlags(int convFlags) {
526edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mConvFlags = convFlags;
527edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
528edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
529edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
530edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setPersonalLevel(int personalLevel) {
531edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mPersonalLevel = personalLevel;
532edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
533edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
534edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
535edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setSpam(boolean spam) {
536edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mSpam = spam;
537edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
538edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
539edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
540edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setPhishing(boolean phishing) {
541edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mPhishing = phishing;
542edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
543edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
544edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
545edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setMuted(boolean muted) {
546edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mMuted = muted;
547edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
548edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
549edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
550edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setAccountUri(Uri accountUri) {
551edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mAccountUri = accountUri;
552edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
553edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
554edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
555edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setConversationInfo(ConversationInfo conversationInfo) {
556edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            if (conversationInfo == null) {
557edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                throw new IllegalArgumentException("Can't set null ConversationInfo");
558edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            }
559edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mConversationInfo = conversationInfo;
560edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
561edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
562edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
563edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setConversationBaseUri(Uri conversationBaseUri) {
564edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mConversationBaseUri = conversationBaseUri;
565edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
566edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
567edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
568edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setIsRemote(boolean isRemote) {
569edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mIsRemote = isRemote;
570edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
571edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
572edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
573edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setAttachmentPreviewUri0(String attachmentPreviewUri0) {
574edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mAttachmentPreviewUri0 = attachmentPreviewUri0;
575edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
576edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
577edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
578edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setAttachmentPreviewUri1(String attachmentPreviewUri1) {
579edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mAttachmentPreviewUri1 = attachmentPreviewUri1;
580edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
581edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
582edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
583edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setAttachmentPreviewStates(int attachmentPreviewStates) {
584edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mAttachmentPreviewStates = attachmentPreviewStates;
585edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
586edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
587edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
588edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setAttachmentPreviewsCount(int attachmentPreviewsCount) {
589edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mAttachmentPreviewsCount = attachmentPreviewsCount;
590edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
591edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
592edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
593f59d01c3116dc2adde97a5b52aa6094144c2d315Andrew Sapperstein        public Builder setPermalink(String permalink) {
594f59d01c3116dc2adde97a5b52aa6094144c2d315Andrew Sapperstein            mPermalink = permalink;
595f59d01c3116dc2adde97a5b52aa6094144c2d315Andrew Sapperstein            return this;
596f59d01c3116dc2adde97a5b52aa6094144c2d315Andrew Sapperstein        }
597f59d01c3116dc2adde97a5b52aa6094144c2d315Andrew Sapperstein
598c92dc65f64e8b09ee78ba2fa799d7d3627373913Alan Lau        public Builder setOrderKey(long orderKey) {
599c92dc65f64e8b09ee78ba2fa799d7d3627373913Alan Lau            mOrderKey = orderKey;
600c92dc65f64e8b09ee78ba2fa799d7d3627373913Alan Lau            return this;
601c92dc65f64e8b09ee78ba2fa799d7d3627373913Alan Lau        }
602c92dc65f64e8b09ee78ba2fa799d7d3627373913Alan Lau
603edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder() {}
604edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
605edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Conversation build() {
606edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            if (mConversationInfo == null) {
607edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                LogUtils.d(LOG_TAG, "Null conversationInfo in Builder");
608edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                mConversationInfo = new ConversationInfo();
609edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            }
610edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return new Conversation(mId, mUri, mSubject, mDateMs, mHasAttachments, mMessageListUri,
611edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                    mSendingState, mPriority, mRead, mSeen, mStarred, mRawFolders, mConvFlags,
612edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                    mPersonalLevel, mSpam, mPhishing, mMuted, mAccountUri, mConversationInfo,
613edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                    mConversationBaseUri, mIsRemote, mAttachmentPreviewUri0, mAttachmentPreviewUri1,
614c92dc65f64e8b09ee78ba2fa799d7d3627373913Alan Lau                    mAttachmentPreviewStates, mAttachmentPreviewsCount, mPermalink, mOrderKey);
615edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
616ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook    }
617ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook
6181367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook    private static final Bundle CONVERSATION_INFO_REQUEST;
6191367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook    private static final Bundle RAW_FOLDERS_REQUEST;
6201367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook
6211367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook    static {
6221367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook        RAW_FOLDERS_REQUEST = new Bundle(2);
6231367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook        RAW_FOLDERS_REQUEST.putBoolean(
6241367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook                ConversationCursorCommand.COMMAND_GET_RAW_FOLDERS, true);
6251367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook        RAW_FOLDERS_REQUEST.putInt(
6261367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook                ConversationCursorCommand.COMMAND_KEY_OPTIONS,
6271367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook                ConversationCursorCommand.OPTION_MOVE_POSITION);
6281367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook
6291367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook        CONVERSATION_INFO_REQUEST = new Bundle(2);
6301367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook        CONVERSATION_INFO_REQUEST.putBoolean(
6311367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook                ConversationCursorCommand.COMMAND_GET_CONVERSATION_INFO, true);
6321367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook        CONVERSATION_INFO_REQUEST.putInt(
6331367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook                ConversationCursorCommand.COMMAND_KEY_OPTIONS,
6341367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook                ConversationCursorCommand.OPTION_MOVE_POSITION);
6351367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook    }
6367f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang
6377f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang    private static ConversationInfo readConversationInfo(Cursor cursor) {
6387f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang        final ConversationInfo ci;
6397f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang
640f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang        if (cursor instanceof ConversationCursor) {
641f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang            final byte[] blob = ((ConversationCursor) cursor).getCachedBlob(
642f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang                    UIProvider.CONVERSATION_INFO_COLUMN);
643f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang            if (blob != null && blob.length > 0) {
644f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang                return ConversationInfo.fromBlob(blob);
645f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang            }
646f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang        }
647f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang
6481367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook        final Bundle response = cursor.respond(CONVERSATION_INFO_REQUEST);
6491367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook        if (response.containsKey(ConversationCursorCommand.COMMAND_GET_CONVERSATION_INFO)) {
6501367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook            ci = response.getParcelable(ConversationCursorCommand.COMMAND_GET_CONVERSATION_INFO);
6517f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang        } else {
6527f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang            // legacy fallback
6537f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang            ci = ConversationInfo.fromBlob(cursor.getBlob(UIProvider.CONVERSATION_INFO_COLUMN));
6547f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang        }
6557f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang        return ci;
6567f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang    }
6577f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang
6587f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang    private static FolderList readRawFolders(Cursor cursor) {
6597f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang        final FolderList fl;
6607f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang
661f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang        if (cursor instanceof ConversationCursor) {
662f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang            final byte[] blob = ((ConversationCursor) cursor).getCachedBlob(
663f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang                    UIProvider.CONVERSATION_RAW_FOLDERS_COLUMN);
664f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang            if (blob != null && blob.length > 0) {
665f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang                return FolderList.fromBlob(blob);
666f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang            }
667f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang        }
668f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang
6691367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook        final Bundle response = cursor.respond(RAW_FOLDERS_REQUEST);
6701367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook        if (response.containsKey(ConversationCursorCommand.COMMAND_GET_RAW_FOLDERS)) {
6711367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook            fl = response.getParcelable(ConversationCursorCommand.COMMAND_GET_RAW_FOLDERS);
6727f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang        } else {
6737f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang            // legacy fallback
674db5356a92ebc593e9eb564aaadad8dac8cd83554Paul Westbrook            // TODO: delete this once Email supports the respond call
6757f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang            fl = FolderList.fromBlob(
6767f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang                    cursor.getBlob(UIProvider.CONVERSATION_RAW_FOLDERS_COLUMN));
6777f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang        }
6787f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang        return fl;
6797f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang    }
6807f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang
681b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang    /**
6821bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang     * Apply any column values from the given {@link ContentValues} (where column names are the
6831bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang     * keys) to this conversation.
6841bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang     *
6851bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang     */
6861bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang    public void applyCachedValues(ContentValues values) {
6871bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        if (values == null) {
6881bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang            return;
6891bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        }
6901bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        for (String key : values.keySet()) {
6911bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang            final Object val = values.get(key);
6921bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang            LogUtils.i(LOG_TAG, "Conversation: applying cached value to col=%s val=%s", key,
6931bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang                    val);
6941bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang            if (ConversationColumns.READ.equals(key)) {
6951bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang                read = (Integer) val != 0;
6961bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang            } else if (ConversationColumns.CONVERSATION_INFO.equals(key)) {
697edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                final ConversationInfo cachedCi = ConversationInfo.fromBlob((byte[]) val);
698edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                if (cachedCi == null) {
699edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                    LogUtils.d(LOG_TAG, "Null ConversationInfo in applyCachedValues");
700edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                } else {
701edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                    conversationInfo.overwriteWith(cachedCi);
702edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                }
7031bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang            } else if (ConversationColumns.FLAGS.equals(key)) {
7041bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang                convFlags = (Integer) val;
7051bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang            } else if (ConversationColumns.STARRED.equals(key)) {
7061bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang                starred = (Integer) val != 0;
7077f4b6140b40c1d1d2624ca1dabe229fbb5c6959aAndy Huang            } else if (ConversationColumns.SEEN.equals(key)) {
7087f4b6140b40c1d1d2624ca1dabe229fbb5c6959aAndy Huang                seen = (Integer) val != 0;
7098ebc2ce34ed7d979662cf88b1c9fa60d63142fe4Andy Huang            } else if (ConversationColumns.RAW_FOLDERS.equals(key)) {
7108ebc2ce34ed7d979662cf88b1c9fa60d63142fe4Andy Huang                rawFolders = FolderList.fromBlob((byte[]) val);
7111bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang            } else if (ConversationColumns.VIEWED.equals(key)) {
7121bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang                // ignore. this is not read from the cursor, either.
7131bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang            } else {
7141bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang                LogUtils.e(LOG_TAG, new UnsupportedOperationException(),
7151bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang                        "unsupported cached conv value in col=%s", key);
7161bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang            }
7171bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        }
7181bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang    }
7191bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang
7201bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang    /**
721b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang     * Get the <strong>immutable</strong> list of {@link Folder}s for this conversation. To modify
722b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang     * this list, make a new {@link FolderList} and use {@link #setRawFolders(FolderList)}.
723b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang     *
724b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang     * @return <strong>Immutable</strong> list of {@link Folder}s.
725b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang     */
726b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang    public List<Folder> getRawFolders() {
727b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang        return rawFolders.folders;
72800ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira    }
72900ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira
730b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang    public void setRawFolders(FolderList folders) {
731b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang        rawFolders = folders;
73285c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira    }
73385c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira
734e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    @Override
735e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    public boolean equals(Object o) {
7363c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank        if (o instanceof Conversation) {
737648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira            Conversation conv = (Conversation) o;
7383c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank            return conv.uri.equals(uri);
7393c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank        }
7403c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank        return false;
741e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    }
742e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank
743e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    @Override
744e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    public int hashCode() {
745e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank        return uri.hashCode();
746e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    }
747e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank
7487f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira    /**
7497f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira     * Get if this conversation is marked as high priority.
7507f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira     */
7517f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira    public boolean isImportant() {
75222657529437c160dec072115c5982409306c1313Mindy Pereira        return priority == UIProvider.ConversationPriority.IMPORTANT;
7537f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira    }
7547f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira
755e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    /**
756e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank     * Get if this conversation is mostly dead
757e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank     */
758e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    public boolean isMostlyDead() {
759e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank        return (convFlags & FLAG_MOSTLY_DEAD) != 0;
760e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    }
761440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal
762440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    /**
763648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira     * Returns true if the URI of the conversation specified as the needle was
764648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira     * found in the collection of conversations specified as the haystack. False
765192fac189e6aed434556a4e37bd3c5c29ef02f29Vikram Aggarwal     * otherwise. This method is safe to call with null arguments.
766f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang     *
767d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * @param haystack
768d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * @param needle
769d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * @return true if the needle was found in the haystack, false otherwise.
770d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     */
771d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal    public final static boolean contains(Collection<Conversation> haystack, Conversation needle) {
772d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        // If the haystack is empty, it cannot contain anything.
773d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        if (haystack == null || haystack.size() <= 0) {
774d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal            return false;
775d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        }
776d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        // The null folder exists everywhere.
777d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        if (needle == null) {
778d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal            return true;
779d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        }
7807dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        final long toFind = needle.id;
781d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        for (final Conversation c : haystack) {
7827dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal            if (toFind == c.id) {
783d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal                return true;
784d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal            }
785d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        }
786d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        return false;
787d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal    }
788d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal
789d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal    /**
790648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira     * Returns a collection of a single conversation. This method always returns
791648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira     * a valid collection even if the input conversation is null.
792f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang     *
793440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal     * @param in a conversation, possibly null.
794440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal     * @return a collection of the conversation.
795440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal     */
796440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    public static Collection<Conversation> listOf(Conversation in) {
797440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal        final Collection<Conversation> target = (in == null) ? EMPTY : ImmutableList.of(in);
798440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal        return target;
799440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    }
8007dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal
8017dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal    /**
802edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler     * Get the snippet for this conversation.
803aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira     */
804aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira    public String getSnippet() {
805edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        return !TextUtils.isEmpty(conversationInfo.firstSnippet) ?
806edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                conversationInfo.firstSnippet : "";
807aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira    }
808aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira
809aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira    /**
8100972e0793cc321670391d063348aecb5031b2677Mindy Pereira     * Get the number of messages for this conversation.
8110972e0793cc321670391d063348aecb5031b2677Mindy Pereira     */
8120972e0793cc321670391d063348aecb5031b2677Mindy Pereira    public int getNumMessages() {
813edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        return conversationInfo.messageCount;
8140972e0793cc321670391d063348aecb5031b2677Mindy Pereira    }
8150972e0793cc321670391d063348aecb5031b2677Mindy Pereira
8160972e0793cc321670391d063348aecb5031b2677Mindy Pereira    /**
8170972e0793cc321670391d063348aecb5031b2677Mindy Pereira     * Get the number of drafts for this conversation.
8180972e0793cc321670391d063348aecb5031b2677Mindy Pereira     */
8190972e0793cc321670391d063348aecb5031b2677Mindy Pereira    public int numDrafts() {
820edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        return conversationInfo.draftCount;
8210972e0793cc321670391d063348aecb5031b2677Mindy Pereira    }
8220972e0793cc321670391d063348aecb5031b2677Mindy Pereira
823cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang    public boolean isViewed() {
824cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang        return viewed;
825cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang    }
826cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang
827cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang    public void markViewed() {
828cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang        viewed = true;
829cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang    }
830cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang
831c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang    public String getBaseUri(String defaultValue) {
832c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang        return conversationBaseUri != null ? conversationBaseUri.toString() : defaultValue;
833c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang    }
834c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang
835479505d71969e26b0785d8e0e1b81108731cf827Mark Wei    public ArrayList<String> getAttachmentPreviewUris() {
836479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        if (attachmentPreviews == null) {
837479505d71969e26b0785d8e0e1b81108731cf827Mark Wei            attachmentPreviews = Lists.newArrayListWithCapacity(2);
838479505d71969e26b0785d8e0e1b81108731cf827Mark Wei            if (!TextUtils.isEmpty(attachmentPreviewUri0)) {
839479505d71969e26b0785d8e0e1b81108731cf827Mark Wei                attachmentPreviews.add(attachmentPreviewUri0);
840479505d71969e26b0785d8e0e1b81108731cf827Mark Wei            }
841479505d71969e26b0785d8e0e1b81108731cf827Mark Wei            if (!TextUtils.isEmpty(attachmentPreviewUri1)) {
842479505d71969e26b0785d8e0e1b81108731cf827Mark Wei                attachmentPreviews.add(attachmentPreviewUri1);
843479505d71969e26b0785d8e0e1b81108731cf827Mark Wei            }
844479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        }
845479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        return attachmentPreviews;
846d198fa7ddb2d0c730847af34f06aa2e940b2537dMark Wei    }
847d198fa7ddb2d0c730847af34f06aa2e940b2537dMark Wei
8480972e0793cc321670391d063348aecb5031b2677Mindy Pereira    /**
8497dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal     * Create a human-readable string of all the conversations
8507dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal     * @param collection Any collection of conversations
8517dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal     * @return string with a human readable representation of the conversations.
8527dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal     */
8537dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal    public static String toString(Collection<Conversation> collection) {
8547dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        final StringBuilder out = new StringBuilder(collection.size() + " conversations:");
8557dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        int count = 0;
8567dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        for (final Conversation c : collection) {
8577dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal            count++;
858648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira            // Indent the conversations to make them easy to read in debug
859648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira            // output.
8607dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal            out.append("      " + count + ": " + c.toString() + "\n");
8617dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        }
8627dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        return out.toString();
8637dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal    }
864820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook
865820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook    /**
866820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook     * Returns an empty string if the specified string is null
867820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook     */
868820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook    private static String emptyIfNull(String in) {
869820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook        return in != null ? in : EMPTY_STRING;
870820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook    }
871bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereira
872bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereira    /**
873928308d6b10d353493492ad05e0227f960ddaa7eJames Lemieux     * Get the properly formatted badge and subject string for displaying a conversation.
874bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereira     */
875928308d6b10d353493492ad05e0227f960ddaa7eJames Lemieux    public static String getSubjectForDisplay(Context context, String badgeText,
876928308d6b10d353493492ad05e0227f960ddaa7eJames Lemieux            String filteredSubject) {
877928308d6b10d353493492ad05e0227f960ddaa7eJames Lemieux        if (TextUtils.isEmpty(filteredSubject)) {
87894033deeb31df739a27fce15887a3f0a2e808b12James Lemieux            return context.getString(R.string.no_subject);
879be0cb1e421831672f49c30ecb46e6eee765cb661Andrew Sapperstein        } else if (!TextUtils.isEmpty(badgeText)) {
880928308d6b10d353493492ad05e0227f960ddaa7eJames Lemieux            if (sBadgeAndSubject == null) {
881928308d6b10d353493492ad05e0227f960ddaa7eJames Lemieux                sBadgeAndSubject = context.getString(R.string.badge_and_subject);
882be0cb1e421831672f49c30ecb46e6eee765cb661Andrew Sapperstein            }
883928308d6b10d353493492ad05e0227f960ddaa7eJames Lemieux            return String.format(sBadgeAndSubject, badgeText, filteredSubject);
88461bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy        }
88561bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy
886928308d6b10d353493492ad05e0227f960ddaa7eJames Lemieux        return filteredSubject;
887bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereira    }
8885f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy
8895f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy    /**
8905f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy     * Public object that knows how to construct Conversation given Cursors. This is not used by
8915f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy     * {@link ConversationCursor} or {@link ConversationCursorLoader}.
8925f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy     */
8935f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy    public static final CursorCreator<Conversation> FACTORY = new CursorCreator<Conversation>() {
8945f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy        @Override
8955f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy        public Conversation createFromCursor(final Cursor c) {
8965f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy            return new Conversation(c);
8975f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy        }
8985f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy
8995f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy        @Override
9005f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy        public String toString() {
9015f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy            return "Conversation CursorCreator";
9025f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy        }
9035f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy    };
904648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira}
905