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