Conversation.java revision ebdfd98264104cb5a6888acd663970b7c0b31382
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
26ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereiraimport com.android.mail.providers.UIProvider.ConversationColumns;
27a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blankimport com.google.common.collect.ImmutableList;
28a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank
29440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwalimport java.util.Collection;
30440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwalimport java.util.Collections;
31440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal
32732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangpublic class Conversation implements Parcelable {
33f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank    public static final int NO_POSITION = -1;
34732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
35e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
36e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see BaseColumns#_ID
37e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
38732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public long id;
39e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
40e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#URI
41e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
42c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank    public Uri uri;
43e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
44e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#SUBJECT
45e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
46732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public String subject;
47e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
48e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#DATE_RECEIVED_MS
49e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
50732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public long dateMs;
51e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
52e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#SNIPPET
53e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
54732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public String snippet;
55e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
56e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#HAS_ATTACHMENTS
57e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
58732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public boolean hasAttachments;
59e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
60e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#MESSAGE_LIST_URI
61e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
62cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira    public Uri messageListUri;
63e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
64e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#SENDER_INFO
65e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
664db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira    public String senders;
67e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
68e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#NUM_MESSAGES
69e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
704db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira    public int numMessages;
71e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
72e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#NUM_DRAFTS
73e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
744db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira    public int numDrafts;
75e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
76e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#SENDING_STATE
77e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
784db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira    public int sendingState;
79e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
80e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#PRIORITY
81e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
824db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira    public int priority;
83e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
84e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#READ
85e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
86c8a994227b9c686d88ee05840544162711a85712Marc Blank    public boolean read;
87e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
88e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#STARRED
89e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
90c8a994227b9c686d88ee05840544162711a85712Marc Blank    public boolean starred;
91e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
92e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#FOLDER_LIST
93e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
94ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank    public String folderList;
95e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
96e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#RAW_FOLDERS
97e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
98cc8211df898ba9dac17a766b89f28d6e6f0afef0Mindy Pereira    public String rawFolders;
99e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
100e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#FLAGS
101e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
10222657529437c160dec072115c5982409306c1313Mindy Pereira    public int convFlags;
103e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
104e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#PERSONAL_LEVEL
105e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
10622657529437c160dec072115c5982409306c1313Mindy Pereira    public int personalLevel;
107e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
108e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#SPAM
109e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
110863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira    public boolean spam;
111e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
112e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#MUTED
113e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
114863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira    public boolean muted;
115e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
11676b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook     * @see UIProvider.ConversationColumns#PHISHING
11776b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook     */
11876b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook    public boolean phishing;
11976b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook    /**
120e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#COLOR
121e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
12292939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank    public int color;
123e623a0f6e3caa9cafec913cf826e946628833517Andy Huang    /**
124e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     * @see UIProvider.ConversationColumns#ACCOUNT_URI
125e623a0f6e3caa9cafec913cf826e946628833517Andy Huang     */
126a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank    public Uri accountUri;
12722657529437c160dec072115c5982409306c1313Mindy Pereira
128ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank    // Used within the UI to indicate the adapter position of this conversation
129f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank    public transient int position;
130ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank    // Used within the UI to indicate that a Conversation should be removed from the
131ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank    // ConversationCursor when executing an update, e.g. the the Conversation is no longer
132ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank    // in the ConversationList for the current folder, that is it's now in some other folder(s)
133ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank    public transient boolean localDeleteOnUpdate;
134732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
135e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    // Constituents of convFlags below
136e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    // Flag indicating that the item has been deleted, but will continue being shown in the list
137e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    // Delete/Archive of a mostly-dead item will NOT propagate the delete/archive, but WILL remove
138e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    // the item from the cursor
139e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    public static final int FLAG_MOSTLY_DEAD = 1 << 0;
140e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank
141440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    /** An immutable, empty conversation list */
142440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    public static final Collection<Conversation> EMPTY = Collections.emptyList();
143440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal
144732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    @Override
145732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public int describeContents() {
146732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        return 0;
147732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
148732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
149732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    @Override
150732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public void writeToParcel(Parcel dest, int flags) {
151732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dest.writeLong(id);
152c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank        dest.writeParcelable(uri, flags);
153732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dest.writeString(subject);
154732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dest.writeLong(dateMs);
155732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dest.writeString(snippet);
156732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dest.writeByte(hasAttachments ? (byte) 1 : 0);
157cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira        dest.writeParcelable(messageListUri, 0);
1584db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        dest.writeString(senders);
1594db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        dest.writeInt(numMessages);
1604db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        dest.writeInt(numDrafts);
1614db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        dest.writeInt(sendingState);
1624db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        dest.writeInt(priority);
163c8a994227b9c686d88ee05840544162711a85712Marc Blank        dest.writeByte(read ? (byte) 1 : 0);
164c8a994227b9c686d88ee05840544162711a85712Marc Blank        dest.writeByte(starred ? (byte) 1 : 0);
165ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank        dest.writeString(folderList);
166cc8211df898ba9dac17a766b89f28d6e6f0afef0Mindy Pereira        dest.writeString(rawFolders);
16722657529437c160dec072115c5982409306c1313Mindy Pereira        dest.writeInt(convFlags);
16822657529437c160dec072115c5982409306c1313Mindy Pereira        dest.writeInt(personalLevel);
169863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        dest.writeInt(spam ? 1 : 0);
17076b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook        dest.writeInt(phishing ? 1 : 0);
171863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        dest.writeInt(muted ? 1 : 0);
17292939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank        dest.writeInt(color);
173a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank        dest.writeParcelable(accountUri, 0);
174732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
175732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
176732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    private Conversation(Parcel in) {
177732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        id = in.readLong();
178c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank        uri = in.readParcelable(null);
179732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        subject = in.readString();
180732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dateMs = in.readLong();
181732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        snippet = in.readString();
182732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        hasAttachments = (in.readByte() != 0);
183cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira        messageListUri = in.readParcelable(null);
1844db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        senders = in.readString();
1854db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        numMessages = in.readInt();
1864db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        numDrafts = in.readInt();
1874db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        sendingState = in.readInt();
1884db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        priority = in.readInt();
189c8a994227b9c686d88ee05840544162711a85712Marc Blank        read = (in.readByte() != 0);
190c8a994227b9c686d88ee05840544162711a85712Marc Blank        starred = (in.readByte() != 0);
191ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank        folderList = in.readString();
192cc8211df898ba9dac17a766b89f28d6e6f0afef0Mindy Pereira        rawFolders = in.readString();
19322657529437c160dec072115c5982409306c1313Mindy Pereira        convFlags = in.readInt();
19422657529437c160dec072115c5982409306c1313Mindy Pereira        personalLevel = in.readInt();
195863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        spam = in.readInt() != 0;
19676b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook        phishing = in.readInt() != 0;
197863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        muted = in.readInt() != 0;
19892939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank        color = in.readInt();
199a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank        accountUri = in.readParcelable(null);
200f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank        position = NO_POSITION;
201ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank        localDeleteOnUpdate = false;
202732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
203732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
204732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    @Override
205732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public String toString() {
2067dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        return "[conversation id=" + id + ", subject =" + subject + "]";
207732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
208732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
209732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public static final Creator<Conversation> CREATOR = new Creator<Conversation>() {
210732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
211732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        @Override
212732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        public Conversation createFromParcel(Parcel source) {
213732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang            return new Conversation(source);
214732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        }
215732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
216732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        @Override
217732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        public Conversation[] newArray(int size) {
218732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang            return new Conversation[size];
219732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        }
220732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
221732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    };
222732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
223acf6039a23382f18c35f6b487d90d53cb67b5858Mindy Pereira    public static final Uri MOVE_CONVERSATIONS_URI = Uri.parse("content://moveconversations");
224acf6039a23382f18c35f6b487d90d53cb67b5858Mindy Pereira
225ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira    /**
226ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira     * The columns that need to be updated to change the folders for a conversation.
227ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira     */
228ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira    public static final String[] UPDATE_FOLDER_COLUMNS = new String[] {
229ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira            ConversationColumns.FOLDER_LIST, ConversationColumns.RAW_FOLDERS
230ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira    };
231ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira
232a831b2f1ba6d3c18d5e54563df8bae1f589c4257Mindy Pereira    public Conversation(Cursor cursor) {
233732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        if (cursor != null) {
234732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang            id = cursor.getLong(UIProvider.CONVERSATION_ID_COLUMN);
235c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank            uri = Uri.parse(cursor.getString(UIProvider.CONVERSATION_URI_COLUMN));
236732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang            dateMs = cursor.getLong(UIProvider.CONVERSATION_DATE_RECEIVED_MS_COLUMN);
237732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang            subject = cursor.getString(UIProvider.CONVERSATION_SUBJECT_COLUMN);
238374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank            // Don't allow null subject
239374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank            if (subject == null) {
240374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank                subject = "";
241374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank            }
242732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang            snippet = cursor.getString(UIProvider.CONVERSATION_SNIPPET_COLUMN);
24387d535fe423d782c3a0343c649330d309976f655Mindy Pereira            hasAttachments = cursor.getInt(UIProvider.CONVERSATION_HAS_ATTACHMENTS_COLUMN) != 0;
2445c765b9c5dd8a9a9421260ba8b46d06073391c73Mindy Pereira            String messageList = cursor
2455c765b9c5dd8a9a9421260ba8b46d06073391c73Mindy Pereira                    .getString(UIProvider.CONVERSATION_MESSAGE_LIST_URI_COLUMN);
2465c765b9c5dd8a9a9421260ba8b46d06073391c73Mindy Pereira            messageListUri = !TextUtils.isEmpty(messageList) ? Uri.parse(messageList) : null;
2474db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira            senders = cursor.getString(UIProvider.CONVERSATION_SENDER_INFO_COLUMN);
2484db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira            numMessages = cursor.getInt(UIProvider.CONVERSATION_NUM_MESSAGES_COLUMN);
2494db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira            numDrafts = cursor.getInt(UIProvider.CONVERSATION_NUM_DRAFTS_COLUMN);
2504db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira            sendingState = cursor.getInt(UIProvider.CONVERSATION_SENDING_STATE_COLUMN);
2514db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira            priority = cursor.getInt(UIProvider.CONVERSATION_PRIORITY_COLUMN);
25287d535fe423d782c3a0343c649330d309976f655Mindy Pereira            read = cursor.getInt(UIProvider.CONVERSATION_READ_COLUMN) != 0;
25387d535fe423d782c3a0343c649330d309976f655Mindy Pereira            starred = cursor.getInt(UIProvider.CONVERSATION_STARRED_COLUMN) != 0;
254ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank            folderList = cursor.getString(UIProvider.CONVERSATION_FOLDER_LIST_COLUMN);
255cc8211df898ba9dac17a766b89f28d6e6f0afef0Mindy Pereira            rawFolders = cursor.getString(UIProvider.CONVERSATION_RAW_FOLDERS_COLUMN);
25622657529437c160dec072115c5982409306c1313Mindy Pereira            convFlags = cursor.getInt(UIProvider.CONVERSATION_FLAGS_COLUMN);
25722657529437c160dec072115c5982409306c1313Mindy Pereira            personalLevel = cursor.getInt(UIProvider.CONVERSATION_PERSONAL_LEVEL_COLUMN);
258863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira            spam = cursor.getInt(UIProvider.CONVERSATION_IS_SPAM_COLUMN) != 0;
25976b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook            phishing = cursor.getInt(UIProvider.CONVERSATION_IS_PHISHING_COLUMN) != 0;
260863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira            muted = cursor.getInt(UIProvider.CONVERSATION_MUTED_COLUMN) != 0;
26192939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank            color = cursor.getInt(UIProvider.CONVERSATION_COLOR_COLUMN);
262a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank            String account = cursor.getString(UIProvider.CONVERSATION_ACCOUNT_URI_COLUMN);
263a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank            accountUri = !TextUtils.isEmpty(account) ? Uri.parse(account) : null;
264f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank            position = NO_POSITION;
265ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank            localDeleteOnUpdate = false;
266732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        }
267732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
268732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
269bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook    public Conversation() {
270ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook    }
271ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook
272863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira    public static Conversation create(long id, Uri uri, String subject, long dateMs,
273863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira            String snippet, boolean hasAttachment, Uri messageListUri, String senders,
274863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira            int numMessages, int numDrafts, int sendingState, int priority, boolean read,
275863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira            boolean starred, String folderList, String rawFolders, int convFlags,
27676b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook            int personalLevel, boolean spam, boolean phishing, boolean muted, Uri accountUri) {
277ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook
278ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        final Conversation conversation = new Conversation();
279ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook
280ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.id = id;
281ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.uri = uri;
282ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.subject = subject;
283ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.dateMs = dateMs;
284ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.snippet = snippet;
285ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.hasAttachments = hasAttachment;
286ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.messageListUri = messageListUri;
287ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.senders = senders;
288ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.numMessages = numMessages;
289ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.numDrafts = numDrafts;
290ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.sendingState = sendingState;
291ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.priority = priority;
292ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.read = read;
293ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.starred = starred;
294ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.folderList = folderList;
295ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.rawFolders = rawFolders;
296ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.convFlags = convFlags;
297ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.personalLevel = personalLevel;
298863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        conversation.spam = spam;
29976b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook        conversation.phishing = phishing;
300863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        conversation.muted = muted;
30192939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank        conversation.color = 0;
302a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank        conversation.accountUri = accountUri;
303ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        return conversation;
304ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook    }
305ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook
306e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    @Override
307e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    public boolean equals(Object o) {
3083c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank        if (o instanceof Conversation) {
3093c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank            Conversation conv = (Conversation)o;
3103c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank            return conv.uri.equals(uri);
3113c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank        }
3123c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank        return false;
313e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    }
314e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank
315e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    @Override
316e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    public int hashCode() {
317e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank        return uri.hashCode();
318e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    }
319e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank
3207f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira    /**
3217f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira     * Get if this conversation is marked as high priority.
3227f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira     */
3237f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira    public boolean isImportant() {
32422657529437c160dec072115c5982409306c1313Mindy Pereira        return priority == UIProvider.ConversationPriority.IMPORTANT;
3257f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira    }
3267f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira
327e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    /**
328e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank     * Get if this conversation is mostly dead
329e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank     */
330e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    public boolean isMostlyDead() {
331e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank        return (convFlags & FLAG_MOSTLY_DEAD) != 0;
332e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    }
333440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal
334440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    /**
335d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * Returns true if the URI of the conversation specified as the needle was found in the
336d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * collection of conversations specified as the haystack. False otherwise. This method is safe
337d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * to call with nullarguments.
338d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * @param haystack
339d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * @param needle
340d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * @return true if the needle was found in the haystack, false otherwise.
341d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     */
342d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal    public final static boolean contains(Collection<Conversation> haystack, Conversation needle) {
343d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        // If the haystack is empty, it cannot contain anything.
344d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        if (haystack == null || haystack.size() <= 0) {
345d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal            return false;
346d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        }
347d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        // The null folder exists everywhere.
348d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        if (needle == null) {
349d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal            return true;
350d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        }
3517dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        final long toFind = needle.id;
352d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        for (final Conversation c : haystack) {
3537dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal            if (toFind == c.id) {
354d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal                return true;
355d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal            }
356d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        }
357d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        return false;
358d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal    }
359d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal
360d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal    /**
361440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal     * Returns a collection of a single conversation. This method always returns a valid collection
362440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal     * even if the input conversation is null.
363440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal     * @param in a conversation, possibly null.
364440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal     * @return a collection of the conversation.
365440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal     */
366440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    public static Collection<Conversation> listOf(Conversation in) {
367440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal        final Collection<Conversation> target = (in == null) ? EMPTY : ImmutableList.of(in);
368440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal        return target;
369440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    }
3707dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal
3717dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal    /**
3727dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal     * Create a human-readable string of all the conversations
3737dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal     * @param collection Any collection of conversations
3747dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal     * @return string with a human readable representation of the conversations.
3757dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal     */
3767dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal    public static String toString(Collection<Conversation> collection) {
3777dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        final StringBuilder out = new StringBuilder(collection.size() + " conversations:");
3787dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        int count = 0;
3797dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        for (final Conversation c : collection) {
3807dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal            count++;
3817dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal            // Indent the conversations to make them easy to read in debug output.
3827dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal            out.append("      " + count + ": " + c.toString() + "\n");
3837dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        }
3847dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        return out.toString();
3857dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal    }
3861b9efd9beb715927e0db7b138ddbb2925bc2c06fMarc Blank}