Conversation.java revision cc8211df898ba9dac17a766b89f28d6e6f0afef0
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 198d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blankimport android.content.ContentProviderClient; 20c8a994227b9c686d88ee05840544162711a85712Marc Blankimport android.content.ContentValues; 21c8a994227b9c686d88ee05840544162711a85712Marc Blankimport android.content.Context; 22732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.database.Cursor; 23732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.net.Uri; 24732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.os.Parcel; 25732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.os.Parcelable; 265c765b9c5dd8a9a9421260ba8b46d06073391c73Mindy Pereiraimport android.text.TextUtils; 27732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 288d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blankimport com.android.mail.browse.ConversationCursor.ConversationOperation; 298d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blankimport com.android.mail.browse.ConversationCursor.ConversationProvider; 308d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank 318d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blankimport java.util.ArrayList; 328d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blankimport java.util.Collection; 338d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank 34732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangpublic class Conversation implements Parcelable { 35f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank public static final int NO_POSITION = -1; 36732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 37732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public long id; 38c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank public Uri uri; 39732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public String subject; 40732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public long dateMs; 41732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public String snippet; 42732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public boolean hasAttachments; 43cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira public Uri messageListUri; 444db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira public String senders; 454db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira public int numMessages; 464db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira public int numDrafts; 474db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira public int sendingState; 484db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira public int priority; 49c8a994227b9c686d88ee05840544162711a85712Marc Blank public boolean read; 50c8a994227b9c686d88ee05840544162711a85712Marc Blank public boolean starred; 51ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank public String folderList; 52cc8211df898ba9dac17a766b89f28d6e6f0afef0Mindy Pereira public String rawFolders; 53ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank // Used within the UI to indicate the adapter position of this conversation 54f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank public transient int position; 55ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank // Used within the UI to indicate that a Conversation should be removed from the 56ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank // ConversationCursor when executing an update, e.g. the the Conversation is no longer 57ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank // in the ConversationList for the current folder, that is it's now in some other folder(s) 58ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank public transient boolean localDeleteOnUpdate; 59732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 60732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 61732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public int describeContents() { 62732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang return 0; 63732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 64732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 65732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 66732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public void writeToParcel(Parcel dest, int flags) { 67732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dest.writeLong(id); 68c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank dest.writeParcelable(uri, flags); 69732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dest.writeString(subject); 70732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dest.writeLong(dateMs); 71732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dest.writeString(snippet); 72732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dest.writeByte(hasAttachments ? (byte) 1 : 0); 73cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira dest.writeParcelable(messageListUri, 0); 744db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira dest.writeString(senders); 754db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira dest.writeInt(numMessages); 764db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira dest.writeInt(numDrafts); 774db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira dest.writeInt(sendingState); 784db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira dest.writeInt(priority); 79c8a994227b9c686d88ee05840544162711a85712Marc Blank dest.writeByte(read ? (byte) 1 : 0); 80c8a994227b9c686d88ee05840544162711a85712Marc Blank dest.writeByte(starred ? (byte) 1 : 0); 81ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank dest.writeString(folderList); 82cc8211df898ba9dac17a766b89f28d6e6f0afef0Mindy Pereira dest.writeString(rawFolders); 83732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 84732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 85732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang private Conversation(Parcel in) { 86732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang id = in.readLong(); 87c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank uri = in.readParcelable(null); 88732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang subject = in.readString(); 89732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dateMs = in.readLong(); 90732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang snippet = in.readString(); 91732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang hasAttachments = (in.readByte() != 0); 92cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira messageListUri = in.readParcelable(null); 934db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira senders = in.readString(); 944db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira numMessages = in.readInt(); 954db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira numDrafts = in.readInt(); 964db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira sendingState = in.readInt(); 974db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira priority = in.readInt(); 98c8a994227b9c686d88ee05840544162711a85712Marc Blank read = (in.readByte() != 0); 99c8a994227b9c686d88ee05840544162711a85712Marc Blank starred = (in.readByte() != 0); 100ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank folderList = in.readString(); 101cc8211df898ba9dac17a766b89f28d6e6f0afef0Mindy Pereira rawFolders = in.readString(); 102f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank position = NO_POSITION; 103ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank localDeleteOnUpdate = false; 104732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 105732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 106732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 107732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public String toString() { 108732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang return "[conversation id=" + id + "]"; 109732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 110732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 111732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public static final Creator<Conversation> CREATOR = new Creator<Conversation>() { 112732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 113732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 114732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public Conversation createFromParcel(Parcel source) { 115732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang return new Conversation(source); 116732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 117732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 118732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 119732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public Conversation[] newArray(int size) { 120732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang return new Conversation[size]; 121732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 122732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 123732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang }; 124732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 125a831b2f1ba6d3c18d5e54563df8bae1f589c4257Mindy Pereira public Conversation(Cursor cursor) { 126732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang if (cursor != null) { 127732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang id = cursor.getLong(UIProvider.CONVERSATION_ID_COLUMN); 128c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank uri = Uri.parse(cursor.getString(UIProvider.CONVERSATION_URI_COLUMN)); 129732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dateMs = cursor.getLong(UIProvider.CONVERSATION_DATE_RECEIVED_MS_COLUMN); 130732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang subject = cursor.getString(UIProvider.CONVERSATION_SUBJECT_COLUMN); 131374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank // Don't allow null subject 132374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank if (subject == null) { 133374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank subject = ""; 134374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank } 135732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang snippet = cursor.getString(UIProvider.CONVERSATION_SNIPPET_COLUMN); 136c8a994227b9c686d88ee05840544162711a85712Marc Blank hasAttachments = cursor.getInt(UIProvider.CONVERSATION_HAS_ATTACHMENTS_COLUMN) == 1; 1375c765b9c5dd8a9a9421260ba8b46d06073391c73Mindy Pereira String messageList = cursor 1385c765b9c5dd8a9a9421260ba8b46d06073391c73Mindy Pereira .getString(UIProvider.CONVERSATION_MESSAGE_LIST_URI_COLUMN); 1395c765b9c5dd8a9a9421260ba8b46d06073391c73Mindy Pereira messageListUri = !TextUtils.isEmpty(messageList) ? Uri.parse(messageList) : null; 1404db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira senders = cursor.getString(UIProvider.CONVERSATION_SENDER_INFO_COLUMN); 1414db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira numMessages = cursor.getInt(UIProvider.CONVERSATION_NUM_MESSAGES_COLUMN); 1424db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira numDrafts = cursor.getInt(UIProvider.CONVERSATION_NUM_DRAFTS_COLUMN); 1434db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira sendingState = cursor.getInt(UIProvider.CONVERSATION_SENDING_STATE_COLUMN); 1444db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira priority = cursor.getInt(UIProvider.CONVERSATION_PRIORITY_COLUMN); 145c8a994227b9c686d88ee05840544162711a85712Marc Blank read = cursor.getInt(UIProvider.CONVERSATION_READ_COLUMN) == 1; 146c8a994227b9c686d88ee05840544162711a85712Marc Blank starred = cursor.getInt(UIProvider.CONVERSATION_STARRED_COLUMN) == 1; 147ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank folderList = cursor.getString(UIProvider.CONVERSATION_FOLDER_LIST_COLUMN); 148cc8211df898ba9dac17a766b89f28d6e6f0afef0Mindy Pereira rawFolders = cursor.getString(UIProvider.CONVERSATION_RAW_FOLDERS_COLUMN); 149f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank position = NO_POSITION; 150ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank localDeleteOnUpdate = false; 151732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 152732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 153732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 1547f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira /** 1557f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira * Get if this conversation is marked as high priority. 1567f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira */ 1577f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira public boolean isImportant() { 1587f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira return priority == UIProvider.ConversationPriority.HIGH; 1597f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira } 1607f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira 161c8a994227b9c686d88ee05840544162711a85712Marc Blank // Below are methods that update Conversation data (update/delete) 162c8a994227b9c686d88ee05840544162711a85712Marc Blank 1638d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank /** 1647f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira * Update an integer column for a single conversation (see updateBoolean below) 1657f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira */ 1667f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira public int updateInt(Context context, String columnName, int value) { 1677f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira ArrayList<Conversation> conversations = new ArrayList<Conversation>(); 1687f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira conversations.add(this); 1697f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira return updateInt(context, conversations, columnName, value); 1707f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira } 1717f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira 1727f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira /** 1737f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira * Update an integer column for a group of conversations (see updateValues below) 1747f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira */ 1757f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira public static int updateInt(Context context, Collection<Conversation> conversations, 1767f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira String columnName, int value) { 1777f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira ContentValues cv = new ContentValues(); 1787f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira cv.put(columnName, value); 1797f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira return updateValues(context, conversations, cv); 1807f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira } 1817f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira 1827f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira /** 183ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank * Update a boolean column for a single conversation (see updateBoolean below) 1848d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank */ 185dd10bc8736282262da0cd9a5f9a0236c10b47028Marc Blank public int updateBoolean(Context context, String columnName, boolean value) { 186dd10bc8736282262da0cd9a5f9a0236c10b47028Marc Blank ArrayList<Conversation> conversations = new ArrayList<Conversation>(); 187dd10bc8736282262da0cd9a5f9a0236c10b47028Marc Blank conversations.add(this); 188dd10bc8736282262da0cd9a5f9a0236c10b47028Marc Blank return updateBoolean(context, conversations, columnName, value); 189c8a994227b9c686d88ee05840544162711a85712Marc Blank } 190c8a994227b9c686d88ee05840544162711a85712Marc Blank 1918d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank /** 192ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank * Update a string column for a group of conversations (see updateValues below) 193ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank */ 194ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank public static int updateBoolean(Context context, Collection<Conversation> conversations, 195ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank String columnName, boolean value) { 196ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank ContentValues cv = new ContentValues(); 197ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank cv.put(columnName, value); 198ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank return updateValues(context, conversations, cv); 199ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank } 200ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank 201ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank /** 202ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank * Update a string column for a single conversation (see updateString below) 203ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank */ 204ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank public int updateString(Context context, String columnName, String value) { 205ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank ArrayList<Conversation> conversations = new ArrayList<Conversation>(); 206ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank conversations.add(this); 207ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank return updateString(context, conversations, columnName, value); 208ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank } 209ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank 210ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank /** 211ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank * Update a string column for a group of conversations (see updateValues below) 212ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank */ 213ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank public static int updateString(Context context, Collection<Conversation> conversations, 214ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank String columnName, String value) { 215ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank ContentValues cv = new ContentValues(); 216ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank cv.put(columnName, value); 217ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank return updateValues(context, conversations, cv); 218ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank } 219ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank 220ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank /** 2218d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * Update a boolean column for a group of conversations, immediately in the UI and in a single 2228d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * transaction in the underlying provider 2238d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * @param conversations a collection of conversations 2248d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * @param context the caller's context 2258d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * @param columnName the column to update 2268d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * @param value the new value 2271b9efd9beb715927e0db7b138ddbb2925bc2c06fMarc Blank * @return the sequence number of the operation (for undo) 2288d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank */ 229ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank private static int updateValues(Context context, Collection<Conversation> conversations, 230ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank ContentValues values) { 2318d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank ArrayList<ConversationOperation> ops = new ArrayList<ConversationOperation>(); 2328d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank for (Conversation conv: conversations) { 2338d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank ConversationOperation op = 234ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank new ConversationOperation(ConversationOperation.UPDATE, conv, values); 2358d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank ops.add(op); 2368d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank } 2371b9efd9beb715927e0db7b138ddbb2925bc2c06fMarc Blank return apply(context, ops); 2388d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank } 2398d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank 2408d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank /** 2418d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * Delete a single conversation 2428d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * @param context the caller's context 243dd10bc8736282262da0cd9a5f9a0236c10b47028Marc Blank * @return the sequence number of the operation (for undo) 2448d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank */ 245dd10bc8736282262da0cd9a5f9a0236c10b47028Marc Blank public int delete(Context context) { 246dd10bc8736282262da0cd9a5f9a0236c10b47028Marc Blank ArrayList<Conversation> conversations = new ArrayList<Conversation>(); 247dd10bc8736282262da0cd9a5f9a0236c10b47028Marc Blank conversations.add(this); 248dd10bc8736282262da0cd9a5f9a0236c10b47028Marc Blank return delete(context, conversations); 249c8a994227b9c686d88ee05840544162711a85712Marc Blank } 2508d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank 2518d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank /** 2528d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * Delete a group of conversations immediately in the UI and in a single transaction in the 2538d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * underlying provider 2548d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * @param context the caller's context 2558d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * @param conversations a collection of conversations 2561b9efd9beb715927e0db7b138ddbb2925bc2c06fMarc Blank * @return the sequence number of the operation (for undo) 2578d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank */ 2581b9efd9beb715927e0db7b138ddbb2925bc2c06fMarc Blank public static int delete(Context context, Collection<Conversation> conversations) { 2598d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank ArrayList<ConversationOperation> ops = new ArrayList<ConversationOperation>(); 2608d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank for (Conversation conv: conversations) { 2618d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank ConversationOperation op = 262f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank new ConversationOperation(ConversationOperation.DELETE, conv); 2638d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank ops.add(op); 2648d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank } 2651b9efd9beb715927e0db7b138ddbb2925bc2c06fMarc Blank return apply(context, ops); 2668d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank } 2678d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank 2688d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank // Convenience methods 2691b9efd9beb715927e0db7b138ddbb2925bc2c06fMarc Blank private static int apply(Context context, ArrayList<ConversationOperation> operations) { 2708d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank ContentProviderClient client = 2718d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank context.getContentResolver().acquireContentProviderClient( 2728d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank ConversationProvider.AUTHORITY); 2738d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank try { 2748d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank ConversationProvider cp = (ConversationProvider)client.getLocalContentProvider(); 2751b9efd9beb715927e0db7b138ddbb2925bc2c06fMarc Blank return cp.apply(operations); 2768d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank } finally { 2778d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank client.release(); 2788d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank } 2793f1eb8517cf7db29ceafa1912ae999af186e2856Marc Blank } 2803f1eb8517cf7db29ceafa1912ae999af186e2856Marc Blank 281cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira public static void undo(final Context context, final Uri undoUri) { 2823f1eb8517cf7db29ceafa1912ae999af186e2856Marc Blank new Thread(new Runnable() { 2833f1eb8517cf7db29ceafa1912ae999af186e2856Marc Blank @Override 2843f1eb8517cf7db29ceafa1912ae999af186e2856Marc Blank public void run() { 285cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira Cursor c = context.getContentResolver().query(undoUri, UIProvider.UNDO_PROJECTION, 286cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira null, null, null); 2873f1eb8517cf7db29ceafa1912ae999af186e2856Marc Blank if (c != null) { 2883f1eb8517cf7db29ceafa1912ae999af186e2856Marc Blank c.close(); 2893f1eb8517cf7db29ceafa1912ae999af186e2856Marc Blank } 290cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira } 291cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira }).start(); 2923f1eb8517cf7db29ceafa1912ae999af186e2856Marc Blank } 293f98b318572750dae998a55a60199598933770b68Mindy Pereira 294f98b318572750dae998a55a60199598933770b68Mindy Pereira public static int archive(Context context, Collection<Conversation> conversations) { 295f98b318572750dae998a55a60199598933770b68Mindy Pereira ArrayList<ConversationOperation> ops = new ArrayList<ConversationOperation>(); 296f98b318572750dae998a55a60199598933770b68Mindy Pereira for (Conversation conv: conversations) { 297f98b318572750dae998a55a60199598933770b68Mindy Pereira ConversationOperation op = 298f98b318572750dae998a55a60199598933770b68Mindy Pereira new ConversationOperation(ConversationOperation.ARCHIVE, conv); 299f98b318572750dae998a55a60199598933770b68Mindy Pereira ops.add(op); 300f98b318572750dae998a55a60199598933770b68Mindy Pereira } 301f98b318572750dae998a55a60199598933770b68Mindy Pereira return apply(context, ops); 302f98b318572750dae998a55a60199598933770b68Mindy Pereira } 303830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira 304830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira public static int mute(Context context, Collection<Conversation> conversations) { 305830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira ArrayList<ConversationOperation> ops = new ArrayList<ConversationOperation>(); 306830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira for (Conversation conv: conversations) { 307830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira ConversationOperation op = 308830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira new ConversationOperation(ConversationOperation.MUTE, conv); 309830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira ops.add(op); 310830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira } 311830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira return apply(context, ops); 312830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira } 313830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira 314830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira public static int reportSpam(Context context, Collection<Conversation> conversations) { 315830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira ArrayList<ConversationOperation> ops = new ArrayList<ConversationOperation>(); 316830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira for (Conversation conv: conversations) { 317830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira ConversationOperation op = 318830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira new ConversationOperation(ConversationOperation.REPORT_SPAM, conv); 319830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira ops.add(op); 320830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira } 321830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira return apply(context, ops); 322830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira } 3231b9efd9beb715927e0db7b138ddbb2925bc2c06fMarc Blank}