Conversation.java revision 76b2062b8c6d18a7b3a05292c385b47b0fcbd09f
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
19732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.database.Cursor;
20732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.net.Uri;
21732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.os.Parcel;
22732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.os.Parcelable;
23e623a0f6e3caa9cafec913cf826e946628833517Andy Huangimport android.provider.BaseColumns;
245c765b9c5dd8a9a9421260ba8b46d06073391c73Mindy Pereiraimport android.text.TextUtils;
25732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
26a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blankimport com.google.common.collect.ImmutableList;
27a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank
28440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwalimport java.util.Collection;
29440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwalimport java.util.Collections;
30440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal
31732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangpublic class Conversation implements Parcelable {
32f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank    public static final int NO_POSITION = -1;
33732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
34e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
35e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see BaseColumns#_ID
36e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
37732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public long id;
38e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
39e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#URI
40e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
41c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank    public Uri uri;
42e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
43e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#SUBJECT
44e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
45732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public String subject;
46e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
47e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#DATE_RECEIVED_MS
48e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
49732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public long dateMs;
50e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
51e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#SNIPPET
52e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
53732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public String snippet;
54e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
55e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#HAS_ATTACHMENTS
56e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
57732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public boolean hasAttachments;
58e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
59e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#MESSAGE_LIST_URI
60e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
61cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira    public Uri messageListUri;
62e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
63e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#SENDER_INFO
64e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
654db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira    public String senders;
66e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
67e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#NUM_MESSAGES
68e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
694db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira    public int numMessages;
70e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
71e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#NUM_DRAFTS
72e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
734db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira    public int numDrafts;
74e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
75e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#SENDING_STATE
76e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
774db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira    public int sendingState;
78e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
79e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#PRIORITY
80e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
814db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira    public int priority;
82e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
83e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#READ
84e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
85c8a994227b9c686d88ee05840544162711a85712Marc Blank    public boolean read;
86e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
87e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#STARRED
88e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
89c8a994227b9c686d88ee05840544162711a85712Marc Blank    public boolean starred;
90e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
91e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#FOLDER_LIST
92e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
93ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank    public String folderList;
94e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
95e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#RAW_FOLDERS
96e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
97cc8211df898ba9dac17a766b89f28d6e6f0afef0Mindy Pereira    public String rawFolders;
98e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
99e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#FLAGS
100e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
10122657529437c160dec072115c5982409306c1313Mindy Pereira    public int convFlags;
102e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
103e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#PERSONAL_LEVEL
104e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
10522657529437c160dec072115c5982409306c1313Mindy Pereira    public int personalLevel;
106e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
107e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#SPAM
108e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
109863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira    public boolean spam;
110e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
111e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#MUTED
112e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
113863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira    public boolean muted;
114e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
11576b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook     * @see UIProvider.ConversationColumns#PHISHING
11676b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook     */
11776b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook    public boolean phishing;
11876b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook    /**
119e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#COLOR
120e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
12192939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank    public int color;
122e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
123e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#ACCOUNT_URI
124e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
125a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank    public Uri accountUri;
12622657529437c160dec072115c5982409306c1313Mindy Pereira
127ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank    // Used within the UI to indicate the adapter position of this conversation
128f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank    public transient int position;
129ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank    // Used within the UI to indicate that a Conversation should be removed from the
130ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank    // ConversationCursor when executing an update, e.g. the the Conversation is no longer
131ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank    // in the ConversationList for the current folder, that is it's now in some other folder(s)
132ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank    public transient boolean localDeleteOnUpdate;
133732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
134e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    // Constituents of convFlags below
135e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    // Flag indicating that the item has been deleted, but will continue being shown in the list
136e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    // Delete/Archive of a mostly-dead item will NOT propagate the delete/archive, but WILL remove
137e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    // the item from the cursor
138e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    public static final int FLAG_MOSTLY_DEAD = 1 << 0;
139e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank
140440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    /** An immutable, empty conversation list */
141440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    public static final Collection<Conversation> EMPTY = Collections.emptyList();
142440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal
143732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    @Override
144732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public int describeContents() {
145732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        return 0;
146732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
147732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
148732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    @Override
149732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public void writeToParcel(Parcel dest, int flags) {
150732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dest.writeLong(id);
151c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank        dest.writeParcelable(uri, flags);
152732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dest.writeString(subject);
153732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dest.writeLong(dateMs);
154732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dest.writeString(snippet);
155732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dest.writeByte(hasAttachments ? (byte) 1 : 0);
156cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira        dest.writeParcelable(messageListUri, 0);
1574db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        dest.writeString(senders);
1584db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        dest.writeInt(numMessages);
1594db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        dest.writeInt(numDrafts);
1604db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        dest.writeInt(sendingState);
1614db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        dest.writeInt(priority);
162c8a994227b9c686d88ee05840544162711a85712Marc Blank        dest.writeByte(read ? (byte) 1 : 0);
163c8a994227b9c686d88ee05840544162711a85712Marc Blank        dest.writeByte(starred ? (byte) 1 : 0);
164ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank        dest.writeString(folderList);
165cc8211df898ba9dac17a766b89f28d6e6f0afef0Mindy Pereira        dest.writeString(rawFolders);
16622657529437c160dec072115c5982409306c1313Mindy Pereira        dest.writeInt(convFlags);
16722657529437c160dec072115c5982409306c1313Mindy Pereira        dest.writeInt(personalLevel);
168863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        dest.writeInt(spam ? 1 : 0);
16976b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook        dest.writeInt(phishing ? 1 : 0);
170863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        dest.writeInt(muted ? 1 : 0);
17192939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank        dest.writeInt(color);
172a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank        dest.writeParcelable(accountUri, 0);
173732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
174732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
175732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    private Conversation(Parcel in) {
176732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        id = in.readLong();
177c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank        uri = in.readParcelable(null);
178732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        subject = in.readString();
179732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dateMs = in.readLong();
180732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        snippet = in.readString();
181732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        hasAttachments = (in.readByte() != 0);
182cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira        messageListUri = in.readParcelable(null);
1834db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        senders = in.readString();
1844db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        numMessages = in.readInt();
1854db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        numDrafts = in.readInt();
1864db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        sendingState = in.readInt();
1874db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        priority = in.readInt();
188c8a994227b9c686d88ee05840544162711a85712Marc Blank        read = (in.readByte() != 0);
189c8a994227b9c686d88ee05840544162711a85712Marc Blank        starred = (in.readByte() != 0);
190ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank        folderList = in.readString();
191cc8211df898ba9dac17a766b89f28d6e6f0afef0Mindy Pereira        rawFolders = in.readString();
19222657529437c160dec072115c5982409306c1313Mindy Pereira        convFlags = in.readInt();
19322657529437c160dec072115c5982409306c1313Mindy Pereira        personalLevel = in.readInt();
194863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        spam = in.readInt() != 0;
19576b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook        phishing = in.readInt() != 0;
196863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        muted = in.readInt() != 0;
19792939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank        color = in.readInt();
198a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank        accountUri = in.readParcelable(null);
199f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank        position = NO_POSITION;
200ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank        localDeleteOnUpdate = false;
201732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
202732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
203732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    @Override
204732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public String toString() {
2057dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        return "[conversation id=" + id + ", subject =" + subject + "]";
206732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
207732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
208732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public static final Creator<Conversation> CREATOR = new Creator<Conversation>() {
209732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
210732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        @Override
211732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        public Conversation createFromParcel(Parcel source) {
212732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang            return new Conversation(source);
213732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        }
214732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
215732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        @Override
216732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        public Conversation[] newArray(int size) {
217732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang            return new Conversation[size];
218732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        }
219732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
220732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    };
221732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
222acf6039a23382f18c35f6b487d90d53cb67b5858Mindy Pereira    public static final Uri MOVE_CONVERSATIONS_URI = Uri.parse("content://moveconversations");
223acf6039a23382f18c35f6b487d90d53cb67b5858Mindy Pereira
224a831b2f1ba6d3c18d5e54563df8bae1f589c4257Mindy Pereira    public Conversation(Cursor cursor) {
225732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        if (cursor != null) {
226732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang            id = cursor.getLong(UIProvider.CONVERSATION_ID_COLUMN);
227c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank            uri = Uri.parse(cursor.getString(UIProvider.CONVERSATION_URI_COLUMN));
228732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang            dateMs = cursor.getLong(UIProvider.CONVERSATION_DATE_RECEIVED_MS_COLUMN);
229732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang            subject = cursor.getString(UIProvider.CONVERSATION_SUBJECT_COLUMN);
230374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank            // Don't allow null subject
231374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank            if (subject == null) {
232374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank                subject = "";
233374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank            }
234732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang            snippet = cursor.getString(UIProvider.CONVERSATION_SNIPPET_COLUMN);
23587d535fe423d782c3a0343c649330d309976f655Mindy Pereira            hasAttachments = cursor.getInt(UIProvider.CONVERSATION_HAS_ATTACHMENTS_COLUMN) != 0;
2365c765b9c5dd8a9a9421260ba8b46d06073391c73Mindy Pereira            String messageList = cursor
2375c765b9c5dd8a9a9421260ba8b46d06073391c73Mindy Pereira                    .getString(UIProvider.CONVERSATION_MESSAGE_LIST_URI_COLUMN);
2385c765b9c5dd8a9a9421260ba8b46d06073391c73Mindy Pereira            messageListUri = !TextUtils.isEmpty(messageList) ? Uri.parse(messageList) : null;
2394db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira            senders = cursor.getString(UIProvider.CONVERSATION_SENDER_INFO_COLUMN);
2404db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira            numMessages = cursor.getInt(UIProvider.CONVERSATION_NUM_MESSAGES_COLUMN);
2414db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira            numDrafts = cursor.getInt(UIProvider.CONVERSATION_NUM_DRAFTS_COLUMN);
2424db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira            sendingState = cursor.getInt(UIProvider.CONVERSATION_SENDING_STATE_COLUMN);
2434db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira            priority = cursor.getInt(UIProvider.CONVERSATION_PRIORITY_COLUMN);
24487d535fe423d782c3a0343c649330d309976f655Mindy Pereira            read = cursor.getInt(UIProvider.CONVERSATION_READ_COLUMN) != 0;
24587d535fe423d782c3a0343c649330d309976f655Mindy Pereira            starred = cursor.getInt(UIProvider.CONVERSATION_STARRED_COLUMN) != 0;
246ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank            folderList = cursor.getString(UIProvider.CONVERSATION_FOLDER_LIST_COLUMN);
247cc8211df898ba9dac17a766b89f28d6e6f0afef0Mindy Pereira            rawFolders = cursor.getString(UIProvider.CONVERSATION_RAW_FOLDERS_COLUMN);
24822657529437c160dec072115c5982409306c1313Mindy Pereira            convFlags = cursor.getInt(UIProvider.CONVERSATION_FLAGS_COLUMN);
24922657529437c160dec072115c5982409306c1313Mindy Pereira            personalLevel = cursor.getInt(UIProvider.CONVERSATION_PERSONAL_LEVEL_COLUMN);
250863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira            spam = cursor.getInt(UIProvider.CONVERSATION_IS_SPAM_COLUMN) != 0;
25176b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook            phishing = cursor.getInt(UIProvider.CONVERSATION_IS_PHISHING_COLUMN) != 0;
252863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira            muted = cursor.getInt(UIProvider.CONVERSATION_MUTED_COLUMN) != 0;
25392939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank            color = cursor.getInt(UIProvider.CONVERSATION_COLOR_COLUMN);
254a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank            String account = cursor.getString(UIProvider.CONVERSATION_ACCOUNT_URI_COLUMN);
255a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank            accountUri = !TextUtils.isEmpty(account) ? Uri.parse(account) : null;
256f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank            position = NO_POSITION;
257ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank            localDeleteOnUpdate = false;
258732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        }
259732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
260732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
261bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook    public Conversation() {
262ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook    }
263ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook
264863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira    public static Conversation create(long id, Uri uri, String subject, long dateMs,
265863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira            String snippet, boolean hasAttachment, Uri messageListUri, String senders,
266863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira            int numMessages, int numDrafts, int sendingState, int priority, boolean read,
267863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira            boolean starred, String folderList, String rawFolders, int convFlags,
26876b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook            int personalLevel, boolean spam, boolean phishing, boolean muted, Uri accountUri) {
269ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook
270ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        final Conversation conversation = new Conversation();
271ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook
272ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.id = id;
273ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.uri = uri;
274ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.subject = subject;
275ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.dateMs = dateMs;
276ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.snippet = snippet;
277ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.hasAttachments = hasAttachment;
278ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.messageListUri = messageListUri;
279ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.senders = senders;
280ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.numMessages = numMessages;
281ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.numDrafts = numDrafts;
282ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.sendingState = sendingState;
283ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.priority = priority;
284ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.read = read;
285ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.starred = starred;
286ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.folderList = folderList;
287ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.rawFolders = rawFolders;
288ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.convFlags = convFlags;
289ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.personalLevel = personalLevel;
290863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        conversation.spam = spam;
29176b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook        conversation.phishing = phishing;
292863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        conversation.muted = muted;
29392939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank        conversation.color = 0;
294a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank        conversation.accountUri = accountUri;
295ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        return conversation;
296ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook    }
297ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook
298e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    @Override
299e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    public boolean equals(Object o) {
3003c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank        if (o instanceof Conversation) {
3013c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank            Conversation conv = (Conversation)o;
3023c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank            return conv.uri.equals(uri);
3033c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank        }
3043c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank        return false;
305e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    }
306e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank
307e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    @Override
308e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    public int hashCode() {
309e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank        return uri.hashCode();
310e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    }
311e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank
3127f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira    /**
3137f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira     * Get if this conversation is marked as high priority.
3147f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira     */
3157f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira    public boolean isImportant() {
31622657529437c160dec072115c5982409306c1313Mindy Pereira        return priority == UIProvider.ConversationPriority.IMPORTANT;
3177f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira    }
3187f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira
319e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    /**
320e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank     * Get if this conversation is mostly dead
321e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank     */
322e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    public boolean isMostlyDead() {
323e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank        return (convFlags & FLAG_MOSTLY_DEAD) != 0;
324e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    }
325440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal
326440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    /**
327d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * Returns true if the URI of the conversation specified as the needle was found in the
328d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * collection of conversations specified as the haystack. False otherwise. This method is safe
329d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * to call with nullarguments.
330d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * @param haystack
331d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * @param needle
332d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * @return true if the needle was found in the haystack, false otherwise.
333d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     */
334d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal    public final static boolean contains(Collection<Conversation> haystack, Conversation needle) {
335d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        // If the haystack is empty, it cannot contain anything.
336d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        if (haystack == null || haystack.size() <= 0) {
337d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal            return false;
338d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        }
339d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        // The null folder exists everywhere.
340d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        if (needle == null) {
341d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal            return true;
342d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        }
3437dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        final long toFind = needle.id;
344d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        for (final Conversation c : haystack) {
3457dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal            if (toFind == c.id) {
346d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal                return true;
347d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal            }
348d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        }
349d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        return false;
350d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal    }
351d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal
352d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal    /**
353440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal     * Returns a collection of a single conversation. This method always returns a valid collection
354440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal     * even if the input conversation is null.
355440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal     * @param in a conversation, possibly null.
356440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal     * @return a collection of the conversation.
357440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal     */
358440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    public static Collection<Conversation> listOf(Conversation in) {
359440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal        final Collection<Conversation> target = (in == null) ? EMPTY : ImmutableList.of(in);
360440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal        return target;
361440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    }
3627dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal
3637dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal    /**
3647dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal     * Create a human-readable string of all the conversations
3657dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal     * @param collection Any collection of conversations
3667dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal     * @return string with a human readable representation of the conversations.
3677dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal     */
3687dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal    public static String toString(Collection<Conversation> collection) {
3697dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        final StringBuilder out = new StringBuilder(collection.size() + " conversations:");
3707dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        int count = 0;
3717dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        for (final Conversation c : collection) {
3727dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal            count++;
3737dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal            // Indent the conversations to make them easy to read in debug output.
3747dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal            out.append("      " + count + ": " + c.toString() + "\n");
3757dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        }
3767dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        return out.toString();
3777dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal    }
3781b9efd9beb715927e0db7b138ddbb2925bc2c06fMarc Blank}