UIProvider.java revision a457137806ef3384099fb60e71a39236c65d4e62
1/*******************************************************************************
2 *      Copyright (C) 2011 Google Inc.
3 *      Licensed to The Android Open Source Project.
4 *
5 *      Licensed under the Apache License, Version 2.0 (the "License");
6 *      you may not use this file except in compliance with the License.
7 *      You may obtain a copy of the License at
8 *
9 *           http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *      Unless required by applicable law or agreed to in writing, software
12 *      distributed under the License is distributed on an "AS IS" BASIS,
13 *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *      See the License for the specific language governing permissions and
15 *      limitations under the License.
16 *******************************************************************************/
17
18package com.android.mail.providers;
19
20import android.content.Context;
21import android.provider.BaseColumns;
22import android.text.TextUtils;
23
24import com.android.common.contacts.DataUsageStatUpdater;
25
26import java.lang.String;
27import java.util.ArrayList;
28
29
30public class UIProvider {
31    public static final String EMAIL_SEPARATOR = "\n";
32    public static final long INVALID_CONVERSATION_ID = -1;
33    public static final long INVALID_MESSAGE_ID = -1;
34
35    // The actual content provider should define its own authority
36    public static final String AUTHORITY = "com.android.mail.providers";
37
38    public static final String ACCOUNT_LIST_TYPE =
39            "vnd.android.cursor.dir/vnd.com.android.mail.account";
40    public static final String ACCOUNT_TYPE =
41            "vnd.android.cursor.item/vnd.com.android.mail.account";
42
43    public static final String[] ACCOUNTS_PROJECTION = {
44            BaseColumns._ID,
45            AccountColumns.NAME,
46            AccountColumns.PROVIDER_VERSION,
47            AccountColumns.URI,
48            AccountColumns.CAPABILITIES,
49            AccountColumns.FOLDER_LIST_URI,
50            AccountColumns.SEARCH_URI,
51            AccountColumns.ACCOUNT_FROM_ADDRESSES_URI,
52            AccountColumns.SAVE_DRAFT_URI,
53            AccountColumns.SEND_MESSAGE_URI,
54            AccountColumns.EXPUNGE_MESSAGE_URI
55    };
56
57    public static final int ACCOUNT_ID_COLUMN = 0;
58    public static final int ACCOUNT_NAME_COLUMN = 1;
59    public static final int ACCOUNT_PROVIDER_VERISON_COLUMN = 2;
60    public static final int ACCOUNT_URI_COLUMN = 3;
61    public static final int ACCOUNT_CAPABILITIES_COLUMN = 4;
62    public static final int ACCOUNT_FOLDER_LIST_URI_COLUMN = 5;
63    public static final int ACCOUNT_SEARCH_URI_COLUMN = 6;
64    public static final int ACCOUNT_FROM_ADDRESSES_URI_COLUMN = 7;
65    public static final int ACCOUNT_SAVE_DRAFT_URI_COLUMN = 8;
66    public static final int ACCOUNT_SEND_MESSAGE_URI_COLUMN = 9;
67    public static final int ACCOUNT_EXPUNGE_MESSAGE_URI_COLUMN = 10;
68
69    public static final class AccountCapabilities {
70        public static final int SYNCABLE_FOLDERS = 0x0001;
71        public static final int REPORT_SPAM = 0x0002;
72        public static final int ARCHIVE = 0x0004;
73        public static final int MUTE = 0x0008;
74        public static final int SERVER_SEARCH = 0x0010;
75        public static final int FOLDER_SERVER_SEARCH = 0x0020;
76        public static final int SANITIZED_HTML = 0x0040;
77        public static final int DRAFT_SYNCHRONIZATION = 0x0080;
78        public static final int MULTIPLE_FROM_ADDRESSES = 0x0100;
79        public static final int SMART_REPLY = 0x0200;
80        public static final int LOCAL_SEARCH = 0x0400;
81        public static final int THREADED_CONVERSATIONS = 0x0800;
82    }
83
84    public static final class AccountColumns {
85        /**
86         * This string column contains the human visible name for the account.
87         */
88        public static final String NAME = "name";
89
90        /**
91         * This integer column returns the version of the UI provider schema from which this
92         * account provider will return results.
93         */
94        public static final String PROVIDER_VERSION = "providerVersion";
95
96        /**
97         * This string column contains the uri to directly access the information for this account.
98         */
99        public static final String URI = "accountUri";
100
101        /**
102         * This integer column contains a bit field of the possible cabibilities that this account
103         * supports.
104         */
105        public static final String CAPABILITIES = "capabilities";
106
107        /**
108         * This string column contains the content provider uri to return the
109         * list of top level folders for this account.
110         */
111        public static final String FOLDER_LIST_URI = "folderListUri";
112
113        /**
114         * This string column contains the content provider uri that can be queried for search
115         * results.
116         */
117        public static final String SEARCH_URI = "searchUri";
118
119        /**
120         * This string column contains the content provider uri that can be queried to access the
121         * from addresses for this account.
122         */
123        public static final String ACCOUNT_FROM_ADDRESSES_URI = "accountFromAddressesUri";
124
125        /**
126         * This string column contains the content provider uri that can be used to save (insert)
127         * new draft messages for this account. NOTE: This might be better to
128         * be an update operation on the messageUri.
129         */
130        public static final String SAVE_DRAFT_URI = "saveDraftUri";
131
132        /**
133         * This string column contains the content provider uri that can be used to send
134         * a message for this account.
135         * NOTE: This might be better to be an update operation on the messageUri.
136         */
137        public static final String SEND_MESSAGE_URI = "sendMessageUri";
138
139        /**
140         * This string column contains the content provider uri that can be used
141         * to expunge a message from this account. NOTE: This might be better to
142         * be an update operation on the messageUri.
143         */
144        public static final String EXPUNGE_MESSAGE_URI = "expungeMessageUri";
145    }
146
147    // We define a "folder" as anything that contains a list of conversations.
148    public static final String FOLDER_LIST_TYPE =
149            "vnd.android.cursor.dir/vnd.com.android.mail.folder";
150    public static final String FOLDER_TYPE =
151            "vnd.android.cursor.item/vnd.com.android.mail.folder";
152
153    public static final String[] FOLDERS_PROJECTION = {
154        BaseColumns._ID,
155        FolderColumns.URI,
156        FolderColumns.NAME,
157        FolderColumns.HAS_CHILDREN,
158        FolderColumns.CAPABILITIES,
159        FolderColumns.SYNC_FREQUENCY,
160        FolderColumns.SYNC_WINDOW,
161        FolderColumns.CONVERSATION_LIST_URI,
162        FolderColumns.CHILD_FOLDERS_LIST_URI,
163        FolderColumns.UNREAD_COUNT,
164        FolderColumns.TOTAL_COUNT
165    };
166
167    public static final int FOLDER_ID_COLUMN = 0;
168    public static final int FOLDER_URI_COLUMN = 1;
169    public static final int FOLDER_NAME_COLUMN = 2;
170    public static final int FOLDER_HAS_CHILDREN_COLUMN = 3;
171    public static final int FOLDER_CAPABILITIES_COLUMN = 4;
172    public static final int FOLDER_SYNC_FREQUENCY_COLUMN = 5;
173    public static final int FOLDER_SYNC_WINDOW_COLUMN = 6;
174    public static final int FOLDER_CONVERSATION_LIST_URI_COLUMN = 7;
175    public static final int FOLDER_CHILD_FOLDERS_LIST_COLUMN = 8;
176    public static final int FOLDER_UNREAD_COUNT_COLUMN = 9;
177    public static final int FOLDER_TOTAL_COUNT_COLUMN = 10;
178
179    public static final class FolderCapabilities {
180        public static final int SYNCABLE = 0x0001;
181        public static final int PARENT = 0x0002;
182        public static final int CAN_HOLD_MAIL = 0x0004;
183        public static final int CAN_ACCEPT_MOVED_MESSAGES = 0x0008;
184    }
185
186    public static final class FolderColumns {
187        public static String URI = "folderUri";
188        /**
189         * This string column contains the human visible name for the folder.
190         */
191        public static final String NAME = "name";
192        /**
193         * This int column represents the capabilities of the folder specified by
194         * FolderCapabilities flags.
195         */
196        public static String CAPABILITIES = "capabilities";
197        /**
198         * This int column represents whether or not this folder has any
199         * child folders.
200         */
201        public static String HAS_CHILDREN = "hasChildren";
202        /**
203         * This int column represents how often the folder should be synced.
204         */
205        public static String SYNC_FREQUENCY = "syncFrequency";
206        /**
207         * This int column represents how large the sync window is.
208         */
209        public static String SYNC_WINDOW = "syncWindow";
210        /**
211         * This string column contains the content provider uri to return the
212         * list of conversations for this folder.
213         */
214        public static final String CONVERSATION_LIST_URI = "conversationListUri";
215        /**
216         * This string column contains the content provider uri to return the
217         * list of child folders of this folder.
218         */
219        public static String CHILD_FOLDERS_LIST_URI = "childFoldersListUri";
220
221        public static String UNREAD_COUNT = "unreadCount";
222
223        public static String TOTAL_COUNT = "totalCount";
224
225        public FolderColumns() {};
226    }
227
228    // We define a "folder" as anything that contains a list of conversations.
229    public static final String CONVERSATION_LIST_TYPE =
230            "vnd.android.cursor.dir/vnd.com.android.mail.conversation";
231    public static final String CONVERSATION_TYPE =
232            "vnd.android.cursor.item/vnd.com.android.mail.conversation";
233
234    public static final String[] CONVERSATION_PROJECTION = {
235        BaseColumns._ID,
236        ConversationColumns.URI,
237        ConversationColumns.MESSAGE_LIST_URI,
238        ConversationColumns.SUBJECT,
239        ConversationColumns.SNIPPET,
240        ConversationColumns.SENDER_INFO,
241        ConversationColumns.DATE_RECEIVED_MS,
242        ConversationColumns.HAS_ATTACHMENTS,
243        ConversationColumns.NUM_MESSAGES,
244        ConversationColumns.NUM_DRAFTS,
245        ConversationColumns.SENDING_STATE,
246        ConversationColumns.PRIORITY
247    };
248
249    // These column indexes only work when the caller uses the
250    // default CONVERSATION_PROJECTION defined above.
251    public static final int CONVERSATION_ID_COLUMN = 0;
252    public static final int CONVERSATION_URI_COLUMN = 1;
253    public static final int CONVERSATION_MESSAGE_LIST_URI_COLUMN = 2;
254    public static final int CONVERSATION_SUBJECT_COLUMN = 3;
255    public static final int CONVERSATION_SNIPPET_COLUMN = 4;
256    public static final int CONVERSATION_SENDER_INFO_COLUMN = 5;
257    public static final int CONVERSATION_DATE_RECEIVED_MS_COLUMN = 6;
258    public static final int CONVERSATION_HAS_ATTACHMENTS_COLUMN = 7;
259    public static final int CONVERSATION_NUM_MESSAGES_COLUMN = 8;
260    public static final int CONVERSATION_NUM_DRAFTS_COLUMN = 9;
261    public static final int CONVERSATION_SENDING_STATE_COLUMN = 10;
262    public static final int CONVERSATION_PRIORITY_COLUMN = 11;
263
264    public static final class ConversationSendingState {
265        public static final int OTHER = 0;
266        public static final int SENDING = 1;
267        public static final int SENT = 2;
268        public static final int SEND_ERROR = -1;
269    };
270
271    public static final class ConversationPriority {
272        public static final int LOW = 0;
273        public static final int HIGH = 1;
274    };
275
276    public static final class ConversationColumns {
277        public static final String URI = "conversationUri";
278        /**
279         * This string column contains the content provider uri to return the
280         * list of messages for this conversation.
281         */
282        public static final String MESSAGE_LIST_URI = "messageListUri";
283        /**
284         * This string column contains the subject string for a conversation.
285         */
286        public static final String SUBJECT = "subject";
287        /**
288         * This string column contains the snippet string for a conversation.
289         */
290        public static final String SNIPPET = "snippet";
291        /**
292         * This string column contains the sender info string for a
293         * conversation.
294         */
295        public static final String SENDER_INFO = "senderInfo";
296        /**
297         * This long column contains the time in ms of the latest update to a
298         * conversation.
299         */
300        public static final String DATE_RECEIVED_MS = "dateReceivedMs";
301
302        /**
303         * This boolean column contains whether any messages in this conversation
304         * have attachments.
305         */
306        public static final String HAS_ATTACHMENTS = "hasAttachments";
307
308        /**
309         * This int column contains the number of messages in this conversation.
310         * For unthreaded, this will always be 1.
311         */
312        public static String NUM_MESSAGES = "numMessages";
313
314        /**
315         * This int column contains the number of drafts associated with this
316         * conversation.
317         */
318        public static String NUM_DRAFTS = "numDrafts";
319
320        /**
321         * This int column contains the state of drafts and replies associated
322         * with this conversation. Use ConversationSendingState to interpret
323         * this field.
324         */
325        public static String SENDING_STATE = "sendingState";
326
327        /**
328         * This int column contains the priority of this conversation. Use
329         * ConversationPriority to interpret this field.
330         */
331        public static String PRIORITY = "priority";
332
333        public ConversationColumns() {
334        }
335    }
336
337    /**
338     * Returns a uri that, when queried, will return a cursor with a list of information for the
339     * list of configured accounts.
340     * @return
341     */
342    // TODO: create a static registry for the starting point for the UI provider.
343//    public static Uri getAccountsUri() {
344//        return Uri.parse(BASE_URI_STRING + "/");
345//    }
346
347    public static final class DraftType {
348        public static final String COMPOSE = "compose";
349        public static final String REPLY = "reply";
350        public static final String REPLY_ALL = "replyAll";
351        public static final String FORWARD = "forward";
352
353        private DraftType() {}
354    }
355
356    public static final String[] MESSAGE_PROJECTION = {
357        BaseColumns._ID,
358        MessageColumns.SERVER_ID,
359        MessageColumns.URI,
360        MessageColumns.CONVERSATION_ID,
361        MessageColumns.SUBJECT,
362        MessageColumns.SNIPPET,
363        MessageColumns.FROM,
364        MessageColumns.TO,
365        MessageColumns.CC,
366        MessageColumns.BCC,
367        MessageColumns.REPLY_TO,
368        MessageColumns.DATE_RECEIVED_MS,
369        MessageColumns.BODY_HTML,
370        MessageColumns.BODY_TEXT,
371        MessageColumns.EMBEDS_EXTERNAL_RESOURCES,
372        MessageColumns.REF_MESSAGE_ID,
373        MessageColumns.DRAFT_TYPE,
374        MessageColumns.INCLUDE_QUOTED_TEXT,
375        MessageColumns.QUOTE_START_POS,
376        MessageColumns.CLIENT_CREATED,
377        MessageColumns.CUSTOM_FROM_ADDRESS,
378        MessageColumns.HAS_ATTACHMENTS,
379        MessageColumns.ATTACHMENT_LIST_URI,
380        MessageColumns.MESSAGE_FLAGS
381    };
382
383    public static final String MESSAGE_LIST_TYPE =
384            "vnd.android.cursor.dir/vnd.com.android.mail.message";
385    public static final String MESSAGE_TYPE =
386            "vnd.android.cursor.item/vnd.com.android.mail.message";
387
388    public static final int MESSAGE_ID_COLUMN = 0;
389    public static final int MESSAGE_SERVER_ID_COLUMN = 1;
390    public static final int MESSAGE_URI_COLUMN = 2;
391    public static final int MESSAGE_CONVERSATION_ID_COLUMN = 3;
392    public static final int MESSAGE_SUBJECT_COLUMN = 4;
393    public static final int MESSAGE_SNIPPET_COLUMN = 5;
394    public static final int MESSAGE_FROM_COLUMN = 6;
395    public static final int MESSAGE_TO_COLUMN = 7;
396    public static final int MESSAGE_CC_COLUMN = 8;
397    public static final int MESSAGE_BCC_COLUMN = 9;
398    public static final int MESSAGE_REPLY_TO_COLUMN = 10;
399    public static final int MESSAGE_DATE_RECEIVED_MS_COLUMN = 11;
400    public static final int MESSAGE_BODY_HTML_COLUMN = 12;
401    public static final int MESSAGE_BODY_TEXT_COLUMN = 13;
402    public static final int MESSAGE_EMBEDS_EXTERNAL_RESOURCES_COLUMN = 14;
403    public static final int MESSAGE_REF_MESSAGE_ID_COLUMN = 15;
404    public static final int MESSAGE_DRAFT_TYPE_COLUMN = 16;
405    public static final int MESSAGE_INCLUDE_QUOTED_TEXT_COLUMN = 17;
406    public static final int MESSAGE_QUOTE_START_POS_COLUMN = 18;
407    public static final int MESSAGE_CLIENT_CREATED_COLUMN = 19;
408    public static final int MESSAGE_CUSTOM_FROM_ADDRESS_COLUMN = 20;
409    public static final int MESSAGE_HAS_ATTACHMENTS_COLUMN = 21;
410    public static final int MESSAGE_ATTACHMENT_LIST_URI_COLUMN = 22;
411    public static final int MESSAGE_FLAGS_COLUMN = 23;
412
413    public static final class MessageFlags {
414        public static final int SYNCABLE = 0x0001;
415        public static final int PARENT = 0x0002;
416        public static final int CAN_HOLD_MAIL = 0x0004;
417        public static final int CAN_ACCEPT_MOVED_MESSAGES = 0x0008;
418        public static final int STARRED = 0x0012;
419    }
420
421    public static final class MessageColumns {
422        public static final String URI = "messageUri";
423        public static final String SERVER_ID = "localMessageId";
424        public static final String CONVERSATION_ID = "conversationId";
425        public static final String SUBJECT = "subject";
426        public static final String SNIPPET = "snippet";
427        public static final String FROM = "fromAddress";
428        public static final String TO = "toAddresses";
429        public static final String CC = "ccAddresses";
430        public static final String BCC = "bccAddresses";
431        public static final String REPLY_TO = "replyToAddress";
432        public static final String DATE_RECEIVED_MS = "dateReceivedMs";
433        public static final String BODY_HTML = "bodyHtml";
434        public static final String BODY_TEXT = "bodyText";
435        public static final String EMBEDS_EXTERNAL_RESOURCES = "bodyEmbedsExternalResources";
436        public static final String REF_MESSAGE_ID = "refMessageId";
437        public static final String DRAFT_TYPE = "draftType";
438        public static final String INCLUDE_QUOTED_TEXT = "includeQuotedText";
439        public static final String QUOTE_START_POS = "quoteStartPos";
440        public static final String CLIENT_CREATED = "clientCreated";
441        public static final String CUSTOM_FROM_ADDRESS = "customFromAddress";
442        public static final String HAS_ATTACHMENTS = "hasAttachments";
443        public static final String ATTACHMENT_LIST_URI = "attachmentListUri";
444        public static final String MESSAGE_FLAGS = "messageFlags";
445
446        private MessageColumns() {}
447    }
448
449    // We define a "folder" as anything that contains a list of conversations.
450    public static final String ATTACHMENT_LIST_TYPE =
451            "vnd.android.cursor.dir/vnd.com.android.mail.attachment";
452    public static final String ATTACHMENT_TYPE =
453            "vnd.android.cursor.item/vnd.com.android.mail.attachment";
454
455    public static final String[] ATTACHMENT_PROJECTION = {
456        BaseColumns._ID,
457        AttachmentColumns.NAME,
458        AttachmentColumns.SIZE,
459        AttachmentColumns.URI,
460        AttachmentColumns.ORIGIN_EXTRAS,
461        AttachmentColumns.CONTENT_TYPE,
462        AttachmentColumns.SYNCED
463    };
464    private static final String EMAIL_SEPARATOR_PATTERN = "\n";
465    public static final int ATTACHMENT_ID_COLUMN = 0;
466    public static final int ATTACHMENT_NAME_COLUMN = 1;
467    public static final int ATTACHMENT_SIZE_COLUMN = 2;
468    public static final int ATTACHMENT_URI_COLUMN = 3;
469
470    public static final class AttachmentColumns {
471        public static final String NAME = "name";
472        public static final String SIZE = "size";
473        public static final String URI = "uri";
474        public static final String ORIGIN_EXTRAS = "originExtras";
475        public static final String CONTENT_TYPE = "contentType";
476        public static final String SYNCED = "synced";
477    }
478
479    public static int getMailMaxAttachmentSize(String account) {
480        // TODO: query the account to see what the max attachment size is?
481        return 5 * 1024 * 1024;
482    }
483
484    public static String getAttachmentTypeSetting() {
485        // TODO: query the account to see what kinds of attachments it supports?
486        return "com.google.android.gm.allowAddAnyAttachment";
487    }
488
489    public static void incrementRecipientsTimesContacted(Context context, String addressString) {
490        DataUsageStatUpdater statsUpdater = new DataUsageStatUpdater(context);
491        ArrayList<String> recipients = new ArrayList<String>();
492        String[] addresses = TextUtils.split(addressString, EMAIL_SEPARATOR_PATTERN);
493        for (String address : addresses) {
494            recipients.add(address);
495        }
496        statsUpdater.updateWithAddress(recipients);
497    }
498}
499