Conversation.java revision a831b2f1ba6d3c18d5e54563df8bae1f589c4257
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 193f1eb8517cf7db29ceafa1912ae999af186e2856Marc Blankimport android.app.Activity; 208d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blankimport android.content.ContentProviderClient; 21c8a994227b9c686d88ee05840544162711a85712Marc Blankimport android.content.ContentValues; 22c8a994227b9c686d88ee05840544162711a85712Marc Blankimport android.content.Context; 23732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.database.Cursor; 24732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.net.Uri; 25732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.os.Parcel; 26732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.os.Parcelable; 273f1eb8517cf7db29ceafa1912ae999af186e2856Marc Blankimport android.widget.Toast; 28732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 298d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blankimport com.android.mail.browse.ConversationCursor.ConversationOperation; 308d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blankimport com.android.mail.browse.ConversationCursor.ConversationProvider; 318d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank 328d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blankimport java.util.ArrayList; 338d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blankimport java.util.Collection; 348d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank 35732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangpublic class Conversation implements Parcelable { 36f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank public static final int NO_POSITION = -1; 37732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 38732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public long id; 39c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank public Uri uri; 40732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public String subject; 41732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public long dateMs; 42732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public String snippet; 43732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public boolean hasAttachments; 448e915724b6e4374da9b70161ee0a55f0c763e563Mindy Pereira public String messageListUri; 454db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira public String senders; 464db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira public int numMessages; 474db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira public int numDrafts; 484db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira public int sendingState; 494db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira public int priority; 50c8a994227b9c686d88ee05840544162711a85712Marc Blank public boolean read; 51c8a994227b9c686d88ee05840544162711a85712Marc Blank public boolean starred; 52ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank public String folderList; 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); 738e915724b6e4374da9b70161ee0a55f0c763e563Mindy Pereira dest.writeString(messageListUri); 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); 82732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 83732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 84732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang private Conversation(Parcel in) { 85732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang id = in.readLong(); 86c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank uri = in.readParcelable(null); 87732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang subject = in.readString(); 88732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dateMs = in.readLong(); 89732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang snippet = in.readString(); 90732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang hasAttachments = (in.readByte() != 0); 918e915724b6e4374da9b70161ee0a55f0c763e563Mindy Pereira messageListUri = in.readString(); 924db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira senders = in.readString(); 934db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira numMessages = in.readInt(); 944db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira numDrafts = in.readInt(); 954db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira sendingState = in.readInt(); 964db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira priority = in.readInt(); 97c8a994227b9c686d88ee05840544162711a85712Marc Blank read = (in.readByte() != 0); 98c8a994227b9c686d88ee05840544162711a85712Marc Blank starred = (in.readByte() != 0); 99ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank folderList = in.readString(); 100f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank position = NO_POSITION; 101ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank localDeleteOnUpdate = false; 102732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 103732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 104732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 105732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public String toString() { 106732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang return "[conversation id=" + id + "]"; 107732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 108732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 109732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public static final Creator<Conversation> CREATOR = new Creator<Conversation>() { 110732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 111732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 112732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public Conversation createFromParcel(Parcel source) { 113732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang return new Conversation(source); 114732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 115732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 116732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 117732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public Conversation[] newArray(int size) { 118732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang return new Conversation[size]; 119732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 120732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 121732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang }; 122732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 123a831b2f1ba6d3c18d5e54563df8bae1f589c4257Mindy Pereira public Conversation(Cursor cursor) { 124732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang if (cursor != null) { 125732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang id = cursor.getLong(UIProvider.CONVERSATION_ID_COLUMN); 126c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank uri = Uri.parse(cursor.getString(UIProvider.CONVERSATION_URI_COLUMN)); 127732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dateMs = cursor.getLong(UIProvider.CONVERSATION_DATE_RECEIVED_MS_COLUMN); 128732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang subject = cursor.getString(UIProvider.CONVERSATION_SUBJECT_COLUMN); 129374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank // Don't allow null subject 130374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank if (subject == null) { 131374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank subject = ""; 132374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank } 133732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang snippet = cursor.getString(UIProvider.CONVERSATION_SNIPPET_COLUMN); 134c8a994227b9c686d88ee05840544162711a85712Marc Blank hasAttachments = cursor.getInt(UIProvider.CONVERSATION_HAS_ATTACHMENTS_COLUMN) == 1; 1358e915724b6e4374da9b70161ee0a55f0c763e563Mindy Pereira messageListUri = cursor.getString(UIProvider.CONVERSATION_MESSAGE_LIST_URI_COLUMN); 1364db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira senders = cursor.getString(UIProvider.CONVERSATION_SENDER_INFO_COLUMN); 1374db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira numMessages = cursor.getInt(UIProvider.CONVERSATION_NUM_MESSAGES_COLUMN); 1384db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira numDrafts = cursor.getInt(UIProvider.CONVERSATION_NUM_DRAFTS_COLUMN); 1394db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira sendingState = cursor.getInt(UIProvider.CONVERSATION_SENDING_STATE_COLUMN); 1404db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira priority = cursor.getInt(UIProvider.CONVERSATION_PRIORITY_COLUMN); 141c8a994227b9c686d88ee05840544162711a85712Marc Blank read = cursor.getInt(UIProvider.CONVERSATION_READ_COLUMN) == 1; 142c8a994227b9c686d88ee05840544162711a85712Marc Blank starred = cursor.getInt(UIProvider.CONVERSATION_STARRED_COLUMN) == 1; 143ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank folderList = cursor.getString(UIProvider.CONVERSATION_FOLDER_LIST_COLUMN); 144f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank position = NO_POSITION; 145ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank localDeleteOnUpdate = false; 146732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 147732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 148732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 149c8a994227b9c686d88ee05840544162711a85712Marc Blank // Below are methods that update Conversation data (update/delete) 150c8a994227b9c686d88ee05840544162711a85712Marc Blank 1518d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank /** 152ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank * Update a boolean column for a single conversation (see updateBoolean below) 1538d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank */ 154dd10bc8736282262da0cd9a5f9a0236c10b47028Marc Blank public int updateBoolean(Context context, String columnName, boolean value) { 155dd10bc8736282262da0cd9a5f9a0236c10b47028Marc Blank ArrayList<Conversation> conversations = new ArrayList<Conversation>(); 156dd10bc8736282262da0cd9a5f9a0236c10b47028Marc Blank conversations.add(this); 157dd10bc8736282262da0cd9a5f9a0236c10b47028Marc Blank return updateBoolean(context, conversations, columnName, value); 158c8a994227b9c686d88ee05840544162711a85712Marc Blank } 159c8a994227b9c686d88ee05840544162711a85712Marc Blank 1608d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank /** 161ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank * Update a string column for a group of conversations (see updateValues below) 162ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank */ 163ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank public static int updateBoolean(Context context, Collection<Conversation> conversations, 164ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank String columnName, boolean value) { 165ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank ContentValues cv = new ContentValues(); 166ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank cv.put(columnName, value); 167ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank return updateValues(context, conversations, cv); 168ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank } 169ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank 170ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank /** 171ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank * Update a string column for a single conversation (see updateString below) 172ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank */ 173ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank public int updateString(Context context, String columnName, String value) { 174ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank ArrayList<Conversation> conversations = new ArrayList<Conversation>(); 175ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank conversations.add(this); 176ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank return updateString(context, conversations, columnName, value); 177ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank } 178ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank 179ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank /** 180ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank * Update a string column for a group of conversations (see updateValues below) 181ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank */ 182ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank public static int updateString(Context context, Collection<Conversation> conversations, 183ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank String columnName, String value) { 184ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank ContentValues cv = new ContentValues(); 185ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank cv.put(columnName, value); 186ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank return updateValues(context, conversations, cv); 187ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank } 188ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank 189ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank /** 1908d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * Update a boolean column for a group of conversations, immediately in the UI and in a single 1918d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * transaction in the underlying provider 1928d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * @param conversations a collection of conversations 1938d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * @param context the caller's context 1948d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * @param columnName the column to update 1958d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * @param value the new value 1961b9efd9beb715927e0db7b138ddbb2925bc2c06fMarc Blank * @return the sequence number of the operation (for undo) 1978d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank */ 198ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank private static int updateValues(Context context, Collection<Conversation> conversations, 199ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank ContentValues values) { 2008d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank ArrayList<ConversationOperation> ops = new ArrayList<ConversationOperation>(); 2018d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank for (Conversation conv: conversations) { 2028d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank ConversationOperation op = 203ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank new ConversationOperation(ConversationOperation.UPDATE, conv, values); 2048d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank ops.add(op); 2058d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank } 2061b9efd9beb715927e0db7b138ddbb2925bc2c06fMarc Blank return apply(context, ops); 2078d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank } 2088d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank 2098d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank /** 2108d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * Delete a single conversation 2118d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * @param context the caller's context 212dd10bc8736282262da0cd9a5f9a0236c10b47028Marc Blank * @return the sequence number of the operation (for undo) 2138d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank */ 214dd10bc8736282262da0cd9a5f9a0236c10b47028Marc Blank public int delete(Context context) { 215dd10bc8736282262da0cd9a5f9a0236c10b47028Marc Blank ArrayList<Conversation> conversations = new ArrayList<Conversation>(); 216dd10bc8736282262da0cd9a5f9a0236c10b47028Marc Blank conversations.add(this); 217dd10bc8736282262da0cd9a5f9a0236c10b47028Marc Blank return delete(context, conversations); 218c8a994227b9c686d88ee05840544162711a85712Marc Blank } 2198d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank 2208d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank /** 2218d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * Delete a group of conversations immediately in the UI and in a single transaction in the 2228d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * underlying provider 2238d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * @param context the caller's context 2248d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank * @param conversations a collection of conversations 2251b9efd9beb715927e0db7b138ddbb2925bc2c06fMarc Blank * @return the sequence number of the operation (for undo) 2268d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank */ 2271b9efd9beb715927e0db7b138ddbb2925bc2c06fMarc Blank public static int delete(Context context, Collection<Conversation> conversations) { 2288d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank ArrayList<ConversationOperation> ops = new ArrayList<ConversationOperation>(); 2298d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank for (Conversation conv: conversations) { 2308d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank ConversationOperation op = 231f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank new ConversationOperation(ConversationOperation.DELETE, conv); 2328d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank ops.add(op); 2338d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank } 2341b9efd9beb715927e0db7b138ddbb2925bc2c06fMarc Blank return apply(context, ops); 2358d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank } 2368d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank 2378d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank // Convenience methods 2381b9efd9beb715927e0db7b138ddbb2925bc2c06fMarc Blank private static int apply(Context context, ArrayList<ConversationOperation> operations) { 2398d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank ContentProviderClient client = 2408d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank context.getContentResolver().acquireContentProviderClient( 2418d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank ConversationProvider.AUTHORITY); 2428d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank try { 2438d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank ConversationProvider cp = (ConversationProvider)client.getLocalContentProvider(); 2441b9efd9beb715927e0db7b138ddbb2925bc2c06fMarc Blank return cp.apply(operations); 2458d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank } finally { 2468d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank client.release(); 2478d69d4e10a9a36ff790babb2f3a098a12d0dc732Marc Blank } 2483f1eb8517cf7db29ceafa1912ae999af186e2856Marc Blank } 2493f1eb8517cf7db29ceafa1912ae999af186e2856Marc Blank 2500825efd09986173b90d7c7d45617fb22d18b1b96Mindy Pereira public static void undo(final Context context, final String undoUri) { 2513f1eb8517cf7db29ceafa1912ae999af186e2856Marc Blank new Thread(new Runnable() { 2523f1eb8517cf7db29ceafa1912ae999af186e2856Marc Blank @Override 2533f1eb8517cf7db29ceafa1912ae999af186e2856Marc Blank public void run() { 2540825efd09986173b90d7c7d45617fb22d18b1b96Mindy Pereira Cursor c = context.getContentResolver().query(Uri.parse(undoUri), 2553f1eb8517cf7db29ceafa1912ae999af186e2856Marc Blank UIProvider.UNDO_PROJECTION, null, null, null); 2563f1eb8517cf7db29ceafa1912ae999af186e2856Marc Blank if (c != null) { 2573f1eb8517cf7db29ceafa1912ae999af186e2856Marc Blank c.close(); 2583f1eb8517cf7db29ceafa1912ae999af186e2856Marc Blank } 259ee62fced125d020ee175cb48efcd1d6517314d51Mindy Pereira }}).start(); 2603f1eb8517cf7db29ceafa1912ae999af186e2856Marc Blank } 261f98b318572750dae998a55a60199598933770b68Mindy Pereira 262f98b318572750dae998a55a60199598933770b68Mindy Pereira public static int archive(Context context, Collection<Conversation> conversations) { 263f98b318572750dae998a55a60199598933770b68Mindy Pereira ArrayList<ConversationOperation> ops = new ArrayList<ConversationOperation>(); 264f98b318572750dae998a55a60199598933770b68Mindy Pereira for (Conversation conv: conversations) { 265f98b318572750dae998a55a60199598933770b68Mindy Pereira ConversationOperation op = 266f98b318572750dae998a55a60199598933770b68Mindy Pereira new ConversationOperation(ConversationOperation.ARCHIVE, conv); 267f98b318572750dae998a55a60199598933770b68Mindy Pereira ops.add(op); 268f98b318572750dae998a55a60199598933770b68Mindy Pereira } 269f98b318572750dae998a55a60199598933770b68Mindy Pereira return apply(context, ops); 270f98b318572750dae998a55a60199598933770b68Mindy Pereira } 271830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira 272830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira public static int mute(Context context, Collection<Conversation> conversations) { 273830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira ArrayList<ConversationOperation> ops = new ArrayList<ConversationOperation>(); 274830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira for (Conversation conv: conversations) { 275830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira ConversationOperation op = 276830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira new ConversationOperation(ConversationOperation.MUTE, conv); 277830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira ops.add(op); 278830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira } 279830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira return apply(context, ops); 280830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira } 281830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira 282830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira public static int reportSpam(Context context, Collection<Conversation> conversations) { 283830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira ArrayList<ConversationOperation> ops = new ArrayList<ConversationOperation>(); 284830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira for (Conversation conv: conversations) { 285830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira ConversationOperation op = 286830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira new ConversationOperation(ConversationOperation.REPORT_SPAM, conv); 287830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira ops.add(op); 288830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira } 289830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira return apply(context, ops); 290830c00f18b199f4eb2b2cc05b7038b8b05d8eca9Mindy Pereira } 2911b9efd9beb715927e0db7b138ddbb2925bc2c06fMarc Blank}