Conversation.java revision d97782206889a5508279b75cce19d7c0fb8a3bca
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; 27648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereiraimport com.android.mail.utils.LogTag; 28648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereiraimport com.android.mail.utils.LogUtils; 29a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blankimport com.google.common.collect.ImmutableList; 30a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank 31648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereiraimport org.json.JSONException; 32648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira 33440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwalimport java.util.Collection; 34440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwalimport java.util.Collections; 35440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal 36732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangpublic class Conversation implements Parcelable { 37f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank public static final int NO_POSITION = -1; 38732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 39e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 40e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see BaseColumns#_ID 41e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 42732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public long id; 43e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 44e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#URI 45e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 46c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank public Uri uri; 47e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 48e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#SUBJECT 49e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 50732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public String subject; 51e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 52e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#DATE_RECEIVED_MS 53e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 54732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public long dateMs; 55e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 56e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#SNIPPET 57e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 58aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira @Deprecated 59732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public String snippet; 60e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 61e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#HAS_ATTACHMENTS 62e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 63732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public boolean hasAttachments; 64e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 65e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#MESSAGE_LIST_URI 66e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 67cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira public Uri messageListUri; 68e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 69e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#SENDER_INFO 70e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 71648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira @Deprecated 724db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira public String senders; 73e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 74e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#NUM_MESSAGES 75e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 764db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira public int numMessages; 77e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 78e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#NUM_DRAFTS 79e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 804db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira public int numDrafts; 81e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 82e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#SENDING_STATE 83e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 844db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira public int sendingState; 85e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 86e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#PRIORITY 87e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 884db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira public int priority; 89e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 90e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#READ 91e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 92c8a994227b9c686d88ee05840544162711a85712Marc Blank public boolean read; 93e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 94e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#STARRED 95e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 96c8a994227b9c686d88ee05840544162711a85712Marc Blank public boolean starred; 97e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 98e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#FOLDER_LIST 99e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 100ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank public String folderList; 101e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 102e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#RAW_FOLDERS 103e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 104cc8211df898ba9dac17a766b89f28d6e6f0afef0Mindy Pereira public String rawFolders; 105e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 106e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#FLAGS 107e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 10822657529437c160dec072115c5982409306c1313Mindy Pereira public int convFlags; 109e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 110e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#PERSONAL_LEVEL 111e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 11222657529437c160dec072115c5982409306c1313Mindy Pereira public int personalLevel; 113e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 114e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#SPAM 115e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 116863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira public boolean spam; 117e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 118e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#MUTED 119e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 120863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira public boolean muted; 121e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 12276b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook * @see UIProvider.ConversationColumns#PHISHING 12376b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook */ 12476b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook public boolean phishing; 12576b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook /** 126e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#COLOR 127e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 12892939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank public int color; 129e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 130e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#ACCOUNT_URI 131e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 132a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank public Uri accountUri; 133648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira /** 134648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * @see UIProvider.ConversationColumns#CONVERSATION_INFO 135648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira */ 136648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira public ConversationInfo conversationInfo; 13722657529437c160dec072115c5982409306c1313Mindy Pereira 138ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank // Used within the UI to indicate the adapter position of this conversation 139f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank public transient int position; 140648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // Used within the UI to indicate that a Conversation should be removed from 141648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // the ConversationCursor when executing an update, e.g. the the 142648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // Conversation is no longer in the ConversationList for the current folder, 143648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // that is it's now in some other folder(s) 144ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank public transient boolean localDeleteOnUpdate; 145732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 146e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank // Constituents of convFlags below 147648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // Flag indicating that the item has been deleted, but will continue being 148648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // shown in the list Delete/Archive of a mostly-dead item will NOT propagate 149648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // the delete/archive, but WILL remove the item from the cursor 150e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank public static final int FLAG_MOSTLY_DEAD = 1 << 0; 151e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank 152440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal /** An immutable, empty conversation list */ 153440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal public static final Collection<Conversation> EMPTY = Collections.emptyList(); 154440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal 155732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 156732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public int describeContents() { 157732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang return 0; 158732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 159732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 160732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 161732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public void writeToParcel(Parcel dest, int flags) { 162732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dest.writeLong(id); 163c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank dest.writeParcelable(uri, flags); 164732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dest.writeString(subject); 165732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dest.writeLong(dateMs); 166732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dest.writeString(snippet); 167732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dest.writeByte(hasAttachments ? (byte) 1 : 0); 168cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira dest.writeParcelable(messageListUri, 0); 1694db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira dest.writeString(senders); 1704db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira dest.writeInt(numMessages); 1714db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira dest.writeInt(numDrafts); 1724db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira dest.writeInt(sendingState); 1734db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira dest.writeInt(priority); 174c8a994227b9c686d88ee05840544162711a85712Marc Blank dest.writeByte(read ? (byte) 1 : 0); 175c8a994227b9c686d88ee05840544162711a85712Marc Blank dest.writeByte(starred ? (byte) 1 : 0); 176ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank dest.writeString(folderList); 177cc8211df898ba9dac17a766b89f28d6e6f0afef0Mindy Pereira dest.writeString(rawFolders); 17822657529437c160dec072115c5982409306c1313Mindy Pereira dest.writeInt(convFlags); 17922657529437c160dec072115c5982409306c1313Mindy Pereira dest.writeInt(personalLevel); 180863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira dest.writeInt(spam ? 1 : 0); 18176b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook dest.writeInt(phishing ? 1 : 0); 182863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira dest.writeInt(muted ? 1 : 0); 18392939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank dest.writeInt(color); 184a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank dest.writeParcelable(accountUri, 0); 185732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 186732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 187732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang private Conversation(Parcel in) { 188732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang id = in.readLong(); 189c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank uri = in.readParcelable(null); 190732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang subject = in.readString(); 191732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dateMs = in.readLong(); 192732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang snippet = in.readString(); 193732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang hasAttachments = (in.readByte() != 0); 194cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira messageListUri = in.readParcelable(null); 1954db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira senders = in.readString(); 1964db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira numMessages = in.readInt(); 1974db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira numDrafts = in.readInt(); 1984db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira sendingState = in.readInt(); 1994db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira priority = in.readInt(); 200c8a994227b9c686d88ee05840544162711a85712Marc Blank read = (in.readByte() != 0); 201c8a994227b9c686d88ee05840544162711a85712Marc Blank starred = (in.readByte() != 0); 202ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank folderList = in.readString(); 203cc8211df898ba9dac17a766b89f28d6e6f0afef0Mindy Pereira rawFolders = in.readString(); 20422657529437c160dec072115c5982409306c1313Mindy Pereira convFlags = in.readInt(); 20522657529437c160dec072115c5982409306c1313Mindy Pereira personalLevel = in.readInt(); 206863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira spam = in.readInt() != 0; 20776b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook phishing = in.readInt() != 0; 208863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira muted = in.readInt() != 0; 20992939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank color = in.readInt(); 210a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank accountUri = in.readParcelable(null); 211f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank position = NO_POSITION; 212ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank localDeleteOnUpdate = false; 213732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 214732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 215732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 216732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public String toString() { 2177dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal return "[conversation id=" + id + ", subject =" + subject + "]"; 218732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 219732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 220732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public static final Creator<Conversation> CREATOR = new Creator<Conversation>() { 221732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 222732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 223732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public Conversation createFromParcel(Parcel source) { 224732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang return new Conversation(source); 225732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 226732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 227732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 228732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public Conversation[] newArray(int size) { 229732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang return new Conversation[size]; 230732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 231732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 232732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang }; 233732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 234acf6039a23382f18c35f6b487d90d53cb67b5858Mindy Pereira public static final Uri MOVE_CONVERSATIONS_URI = Uri.parse("content://moveconversations"); 235acf6039a23382f18c35f6b487d90d53cb67b5858Mindy Pereira 236ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira /** 2376c2663dc9cade8aff34c462d244e3d72c475c664Mindy Pereira * The columns that need to be updated to change the read state of a conversation. 238ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira */ 239ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira public static final String[] UPDATE_FOLDER_COLUMNS = new String[] { 240ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira ConversationColumns.FOLDER_LIST, ConversationColumns.RAW_FOLDERS 241ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira }; 242ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira 243648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira private static final String LOG_TAG = LogTag.getLogTag(); 244648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira 245a831b2f1ba6d3c18d5e54563df8bae1f589c4257Mindy Pereira public Conversation(Cursor cursor) { 246732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang if (cursor != null) { 247732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang id = cursor.getLong(UIProvider.CONVERSATION_ID_COLUMN); 248c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank uri = Uri.parse(cursor.getString(UIProvider.CONVERSATION_URI_COLUMN)); 249732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dateMs = cursor.getLong(UIProvider.CONVERSATION_DATE_RECEIVED_MS_COLUMN); 250732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang subject = cursor.getString(UIProvider.CONVERSATION_SUBJECT_COLUMN); 251374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank // Don't allow null subject 252374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank if (subject == null) { 253374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank subject = ""; 254374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank } 255732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang snippet = cursor.getString(UIProvider.CONVERSATION_SNIPPET_COLUMN); 25687d535fe423d782c3a0343c649330d309976f655Mindy Pereira hasAttachments = cursor.getInt(UIProvider.CONVERSATION_HAS_ATTACHMENTS_COLUMN) != 0; 257648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira String messageList = cursor.getString(UIProvider.CONVERSATION_MESSAGE_LIST_URI_COLUMN); 2585c765b9c5dd8a9a9421260ba8b46d06073391c73Mindy Pereira messageListUri = !TextUtils.isEmpty(messageList) ? Uri.parse(messageList) : null; 2594db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira numMessages = cursor.getInt(UIProvider.CONVERSATION_NUM_MESSAGES_COLUMN); 2604db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira numDrafts = cursor.getInt(UIProvider.CONVERSATION_NUM_DRAFTS_COLUMN); 2614db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira sendingState = cursor.getInt(UIProvider.CONVERSATION_SENDING_STATE_COLUMN); 2624db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira priority = cursor.getInt(UIProvider.CONVERSATION_PRIORITY_COLUMN); 26387d535fe423d782c3a0343c649330d309976f655Mindy Pereira read = cursor.getInt(UIProvider.CONVERSATION_READ_COLUMN) != 0; 26487d535fe423d782c3a0343c649330d309976f655Mindy Pereira starred = cursor.getInt(UIProvider.CONVERSATION_STARRED_COLUMN) != 0; 265ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank folderList = cursor.getString(UIProvider.CONVERSATION_FOLDER_LIST_COLUMN); 266cc8211df898ba9dac17a766b89f28d6e6f0afef0Mindy Pereira rawFolders = cursor.getString(UIProvider.CONVERSATION_RAW_FOLDERS_COLUMN); 26722657529437c160dec072115c5982409306c1313Mindy Pereira convFlags = cursor.getInt(UIProvider.CONVERSATION_FLAGS_COLUMN); 26822657529437c160dec072115c5982409306c1313Mindy Pereira personalLevel = cursor.getInt(UIProvider.CONVERSATION_PERSONAL_LEVEL_COLUMN); 269863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira spam = cursor.getInt(UIProvider.CONVERSATION_IS_SPAM_COLUMN) != 0; 27076b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook phishing = cursor.getInt(UIProvider.CONVERSATION_IS_PHISHING_COLUMN) != 0; 271863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira muted = cursor.getInt(UIProvider.CONVERSATION_MUTED_COLUMN) != 0; 27292939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank color = cursor.getInt(UIProvider.CONVERSATION_COLOR_COLUMN); 273a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank String account = cursor.getString(UIProvider.CONVERSATION_ACCOUNT_URI_COLUMN); 274a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank accountUri = !TextUtils.isEmpty(account) ? Uri.parse(account) : null; 275f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank position = NO_POSITION; 276ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank localDeleteOnUpdate = false; 277648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira senders = cursor.getString(UIProvider.CONVERSATION_SENDER_INFO_COLUMN); 278648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira try { 279648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira conversationInfo = ConversationInfo.fromString(cursor 280648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira .getString(UIProvider.CONVERSATION_INFO_COLUMN)); 281648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira } catch (JSONException e) { 282648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira LogUtils.w(LOG_TAG, e, 283648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira "Unable to instantiate ConversationInfo. Try to continue anyway"); 284648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira } 285732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 286732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 287732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 288bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook public Conversation() { 289ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook } 290ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook 291863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira public static Conversation create(long id, Uri uri, String subject, long dateMs, 292863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira String snippet, boolean hasAttachment, Uri messageListUri, String senders, 293863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira int numMessages, int numDrafts, int sendingState, int priority, boolean read, 294863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira boolean starred, String folderList, String rawFolders, int convFlags, 29576b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook int personalLevel, boolean spam, boolean phishing, boolean muted, Uri accountUri) { 296ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook 297ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook final Conversation conversation = new Conversation(); 298ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook 299ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.id = id; 300ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.uri = uri; 301ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.subject = subject; 302ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.dateMs = dateMs; 303ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.snippet = snippet; 304ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.hasAttachments = hasAttachment; 305ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.messageListUri = messageListUri; 306ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.senders = senders; 307ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.numMessages = numMessages; 308ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.numDrafts = numDrafts; 309ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.sendingState = sendingState; 310ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.priority = priority; 311ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.read = read; 312ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.starred = starred; 313ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.folderList = folderList; 314ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.rawFolders = rawFolders; 315ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.convFlags = convFlags; 316ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.personalLevel = personalLevel; 317863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira conversation.spam = spam; 31876b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook conversation.phishing = phishing; 319863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira conversation.muted = muted; 32092939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank conversation.color = 0; 321a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank conversation.accountUri = accountUri; 322ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook return conversation; 323ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook } 324ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook 325e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank @Override 326e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank public boolean equals(Object o) { 3273c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank if (o instanceof Conversation) { 328648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira Conversation conv = (Conversation) o; 3293c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank return conv.uri.equals(uri); 3303c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank } 3313c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank return false; 332e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank } 333e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank 334e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank @Override 335e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank public int hashCode() { 336e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank return uri.hashCode(); 337e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank } 338e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank 3397f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira /** 3407f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira * Get if this conversation is marked as high priority. 3417f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira */ 3427f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira public boolean isImportant() { 34322657529437c160dec072115c5982409306c1313Mindy Pereira return priority == UIProvider.ConversationPriority.IMPORTANT; 3447f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira } 3457f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira 346e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank /** 347e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank * Get if this conversation is mostly dead 348e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank */ 349e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank public boolean isMostlyDead() { 350e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank return (convFlags & FLAG_MOSTLY_DEAD) != 0; 351e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank } 352440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal 353440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal /** 354648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * Returns true if the URI of the conversation specified as the needle was 355648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * found in the collection of conversations specified as the haystack. False 356648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * otherwise. This method is safe to call with nullarguments. 357648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * 358d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal * @param haystack 359d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal * @param needle 360d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal * @return true if the needle was found in the haystack, false otherwise. 361d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal */ 362d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal public final static boolean contains(Collection<Conversation> haystack, Conversation needle) { 363d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal // If the haystack is empty, it cannot contain anything. 364d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal if (haystack == null || haystack.size() <= 0) { 365d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal return false; 366d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal } 367d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal // The null folder exists everywhere. 368d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal if (needle == null) { 369d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal return true; 370d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal } 3717dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal final long toFind = needle.id; 372d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal for (final Conversation c : haystack) { 3737dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal if (toFind == c.id) { 374d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal return true; 375d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal } 376d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal } 377d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal return false; 378d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal } 379d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal 380d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal /** 381648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * Returns a collection of a single conversation. This method always returns 382648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * a valid collection even if the input conversation is null. 383648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * 384440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal * @param in a conversation, possibly null. 385440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal * @return a collection of the conversation. 386440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal */ 387440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal public static Collection<Conversation> listOf(Conversation in) { 388440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal final Collection<Conversation> target = (in == null) ? EMPTY : ImmutableList.of(in); 389440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal return target; 390440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal } 3917dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal 3927dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal /** 393aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira * Get the snippet for this conversation. Masks that it may come from 394aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira * conversation info or the original deprecated snippet string. 395aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira */ 396aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira public String getSnippet() { 397d97782206889a5508279b75cce19d7c0fb8a3bcaMindy Pereira return conversationInfo != null && !TextUtils.isEmpty(conversationInfo.firstSnippet) ? 398d97782206889a5508279b75cce19d7c0fb8a3bcaMindy Pereira conversationInfo.firstSnippet : snippet; 399aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira } 400aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira 401aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira /** 4027dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal * Create a human-readable string of all the conversations 403648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * 4047dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal * @param collection Any collection of conversations 4057dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal * @return string with a human readable representation of the conversations. 4067dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal */ 4077dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal public static String toString(Collection<Conversation> collection) { 4087dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal final StringBuilder out = new StringBuilder(collection.size() + " conversations:"); 4097dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal int count = 0; 4107dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal for (final Conversation c : collection) { 4117dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal count++; 412648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // Indent the conversations to make them easy to read in debug 413648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // output. 4147dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal out.append(" " + count + ": " + c.toString() + "\n"); 4157dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal } 4167dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal return out.toString(); 4177dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal } 418648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira} 419