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}