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}