Conversation.java revision d503df4f0c31bbf842c6a1d3cba18df8c074bf67
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
19440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwalimport com.google.common.collect.ImmutableList;
20440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal
21732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.database.Cursor;
22732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.net.Uri;
23732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.os.Parcel;
24732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.os.Parcelable;
255c765b9c5dd8a9a9421260ba8b46d06073391c73Mindy Pereiraimport android.text.TextUtils;
26732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
27440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwalimport java.util.Collection;
28440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwalimport java.util.Collections;
29440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal
30732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangpublic class Conversation implements Parcelable {
31f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank    public static final int NO_POSITION = -1;
32732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
33732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public long id;
34c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank    public Uri uri;
35732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public String subject;
36732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public long dateMs;
37732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public String snippet;
38732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public boolean hasAttachments;
39cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira    public Uri messageListUri;
404db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira    public String senders;
414db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira    public int numMessages;
424db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira    public int numDrafts;
434db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira    public int sendingState;
444db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira    public int priority;
45c8a994227b9c686d88ee05840544162711a85712Marc Blank    public boolean read;
46c8a994227b9c686d88ee05840544162711a85712Marc Blank    public boolean starred;
47ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank    public String folderList;
48cc8211df898ba9dac17a766b89f28d6e6f0afef0Mindy Pereira    public String rawFolders;
4922657529437c160dec072115c5982409306c1313Mindy Pereira    public int convFlags;
5022657529437c160dec072115c5982409306c1313Mindy Pereira    public int personalLevel;
51863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira    public boolean spam;
52863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira    public boolean muted;
5392939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank    public int color;
5422657529437c160dec072115c5982409306c1313Mindy Pereira
55ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank    // Used within the UI to indicate the adapter position of this conversation
56f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank    public transient int position;
57ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank    // Used within the UI to indicate that a Conversation should be removed from the
58ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank    // ConversationCursor when executing an update, e.g. the the Conversation is no longer
59ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank    // in the ConversationList for the current folder, that is it's now in some other folder(s)
60ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank    public transient boolean localDeleteOnUpdate;
61732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
62e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    // Constituents of convFlags below
63e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    // Flag indicating that the item has been deleted, but will continue being shown in the list
64e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    // Delete/Archive of a mostly-dead item will NOT propagate the delete/archive, but WILL remove
65e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    // the item from the cursor
66e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    public static final int FLAG_MOSTLY_DEAD = 1 << 0;
67e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank
68440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    /** An immutable, empty conversation list */
69440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    public static final Collection<Conversation> EMPTY = Collections.emptyList();
70440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal
71732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    @Override
72732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public int describeContents() {
73732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        return 0;
74732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
75732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
76732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    @Override
77732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public void writeToParcel(Parcel dest, int flags) {
78732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dest.writeLong(id);
79c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank        dest.writeParcelable(uri, flags);
80732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dest.writeString(subject);
81732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dest.writeLong(dateMs);
82732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dest.writeString(snippet);
83732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dest.writeByte(hasAttachments ? (byte) 1 : 0);
84cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira        dest.writeParcelable(messageListUri, 0);
854db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        dest.writeString(senders);
864db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        dest.writeInt(numMessages);
874db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        dest.writeInt(numDrafts);
884db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        dest.writeInt(sendingState);
894db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        dest.writeInt(priority);
90c8a994227b9c686d88ee05840544162711a85712Marc Blank        dest.writeByte(read ? (byte) 1 : 0);
91c8a994227b9c686d88ee05840544162711a85712Marc Blank        dest.writeByte(starred ? (byte) 1 : 0);
92ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank        dest.writeString(folderList);
93cc8211df898ba9dac17a766b89f28d6e6f0afef0Mindy Pereira        dest.writeString(rawFolders);
9422657529437c160dec072115c5982409306c1313Mindy Pereira        dest.writeInt(convFlags);
9522657529437c160dec072115c5982409306c1313Mindy Pereira        dest.writeInt(personalLevel);
96863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        dest.writeInt(spam ? 1 : 0);
97863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        dest.writeInt(muted ? 1 : 0);
9892939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank        dest.writeInt(color);
99732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
100732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
101732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    private Conversation(Parcel in) {
102732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        id = in.readLong();
103c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank        uri = in.readParcelable(null);
104732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        subject = in.readString();
105732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        dateMs = in.readLong();
106732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        snippet = in.readString();
107732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        hasAttachments = (in.readByte() != 0);
108cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira        messageListUri = in.readParcelable(null);
1094db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        senders = in.readString();
1104db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        numMessages = in.readInt();
1114db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        numDrafts = in.readInt();
1124db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        sendingState = in.readInt();
1134db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira        priority = in.readInt();
114c8a994227b9c686d88ee05840544162711a85712Marc Blank        read = (in.readByte() != 0);
115c8a994227b9c686d88ee05840544162711a85712Marc Blank        starred = (in.readByte() != 0);
116ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank        folderList = in.readString();
117cc8211df898ba9dac17a766b89f28d6e6f0afef0Mindy Pereira        rawFolders = in.readString();
11822657529437c160dec072115c5982409306c1313Mindy Pereira        convFlags = in.readInt();
11922657529437c160dec072115c5982409306c1313Mindy Pereira        personalLevel = in.readInt();
120863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        spam = in.readInt() != 0;
121863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        muted = in.readInt() != 0;
12292939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank        color = in.readInt();
123f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank        position = NO_POSITION;
124ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank        localDeleteOnUpdate = false;
125732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
126732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
127732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    @Override
128732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public String toString() {
129732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        return "[conversation id=" + id + "]";
130732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
131732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
132732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    public static final Creator<Conversation> CREATOR = new Creator<Conversation>() {
133732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
134732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        @Override
135732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        public Conversation createFromParcel(Parcel source) {
136732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang            return new Conversation(source);
137732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        }
138732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
139732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        @Override
140732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        public Conversation[] newArray(int size) {
141732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang            return new Conversation[size];
142732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        }
143732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
144732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    };
145732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
146acf6039a23382f18c35f6b487d90d53cb67b5858Mindy Pereira    public static final Uri MOVE_CONVERSATIONS_URI = Uri.parse("content://moveconversations");
147acf6039a23382f18c35f6b487d90d53cb67b5858Mindy Pereira
148a831b2f1ba6d3c18d5e54563df8bae1f589c4257Mindy Pereira    public Conversation(Cursor cursor) {
149732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        if (cursor != null) {
150732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang            id = cursor.getLong(UIProvider.CONVERSATION_ID_COLUMN);
151c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank            uri = Uri.parse(cursor.getString(UIProvider.CONVERSATION_URI_COLUMN));
152732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang            dateMs = cursor.getLong(UIProvider.CONVERSATION_DATE_RECEIVED_MS_COLUMN);
153732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang            subject = cursor.getString(UIProvider.CONVERSATION_SUBJECT_COLUMN);
154374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank            // Don't allow null subject
155374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank            if (subject == null) {
156374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank                subject = "";
157374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank            }
158732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang            snippet = cursor.getString(UIProvider.CONVERSATION_SNIPPET_COLUMN);
15987d535fe423d782c3a0343c649330d309976f655Mindy Pereira            hasAttachments = cursor.getInt(UIProvider.CONVERSATION_HAS_ATTACHMENTS_COLUMN) != 0;
1605c765b9c5dd8a9a9421260ba8b46d06073391c73Mindy Pereira            String messageList = cursor
1615c765b9c5dd8a9a9421260ba8b46d06073391c73Mindy Pereira                    .getString(UIProvider.CONVERSATION_MESSAGE_LIST_URI_COLUMN);
1625c765b9c5dd8a9a9421260ba8b46d06073391c73Mindy Pereira            messageListUri = !TextUtils.isEmpty(messageList) ? Uri.parse(messageList) : null;
1634db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira            senders = cursor.getString(UIProvider.CONVERSATION_SENDER_INFO_COLUMN);
1644db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira            numMessages = cursor.getInt(UIProvider.CONVERSATION_NUM_MESSAGES_COLUMN);
1654db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira            numDrafts = cursor.getInt(UIProvider.CONVERSATION_NUM_DRAFTS_COLUMN);
1664db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira            sendingState = cursor.getInt(UIProvider.CONVERSATION_SENDING_STATE_COLUMN);
1674db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira            priority = cursor.getInt(UIProvider.CONVERSATION_PRIORITY_COLUMN);
16887d535fe423d782c3a0343c649330d309976f655Mindy Pereira            read = cursor.getInt(UIProvider.CONVERSATION_READ_COLUMN) != 0;
16987d535fe423d782c3a0343c649330d309976f655Mindy Pereira            starred = cursor.getInt(UIProvider.CONVERSATION_STARRED_COLUMN) != 0;
170ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank            folderList = cursor.getString(UIProvider.CONVERSATION_FOLDER_LIST_COLUMN);
171cc8211df898ba9dac17a766b89f28d6e6f0afef0Mindy Pereira            rawFolders = cursor.getString(UIProvider.CONVERSATION_RAW_FOLDERS_COLUMN);
17222657529437c160dec072115c5982409306c1313Mindy Pereira            convFlags = cursor.getInt(UIProvider.CONVERSATION_FLAGS_COLUMN);
17322657529437c160dec072115c5982409306c1313Mindy Pereira            personalLevel = cursor.getInt(UIProvider.CONVERSATION_PERSONAL_LEVEL_COLUMN);
174863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira            spam = cursor.getInt(UIProvider.CONVERSATION_IS_SPAM_COLUMN) != 0;
175863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira            muted = cursor.getInt(UIProvider.CONVERSATION_MUTED_COLUMN) != 0;
17692939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank            color = cursor.getInt(UIProvider.CONVERSATION_COLOR_COLUMN);
177f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank            position = NO_POSITION;
178ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank            localDeleteOnUpdate = false;
179732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        }
180732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    }
181732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang
182bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook    public Conversation() {
183ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook    }
184ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook
185863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira    public static Conversation create(long id, Uri uri, String subject, long dateMs,
186863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira            String snippet, boolean hasAttachment, Uri messageListUri, String senders,
187863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira            int numMessages, int numDrafts, int sendingState, int priority, boolean read,
188863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira            boolean starred, String folderList, String rawFolders, int convFlags,
189863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira            int personalLevel, boolean spam, boolean muted) {
190ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook
191ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        final Conversation conversation = new Conversation();
192ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook
193ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.id = id;
194ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.uri = uri;
195ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.subject = subject;
196ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.dateMs = dateMs;
197ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.snippet = snippet;
198ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.hasAttachments = hasAttachment;
199ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.messageListUri = messageListUri;
200ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.senders = senders;
201ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.numMessages = numMessages;
202ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.numDrafts = numDrafts;
203ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.sendingState = sendingState;
204ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.priority = priority;
205ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.read = read;
206ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.starred = starred;
207ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.folderList = folderList;
208ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.rawFolders = rawFolders;
209ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.convFlags = convFlags;
210ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        conversation.personalLevel = personalLevel;
211863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        conversation.spam = spam;
212863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira        conversation.muted = muted;
21392939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank        conversation.color = 0;
214ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        return conversation;
215ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook    }
216ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook
217e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    @Override
218e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    public boolean equals(Object o) {
2193c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank        if (o instanceof Conversation) {
2203c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank            Conversation conv = (Conversation)o;
2213c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank            return conv.uri.equals(uri);
2223c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank        }
2233c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank        return false;
224e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    }
225e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank
226e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    @Override
227e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    public int hashCode() {
228e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank        return uri.hashCode();
229e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    }
230e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank
2317f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira    /**
2327f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira     * Get if this conversation is marked as high priority.
2337f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira     */
2347f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira    public boolean isImportant() {
23522657529437c160dec072115c5982409306c1313Mindy Pereira        return priority == UIProvider.ConversationPriority.IMPORTANT;
2367f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira    }
2377f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira
238e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    /**
239e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank     * Get if this conversation is mostly dead
240e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank     */
241e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    public boolean isMostlyDead() {
242e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank        return (convFlags & FLAG_MOSTLY_DEAD) != 0;
243e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank    }
244440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal
245440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    /**
246d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * Returns true if the URI of the conversation specified as the needle was found in the
247d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * collection of conversations specified as the haystack. False otherwise. This method is safe
248d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * to call with nullarguments.
249d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * @param haystack
250d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * @param needle
251d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     * @return true if the needle was found in the haystack, false otherwise.
252d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal     */
253d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal    public final static boolean contains(Collection<Conversation> haystack, Conversation needle) {
254d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        // If the haystack is empty, it cannot contain anything.
255d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        if (haystack == null || haystack.size() <= 0) {
256d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal            return false;
257d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        }
258d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        // The null folder exists everywhere.
259d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        if (needle == null) {
260d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal            return true;
261d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        }
262d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        final Uri toFind = needle.uri;
263d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        for (final Conversation c : haystack) {
264d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal            if (toFind.equals(c.uri)) {
265d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal                return true;
266d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal            }
267d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        }
268d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal        return false;
269d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal    }
270d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal
271d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal    /**
272440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal     * Returns a collection of a single conversation. This method always returns a valid collection
273440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal     * even if the input conversation is null.
274440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal     * @param in a conversation, possibly null.
275440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal     * @return a collection of the conversation.
276440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal     */
277440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    public static Collection<Conversation> listOf(Conversation in) {
278440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal        final Collection<Conversation> target = (in == null) ? EMPTY : ImmutableList.of(in);
279440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal        return target;
280440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal    }
2811b9efd9beb715927e0db7b138ddbb2925bc2c06fMarc Blank}