MockUiProvider.java revision 9982fdb413d09b8e391dbc96a114987b1b87bb62
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(Folder.toString(folders[i]));
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,
238                        i + "Test <testsender@test.com>", -1));
239            } else if (i % 3 == 0) {
240                info.addMessage(new MessageInfo(true, false, i + "sender@test.com", -1));
241            } else {
242                info.addMessage(new MessageInfo(false, false, MessageInfo.SENDER_LIST_TOKEN_ELIDED,
243                        -1));
244            }
245        }
246        return ConversationInfo.toString(info);
247    }
248
249    private static Map<String, Object> createMessageDetailsMap(int messageId, String subject,
250            int hasAttachments, boolean addReplyTo) {
251        final String messageUri = "content://" + AUTHORITY + "/message/" + messageId;
252        Map<String, Object> messageMap = Maps.newHashMap();
253        messageMap.put(BaseColumns._ID, Long.valueOf(messageId));
254        messageMap.put(MessageColumns.URI, messageUri);
255        messageMap.put(MessageColumns.SUBJECT, "Message " + subject);
256        messageMap.put(MessageColumns.SNIPPET, "SNIPPET");
257        String html = "<html><body><b><i>This is some html!!!</i></b></body></html>";
258        messageMap.put(MessageColumns.BODY_HTML, html);
259        messageMap.put(MessageColumns.BODY_TEXT, Html.fromHtml(html));
260        messageMap.put(MessageColumns.HAS_ATTACHMENTS, hasAttachments);
261        messageMap.put(MessageColumns.DATE_RECEIVED_MS, new Date().getTime());
262        messageMap.put(MessageColumns.ATTACHMENT_LIST_URI, messageUri + "/getAttachments");
263        messageMap.put(MessageColumns.TO, "account1@mock.com, account2@mock.com");
264        messageMap.put(MessageColumns.FROM, "fromaccount1@mock.com");
265        if (addReplyTo) {
266            messageMap.put(MessageColumns.REPLY_TO, "replytofromaccount1@mock.com");
267        }
268        return messageMap;
269    }
270
271    private static Map<String, Object> createAttachmentDetailsMap(int attachmentId, String name) {
272        Map<String, Object> attachmentMap = Maps.newHashMap();
273        attachmentMap.put(BaseColumns._ID, Long.valueOf(attachmentId));
274        attachmentMap.put(AttachmentColumns.NAME, "Attachment " + name);
275        attachmentMap.put(AttachmentColumns.URI,
276                "attachmentUri/" + attachmentMap.get(AttachmentColumns.NAME));
277        return attachmentMap;
278    }
279
280    private static Map<String, Object> createFolderDetailsMap(int folderId, String name,
281            int unread, int total) {
282        return createFolderDetailsMap(folderId, name, false, unread, total);
283    }
284
285    private static Map<String, Object> createFolderDetailsMap(int folderId, String name,
286            boolean hasChildren, int unread, int total) {
287        final String folderUri = "content://" + AUTHORITY + "/folder/" + folderId;
288        Map<String, Object> folderMap = Maps.newHashMap();
289        folderMap.put(BaseColumns._ID, Long.valueOf(folderId));
290        folderMap.put(FolderColumns.URI, folderUri);
291        folderMap.put(FolderColumns.NAME, "Folder " + name);
292        folderMap.put(FolderColumns.HAS_CHILDREN, new Integer(hasChildren ? 1 : 0));
293        folderMap.put(FolderColumns.CONVERSATION_LIST_URI, folderUri + "/getConversations");
294        folderMap.put(FolderColumns.CHILD_FOLDERS_LIST_URI, folderUri + "/getChildFolders");
295        folderMap.put(FolderColumns.CAPABILITIES,
296                Long.valueOf(
297                        FolderCapabilities.SYNCABLE |
298                        FolderCapabilities.PARENT |
299                        FolderCapabilities.CAN_HOLD_MAIL |
300                        FolderCapabilities.CAN_ACCEPT_MOVED_MESSAGES));
301        folderMap.put(FolderColumns.UNREAD_COUNT, unread);
302        folderMap.put(FolderColumns.TOTAL_COUNT, total);
303        folderMap.put(FolderColumns.SYNC_STATUS, 0);
304        folderMap.put(FolderColumns.LAST_SYNC_RESULT, 0);
305        return folderMap;
306    }
307
308    // Temporarily made this public to allow the Gmail accounts to use the mock ui provider uris
309    public static Map<String, Object> createAccountDetailsMap(int accountId, boolean cacheMap,
310            String defaultInbox) {
311        final String accountUri = getMockAccountUri(accountId);
312        Map<String, Object> accountMap = Maps.newHashMap();
313        accountMap.put(BaseColumns._ID, Long.valueOf(accountId));
314        accountMap.put(AccountColumns.NAME, "account" + accountId + "@mockuiprovider.com");
315        accountMap.put(AccountColumns.PROVIDER_VERSION, Long.valueOf(1));
316        accountMap.put(AccountColumns.URI, Uri.parse(accountUri));
317        accountMap.put(AccountColumns.CAPABILITIES,
318                Integer.valueOf(
319                        AccountCapabilities.SYNCABLE_FOLDERS |
320                        AccountCapabilities.REPORT_SPAM |
321                        AccountCapabilities.ARCHIVE |
322                        AccountCapabilities.MUTE |
323                        AccountCapabilities.SERVER_SEARCH |
324                        AccountCapabilities.FOLDER_SERVER_SEARCH |
325                        AccountCapabilities.SANITIZED_HTML |
326                        AccountCapabilities.DRAFT_SYNCHRONIZATION |
327                        AccountCapabilities.MULTIPLE_FROM_ADDRESSES |
328                        AccountCapabilities.SMART_REPLY |
329                        AccountCapabilities.LOCAL_SEARCH |
330                        AccountCapabilities.THREADED_CONVERSATIONS |
331                        AccountCapabilities.MULTIPLE_FOLDERS_PER_CONV));
332        JSONArray replyFroms = new JSONArray();
333        ArrayList<ReplyFromAccount> list = new ArrayList<ReplyFromAccount>();
334        list.add(new ReplyFromAccount(null, Uri.parse(accountUri), "customAddress1@custom.com",
335                "customAddress2@custom.com", "Custom1", false, true));
336        list.add(new ReplyFromAccount(null, Uri.parse(accountUri), "customAddress2@custom.com",
337                "customAddress2@custom.com", "Custom2", false, true));
338        for (ReplyFromAccount a : list) {
339            replyFroms.put(a.serialize());
340        }
341        accountMap.put(AccountColumns.ACCOUNT_FROM_ADDRESSES, replyFroms.toString());
342        accountMap.put(AccountColumns.FOLDER_LIST_URI, Uri.parse(accountUri + "/folders"));
343        accountMap.put(AccountColumns.SEARCH_URI, Uri.parse(accountUri + "/search"));
344        accountMap.put(AccountColumns.SAVE_DRAFT_URI, Uri.parse(accountUri + "/saveDraft"));
345        accountMap.put(AccountColumns.SEND_MAIL_URI, Uri.parse(accountUri + "/sendMail"));
346        accountMap.put(AccountColumns.EXPUNGE_MESSAGE_URI,
347                Uri.parse(accountUri + "/expungeMessage"));
348        accountMap.put(AccountColumns.UNDO_URI, Uri.parse(accountUri + "/undo"));
349        accountMap.put(AccountColumns.SETTINGS_INTENT_URI, Uri.EMPTY);
350        accountMap.put(AccountColumns.HELP_INTENT_URI, Uri.EMPTY);
351        accountMap.put(AccountColumns.SYNC_STATUS, 0);
352        accountMap.put(AccountColumns.COMPOSE_URI, Uri.parse(accountUri + "/compose"));
353        accountMap.put(AccountColumns.RECENT_FOLDER_LIST_URI,
354                Uri.parse(accountUri + "/recentFolderListUri"));
355        accountMap.put(AccountColumns.MIME_TYPE, "account/mock");
356        accountMap.put(AccountColumns.COLOR, 0);
357        accountMap.put(AccountColumns.RECENT_FOLDER_LIST_URI, Uri.EMPTY);
358        accountMap.put(AccountColumns.DEFAULT_RECENT_FOLDER_LIST_URI,
359                Uri.EMPTY);
360        accountMap.put(AccountColumns.MANUAL_SYNC_URI,
361                Uri.EMPTY);
362        accountMap.put(AccountColumns.VIEW_INTENT_PROXY_URI,
363                Uri.EMPTY);
364
365        // TODO: store the default inbox
366        accountMap.put(SettingsColumns.DEFAULT_INBOX, defaultInbox);
367        if (cacheMap) {
368            addAccountInfoToAccountCache(accountMap);
369        }
370        return accountMap;
371    }
372
373    public static String getMockAccountUri(int accountId) {
374        return "content://" + AUTHORITY + "/account/" + accountId;
375    }
376
377    @Override
378    public boolean onCreate() {
379        return true;
380    }
381
382    @Override
383    public Cursor query(Uri url, String[] projection, String selection, String[] selectionArgs,
384            String sortOrder) {
385
386        // TODO (pwestbro): respect the projection that is specified by the caller
387
388        final List<Map<String, Object>> queryResults =
389                MOCK_QUERY_RESULTS.get(url.toString());
390
391        if (queryResults != null && queryResults.size() > 0) {
392            // Get the projection.  If there are rows in the result set, pick the first item to
393            // generate the projection
394            // TODO (pwestbro): handle the case where we want to return an empty result.\
395            if (projection == null) {
396                Set<String> keys = queryResults.get(0).keySet();
397                projection = keys.toArray(new String[keys.size()]);
398            }
399            MatrixCursor matrixCursor = new MatrixCursor(projection, queryResults.size());
400
401            for (Map<String, Object> queryResult : queryResults) {
402                MatrixCursor.RowBuilder rowBuilder = matrixCursor.newRow();
403
404                for (String key : projection) {
405                    rowBuilder.add(queryResult.get(key));
406                }
407            }
408            return matrixCursor;
409        }
410
411        return null;
412    }
413
414    @Override
415    public Uri insert(Uri url, ContentValues values) {
416        return url;
417    }
418
419    @Override
420    public int update(Uri url, ContentValues values, String selection,
421            String[] selectionArgs) {
422        return 0;
423    }
424
425    @Override
426    public int delete(Uri url, String selection, String[] selectionArgs) {
427        return 0;
428    }
429
430    @Override
431    public String getType(Uri uri) {
432        return null;
433    }
434
435    @VisibleForTesting
436    static Uri getAccountsUri() {
437        // TODO: this should probably return a different specific to the mock account list
438        return Uri.parse(BASE_URI_STRING + "/");
439    }
440
441    private static void addAccountInfoToAccountCache(Map<String, Object> accountInfo) {
442        final Parcel dest = Parcel.obtain();
443        dest.writeString((String) accountInfo.get(AccountColumns.NAME));
444        dest.writeString("mock");
445
446        final int providerVersion = 1;
447        dest.writeInt(providerVersion);
448        dest.writeParcelable((Uri) accountInfo.get(AccountColumns.URI), 0);
449        dest.writeInt((Integer) accountInfo.get(AccountColumns.CAPABILITIES));
450        dest.writeParcelable((Uri) accountInfo.get(AccountColumns.FOLDER_LIST_URI), 0);
451        dest.writeParcelable((Uri) accountInfo.get(AccountColumns.FULL_FOLDER_LIST_URI), 0);
452        dest.writeParcelable((Uri) accountInfo.get(AccountColumns.SEARCH_URI), 0);
453        dest.writeString((String) accountInfo.get(AccountColumns.ACCOUNT_FROM_ADDRESSES));
454        dest.writeParcelable((Uri) accountInfo.get(AccountColumns.SAVE_DRAFT_URI), 0);
455        dest.writeParcelable((Uri) accountInfo.get(AccountColumns.SEND_MAIL_URI), 0);
456        dest.writeParcelable((Uri) accountInfo.get(AccountColumns.EXPUNGE_MESSAGE_URI), 0);
457        dest.writeParcelable((Uri) accountInfo.get(AccountColumns.UNDO_URI), 0);
458        dest.writeParcelable((Uri) accountInfo.get(AccountColumns.SETTINGS_INTENT_URI), 0);
459        dest.writeParcelable((Uri) accountInfo.get(AccountColumns.HELP_INTENT_URI), 0);
460        dest.writeParcelable((Uri) accountInfo.get(AccountColumns.SEND_FEEDBACK_INTENT_URI), 0);
461        dest.writeInt((Integer) accountInfo.get(AccountColumns.SYNC_STATUS));
462        dest.writeParcelable((Uri) accountInfo.get(AccountColumns.COMPOSE_URI), 0);
463        dest.writeString((String) accountInfo.get(AccountColumns.MIME_TYPE));
464        dest.writeParcelable((Uri) accountInfo.get(AccountColumns.RECENT_FOLDER_LIST_URI), 0);
465        dest.writeInt((Integer) accountInfo.get(AccountColumns.COLOR));
466        dest.writeParcelable((Uri) accountInfo.get(AccountColumns.DEFAULT_RECENT_FOLDER_LIST_URI),
467                0);
468        dest.writeParcelable((Uri) accountInfo.get(AccountColumns.MANUAL_SYNC_URI),
469                0);
470        dest.writeParcelable((Uri) accountInfo.get(AccountColumns.VIEW_INTENT_PROXY_URI),
471                0);
472        Parcel p = Parcel.obtain();
473        p.writeString("");
474        p.writeInt(1);
475        p.writeInt(1);
476        p.writeInt(1);
477        p.writeInt(1);
478        p.writeInt(1);
479        p.writeInt(1);
480        p.writeInt(1);
481        p.writeInt(1);
482        p.writeString((String)accountInfo.get(SettingsColumns.DEFAULT_INBOX));
483        p.writeInt(1);
484        p.setDataPosition(0);
485        dest.writeString(new Settings(p).serialize());
486        dest.setDataPosition(0);
487        final Account account = new Account(dest);
488        MailAppProvider.addAccount(account, MOCK_ACCOUNTS_URI);
489    }
490}
491
492