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}