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}