MockUiProvider.java revision 5f424372f9a801120b5dc8d3f56e907baaa04e25
1/** 2 * Copyright (c) 2011, Google Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.mail.providers.protos.mock; 18 19import android.content.ContentProvider; 20import android.content.ContentValues; 21import android.database.Cursor; 22import android.database.MatrixCursor; 23import android.net.Uri; 24import android.os.Parcel; 25import android.provider.BaseColumns; 26import android.text.Html; 27 28import com.android.mail.providers.Account; 29import com.android.mail.providers.ConversationInfo; 30import com.android.mail.providers.Folder; 31import com.android.mail.providers.MailAppProvider; 32import com.android.mail.providers.MessageInfo; 33import com.android.mail.providers.ReplyFromAccount; 34import com.android.mail.providers.Settings; 35import com.android.mail.providers.UIProvider.AccountCapabilities; 36import com.android.mail.providers.UIProvider.AccountColumns; 37import com.android.mail.providers.UIProvider.AccountColumns.SettingsColumns; 38import com.android.mail.providers.UIProvider.AttachmentColumns; 39import com.android.mail.providers.UIProvider.ConversationColumns; 40import com.android.mail.providers.UIProvider.FolderCapabilities; 41import com.android.mail.providers.UIProvider.FolderColumns; 42import com.android.mail.providers.UIProvider.MessageColumns; 43 44import com.google.common.annotations.VisibleForTesting; 45import com.google.common.collect.ImmutableList; 46import com.google.common.collect.ImmutableMap; 47import com.google.common.collect.Lists; 48import com.google.common.collect.Maps; 49 50import org.json.JSONArray; 51 52import java.util.ArrayList; 53import java.util.Date; 54import java.util.List; 55import java.util.Map; 56import java.util.Set; 57 58public final class MockUiProvider extends ContentProvider { 59 60 public static final String AUTHORITY = "com.android.mail.mockprovider"; 61 62 63 static final String BASE_URI_STRING = "content://" + AUTHORITY; 64 65 private static final Uri MOCK_ACCOUNTS_URI = Uri.parse("content://" + AUTHORITY + "/accounts"); 66 67 68 public static final int NUM_MOCK_ACCOUNTS = 2; 69 70 // A map of query result for uris 71 // TODO(pwestbro) read this map from an external 72 private static Map<String, List<Map<String, Object>>> MOCK_QUERY_RESULTS = Maps.newHashMap(); 73 74 75 public static void initializeMockProvider() { 76 ImmutableMap.Builder<String, List<Map<String, Object>>> builder = ImmutableMap.builder(); 77 78 // Add results for account list 79 final List<Map<String, Object>> accountList = Lists.newArrayList(); 80 Map<String, Object> accountDetailsMap0; 81 Map<String, Object> folderDetailsMap0 = createFolderDetailsMap(0, "zero", true, 0, 2); 82 builder.put(folderDetailsMap0.get(FolderColumns.URI).toString(), 83 ImmutableList.of(folderDetailsMap0)); 84 Map<String, Object> folderDetailsMap2 = createFolderDetailsMap(2, "two", 2, 2); 85 // Account 1 86 accountDetailsMap0 = createAccountDetailsMap(0, true, 87 (String)folderDetailsMap0.get(FolderColumns.URI)); 88 89 accountList.add(accountDetailsMap0); 90 Uri accountUri1 = (Uri) accountDetailsMap0.get(AccountColumns.URI); 91 builder.put(accountUri1.toString(), ImmutableList.of(accountDetailsMap0)); 92 93 // Account 2 94 Map<String, Object> accountDetailsMap1 = createAccountDetailsMap(1, true, 95 (String)folderDetailsMap2.get(FolderColumns.URI)); 96 accountList.add(accountDetailsMap1); 97 98 Uri accountUri2 = (Uri) accountDetailsMap1.get(AccountColumns.URI); 99 builder.put(accountUri2.toString(), ImmutableList.of(accountDetailsMap1)); 100 101 // Add the account list to the builder 102 builder.put(getAccountsUri().toString(), accountList); 103 104 builder.put( 105 folderDetailsMap0.get(FolderColumns.CHILD_FOLDERS_LIST_URI).toString(), 106 ImmutableList.of(createFolderDetailsMap(10, "zeroChild0", 0, 0), 107 createFolderDetailsMap(11, "zeroChild1", 0, 0))); 108 109 Map<String, Object> conv0 = createConversationDetailsMap("zeroConv0".hashCode(), 110 "zeroConv0", 1, 1, 0); 111 builder.put(conv0.get(ConversationColumns.URI).toString(), 112 ImmutableList.of(conv0)); 113 Map<String, Object> conv1 = createConversationDetailsMap("zeroConv1".hashCode(), 114 "zeroConv1", 1, 5, 1); 115 builder.put(conv1.get(ConversationColumns.URI).toString(), 116 ImmutableList.of(conv1)); 117 Map<String, Object> conv2 = createConversationDetailsMap("zeroConv2".hashCode(), 118 "zeroConv2", 1, 5, 2); 119 builder.put(conv2.get(ConversationColumns.URI).toString(), 120 ImmutableList.of(conv2)); 121 builder.put(folderDetailsMap0.get(FolderColumns.CONVERSATION_LIST_URI).toString(), 122 ImmutableList.of(conv0, conv1, conv2)); 123 124 Map<String, Object> message0 = createMessageDetailsMap("zeroConv0".hashCode(), "zeroConv0", 125 1, false); 126 builder.put(message0.get(MessageColumns.URI).toString(), ImmutableList.of(message0)); 127 builder.put(conv0.get(ConversationColumns.MESSAGE_LIST_URI).toString(), 128 ImmutableList.of(message0)); 129 builder.put(message0.get(MessageColumns.ATTACHMENT_LIST_URI).toString(), 130 ImmutableList.of(createAttachmentDetailsMap(0, "zero"))); 131 Map<String, Object> message1 = createMessageDetailsMap("zeroConv1".hashCode(), "zeroConv1", 132 1, false); 133 builder.put(message1.get(MessageColumns.URI).toString(), ImmutableList.of(message1)); 134 Map<String, Object> message1a = createMessageDetailsMap("zeroConv1a".hashCode(), "zeroConv1a", 135 2, false); 136 builder.put(message1a.get(MessageColumns.URI).toString(), ImmutableList.of(message1a)); 137 builder.put(conv1.get(ConversationColumns.MESSAGE_LIST_URI).toString(), 138 ImmutableList.of(message1, message1a)); 139 builder.put(message1.get(MessageColumns.ATTACHMENT_LIST_URI).toString(), 140 ImmutableList.of(createAttachmentDetailsMap(1, "one"))); 141 142 Map<String, Object> folderDetailsMap1 = createFolderDetailsMap(1, "one", 0, 0); 143 builder.put(folderDetailsMap1.get(FolderColumns.URI).toString(), 144 ImmutableList.of(folderDetailsMap1)); 145 builder.put(accountDetailsMap0.get(AccountColumns.FOLDER_LIST_URI).toString(), 146 ImmutableList.of(folderDetailsMap0, folderDetailsMap1)); 147 148 builder.put(folderDetailsMap2.get(FolderColumns.URI).toString(), 149 ImmutableList.of(folderDetailsMap2)); 150 Map<String, Object> folderDetailsMap3 = createFolderDetailsMap(3, "three", 0, 0); 151 builder.put(folderDetailsMap3.get(FolderColumns.URI).toString(), 152 ImmutableList.of(folderDetailsMap3)); 153 builder.put(accountDetailsMap1.get(AccountColumns.FOLDER_LIST_URI).toString(), 154 ImmutableList.of(folderDetailsMap2, folderDetailsMap3)); 155 156 Map<String, Object> conv3 = createConversationDetailsMap("zeroConv3".hashCode(), 157 "zeroConv3", 0, 1, 0); 158 builder.put(conv3.get(ConversationColumns.URI).toString(), 159 ImmutableList.of(conv3)); 160 Map<String, Object> conv4 = createConversationDetailsMap("zeroConv4".hashCode(), 161 "zeroConv4", 0, 1, 0); 162 builder.put(conv4.get(ConversationColumns.URI).toString(), 163 ImmutableList.of(conv4)); 164 builder.put(folderDetailsMap2.get(FolderColumns.CONVERSATION_LIST_URI).toString(), 165 ImmutableList.of(conv3, conv4)); 166 167 Map<String, Object> message2 = createMessageDetailsMap("zeroConv3".hashCode(), "zeroConv3", 168 0, true); 169 builder.put(message2.get(MessageColumns.URI).toString(), ImmutableList.of(message2)); 170 builder.put(conv3.get(ConversationColumns.MESSAGE_LIST_URI).toString(), 171 ImmutableList.of(message2)); 172 Map<String, Object> message3 = createMessageDetailsMap("zeroConv4".hashCode(), "zeroConv4", 173 0, true); 174 builder.put(message3.get(MessageColumns.URI).toString(), ImmutableList.of(message3)); 175 builder.put(conv4.get(ConversationColumns.MESSAGE_LIST_URI).toString(), 176 ImmutableList.of(message3)); 177 178 MOCK_QUERY_RESULTS = builder.build(); 179 } 180 181 private static Map<String, Object> createConversationDetailsMap(int conversationId, 182 String subject, int hasAttachments, int messageCount, int draftCount) { 183 final String conversationUri = "content://" + AUTHORITY + "/conversation/" + conversationId; 184 Map<String, Object> conversationMap = Maps.newHashMap(); 185 conversationMap.put(BaseColumns._ID, Long.valueOf(conversationId)); 186 conversationMap.put(ConversationColumns.URI, conversationUri); 187 conversationMap.put(ConversationColumns.MESSAGE_LIST_URI, conversationUri + "/getMessages"); 188 conversationMap.put(ConversationColumns.SUBJECT, "Conversation " + subject); 189 conversationMap.put(ConversationColumns.SNIPPET, "snippet"); 190 conversationMap.put(ConversationColumns.SENDER_INFO, 191 "account1@mock.com, account2@mock.com"); 192 conversationMap.put(ConversationColumns.DATE_RECEIVED_MS, new Date().getTime()); 193 conversationMap.put(ConversationColumns.HAS_ATTACHMENTS, hasAttachments); 194 conversationMap.put(ConversationColumns.NUM_MESSAGES, 1); 195 conversationMap.put(ConversationColumns.NUM_DRAFTS, 1); 196 conversationMap.put(ConversationColumns.SENDING_STATE, 1); 197 conversationMap.put(ConversationColumns.READ, 0); 198 conversationMap.put(ConversationColumns.STARRED, 0); 199 conversationMap.put(ConversationColumns.CONVERSATION_INFO, 200 generateConversationInfo(messageCount, draftCount)); 201 Folder[] folders = new Folder[3]; 202 StringBuilder foldersString = new StringBuilder(); 203 for (int i = 0; i < folders.length; i++) { 204 folders[i] = new Folder(); 205 folders[i].name = "folder" + i; 206 switch (i) { 207 case 0: 208 folders[i].bgColor = "#fff000"; 209 break; 210 case 1: 211 folders[i].bgColor = "#0000FF"; 212 break; 213 case 2: 214 folders[i].bgColor = "#FFFF00"; 215 break; 216 default: 217 folders[i].bgColor = null; 218 break; 219 } 220 221 } 222 for (int i = 0; i < folders.length; i++) { 223 foldersString.append(folders[i].serialize()); 224 if (i < folders.length - 1) { 225 foldersString.append(","); 226 } 227 } 228 conversationMap.put(ConversationColumns.RAW_FOLDERS, foldersString.toString()); 229 return conversationMap; 230 } 231 232 private static String generateConversationInfo(int messageCount, int draftCount) { 233 ConversationInfo info = new ConversationInfo(messageCount, draftCount, "first", 234 "firstUnread", "last"); 235 for (int i = 0; i < messageCount; i++) { 236 if (i % 2 == 0) { 237 info.addMessage(new MessageInfo(false, false, i + "Test <testsender@test.com>")); 238 } else if (i % 3 == 0) { 239 info.addMessage(new MessageInfo(true, false, i + "sender@test.com")); 240 } else { 241 info.addMessage(new MessageInfo(false, false, 242 MessageInfo.SENDER_LIST_TOKEN_ELIDED)); 243 } 244 } 245 return ConversationInfo.toString(info); 246 } 247 248 private static Map<String, Object> createMessageDetailsMap(int messageId, String subject, 249 int hasAttachments, boolean addReplyTo) { 250 final String messageUri = "content://" + AUTHORITY + "/message/" + messageId; 251 Map<String, Object> messageMap = Maps.newHashMap(); 252 messageMap.put(BaseColumns._ID, Long.valueOf(messageId)); 253 messageMap.put(MessageColumns.URI, messageUri); 254 messageMap.put(MessageColumns.SUBJECT, "Message " + subject); 255 messageMap.put(MessageColumns.SNIPPET, "SNIPPET"); 256 String html = "<html><body><b><i>This is some html!!!</i></b></body></html>"; 257 messageMap.put(MessageColumns.BODY_HTML, html); 258 messageMap.put(MessageColumns.BODY_TEXT, Html.fromHtml(html)); 259 messageMap.put(MessageColumns.HAS_ATTACHMENTS, hasAttachments); 260 messageMap.put(MessageColumns.DATE_RECEIVED_MS, new Date().getTime()); 261 messageMap.put(MessageColumns.ATTACHMENT_LIST_URI, messageUri + "/getAttachments"); 262 messageMap.put(MessageColumns.TO, "account1@mock.com, account2@mock.com"); 263 messageMap.put(MessageColumns.FROM, "fromaccount1@mock.com"); 264 if (addReplyTo) { 265 messageMap.put(MessageColumns.REPLY_TO, "replytofromaccount1@mock.com"); 266 } 267 return messageMap; 268 } 269 270 private static Map<String, Object> createAttachmentDetailsMap(int attachmentId, String name) { 271 Map<String, Object> attachmentMap = Maps.newHashMap(); 272 attachmentMap.put(BaseColumns._ID, Long.valueOf(attachmentId)); 273 attachmentMap.put(AttachmentColumns.NAME, "Attachment " + name); 274 attachmentMap.put(AttachmentColumns.URI, 275 "attachmentUri/" + attachmentMap.get(AttachmentColumns.NAME)); 276 return attachmentMap; 277 } 278 279 private static Map<String, Object> createFolderDetailsMap(int folderId, String name, 280 int unread, int total) { 281 return createFolderDetailsMap(folderId, name, false, unread, total); 282 } 283 284 private static Map<String, Object> createFolderDetailsMap(int folderId, String name, 285 boolean hasChildren, int unread, int total) { 286 final String folderUri = "content://" + AUTHORITY + "/folder/" + folderId; 287 Map<String, Object> folderMap = Maps.newHashMap(); 288 folderMap.put(BaseColumns._ID, Long.valueOf(folderId)); 289 folderMap.put(FolderColumns.URI, folderUri); 290 folderMap.put(FolderColumns.NAME, "Folder " + name); 291 folderMap.put(FolderColumns.HAS_CHILDREN, new Integer(hasChildren ? 1 : 0)); 292 folderMap.put(FolderColumns.CONVERSATION_LIST_URI, folderUri + "/getConversations"); 293 folderMap.put(FolderColumns.CHILD_FOLDERS_LIST_URI, folderUri + "/getChildFolders"); 294 folderMap.put(FolderColumns.CAPABILITIES, 295 Long.valueOf( 296 FolderCapabilities.SYNCABLE | 297 FolderCapabilities.PARENT | 298 FolderCapabilities.CAN_HOLD_MAIL | 299 FolderCapabilities.CAN_ACCEPT_MOVED_MESSAGES)); 300 folderMap.put(FolderColumns.UNREAD_COUNT, unread); 301 folderMap.put(FolderColumns.TOTAL_COUNT, total); 302 folderMap.put(FolderColumns.SYNC_STATUS, 0); 303 folderMap.put(FolderColumns.LAST_SYNC_RESULT, 0); 304 return folderMap; 305 } 306 307 // Temporarily made this public to allow the Gmail accounts to use the mock ui provider uris 308 public static Map<String, Object> createAccountDetailsMap(int accountId, boolean cacheMap, 309 String defaultInbox) { 310 final String accountUri = getMockAccountUri(accountId); 311 Map<String, Object> accountMap = Maps.newHashMap(); 312 accountMap.put(BaseColumns._ID, Long.valueOf(accountId)); 313 accountMap.put(AccountColumns.NAME, "account" + accountId + "@mockuiprovider.com"); 314 accountMap.put(AccountColumns.PROVIDER_VERSION, Long.valueOf(1)); 315 accountMap.put(AccountColumns.URI, Uri.parse(accountUri)); 316 accountMap.put(AccountColumns.CAPABILITIES, 317 Integer.valueOf( 318 AccountCapabilities.SYNCABLE_FOLDERS | 319 AccountCapabilities.REPORT_SPAM | 320 AccountCapabilities.ARCHIVE | 321 AccountCapabilities.MUTE | 322 AccountCapabilities.SERVER_SEARCH | 323 AccountCapabilities.FOLDER_SERVER_SEARCH | 324 AccountCapabilities.SANITIZED_HTML | 325 AccountCapabilities.DRAFT_SYNCHRONIZATION | 326 AccountCapabilities.MULTIPLE_FROM_ADDRESSES | 327 AccountCapabilities.SMART_REPLY | 328 AccountCapabilities.LOCAL_SEARCH | 329 AccountCapabilities.THREADED_CONVERSATIONS | 330 AccountCapabilities.MULTIPLE_FOLDERS_PER_CONV)); 331 JSONArray replyFroms = new JSONArray(); 332 ArrayList<ReplyFromAccount> list = new ArrayList<ReplyFromAccount>(); 333 list.add(new ReplyFromAccount(null, Uri.parse(accountUri), "customAddress1@custom.com", 334 "customAddress2@custom.com", "Custom1", false, true)); 335 list.add(new ReplyFromAccount(null, Uri.parse(accountUri), "customAddress2@custom.com", 336 "customAddress2@custom.com", "Custom2", false, true)); 337 for (ReplyFromAccount a : list) { 338 replyFroms.put(a.serialize()); 339 } 340 accountMap.put(AccountColumns.ACCOUNT_FROM_ADDRESSES, replyFroms.toString()); 341 accountMap.put(AccountColumns.FOLDER_LIST_URI, Uri.parse(accountUri + "/folders")); 342 accountMap.put(AccountColumns.SEARCH_URI, Uri.parse(accountUri + "/search")); 343 accountMap.put(AccountColumns.SAVE_DRAFT_URI, Uri.parse(accountUri + "/saveDraft")); 344 accountMap.put(AccountColumns.SEND_MAIL_URI, Uri.parse(accountUri + "/sendMail")); 345 accountMap.put(AccountColumns.EXPUNGE_MESSAGE_URI, 346 Uri.parse(accountUri + "/expungeMessage")); 347 accountMap.put(AccountColumns.UNDO_URI, Uri.parse(accountUri + "/undo")); 348 accountMap.put(AccountColumns.SETTINGS_INTENT_URI, Uri.EMPTY); 349 accountMap.put(AccountColumns.HELP_INTENT_URI, Uri.EMPTY); 350 accountMap.put(AccountColumns.SYNC_STATUS, 0); 351 accountMap.put(AccountColumns.COMPOSE_URI, Uri.parse(accountUri + "/compose")); 352 accountMap.put(AccountColumns.RECENT_FOLDER_LIST_URI, 353 Uri.parse(accountUri + "/recentFolderListUri")); 354 accountMap.put(AccountColumns.MIME_TYPE, "account/mock"); 355 accountMap.put(AccountColumns.COLOR, 0); 356 accountMap.put(AccountColumns.RECENT_FOLDER_LIST_URI, Uri.EMPTY); 357 accountMap.put(AccountColumns.DEFAULT_RECENT_FOLDER_LIST_URI, 358 Uri.EMPTY); 359 accountMap.put(AccountColumns.MANUAL_SYNC_URI, 360 Uri.EMPTY); 361 362 // TODO: store the default inbox 363 accountMap.put(SettingsColumns.DEFAULT_INBOX, defaultInbox); 364 if (cacheMap) { 365 addAccountInfoToAccountCache(accountMap); 366 } 367 return accountMap; 368 } 369 370 public static String getMockAccountUri(int accountId) { 371 return "content://" + AUTHORITY + "/account/" + accountId; 372 } 373 374 @Override 375 public boolean onCreate() { 376 return true; 377 } 378 379 @Override 380 public Cursor query(Uri url, String[] projection, String selection, String[] selectionArgs, 381 String sortOrder) { 382 383 // TODO (pwestbro): respect the projection that is specified by the caller 384 385 final List<Map<String, Object>> queryResults = 386 MOCK_QUERY_RESULTS.get(url.toString()); 387 388 if (queryResults != null && queryResults.size() > 0) { 389 // Get the projection. If there are rows in the result set, pick the first item to 390 // generate the projection 391 // TODO (pwestbro): handle the case where we want to return an empty result.\ 392 if (projection == null) { 393 Set<String> keys = queryResults.get(0).keySet(); 394 projection = keys.toArray(new String[keys.size()]); 395 } 396 MatrixCursor matrixCursor = new MatrixCursor(projection, queryResults.size()); 397 398 for (Map<String, Object> queryResult : queryResults) { 399 MatrixCursor.RowBuilder rowBuilder = matrixCursor.newRow(); 400 401 for (String key : projection) { 402 rowBuilder.add(queryResult.get(key)); 403 } 404 } 405 return matrixCursor; 406 } 407 408 return null; 409 } 410 411 @Override 412 public Uri insert(Uri url, ContentValues values) { 413 return url; 414 } 415 416 @Override 417 public int update(Uri url, ContentValues values, String selection, 418 String[] selectionArgs) { 419 return 0; 420 } 421 422 @Override 423 public int delete(Uri url, String selection, String[] selectionArgs) { 424 return 0; 425 } 426 427 @Override 428 public String getType(Uri uri) { 429 return null; 430 } 431 432 @VisibleForTesting 433 static Uri getAccountsUri() { 434 // TODO: this should probably return a different specific to the mock account list 435 return Uri.parse(BASE_URI_STRING + "/"); 436 } 437 438 private static void addAccountInfoToAccountCache(Map<String, Object> accountInfo) { 439 final Parcel dest = Parcel.obtain(); 440 dest.writeString((String) accountInfo.get(AccountColumns.NAME)); 441 dest.writeString("mock"); 442 443 final int providerVersion = 1; 444 dest.writeInt(providerVersion); 445 dest.writeParcelable((Uri) accountInfo.get(AccountColumns.URI), 0); 446 dest.writeInt((Integer) accountInfo.get(AccountColumns.CAPABILITIES)); 447 dest.writeParcelable((Uri) accountInfo.get(AccountColumns.FOLDER_LIST_URI), 0); 448 dest.writeParcelable((Uri) accountInfo.get(AccountColumns.FULL_FOLDER_LIST_URI), 0); 449 dest.writeParcelable((Uri) accountInfo.get(AccountColumns.SEARCH_URI), 0); 450 dest.writeString((String) accountInfo.get(AccountColumns.ACCOUNT_FROM_ADDRESSES)); 451 dest.writeParcelable((Uri) accountInfo.get(AccountColumns.SAVE_DRAFT_URI), 0); 452 dest.writeParcelable((Uri) accountInfo.get(AccountColumns.SEND_MAIL_URI), 0); 453 dest.writeParcelable((Uri) accountInfo.get(AccountColumns.EXPUNGE_MESSAGE_URI), 0); 454 dest.writeParcelable((Uri) accountInfo.get(AccountColumns.UNDO_URI), 0); 455 dest.writeParcelable((Uri) accountInfo.get(AccountColumns.SETTINGS_INTENT_URI), 0); 456 dest.writeParcelable((Uri) accountInfo.get(AccountColumns.HELP_INTENT_URI), 0); 457 dest.writeParcelable((Uri) accountInfo.get(AccountColumns.SEND_FEEDBACK_INTENT_URI), 0); 458 dest.writeInt((Integer) accountInfo.get(AccountColumns.SYNC_STATUS)); 459 dest.writeParcelable((Uri) accountInfo.get(AccountColumns.COMPOSE_URI), 0); 460 dest.writeString((String) accountInfo.get(AccountColumns.MIME_TYPE)); 461 dest.writeParcelable((Uri) accountInfo.get(AccountColumns.RECENT_FOLDER_LIST_URI), 0); 462 dest.writeInt((Integer) accountInfo.get(AccountColumns.COLOR)); 463 dest.writeParcelable((Uri) accountInfo.get(AccountColumns.DEFAULT_RECENT_FOLDER_LIST_URI), 464 0); 465 dest.writeParcelable((Uri) accountInfo.get(AccountColumns.MANUAL_SYNC_URI), 466 0); 467 Parcel p = Parcel.obtain(); 468 p.writeString(""); 469 p.writeInt(1); 470 p.writeInt(1); 471 p.writeInt(1); 472 p.writeInt(1); 473 p.writeInt(1); 474 p.writeInt(1); 475 p.writeInt(1); 476 p.writeInt(1); 477 p.writeString((String)accountInfo.get(SettingsColumns.DEFAULT_INBOX)); 478 p.writeInt(1); 479 p.setDataPosition(0); 480 dest.writeString(new Settings(p).serialize()); 481 dest.setDataPosition(0); 482 final Account account = new Account(dest); 483 MailAppProvider.addAccount(account, MOCK_ACCOUNTS_URI); 484 } 485} 486 487