Conversation.java revision edd6c1a2807d2ade930dfd4622707298dc470d64
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;
16022657529437c160dec072115c5982409306c1313Mindy Pereira
161dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy    /**
162dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy     * Used within the UI to indicate the adapter position of this conversation
163dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy     *
164dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy     * @deprecated Keeping this in sync with the desired value is a not always done properly, is a
165dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy     *             source of bugs, and is a bad idea in general. Do not trust this value. Try to
166dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy     *             migrate code away from using it.
167dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy     */
168dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy    @Deprecated
169f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank    public transient int position;
170648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira    // Used within the UI to indicate that a Conversation should be removed from
171648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira    // the ConversationCursor when executing an update, e.g. the the
172648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira    // Conversation is no longer in the ConversationList for the current folder,
173648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira    // that is it's now in some other folder(s)
174ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank    public transient boolean localDeleteOnUpdate;
175732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
176cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang    private transient boolean viewed;
177cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang
1782909b7442130800d6c6c20c1227d65295262f03emindyp    private static String sSubjectAndSnippet;
1792909b7442130800d6c6c20c1227d65295262f03emindyp
180e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    // Constituents of convFlags below
181648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira    // Flag indicating that the item has been deleted, but will continue being
182648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira    // shown in the list Delete/Archive of a mostly-dead item will NOT propagate
183648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira    // the delete/archive, but WILL remove the item from the cursor
184e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    public static final int FLAG_MOSTLY_DEAD = 1 << 0;
185e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank
186440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    /** An immutable, empty conversation list */
187440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    public static final Collection<Conversation> EMPTY = Collections.emptyList();
188440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal
189732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    @Override
190732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public int describeContents() {
191732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        return 0;
192732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
193732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
194732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    @Override
195732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public void writeToParcel(Parcel dest, int flags) {
196732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dest.writeLong(id);
197c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank        dest.writeParcelable(uri, flags);
198732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dest.writeString(subject);
199732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dest.writeLong(dateMs);
200f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang        dest.writeInt(hasAttachments ? 1 : 0);
201cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira        dest.writeParcelable(messageListUri, 0);
2024db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        dest.writeInt(sendingState);
2034db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        dest.writeInt(priority);
204f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang        dest.writeInt(read ? 1 : 0);
205d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        dest.writeInt(seen ? 1 : 0);
206f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang        dest.writeInt(starred ? 1 : 0);
207b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang        dest.writeParcelable(rawFolders, 0);
20822657529437c160dec072115c5982409306c1313Mindy Pereira        dest.writeInt(convFlags);
20922657529437c160dec072115c5982409306c1313Mindy Pereira        dest.writeInt(personalLevel);
210863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        dest.writeInt(spam ? 1 : 0);
21176b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook        dest.writeInt(phishing ? 1 : 0);
212863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        dest.writeInt(muted ? 1 : 0);
21392939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank        dest.writeInt(color);
214a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank        dest.writeParcelable(accountUri, 0);
215351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang        dest.writeParcelable(conversationInfo, 0);
21641dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook        dest.writeParcelable(conversationBaseUri, 0);
217f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang        dest.writeInt(isRemote ? 1 : 0);
218479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        dest.writeString(attachmentPreviewUri0);
219479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        dest.writeString(attachmentPreviewUri1);
220479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        dest.writeInt(attachmentPreviewStates);
221479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        dest.writeInt(attachmentPreviewsCount);
222732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
223732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
224351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang    private Conversation(Parcel in, ClassLoader loader) {
225732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        id = in.readLong();
226c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank        uri = in.readParcelable(null);
227732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        subject = in.readString();
228732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dateMs = in.readLong();
229f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang        hasAttachments = (in.readInt() != 0);
230cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira        messageListUri = in.readParcelable(null);
2314db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        sendingState = in.readInt();
2324db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        priority = in.readInt();
233f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang        read = (in.readInt() != 0);
234d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        seen = (in.readInt() != 0);
235f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang        starred = (in.readInt() != 0);
236b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang        rawFolders = in.readParcelable(loader);
23722657529437c160dec072115c5982409306c1313Mindy Pereira        convFlags = in.readInt();
23822657529437c160dec072115c5982409306c1313Mindy Pereira        personalLevel = in.readInt();
239863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        spam = in.readInt() != 0;
24076b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook        phishing = in.readInt() != 0;
241863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        muted = in.readInt() != 0;
24292939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank        color = in.readInt();
243a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank        accountUri = in.readParcelable(null);
244f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank        position = NO_POSITION;
245ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank        localDeleteOnUpdate = false;
246351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang        conversationInfo = in.readParcelable(loader);
24741dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook        conversationBaseUri = in.readParcelable(null);
248f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang        isRemote = in.readInt() != 0;
249479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        attachmentPreviews = null;
250479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        attachmentPreviewUri0 = in.readString();
251479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        attachmentPreviewUri1 = in.readString();
252479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        attachmentPreviewStates = in.readInt();
253479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        attachmentPreviewsCount = in.readInt();
254732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
255732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
256732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    @Override
257732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public String toString() {
2589e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang        // log extra info at DEBUG level or finer
2599e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang        final StringBuilder sb = new StringBuilder("[conversation id=");
2609e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang        sb.append(id);
2619e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang        if (LogUtils.isLoggable(LOG_TAG, LogUtils.DEBUG)) {
2629e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang            sb.append(", subject=");
2639e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang            sb.append(subject);
2649e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang        }
2659e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang        sb.append("]");
2669e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang        return sb.toString();
267732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
268732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
269351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang    public static final ClassLoaderCreator<Conversation> CREATOR =
270351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang            new ClassLoaderCreator<Conversation>() {
271732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
272732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        @Override
273732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        public Conversation createFromParcel(Parcel source) {
274351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang            return new Conversation(source, null);
275351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang        }
276351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang
277351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang        @Override
278351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang        public Conversation createFromParcel(Parcel source, ClassLoader loader) {
279351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang            return new Conversation(source, loader);
280732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        }
281732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
282732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        @Override
283732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        public Conversation[] newArray(int size) {
284732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang            return new Conversation[size];
285732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        }
286732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
287732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    };
288732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
289acf6039a23382f18c35f6b487d90d53cb67b5858Mindy Pereira    public static final Uri MOVE_CONVERSATIONS_URI = Uri.parse("content://moveconversations");
290acf6039a23382f18c35f6b487d90d53cb67b5858Mindy Pereira
291ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira    /**
292ae7e6a0786a2d890b77c783d7ac39a90523b8154mindyp     * The column that needs to be updated to change the folders for a conversation.
293ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira     */
29400ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira    public static final String UPDATE_FOLDER_COLUMN = ConversationColumns.RAW_FOLDERS;
295ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira
296a831b2f1ba6d3c18d5e54563df8bae1f589c4257Mindy Pereira    public Conversation(Cursor cursor) {
297edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        if (cursor == null) {
298edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            throw new IllegalArgumentException("Creating conversation from null cursor");
299edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
300edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        id = cursor.getLong(UIProvider.CONVERSATION_ID_COLUMN);
301edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        uri = Uri.parse(cursor.getString(UIProvider.CONVERSATION_URI_COLUMN));
302edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        dateMs = cursor.getLong(UIProvider.CONVERSATION_DATE_RECEIVED_MS_COLUMN);
303edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        final String subj = cursor.getString(UIProvider.CONVERSATION_SUBJECT_COLUMN);
304edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        // Don't allow null subject
305edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        if (subj == null) {
306edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            subject = "";
307edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        } else {
308edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            subject = subj;
309732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        }
310edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        hasAttachments = cursor.getInt(UIProvider.CONVERSATION_HAS_ATTACHMENTS_COLUMN) != 0;
311edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        String messageList = cursor.getString(UIProvider.CONVERSATION_MESSAGE_LIST_URI_COLUMN);
312edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        messageListUri = !TextUtils.isEmpty(messageList) ? Uri.parse(messageList) : null;
313edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        sendingState = cursor.getInt(UIProvider.CONVERSATION_SENDING_STATE_COLUMN);
314edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        priority = cursor.getInt(UIProvider.CONVERSATION_PRIORITY_COLUMN);
315edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        read = cursor.getInt(UIProvider.CONVERSATION_READ_COLUMN) != 0;
316edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        seen = cursor.getInt(UIProvider.CONVERSATION_SEEN_COLUMN) != 0;
317edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        starred = cursor.getInt(UIProvider.CONVERSATION_STARRED_COLUMN) != 0;
318edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        rawFolders = readRawFolders(cursor);
319edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        convFlags = cursor.getInt(UIProvider.CONVERSATION_FLAGS_COLUMN);
320edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        personalLevel = cursor.getInt(UIProvider.CONVERSATION_PERSONAL_LEVEL_COLUMN);
321edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        spam = cursor.getInt(UIProvider.CONVERSATION_IS_SPAM_COLUMN) != 0;
322edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        phishing = cursor.getInt(UIProvider.CONVERSATION_IS_PHISHING_COLUMN) != 0;
323edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        muted = cursor.getInt(UIProvider.CONVERSATION_MUTED_COLUMN) != 0;
324edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        color = cursor.getInt(UIProvider.CONVERSATION_COLOR_COLUMN);
325edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        String account = cursor.getString(UIProvider.CONVERSATION_ACCOUNT_URI_COLUMN);
326edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        accountUri = !TextUtils.isEmpty(account) ? Uri.parse(account) : null;
327edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        position = NO_POSITION;
328edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        localDeleteOnUpdate = false;
329edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        conversationInfo = readConversationInfo(cursor);
330edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        if (conversationInfo == null) {
331edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            LogUtils.wtf(LOG_TAG, "Null conversation info from cursor");
332edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
333edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        final String conversationBase =
334edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                cursor.getString(UIProvider.CONVERSATION_BASE_URI_COLUMN);
335edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        conversationBaseUri = !TextUtils.isEmpty(conversationBase) ?
336edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                Uri.parse(conversationBase) : null;
337edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        isRemote = cursor.getInt(UIProvider.CONVERSATION_REMOTE_COLUMN) != 0;
338edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        attachmentPreviews = null;
339edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        attachmentPreviewUri0 = cursor.getString(
340edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                UIProvider.CONVERSATION_ATTACHMENT_PREVIEW_URI0_COLUMN);
341edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        attachmentPreviewUri1 = cursor.getString(
342edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                UIProvider.CONVERSATION_ATTACHMENT_PREVIEW_URI1_COLUMN);
343edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        attachmentPreviewStates = cursor.getInt(
344edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                UIProvider.CONVERSATION_ATTACHMENT_PREVIEW_STATES_COLUMN);
345edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        attachmentPreviewsCount = cursor.getInt(
346edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                UIProvider.CONVERSATION_ATTACHMENT_PREVIEWS_COUNT_COLUMN);
347732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
348732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
3491bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang    public Conversation(Conversation other) {
3501bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        if (other == null) {
351edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            throw new IllegalArgumentException("Copying null conversation");
3521bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        }
3531bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang
3541bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        id = other.id;
3551bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        uri = other.uri;
3561bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        dateMs = other.dateMs;
3571bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        subject = other.subject;
3581bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        hasAttachments = other.hasAttachments;
3591bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        messageListUri = other.messageListUri;
3601bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        sendingState = other.sendingState;
3611bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        priority = other.priority;
3621bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        read = other.read;
3631bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        seen = other.seen;
3641bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        starred = other.starred;
3651bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        rawFolders = other.rawFolders; // FolderList is immutable, shallow copy is OK
3661bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        convFlags = other.convFlags;
3671bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        personalLevel = other.personalLevel;
3681bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        spam = other.spam;
3691bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        phishing = other.phishing;
3701bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        muted = other.muted;
3711bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        color = other.color;
3721bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        accountUri = other.accountUri;
3731bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        position = other.position;
3741bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        localDeleteOnUpdate = other.localDeleteOnUpdate;
3751bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        // although ConversationInfo is mutable (see ConversationInfo.markRead), applyCachedValues
3761bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        // will overwrite this if cached changes exist anyway, so a shallow copy is OK
3771bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        conversationInfo = other.conversationInfo;
3781bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        conversationBaseUri = other.conversationBaseUri;
3791bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        isRemote = other.isRemote;
380479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        attachmentPreviews = null;
381479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        attachmentPreviewUri0 = other.attachmentPreviewUri0;
382479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        attachmentPreviewUri1 = other.attachmentPreviewUri1;
383479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        attachmentPreviewStates = other.attachmentPreviewStates;
384479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        attachmentPreviewsCount = other.attachmentPreviewsCount;
3851bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang    }
3861bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang
387edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    public Conversation(long id, Uri uri, String subject, long dateMs,
388edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            boolean hasAttachment, Uri messageListUri,
389edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            int sendingState, int priority, boolean read,
390d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy            boolean seen, boolean starred, FolderList rawFolders, int convFlags, int personalLevel,
391d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy            boolean spam, boolean phishing, boolean muted, Uri accountUri,
392479505d71969e26b0785d8e0e1b81108731cf827Mark Wei            ConversationInfo conversationInfo, Uri conversationBase, boolean isRemote,
393479505d71969e26b0785d8e0e1b81108731cf827Mark Wei            String attachmentPreviewUri0, String attachmentPreviewUri1, int attachmentPreviewStates,
394b6f1998c9151ad236dd3c6c5d0be3280df3ae895Mark Wei            int attachmentPreviewsCount) {
395edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        if (conversationInfo == null) {
396edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            throw new IllegalArgumentException("Null conversationInfo");
397edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
398edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.id = id;
399edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.uri = uri;
400edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.subject = subject;
401edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.dateMs = dateMs;
402edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.hasAttachments = hasAttachment;
403edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.messageListUri = messageListUri;
404edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.sendingState = sendingState;
405edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.priority = priority;
406edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.read = read;
407edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.seen = seen;
408edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.starred = starred;
409edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.rawFolders = rawFolders;
410edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.convFlags = convFlags;
411edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.personalLevel = personalLevel;
412edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.spam = spam;
413edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.phishing = phishing;
414edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.muted = muted;
415edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.color = 0;
416edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.accountUri = accountUri;
417edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.conversationInfo = conversationInfo;
418edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.conversationBaseUri = conversationBase;
419edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.isRemote = isRemote;
420edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.attachmentPreviews = null;
421edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.attachmentPreviewUri0 = attachmentPreviewUri0;
422edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.attachmentPreviewUri1 = attachmentPreviewUri1;
423edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.attachmentPreviewStates = attachmentPreviewStates;
424edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        this.attachmentPreviewsCount = attachmentPreviewsCount;
425edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    }
426edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
427edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler    public static class Builder {
428edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private long mId;
429edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private Uri mUri;
430edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private String mSubject;
431edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private long mDateMs;
432edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private boolean mHasAttachments;
433edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private Uri mMessageListUri;
434edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private int mSendingState;
435edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private int mPriority;
436edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private boolean mRead;
437edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private boolean mSeen;
438edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private boolean mStarred;
439edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private FolderList mRawFolders;
440edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private int mConvFlags;
441edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private int mPersonalLevel;
442edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private boolean mSpam;
443edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private boolean mPhishing;
444edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private boolean mMuted;
445edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private Uri mAccountUri;
446edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private ConversationInfo mConversationInfo;
447edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private Uri mConversationBaseUri;
448edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private boolean mIsRemote;
449edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private String mAttachmentPreviewUri0;
450edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private String mAttachmentPreviewUri1;
451edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private int mAttachmentPreviewStates;
452edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        private int mAttachmentPreviewsCount;
453edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
454edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setId(long id) {
455edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mId = id;
456edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
457edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
458edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
459edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setUri(Uri uri) {
460edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mUri = uri;
461edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
462edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
463edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
464edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setSubject(String subject) {
465edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mSubject = subject;
466edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
467edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
468edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
469edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setDateMs(long dateMs) {
470edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mDateMs = dateMs;
471edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
472edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
473edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
474edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setHasAttachments(boolean hasAttachments) {
475edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mHasAttachments = hasAttachments;
476edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
477edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
478edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
479edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setMessageListUri(Uri messageListUri) {
480edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mMessageListUri = messageListUri;
481edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
482edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
483edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
484edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setSendingState(int sendingState) {
485edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mSendingState = sendingState;
486edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
487edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
488edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
489edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setPriority(int priority) {
490edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mPriority = priority;
491edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
492edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
493edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
494edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setRead(boolean read) {
495edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mRead = read;
496edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
497edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
498edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
499edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setSeen(boolean seen) {
500edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mSeen = seen;
501edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
502edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
503edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
504edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setStarred(boolean starred) {
505edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mStarred = starred;
506edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
507edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
508edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
509edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setRawFolders(FolderList rawFolders) {
510edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mRawFolders = rawFolders;
511edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
512edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
513edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
514edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setConvFlags(int convFlags) {
515edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mConvFlags = convFlags;
516edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
517edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
518edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
519edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setPersonalLevel(int personalLevel) {
520edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mPersonalLevel = personalLevel;
521edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
522edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
523edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
524edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setSpam(boolean spam) {
525edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mSpam = spam;
526edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
527edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
528edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
529edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setPhishing(boolean phishing) {
530edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mPhishing = phishing;
531edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
532edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
533edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
534edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setMuted(boolean muted) {
535edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mMuted = muted;
536edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
537edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
538edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
539edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setAccountUri(Uri accountUri) {
540edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mAccountUri = accountUri;
541edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
542edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
543edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
544edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setConversationInfo(ConversationInfo conversationInfo) {
545edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            if (conversationInfo == null) {
546edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                throw new IllegalArgumentException("Can't set null ConversationInfo");
547edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            }
548edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mConversationInfo = conversationInfo;
549edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
550edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
551edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
552edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setConversationBaseUri(Uri conversationBaseUri) {
553edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mConversationBaseUri = conversationBaseUri;
554edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
555edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
556edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
557edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setIsRemote(boolean isRemote) {
558edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mIsRemote = isRemote;
559edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
560edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
561edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
562edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setAttachmentPreviewUri0(String attachmentPreviewUri0) {
563edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mAttachmentPreviewUri0 = attachmentPreviewUri0;
564edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
565edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
566edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
567edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setAttachmentPreviewUri1(String attachmentPreviewUri1) {
568edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mAttachmentPreviewUri1 = attachmentPreviewUri1;
569edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
570edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
571edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
572edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setAttachmentPreviewStates(int attachmentPreviewStates) {
573edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mAttachmentPreviewStates = attachmentPreviewStates;
574edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
575edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
576edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
577edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder setAttachmentPreviewsCount(int attachmentPreviewsCount) {
578edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            mAttachmentPreviewsCount = attachmentPreviewsCount;
579edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return this;
580edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
581edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
582edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Builder() {}
583edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler
584edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        public Conversation build() {
585edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            if (mConversationInfo == null) {
586edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                LogUtils.d(LOG_TAG, "Null conversationInfo in Builder");
587edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                mConversationInfo = new ConversationInfo();
588edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            }
589edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler            return new Conversation(mId, mUri, mSubject, mDateMs, mHasAttachments, mMessageListUri,
590edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                    mSendingState, mPriority, mRead, mSeen, mStarred, mRawFolders, mConvFlags,
591edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                    mPersonalLevel, mSpam, mPhishing, mMuted, mAccountUri, mConversationInfo,
592edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                    mConversationBaseUri, mIsRemote, mAttachmentPreviewUri0, mAttachmentPreviewUri1,
593edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                    mAttachmentPreviewStates, mAttachmentPreviewsCount);
594edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        }
595ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook    }
596ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook
5971367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook    private static final Bundle CONVERSATION_INFO_REQUEST;
5981367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook    private static final Bundle RAW_FOLDERS_REQUEST;
5991367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook
6001367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook    static {
6011367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook        RAW_FOLDERS_REQUEST = new Bundle(2);
6021367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook        RAW_FOLDERS_REQUEST.putBoolean(
6031367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook                ConversationCursorCommand.COMMAND_GET_RAW_FOLDERS, true);
6041367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook        RAW_FOLDERS_REQUEST.putInt(
6051367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook                ConversationCursorCommand.COMMAND_KEY_OPTIONS,
6061367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook                ConversationCursorCommand.OPTION_MOVE_POSITION);
6071367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook
6081367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook        CONVERSATION_INFO_REQUEST = new Bundle(2);
6091367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook        CONVERSATION_INFO_REQUEST.putBoolean(
6101367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook                ConversationCursorCommand.COMMAND_GET_CONVERSATION_INFO, true);
6111367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook        CONVERSATION_INFO_REQUEST.putInt(
6121367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook                ConversationCursorCommand.COMMAND_KEY_OPTIONS,
6131367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook                ConversationCursorCommand.OPTION_MOVE_POSITION);
6141367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook    }
6157f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang
6167f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang    private static ConversationInfo readConversationInfo(Cursor cursor) {
6177f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang        final ConversationInfo ci;
6187f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang
619f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang        if (cursor instanceof ConversationCursor) {
620f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang            final byte[] blob = ((ConversationCursor) cursor).getCachedBlob(
621f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang                    UIProvider.CONVERSATION_INFO_COLUMN);
622f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang            if (blob != null && blob.length > 0) {
623f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang                return ConversationInfo.fromBlob(blob);
624f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang            }
625f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang        }
626f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang
6271367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook        final Bundle response = cursor.respond(CONVERSATION_INFO_REQUEST);
6281367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook        if (response.containsKey(ConversationCursorCommand.COMMAND_GET_CONVERSATION_INFO)) {
6291367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook            ci = response.getParcelable(ConversationCursorCommand.COMMAND_GET_CONVERSATION_INFO);
6307f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang        } else {
6317f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang            // legacy fallback
6327f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang            ci = ConversationInfo.fromBlob(cursor.getBlob(UIProvider.CONVERSATION_INFO_COLUMN));
6337f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang        }
6347f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang        return ci;
6357f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang    }
6367f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang
6377f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang    private static FolderList readRawFolders(Cursor cursor) {
6387f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang        final FolderList fl;
6397f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang
640f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang        if (cursor instanceof ConversationCursor) {
641f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang            final byte[] blob = ((ConversationCursor) cursor).getCachedBlob(
642f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang                    UIProvider.CONVERSATION_RAW_FOLDERS_COLUMN);
643f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang            if (blob != null && blob.length > 0) {
644f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang                return FolderList.fromBlob(blob);
645f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang            }
646f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang        }
647f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang
6481367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook        final Bundle response = cursor.respond(RAW_FOLDERS_REQUEST);
6491367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook        if (response.containsKey(ConversationCursorCommand.COMMAND_GET_RAW_FOLDERS)) {
6501367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook            fl = response.getParcelable(ConversationCursorCommand.COMMAND_GET_RAW_FOLDERS);
6517f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang        } else {
6527f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang            // legacy fallback
653db5356a92ebc593e9eb564aaadad8dac8cd83554Paul Westbrook            // TODO: delete this once Email supports the respond call
6547f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang            fl = FolderList.fromBlob(
6557f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang                    cursor.getBlob(UIProvider.CONVERSATION_RAW_FOLDERS_COLUMN));
6567f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang        }
6577f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang        return fl;
6587f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang    }
6597f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang
660b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang    /**
6611bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang     * Apply any column values from the given {@link ContentValues} (where column names are the
6621bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang     * keys) to this conversation.
6631bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang     *
6641bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang     */
6651bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang    public void applyCachedValues(ContentValues values) {
6661bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        if (values == null) {
6671bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang            return;
6681bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        }
6691bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        for (String key : values.keySet()) {
6701bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang            final Object val = values.get(key);
6711bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang            LogUtils.i(LOG_TAG, "Conversation: applying cached value to col=%s val=%s", key,
6721bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang                    val);
6731bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang            if (ConversationColumns.READ.equals(key)) {
6741bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang                read = (Integer) val != 0;
6751bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang            } else if (ConversationColumns.CONVERSATION_INFO.equals(key)) {
676edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                final ConversationInfo cachedCi = ConversationInfo.fromBlob((byte[]) val);
677edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                if (cachedCi == null) {
678edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                    LogUtils.d(LOG_TAG, "Null ConversationInfo in applyCachedValues");
679edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                } else {
680edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                    conversationInfo.overwriteWith(cachedCi);
681edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                }
6821bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang            } else if (ConversationColumns.FLAGS.equals(key)) {
6831bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang                convFlags = (Integer) val;
6841bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang            } else if (ConversationColumns.STARRED.equals(key)) {
6851bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang                starred = (Integer) val != 0;
6867f4b6140b40c1d1d2624ca1dabe229fbb5c6959aAndy Huang            } else if (ConversationColumns.SEEN.equals(key)) {
6877f4b6140b40c1d1d2624ca1dabe229fbb5c6959aAndy Huang                seen = (Integer) val != 0;
6888ebc2ce34ed7d979662cf88b1c9fa60d63142fe4Andy Huang            } else if (ConversationColumns.RAW_FOLDERS.equals(key)) {
6898ebc2ce34ed7d979662cf88b1c9fa60d63142fe4Andy Huang                rawFolders = FolderList.fromBlob((byte[]) val);
6901bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang            } else if (ConversationColumns.VIEWED.equals(key)) {
6911bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang                // ignore. this is not read from the cursor, either.
6921bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang            } else {
6931bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang                LogUtils.e(LOG_TAG, new UnsupportedOperationException(),
6941bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang                        "unsupported cached conv value in col=%s", key);
6951bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang            }
6961bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang        }
6971bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang    }
6981bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang
6991bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang    /**
700b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang     * Get the <strong>immutable</strong> list of {@link Folder}s for this conversation. To modify
701b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang     * this list, make a new {@link FolderList} and use {@link #setRawFolders(FolderList)}.
702b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang     *
703b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang     * @return <strong>Immutable</strong> list of {@link Folder}s.
704b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang     */
705b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang    public List<Folder> getRawFolders() {
706b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang        return rawFolders.folders;
70700ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira    }
70800ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira
709b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang    public void setRawFolders(FolderList folders) {
710b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang        rawFolders = folders;
71185c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira    }
71285c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira
713e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    @Override
714e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    public boolean equals(Object o) {
7153c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank        if (o instanceof Conversation) {
716648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira            Conversation conv = (Conversation) o;
7173c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank            return conv.uri.equals(uri);
7183c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank        }
7193c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank        return false;
720e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    }
721e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank
722e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    @Override
723e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    public int hashCode() {
724e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank        return uri.hashCode();
725e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    }
726e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank
7277f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira    /**
7287f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira     * Get if this conversation is marked as high priority.
7297f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira     */
7307f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira    public boolean isImportant() {
73122657529437c160dec072115c5982409306c1313Mindy Pereira        return priority == UIProvider.ConversationPriority.IMPORTANT;
7327f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira    }
7337f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira
734e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    /**
735e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank     * Get if this conversation is mostly dead
736e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank     */
737e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    public boolean isMostlyDead() {
738e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank        return (convFlags & FLAG_MOSTLY_DEAD) != 0;
739e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    }
740440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal
741440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    /**
742648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira     * Returns true if the URI of the conversation specified as the needle was
743648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira     * found in the collection of conversations specified as the haystack. False
744192fac189e6aed434556a4e37bd3c5c29ef02f29Vikram Aggarwal     * otherwise. This method is safe to call with null arguments.
745f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang     *
746d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * @param haystack
747d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * @param needle
748d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * @return true if the needle was found in the haystack, false otherwise.
749d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     */
750d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal    public final static boolean contains(Collection<Conversation> haystack, Conversation needle) {
751d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        // If the haystack is empty, it cannot contain anything.
752d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        if (haystack == null || haystack.size() <= 0) {
753d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal            return false;
754d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        }
755d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        // The null folder exists everywhere.
756d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        if (needle == null) {
757d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal            return true;
758d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        }
7597dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        final long toFind = needle.id;
760d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        for (final Conversation c : haystack) {
7617dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal            if (toFind == c.id) {
762d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal                return true;
763d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal            }
764d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        }
765d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        return false;
766d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal    }
767d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal
768d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal    /**
769648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira     * Returns a collection of a single conversation. This method always returns
770648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira     * a valid collection even if the input conversation is null.
771f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang     *
772440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal     * @param in a conversation, possibly null.
773440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal     * @return a collection of the conversation.
774440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal     */
775440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    public static Collection<Conversation> listOf(Conversation in) {
776440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal        final Collection<Conversation> target = (in == null) ? EMPTY : ImmutableList.of(in);
777440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal        return target;
778440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    }
7797dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal
7807dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal    /**
781edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler     * Get the snippet for this conversation.
782aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira     */
783aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira    public String getSnippet() {
784edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        return !TextUtils.isEmpty(conversationInfo.firstSnippet) ?
785edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler                conversationInfo.firstSnippet : "";
786aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira    }
787aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira
788aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira    /**
7890972e0793cc321670391d063348aecb5031b2677Mindy Pereira     * Get the number of messages for this conversation.
7900972e0793cc321670391d063348aecb5031b2677Mindy Pereira     */
7910972e0793cc321670391d063348aecb5031b2677Mindy Pereira    public int getNumMessages() {
792edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        return conversationInfo.messageCount;
7930972e0793cc321670391d063348aecb5031b2677Mindy Pereira    }
7940972e0793cc321670391d063348aecb5031b2677Mindy Pereira
7950972e0793cc321670391d063348aecb5031b2677Mindy Pereira    /**
7960972e0793cc321670391d063348aecb5031b2677Mindy Pereira     * Get the number of drafts for this conversation.
7970972e0793cc321670391d063348aecb5031b2677Mindy Pereira     */
7980972e0793cc321670391d063348aecb5031b2677Mindy Pereira    public int numDrafts() {
799edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler        return conversationInfo.draftCount;
8000972e0793cc321670391d063348aecb5031b2677Mindy Pereira    }
8010972e0793cc321670391d063348aecb5031b2677Mindy Pereira
802cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang    public boolean isViewed() {
803cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang        return viewed;
804cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang    }
805cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang
806cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang    public void markViewed() {
807cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang        viewed = true;
808cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang    }
809cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang
810c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang    public String getBaseUri(String defaultValue) {
811c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang        return conversationBaseUri != null ? conversationBaseUri.toString() : defaultValue;
812c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang    }
813c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang
814479505d71969e26b0785d8e0e1b81108731cf827Mark Wei    public ArrayList<String> getAttachmentPreviewUris() {
815479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        if (attachmentPreviews == null) {
816479505d71969e26b0785d8e0e1b81108731cf827Mark Wei            attachmentPreviews = Lists.newArrayListWithCapacity(2);
817479505d71969e26b0785d8e0e1b81108731cf827Mark Wei            if (!TextUtils.isEmpty(attachmentPreviewUri0)) {
818479505d71969e26b0785d8e0e1b81108731cf827Mark Wei                attachmentPreviews.add(attachmentPreviewUri0);
819479505d71969e26b0785d8e0e1b81108731cf827Mark Wei            }
820479505d71969e26b0785d8e0e1b81108731cf827Mark Wei            if (!TextUtils.isEmpty(attachmentPreviewUri1)) {
821479505d71969e26b0785d8e0e1b81108731cf827Mark Wei                attachmentPreviews.add(attachmentPreviewUri1);
822479505d71969e26b0785d8e0e1b81108731cf827Mark Wei            }
823479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        }
824479505d71969e26b0785d8e0e1b81108731cf827Mark Wei        return attachmentPreviews;
825d198fa7ddb2d0c730847af34f06aa2e940b2537dMark Wei    }
826d198fa7ddb2d0c730847af34f06aa2e940b2537dMark Wei
8270972e0793cc321670391d063348aecb5031b2677Mindy Pereira    /**
8287dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal     * Create a human-readable string of all the conversations
8297dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal     * @param collection Any collection of conversations
8307dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal     * @return string with a human readable representation of the conversations.
8317dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal     */
8327dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal    public static String toString(Collection<Conversation> collection) {
8337dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        final StringBuilder out = new StringBuilder(collection.size() + " conversations:");
8347dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        int count = 0;
8357dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        for (final Conversation c : collection) {
8367dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal            count++;
837648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira            // Indent the conversations to make them easy to read in debug
838648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira            // output.
8397dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal            out.append("      " + count + ": " + c.toString() + "\n");
8407dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        }
8417dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        return out.toString();
8427dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal    }
843820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook
844820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook    /**
845820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook     * Returns an empty string if the specified string is null
846820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook     */
847820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook    private static String emptyIfNull(String in) {
848820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook        return in != null ? in : EMPTY_STRING;
849820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook    }
850bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereira
851bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereira    /**
852f2caf91209e4e2d4182d6b379a3cd79eed81af71mindyp     * Get the properly formatted subject and snippet string for display a
853f2caf91209e4e2d4182d6b379a3cd79eed81af71mindyp     * conversation.
854f2caf91209e4e2d4182d6b379a3cd79eed81af71mindyp     *
855f2caf91209e4e2d4182d6b379a3cd79eed81af71mindyp     * @param context
856f2caf91209e4e2d4182d6b379a3cd79eed81af71mindyp     * @param filteredSubject
857f2caf91209e4e2d4182d6b379a3cd79eed81af71mindyp     * @param snippet
858bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereira     */
859c046e4a310462aa6998a34ff50439eb5e2508d85mindyp    public static String getSubjectAndSnippetForDisplay(Context context,
860c046e4a310462aa6998a34ff50439eb5e2508d85mindyp            String filteredSubject, String snippet) {
8612909b7442130800d6c6c20c1227d65295262f03emindyp        if (sSubjectAndSnippet == null) {
8622909b7442130800d6c6c20c1227d65295262f03emindyp            sSubjectAndSnippet = context.getString(R.string.subject_and_snippet);
8632909b7442130800d6c6c20c1227d65295262f03emindyp        }
86461bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy        if (TextUtils.isEmpty(filteredSubject) && TextUtils.isEmpty(snippet)) {
86561bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy            return "";
86661bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy        } else if (TextUtils.isEmpty(filteredSubject)) {
86761bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy            return snippet;
86861bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy        } else if (TextUtils.isEmpty(snippet)) {
86961bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy            return filteredSubject;
87061bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy        }
87161bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy
87261bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy        return String.format(sSubjectAndSnippet, filteredSubject, snippet);
873bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereira    }
8745f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy
8755f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy    /**
8765f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy     * Public object that knows how to construct Conversation given Cursors. This is not used by
8775f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy     * {@link ConversationCursor} or {@link ConversationCursorLoader}.
8785f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy     */
8795f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy    public static final CursorCreator<Conversation> FACTORY = new CursorCreator<Conversation>() {
8805f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy        @Override
8815f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy        public Conversation createFromCursor(final Cursor c) {
8825f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy            return new Conversation(c);
8835f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy        }
8845f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy
8855f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy        @Override
8865f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy        public String toString() {
8875f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy            return "Conversation CursorCreator";
8885f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy        }
8895f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy    };
890648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira}
891