From c0033f24a26a08c47aa38d957f42cf63cfa3c345 Mon Sep 17 00:00:00 2001 From: Andrew Stadler Date: Mon, 8 Jun 2009 15:27:17 -0700 Subject: [PATCH] Convert remainder of app to use provider-based accounts What works: * Unit tests, except for com.android.email.activity.setup.* * Editing existing accounts * Create new accounts * Checking account settings against server * Mail sync using accounts * Viewing mailboxes What breaks (in approx order of planned fixes) * Unit tests in com.android.email.activity.setup.* * Viewing messages * Composing messages * Some details of account editing * Import of existing accounts --- src/com/android/email/Email.java | 35 ++- .../android/email/MessagingController.java | 212 +++++++++--------- src/com/android/email/MessagingListener.java | 81 +++---- .../email/activity/AccountShortcutPicker.java | 129 +++++------ .../email/activity/FolderMessageList.java | 151 ++++++------- .../email/activity/MessageCompose.java | 69 +++--- .../android/email/activity/MessageView.java | 51 +++-- .../email/activity/setup/AccountSettings.java | 15 +- .../android/email/mail/StoreSynchronizer.java | 4 +- .../email/mail/internet/EmailHtmlUtil.java | 4 +- .../email/provider/AttachmentProvider.java | 26 +-- .../android/email/provider/EmailStore.java | 50 ++++- .../android/email/service/MailService.java | 100 ++++++--- .../com/android/email/AccountUnitTests.java | 9 - .../email/MessagingControllerUnitTests.java | 57 ++--- .../activity/FolderMessageListUnitTests.java | 55 +++-- .../MessageComposeInstrumentationTests.java | 14 +- .../email/activity/MessageViewTests.java | 23 +- .../activity/setup/AccountSettingsTests.java | 55 ++++- .../android/email/mail/MessageTestUtils.java | 4 +- .../mail/internet/EmailHtmlUtilTest.java | 17 +- 21 files changed, 628 insertions(+), 533 deletions(-) diff --git a/src/com/android/email/Email.java b/src/com/android/email/Email.java index e00408eec..de95c1b5e 100644 --- a/src/com/android/email/Email.java +++ b/src/com/android/email/Email.java @@ -19,6 +19,8 @@ package com.android.email; import com.android.email.activity.AccountShortcutPicker; import com.android.email.activity.MessageCompose; import com.android.email.mail.internet.BinaryTempFileBody; +import com.android.email.provider.EmailContent; +import com.android.email.provider.EmailStore; import com.android.email.service.BootReceiver; import com.android.email.service.MailService; @@ -26,6 +28,7 @@ import android.app.Application; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; +import android.database.Cursor; import java.io.File; @@ -126,7 +129,19 @@ public class Email extends Application { * whether any accounts are configured. */ public static void setServicesEnabled(Context context) { - setServicesEnabled(context, Preferences.getPreferences(context).getAccounts().length > 0); + Cursor c = null; + try { + c = context.getContentResolver().query( + EmailStore.Account.CONTENT_URI, + EmailStore.Account.CONTENT_PROJECTION, + null, null, null); + boolean enable = c.getCount() > 0; + setServicesEnabled(context, c.getCount() > 0); + } finally { + if (c != null) { + c.close(); + } + } } public static void setServicesEnabled(Context context, boolean enabled) { @@ -175,7 +190,23 @@ public class Email extends Application { Preferences prefs = Preferences.getPreferences(this); DEBUG = prefs.geteEnableDebugLogging(); DEBUG_SENSITIVE = prefs.getEnableSensitiveLogging(); - MessagingController.getInstance(this).resetVisibleLimits(prefs.getAccounts()); + + // Reset all accounts to default visible window + Cursor c = null; + try { + c = getContentResolver().query( + EmailStore.Account.CONTENT_URI, + EmailStore.Account.CONTENT_PROJECTION, + null, null, null); + while (c.moveToNext()) { + EmailStore.Account account = EmailContent.getContent(c, EmailStore.Account.class); + MessagingController.getInstance(this).resetVisibleLimits(account); + } + } finally { + if (c != null) { + c.close(); + } + } /* * We have to give MimeMessage a temp directory because File.createTempFile(String, String) diff --git a/src/com/android/email/MessagingController.java b/src/com/android/email/MessagingController.java index e4ebada69..45961b627 100644 --- a/src/com/android/email/MessagingController.java +++ b/src/com/android/email/MessagingController.java @@ -33,6 +33,7 @@ import com.android.email.mail.store.LocalStore; import com.android.email.mail.store.LocalStore.LocalFolder; import com.android.email.mail.store.LocalStore.LocalMessage; import com.android.email.mail.store.LocalStore.PendingCommand; +import com.android.email.provider.EmailStore; import android.content.Context; import android.os.Process; @@ -198,9 +199,7 @@ public class MessagingController implements Runnable { * @param listener * @throws MessagingException */ - public void listFolders( - final Account account, - boolean refreshRemote, + public void listFolders(final EmailStore.Account account, boolean refreshRemote, MessagingListener listener) { synchronized (mListeners) { for (MessagingListener l : mListeners) { @@ -208,7 +207,8 @@ public class MessagingController implements Runnable { } } try { - Store localStore = Store.getInstance(account.getLocalStoreUri(), mContext, null); + Store localStore = Store.getInstance(account.getLocalStoreUri(mContext), mContext, + null); Folder[] localFolders = localStore.getPersonalNamespaces(); if (localFolders == null || localFolders.length == 0) { @@ -234,8 +234,8 @@ public class MessagingController implements Runnable { public void run() { try { LocalStore localStore = (LocalStore) Store.getInstance( - account.getLocalStoreUri(), mContext, null); - Store store = Store.getInstance(account.getStoreUri(), mContext, + account.getLocalStoreUri(mContext), mContext, null); + Store store = Store.getInstance(account.getStoreUri(mContext), mContext, localStore.getPersistentCallbacks()); Folder[] remoteFolders = store.getPersonalNamespaces(); @@ -258,10 +258,10 @@ public class MessagingController implements Runnable { for (Folder localFolder : localFolders) { String localFolderName = localFolder.getName(); if (localFolderName.equalsIgnoreCase(Email.INBOX) || - localFolderName.equals(account.getTrashFolderName()) || - localFolderName.equals(account.getOutboxFolderName()) || - localFolderName.equals(account.getDraftsFolderName()) || - localFolderName.equals(account.getSentFolderName())) { + localFolderName.equals(account.getTrashFolderName(mContext)) || + localFolderName.equals(account.getOutboxFolderName(mContext)) || + localFolderName.equals(account.getDraftsFolderName(mContext)) || + localFolderName.equals(account.getSentFolderName(mContext))) { continue; } if (!remoteFolderNames.contains(localFolder.getName())) { @@ -310,8 +310,11 @@ public class MessagingController implements Runnable { * * NOTE: Inbox is not queried, because we require it to be INBOX, and outbox is not * queried, because outbox is local-only. + * + * TODO: Rewrite this to use simple folder tagging and none of this account nonsense */ - /* package */ void updateAccountFolderNames(Account account, Folder[] remoteFolders) { + /* package */ void updateAccountFolderNames(EmailStore.Account account, + Folder[] remoteFolders) { String trash = null; String sent = null; String drafts = null; @@ -326,24 +329,25 @@ public class MessagingController implements Runnable { drafts = folder.getName(); } } - +/* // Do not update when null (defaults are already in place) boolean commit = false; - if (trash != null && !trash.equals(account.getTrashFolderName())) { + if (trash != null && !trash.equals(account.getTrashFolderName(mContext))) { account.setTrashFolderName(trash); commit = true; } - if (sent != null && !sent.equals(account.getSentFolderName())) { + if (sent != null && !sent.equals(account.getSentFolderName(mContext))) { account.setSentFolderName(sent); commit = true; } - if (drafts != null && !drafts.equals(account.getDraftsFolderName())) { + if (drafts != null && !drafts.equals(account.getDraftsFolderName(mContext))) { account.setDraftsFolderName(drafts); commit = true; } if (commit) { - account.save(Preferences.getPreferences(mContext)); + account.saveOrUpdate(mContext); } +*/ } /** @@ -355,7 +359,7 @@ public class MessagingController implements Runnable { * @param listener * @throws MessagingException */ - public void listLocalMessages(final Account account, final String folder, + public void listLocalMessages(final EmailStore.Account account, final String folder, MessagingListener listener) { synchronized (mListeners) { for (MessagingListener l : mListeners) { @@ -364,7 +368,8 @@ public class MessagingController implements Runnable { } try { - Store localStore = Store.getInstance(account.getLocalStoreUri(), mContext, null); + Store localStore = Store.getInstance(account.getLocalStoreUri(mContext), mContext, + null); Folder localFolder = localStore.getFolder(folder); localFolder.open(OpenMode.READ_WRITE, null); Message[] localMessages = localFolder.getMessages(null); @@ -392,11 +397,13 @@ public class MessagingController implements Runnable { } } - public void loadMoreMessages(Account account, String folder, MessagingListener listener) { + public void loadMoreMessages(EmailStore.Account account, String folder, + MessagingListener listener) { try { - Store.StoreInfo info = Store.StoreInfo.getStoreInfo(account.getStoreUri(), mContext); + Store.StoreInfo info = Store.StoreInfo.getStoreInfo(account.getStoreUri(mContext), + mContext); LocalStore localStore = (LocalStore) Store.getInstance( - account.getLocalStoreUri(), mContext, null); + account.getLocalStoreUri(mContext), mContext, null); LocalFolder localFolder = (LocalFolder) localStore.getFolder(folder); int oldLimit = localFolder.getVisibleLimit(); if (oldLimit <= 0) { @@ -410,18 +417,16 @@ public class MessagingController implements Runnable { } } - public void resetVisibleLimits(Account[] accounts) { - for (Account account : accounts) { - try { - Store.StoreInfo info = Store.StoreInfo.getStoreInfo(account.getStoreUri(), - mContext); - LocalStore localStore = - (LocalStore) Store.getInstance(account.getLocalStoreUri(), mContext, null); - localStore.resetVisibleLimits(info.mVisibleLimitDefault); - } - catch (MessagingException e) { - Log.e(Email.LOG_TAG, "Unable to reset visible limits", e); - } + public void resetVisibleLimits(EmailStore.Account account) { + try { + Store.StoreInfo info = Store.StoreInfo.getStoreInfo(account.getStoreUri(mContext), + mContext); + LocalStore localStore = (LocalStore) Store.getInstance( + account.getLocalStoreUri(mContext), mContext, null); + localStore.resetVisibleLimits(info.mVisibleLimitDefault); + } + catch (MessagingException e) { + Log.e(Email.LOG_TAG, "Unable to reset visible limits", e); } } @@ -431,12 +436,12 @@ public class MessagingController implements Runnable { * @param folder * @param listener */ - public void synchronizeMailbox(final Account account, final String folder, + public void synchronizeMailbox(final EmailStore.Account account, final String folder, MessagingListener listener) { /* * We don't ever sync the Outbox. */ - if (folder.equals(account.getOutboxFolderName())) { + if (folder.equals(account.getOutboxFolderName(mContext))) { return; } synchronized (mListeners) { @@ -458,7 +463,8 @@ public class MessagingController implements Runnable { * @param folder * @param listener */ - private void synchronizeMailboxSynchronous(final Account account, final String folder) { + private void synchronizeMailboxSynchronous(final EmailStore.Account account, + final String folder) { synchronized (mListeners) { for (MessagingListener l : mListeners) { l.synchronizeMailboxStarted(account, folder); @@ -471,8 +477,8 @@ public class MessagingController implements Runnable { // Select generic sync or store-specific sync final LocalStore localStore = - (LocalStore) Store.getInstance(account.getLocalStoreUri(), mContext, null); - Store remoteStore = Store.getInstance(account.getStoreUri(), mContext, + (LocalStore) Store.getInstance(account.getLocalStoreUri(mContext), mContext, null); + Store remoteStore = Store.getInstance(account.getStoreUri(mContext), mContext, localStore.getPersistentCallbacks()); StoreSynchronizer customSync = remoteStore.getMessageSynchronizer(); if (customSync == null) { @@ -516,14 +522,14 @@ public class MessagingController implements Runnable { * @return * @throws MessagingException */ - private StoreSynchronizer.SyncResults synchronizeMailboxGeneric(final Account account, - final String folder) throws MessagingException { + private StoreSynchronizer.SyncResults synchronizeMailboxGeneric( + final EmailStore.Account account, final String folder) throws MessagingException { /* * Get the message list from the local store and create an index of * the uids within the list. */ final LocalStore localStore = - (LocalStore) Store.getInstance(account.getLocalStoreUri(), mContext, null); + (LocalStore) Store.getInstance(account.getLocalStoreUri(mContext), mContext, null); final LocalFolder localFolder = (LocalFolder) localStore.getFolder(folder); localFolder.open(OpenMode.READ_WRITE, null); Message[] localMessages = localFolder.getMessages(null); @@ -536,7 +542,7 @@ public class MessagingController implements Runnable { } } - Store remoteStore = Store.getInstance(account.getStoreUri(), mContext, + Store remoteStore = Store.getInstance(account.getStoreUri(mContext), mContext, localStore.getPersistentCallbacks()); Folder remoteFolder = remoteStore.getFolder(folder); @@ -547,9 +553,9 @@ public class MessagingController implements Runnable { * designed and on Imap folders during error conditions. This allows us * to treat Pop3 and Imap the same in this code. */ - if (folder.equals(account.getTrashFolderName()) || - folder.equals(account.getSentFolderName()) || - folder.equals(account.getDraftsFolderName())) { + if (folder.equals(account.getTrashFolderName(mContext)) || + folder.equals(account.getSentFolderName(mContext)) || + folder.equals(account.getDraftsFolderName(mContext))) { if (!remoteFolder.exists()) { if (!remoteFolder.create(FolderType.HOLDS_MESSAGES)) { return new StoreSynchronizer.SyncResults(0, 0); @@ -592,7 +598,8 @@ public class MessagingController implements Runnable { int visibleLimit = localFolder.getVisibleLimit(); if (visibleLimit <= 0) { - Store.StoreInfo info = Store.StoreInfo.getStoreInfo(account.getStoreUri(), mContext); + Store.StoreInfo info = Store.StoreInfo.getStoreInfo(account.getStoreUri(mContext), + mContext); visibleLimit = info.mVisibleLimitDefault; localFolder.setVisibleLimit(visibleLimit); } @@ -920,10 +927,10 @@ public class MessagingController implements Runnable { return results; } - private void queuePendingCommand(Account account, PendingCommand command) { + private void queuePendingCommand(EmailStore.Account account, PendingCommand command) { try { LocalStore localStore = (LocalStore) Store.getInstance( - account.getLocalStoreUri(), mContext, null); + account.getLocalStoreUri(mContext), mContext, null); localStore.addPendingCommand(command); } catch (Exception e) { @@ -931,7 +938,7 @@ public class MessagingController implements Runnable { } } - private void processPendingCommands(final Account account) { + private void processPendingCommands(final EmailStore.Account account) { put("processPendingCommands", null, new Runnable() { public void run() { try { @@ -950,9 +957,10 @@ public class MessagingController implements Runnable { }); } - private void processPendingCommandsSynchronous(Account account) throws MessagingException { + private void processPendingCommandsSynchronous(EmailStore.Account account) + throws MessagingException { LocalStore localStore = (LocalStore) Store.getInstance( - account.getLocalStoreUri(), mContext, null); + account.getLocalStoreUri(mContext), mContext, null); ArrayList commands = localStore.getPendingCommands(); for (PendingCommand command : commands) { /* @@ -985,13 +993,13 @@ public class MessagingController implements Runnable { * @param account * @throws MessagingException */ - private void processPendingAppend(PendingCommand command, Account account) + private void processPendingAppend(PendingCommand command, EmailStore.Account account) throws MessagingException { String folder = command.arguments[0]; String uid = command.arguments[1]; LocalStore localStore = (LocalStore) Store.getInstance( - account.getLocalStoreUri(), mContext, null); + account.getLocalStoreUri(mContext), mContext, null); LocalFolder localFolder = (LocalFolder) localStore.getFolder(folder); LocalMessage localMessage = (LocalMessage) localFolder.getMessage(uid); @@ -999,7 +1007,7 @@ public class MessagingController implements Runnable { return; } - Store remoteStore = Store.getInstance(account.getStoreUri(), mContext, + Store remoteStore = Store.getInstance(account.getStoreUri(mContext), mContext, localStore.getPersistentCallbacks()); Folder remoteFolder = remoteStore.getFolder(folder); if (!remoteFolder.exists()) { @@ -1083,16 +1091,16 @@ public class MessagingController implements Runnable { * @param account * @throws MessagingException */ - private void processPendingTrash(PendingCommand command, final Account account) + private void processPendingTrash(PendingCommand command, final EmailStore.Account account) throws MessagingException { String folder = command.arguments[0]; String uid = command.arguments[1]; final LocalStore localStore = (LocalStore) Store.getInstance( - account.getLocalStoreUri(), mContext, null); + account.getLocalStoreUri(mContext), mContext, null); LocalFolder localFolder = (LocalFolder) localStore.getFolder(folder); - Store remoteStore = Store.getInstance(account.getStoreUri(), mContext, + Store remoteStore = Store.getInstance(account.getStoreUri(mContext), mContext, localStore.getPersistentCallbacks()); Folder remoteFolder = remoteStore.getFolder(folder); if (!remoteFolder.exists()) { @@ -1112,7 +1120,7 @@ public class MessagingController implements Runnable { return; } - Folder remoteTrashFolder = remoteStore.getFolder(account.getTrashFolderName()); + Folder remoteTrashFolder = remoteStore.getFolder(account.getTrashFolderName(mContext)); /* * Attempt to copy the remote message to the remote trash folder. */ @@ -1129,7 +1137,7 @@ public class MessagingController implements Runnable { * and pass in the persistence callbacks. */ final LocalFolder localTrashFolder = - (LocalFolder) localStore.getFolder(account.getTrashFolderName()); + (LocalFolder) localStore.getFolder(account.getTrashFolderName(mContext)); remoteTrashFolder.open(OpenMode.READ_WRITE, localTrashFolder.getPersistentCallbacks()); if (remoteTrashFolder.getMode() != OpenMode.READ_WRITE) { return; @@ -1176,17 +1184,17 @@ public class MessagingController implements Runnable { * @param command arguments = (String folder, String uid, boolean read) * @param account */ - private void processPendingMarkRead(PendingCommand command, Account account) + private void processPendingMarkRead(PendingCommand command, EmailStore.Account account) throws MessagingException { String folder = command.arguments[0]; String uid = command.arguments[1]; boolean read = Boolean.parseBoolean(command.arguments[2]); LocalStore localStore = (LocalStore) Store.getInstance( - account.getLocalStoreUri(), mContext, null); + account.getLocalStoreUri(mContext), mContext, null); LocalFolder localFolder = (LocalFolder) localStore.getFolder(folder); - Store remoteStore = Store.getInstance(account.getStoreUri(), mContext, + Store remoteStore = Store.getInstance(account.getStoreUri(mContext), mContext, localStore.getPersistentCallbacks()); Folder remoteFolder = remoteStore.getFolder(folder); if (!remoteFolder.exists()) { @@ -1215,12 +1223,13 @@ public class MessagingController implements Runnable { * @param seen */ public void markMessageRead( - final Account account, + final EmailStore.Account account, final String folder, final String uid, final boolean seen) { try { - Store localStore = Store.getInstance(account.getLocalStoreUri(), mContext, null); + Store localStore = Store.getInstance(account.getLocalStoreUri(mContext), mContext, + null); Folder localFolder = localStore.getFolder(folder); localFolder.open(OpenMode.READ_WRITE, null); @@ -1237,13 +1246,13 @@ public class MessagingController implements Runnable { } } - private void loadMessageForViewRemote(final Account account, final String folder, + private void loadMessageForViewRemote(final EmailStore.Account account, final String folder, final String uid, MessagingListener listener) { put("loadMessageForViewRemote", listener, new Runnable() { public void run() { try { LocalStore localStore = (LocalStore) Store.getInstance( - account.getLocalStoreUri(), mContext, null); + account.getLocalStoreUri(mContext), mContext, null); LocalFolder localFolder = (LocalFolder) localStore.getFolder(folder); localFolder.open(OpenMode.READ_WRITE, null); @@ -1276,7 +1285,7 @@ public class MessagingController implements Runnable { * fully if possible. */ - Store remoteStore = Store.getInstance(account.getStoreUri(), mContext, + Store remoteStore = Store.getInstance(account.getStoreUri(mContext), mContext, localStore.getPersistentCallbacks()); Folder remoteFolder = remoteStore.getFolder(folder); remoteFolder.open(OpenMode.READ_WRITE, localFolder.getPersistentCallbacks()); @@ -1349,15 +1358,16 @@ public class MessagingController implements Runnable { }); } - public void loadMessageForView(final Account account, final String folder, final String uid, - MessagingListener listener) { + public void loadMessageForView(final EmailStore.Account account, final String folder, + final String uid, MessagingListener listener) { synchronized (mListeners) { for (MessagingListener l : mListeners) { l.loadMessageForViewStarted(account, folder, uid); } } try { - Store localStore = Store.getInstance(account.getLocalStoreUri(), mContext, null); + Store localStore = Store.getInstance(account.getLocalStoreUri(mContext), mContext, + null); LocalFolder localFolder = (LocalFolder) localStore.getFolder(folder); localFolder.open(OpenMode.READ_WRITE, null); @@ -1413,7 +1423,7 @@ public class MessagingController implements Runnable { * @param listener */ public void loadAttachment( - final Account account, + final EmailStore.Account account, final Message message, final Part part, final Object tag, @@ -1452,7 +1462,7 @@ public class MessagingController implements Runnable { public void run() { try { LocalStore localStore = (LocalStore) Store.getInstance( - account.getLocalStoreUri(), mContext, null); + account.getLocalStoreUri(mContext), mContext, null); /* * We clear out any attachments already cached in the entire store and then * we update the passed in message to reflect that there are no cached @@ -1466,7 +1476,7 @@ public class MessagingController implements Runnable { for (Part attachment : attachments) { attachment.setBody(null); } - Store remoteStore = Store.getInstance(account.getStoreUri(), mContext, + Store remoteStore = Store.getInstance(account.getStoreUri(mContext), mContext, localStore.getPersistentCallbacks()); LocalFolder localFolder = (LocalFolder) localStore.getFolder(message.getFolder().getName()); @@ -1505,13 +1515,13 @@ public class MessagingController implements Runnable { * @param message * @param listener */ - public void sendMessage(final Account account, - final Message message, + public void sendMessage(final EmailStore.Account account, final Message message, MessagingListener listener) { try { - Store localStore = Store.getInstance(account.getLocalStoreUri(), mContext, null); + Store localStore = Store.getInstance(account.getLocalStoreUri(mContext), mContext, + null); LocalFolder localFolder = - (LocalFolder) localStore.getFolder(account.getOutboxFolderName()); + (LocalFolder) localStore.getFolder(account.getOutboxFolderName(mContext)); localFolder.open(OpenMode.READ_WRITE, null); localFolder.appendMessages(new Message[] { message @@ -1535,8 +1545,7 @@ public class MessagingController implements Runnable { * @param account * @param listener */ - public void sendPendingMessages(final Account account, - MessagingListener listener) { + public void sendPendingMessages(final EmailStore.Account account, MessagingListener listener) { put("sendPendingMessages", listener, new Runnable() { public void run() { sendPendingMessagesSynchronous(account); @@ -1549,11 +1558,11 @@ public class MessagingController implements Runnable { * @param account * @param listener */ - public void sendPendingMessagesSynchronous(final Account account) { + public void sendPendingMessagesSynchronous(final EmailStore.Account account) { try { LocalStore localStore = (LocalStore) Store.getInstance( - account.getLocalStoreUri(), mContext, null); - Folder localFolder = localStore.getFolder(account.getOutboxFolderName()); + account.getLocalStoreUri(mContext), mContext, null); + Folder localFolder = localStore.getFolder(account.getOutboxFolderName(mContext)); if (!localFolder.exists()) { return; } @@ -1570,14 +1579,14 @@ public class MessagingController implements Runnable { fp.add(FetchProfile.Item.BODY); LocalFolder localSentFolder = - (LocalFolder) localStore.getFolder(account.getSentFolderName()); + (LocalFolder) localStore.getFolder(account.getSentFolderName(mContext)); // Determine if upload to "sent" folder is necessary Store remoteStore = Store.getInstance( - account.getStoreUri(), mContext, localStore.getPersistentCallbacks()); + account.getStoreUri(mContext), mContext, localStore.getPersistentCallbacks()); boolean requireCopyMessageToSentFolder = remoteStore.requireCopyMessageToSentFolder(); - Sender sender = Sender.getInstance(account.getSenderUri(), mContext); + Sender sender = Sender.getInstance(account.getSenderUri(mContext), mContext); for (Message message : localMessages) { try { localFolder.fetch(new Message[] { message }, fp, null); @@ -1643,15 +1652,16 @@ public class MessagingController implements Runnable { * @param message * @param listener */ - public void deleteMessage(final Account account, final String folder, final Message message, - MessagingListener listener) { - if (folder.equals(account.getTrashFolderName())) { + public void deleteMessage(final EmailStore.Account account, final String folder, + final Message message, MessagingListener listener) { + if (folder.equals(account.getTrashFolderName(mContext))) { return; } try { - Store localStore = Store.getInstance(account.getLocalStoreUri(), mContext, null); + Store localStore = Store.getInstance(account.getLocalStoreUri(mContext), mContext, + null); Folder localFolder = localStore.getFolder(folder); - Folder localTrashFolder = localStore.getFolder(account.getTrashFolderName()); + Folder localTrashFolder = localStore.getFolder(account.getTrashFolderName(mContext)); localFolder.copyMessages(new Message[] { message }, localTrashFolder, null); message.setFlag(Flag.DELETED, true); @@ -1669,14 +1679,14 @@ public class MessagingController implements Runnable { } } - public void emptyTrash(final Account account, MessagingListener listener) { + public void emptyTrash(final EmailStore.Account account, MessagingListener listener) { put("emptyTrash", listener, new Runnable() { public void run() { // TODO IMAP try { Store localStore = Store.getInstance( - account.getLocalStoreUri(), mContext, null); - Folder localFolder = localStore.getFolder(account.getTrashFolderName()); + account.getLocalStoreUri(mContext), mContext, null); + Folder localFolder = localStore.getFolder(account.getTrashFolderName(mContext)); localFolder.open(OpenMode.READ_WRITE, null); Message[] messages = localFolder.getMessages(null); localFolder.setFlags(messages, new Flag[] { @@ -1713,7 +1723,7 @@ public class MessagingController implements Runnable { * @param accounts List of accounts to check, or null to check all accounts * @param listener */ - public void checkMail(final Context context, Account[] accounts, + public void checkMail(final Context context, EmailStore.Account[] accounts, final MessagingListener listener) { /** * Note: The somewhat tortured logic here is to guarantee proper ordering of events: @@ -1733,9 +1743,10 @@ public class MessagingController implements Runnable { } } if (accounts == null) { - accounts = Preferences.getPreferences(context).getAccounts(); + // TODO eliminate this use case, implement, or ...? +// accounts = Preferences.getPreferences(context).getAccounts(); } - for (final Account account : accounts) { + for (final EmailStore.Account account : accounts) { listFolders(account, true, null); put("checkMail", listener, new Runnable() { @@ -1756,11 +1767,12 @@ public class MessagingController implements Runnable { }); } - public void saveDraft(final Account account, final Message message) { + public void saveDraft(final EmailStore.Account account, final Message message) { try { - Store localStore = Store.getInstance(account.getLocalStoreUri(), mContext, null); + Store localStore = Store.getInstance(account.getLocalStoreUri(mContext), mContext, + null); LocalFolder localFolder = - (LocalFolder) localStore.getFolder(account.getDraftsFolderName()); + (LocalFolder) localStore.getFolder(account.getDraftsFolderName(mContext)); localFolder.open(OpenMode.READ_WRITE, null); localFolder.appendMessages(new Message[] { message @@ -1781,7 +1793,7 @@ public class MessagingController implements Runnable { } } - class Command { + private static class Command { public Runnable runnable; public MessagingListener listener; diff --git a/src/com/android/email/MessagingListener.java b/src/com/android/email/MessagingListener.java index b8271681c..3201422fa 100644 --- a/src/com/android/email/MessagingListener.java +++ b/src/com/android/email/MessagingListener.java @@ -16,11 +16,12 @@ package com.android.email; -import android.content.Context; - import com.android.email.mail.Folder; import com.android.email.mail.Message; import com.android.email.mail.Part; +import com.android.email.provider.EmailStore; + +import android.content.Context; /** * Defines the interface that MessagingController will use to callback to requesters. This class @@ -30,91 +31,95 @@ import com.android.email.mail.Part; * changes in this class. */ public class MessagingListener { - public void listFoldersStarted(Account account) { + public void listFoldersStarted(EmailStore.Account account) { } - public void listFolders(Account account, Folder[] folders) { + public void listFolders(EmailStore.Account account, Folder[] folders) { } - public void listFoldersFailed(Account account, String message) { + public void listFoldersFailed(EmailStore.Account account, String message) { } - public void listFoldersFinished(Account account) { + public void listFoldersFinished(EmailStore.Account account) { } - public void listLocalMessagesStarted(Account account, String folder) { + public void listLocalMessagesStarted(EmailStore.Account account, String folder) { } - public void listLocalMessages(Account account, String folder, Message[] messages) { + public void listLocalMessages(EmailStore.Account account, String folder, Message[] messages) { } - public void listLocalMessagesFailed(Account account, String folder, String message) { + public void listLocalMessagesFailed(EmailStore.Account account, String folder, String message) { } - public void listLocalMessagesFinished(Account account, String folder) { + public void listLocalMessagesFinished(EmailStore.Account account, String folder) { } - public void synchronizeMailboxStarted(Account account, String folder) { + public void synchronizeMailboxStarted(EmailStore.Account account, String folder) { } - public void synchronizeMailboxNewMessage(Account account, String folder, Message message) { + public void synchronizeMailboxNewMessage(EmailStore.Account account, String folder, + Message message) { } - public void synchronizeMailboxRemovedMessage(Account account, String folder,Message message) { + public void synchronizeMailboxRemovedMessage(EmailStore.Account account, String folder, + Message message) { } - public void synchronizeMailboxFinished(Account account, String folder, + public void synchronizeMailboxFinished(EmailStore.Account account, String folder, int totalMessagesInMailbox, int numNewMessages) { } - public void synchronizeMailboxFailed(Account account, String folder, Exception e) { + public void synchronizeMailboxFailed(EmailStore.Account account, String folder, Exception e) { } - public void loadMessageForViewStarted(Account account, String folder, String uid) { + public void loadMessageForViewStarted(EmailStore.Account account, String folder, String uid) { } - public void loadMessageForViewHeadersAvailable(Account account, String folder, String uid, + public void loadMessageForViewHeadersAvailable(EmailStore.Account account, String folder, + String uid, Message message) { + } + + public void loadMessageForViewBodyAvailable(EmailStore.Account account, String folder, + String uid, Message message) { + } + + public void loadMessageForViewFinished(EmailStore.Account account, String folder, String uid, Message message) { } - public void loadMessageForViewBodyAvailable(Account account, String folder, String uid, - Message message) { + public void loadMessageForViewFailed(EmailStore.Account account, String folder, String uid, + String message) { } - public void loadMessageForViewFinished(Account account, String folder, String uid, - Message message) { + public void checkMailStarted(Context context, EmailStore.Account account) { } - public void loadMessageForViewFailed(Account account, String folder, String uid, String message) { + public void checkMailFinished(Context context, EmailStore.Account account) { } - public void checkMailStarted(Context context, Account account) { + public void checkMailFailed(Context context, EmailStore.Account account, String reason) { } - public void checkMailFinished(Context context, Account account) { + public void sendPendingMessagesCompleted(EmailStore.Account account) { } - public void checkMailFailed(Context context, Account account, String reason) { + public void sendPendingMessagesFailed(EmailStore.Account account, Exception reason) { } - public void sendPendingMessagesCompleted(Account account) { + public void sendPendingMessageFailed(EmailStore.Account account, Message message, + Exception reason) { } - public void sendPendingMessagesFailed(Account account, Exception reason) { + public void emptyTrashCompleted(EmailStore.Account account) { } - public void sendPendingMessageFailed(Account account, Message message, Exception reason) { - } - - public void emptyTrashCompleted(Account account) { - } - - public void messageUidChanged(Account account, String folder, String oldUid, String newUid) { - + public void messageUidChanged(EmailStore.Account account, String folder, + String oldUid, String newUid) { } public void loadAttachmentStarted( - Account account, + EmailStore.Account account, Message message, Part part, Object tag, @@ -123,7 +128,7 @@ public class MessagingListener { } public void loadAttachmentFinished( - Account account, + EmailStore.Account account, Message message, Part part, Object tag) @@ -131,7 +136,7 @@ public class MessagingListener { } public void loadAttachmentFailed( - Account account, + EmailStore.Account account, Message message, Part part, Object tag, diff --git a/src/com/android/email/activity/AccountShortcutPicker.java b/src/com/android/email/activity/AccountShortcutPicker.java index 0e481f22e..1fbea3645 100644 --- a/src/com/android/email/activity/AccountShortcutPicker.java +++ b/src/com/android/email/activity/AccountShortcutPicker.java @@ -16,24 +16,21 @@ package com.android.email.activity; -import com.android.email.Account; import com.android.email.Email; -import com.android.email.Preferences; import com.android.email.R; -import com.android.email.mail.MessagingException; -import com.android.email.mail.Store; -import com.android.email.mail.store.LocalStore; -import com.android.email.mail.store.LocalStore.LocalFolder; +import com.android.email.provider.EmailStore; +import com.android.email.provider.EmailStore.Account; import android.app.ListActivity; +import android.content.Context; import android.content.Intent; +import android.database.Cursor; import android.os.Bundle; import android.os.Parcelable; import android.view.View; -import android.view.ViewGroup; import android.widget.AdapterView; -import android.widget.ArrayAdapter; import android.widget.ListView; +import android.widget.SimpleCursorAdapter; import android.widget.TextView; import android.widget.AdapterView.OnItemClickListener; @@ -45,9 +42,21 @@ import android.widget.AdapterView.OnItemClickListener; * (or, one could be a base class of the other). */ public class AccountShortcutPicker extends ListActivity implements OnItemClickListener { - - Account[] mAccounts; - + + /** + * Support for list adapter + */ + private final static String[] sFromColumns = new String[] { + EmailStore.AccountColumns.DISPLAY_NAME, + EmailStore.AccountColumns.EMAIL_ADDRESS, + EmailStore.RECORD_ID + }; + private final int[] sToIds = new int[] { + R.id.description, + R.id.email, + R.id.new_message_count + }; + @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); @@ -59,8 +68,11 @@ public class AccountShortcutPicker extends ListActivity implements OnItemClickLi } // finish() immediately if no accounts are configured - mAccounts = Preferences.getPreferences(this).getAccounts(); - if (mAccounts.length == 0) { + Cursor c = this.managedQuery( + EmailStore.Account.CONTENT_URI, + EmailStore.Account.CONTENT_PROJECTION, + null, null); + if (c.getCount() == 0) { finish(); return; } @@ -70,16 +82,10 @@ public class AccountShortcutPicker extends ListActivity implements OnItemClickLi listView.setOnItemClickListener(this); listView.setItemsCanFocus(false); listView.setEmptyView(findViewById(R.id.empty)); - } - - @Override - public void onResume() { - super.onResume(); - refresh(); - } - - private void refresh() { - getListView().setAdapter(new AccountsAdapter(mAccounts)); + + AccountsAdapter a = new AccountsAdapter(this, + R.layout.accounts_item, c, sFromColumns, sToIds); + listView.setAdapter(a); } private void onOpenAccount(Account account) { @@ -93,58 +99,33 @@ public class AccountShortcutPicker extends ListActivity implements OnItemClickLi onOpenAccount(account); } - class AccountsAdapter extends ArrayAdapter { - public AccountsAdapter(Account[] accounts) { - super(AccountShortcutPicker.this, 0, accounts); - } + private static class AccountsAdapter extends SimpleCursorAdapter { - @Override - public View getView(int position, View convertView, ViewGroup parent) { - Account account = getItem(position); - View view; - if (convertView != null) { - view = convertView; - } - else { - view = getLayoutInflater().inflate(R.layout.accounts_item, parent, false); - } - AccountViewHolder holder = (AccountViewHolder) view.getTag(); - if (holder == null) { - holder = new AccountViewHolder(); - holder.description = (TextView) view.findViewById(R.id.description); - holder.email = (TextView) view.findViewById(R.id.email); - holder.newMessageCount = (TextView) view.findViewById(R.id.new_message_count); - view.setTag(holder); - } - holder.description.setText(account.getDescription()); - holder.email.setText(account.getEmail()); - if (account.getEmail().equals(account.getDescription())) { - holder.email.setVisibility(View.GONE); - } - int unreadMessageCount = 0; - try { - LocalStore localStore = (LocalStore) Store.getInstance( - account.getLocalStoreUri(), getApplication(), null); - LocalFolder localFolder = (LocalFolder) localStore.getFolder(Email.INBOX); - if (localFolder.exists()) { - unreadMessageCount = localFolder.getUnreadMessageCount(); + public AccountsAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { + super(context, layout, c, from, to); + setViewBinder(new MyViewBinder()); + } + + /** + * This is only used for the unread messages count. Most of the views are handled + * normally by SimpleCursorAdapter. + */ + private static class MyViewBinder implements SimpleCursorAdapter.ViewBinder { + + public boolean setViewValue(View view, Cursor cursor, int columnIndex) { + if (view.getId() == R.id.new_message_count) { + + int unreadMessageCount = 0; // TODO get unread count from Account + if (unreadMessageCount <= 0) { + view.setVisibility(View.GONE); + } else { + ((TextView)view).setText(String.valueOf(unreadMessageCount)); + } + return true; } + + return false; } - catch (MessagingException me) { - /* - * This is not expected to fail under normal circumstances. - */ - throw new RuntimeException("Unable to get unread count from local store.", me); - } - holder.newMessageCount.setText(Integer.toString(unreadMessageCount)); - holder.newMessageCount.setVisibility(unreadMessageCount > 0 ? View.VISIBLE : View.GONE); - return view; - } - - class AccountViewHolder { - public TextView description; - public TextView email; - public TextView newMessageCount; } } @@ -175,11 +156,11 @@ public class AccountShortcutPicker extends ListActivity implements OnItemClickLi * with an appropriate Uri for your content, but any Intent will work here as long as it * triggers the desired action within your Activity. */ - private void setupShortcut(Account account) { + private void setupShortcut(EmailStore.Account account) { // First, set up the shortcut intent. Intent shortcutIntent = FolderMessageList.actionHandleAccountUriIntent(this, - account, Email.INBOX); + account.mId, Email.INBOX); // Then, set up the container intent (the response to the caller) diff --git a/src/com/android/email/activity/FolderMessageList.java b/src/com/android/email/activity/FolderMessageList.java index e8a818ef2..d944f266e 100644 --- a/src/com/android/email/activity/FolderMessageList.java +++ b/src/com/android/email/activity/FolderMessageList.java @@ -16,11 +16,9 @@ package com.android.email.activity; -import com.android.email.Account; import com.android.email.Email; import com.android.email.MessagingController; import com.android.email.MessagingListener; -import com.android.email.Preferences; import com.android.email.R; import com.android.email.Utility; import com.android.email.activity.setup.AccountSettings; @@ -35,9 +33,11 @@ import com.android.email.mail.Message.RecipientType; import com.android.email.mail.store.LocalStore; import com.android.email.mail.store.LocalStore.LocalFolder; import com.android.email.mail.store.LocalStore.LocalMessage; +import com.android.email.provider.EmailStore; import android.app.ExpandableListActivity; import android.app.NotificationManager; +import android.content.ContentUris; import android.content.Context; import android.content.Intent; import android.graphics.Typeface; @@ -88,7 +88,7 @@ import java.util.Date; * And don't refresh remote folders ever unless the user runs a refresh. Maybe not even then. */ public class FolderMessageList extends ExpandableListActivity { - private static final String EXTRA_ACCOUNT = "account"; + private static final String EXTRA_ACCOUNT_ID = "account"; private static final String EXTRA_CLEAR_NOTIFICATION = "clearNotification"; private static final String EXTRA_INITIAL_FOLDER = "initialFolder"; @@ -134,7 +134,8 @@ public class FolderMessageList extends ExpandableListActivity { private FolderMessageListAdapter mAdapter; private LayoutInflater mInflater; - private Account mAccount; + private long mAccountId; + private EmailStore.Account mAccount; private boolean mSyncWindowUser; /** @@ -353,7 +354,7 @@ public class FolderMessageList extends ExpandableListActivity { String mFolder; boolean mSynchronizeRemote; MessagingListener mListener; - Account mAccount; + EmailStore.Account mAccount; MessagingController mController; /** @@ -363,7 +364,8 @@ public class FolderMessageList extends ExpandableListActivity { * @param synchronizeRemote */ public FolderUpdateWorker(String folder, boolean synchronizeRemote, - MessagingListener listener, Account account, MessagingController controller) { + MessagingListener listener, EmailStore.Account account, + MessagingController controller) { mFolder = folder; mSynchronizeRemote = synchronizeRemote; mListener = listener; @@ -390,21 +392,6 @@ public class FolderMessageList extends ExpandableListActivity { } } - @Deprecated - public static void actionHandleAccount(Context context, Account account, String initialFolder) { - Intent intent = new Intent(context, FolderMessageList.class); - intent.putExtra(EXTRA_ACCOUNT, account); - if (initialFolder != null) { - intent.putExtra(EXTRA_INITIAL_FOLDER, initialFolder); - } - context.startActivity(intent); - } - - @Deprecated - public static void actionHandleAccount(Context context, Account account) { - actionHandleAccount(context, account, null); - } - /** * Open a specific account. * @param context @@ -421,15 +408,17 @@ public class FolderMessageList extends ExpandableListActivity { * @param initialFolder The folder to open, or null for none */ public static void actionHandleAccount(Context context, long id, String initialFolder) { - // TODO Auto-generated method stub - // DO NOT CHECK IN UNTIL WRITTEN - // PLACEHOLDER: Just return to accounts list, for now - Accounts.actionShowAccounts(context); + Intent intent = new Intent(context, FolderMessageList.class); + intent.putExtra(EXTRA_ACCOUNT_ID, id); + if (initialFolder != null) { + intent.putExtra(EXTRA_INITIAL_FOLDER, initialFolder); + } + context.startActivity(intent); } - public static Intent actionHandleAccountIntent(Context context, Account account, String initialFolder) { + public static Intent actionHandleAccountIntent(Context context, long id, String initialFolder) { Intent intent = new Intent(context, FolderMessageList.class); - intent.putExtra(EXTRA_ACCOUNT, account); + intent.putExtra(EXTRA_ACCOUNT_ID, id); intent.putExtra(EXTRA_CLEAR_NOTIFICATION, true); if (initialFolder != null) { intent.putExtra(EXTRA_INITIAL_FOLDER, initialFolder); @@ -446,11 +435,12 @@ public class FolderMessageList extends ExpandableListActivity { * @param initialFolder If non-null, can set the folder name to open (typically Email.INBOX) * @return an Intent which can be used to view that account */ - public static Intent actionHandleAccountUriIntent(Context context, Account account, + public static Intent actionHandleAccountUriIntent(Context context, long id, String initialFolder) { - Intent i = actionHandleAccountIntent(context, account, initialFolder); - i.removeExtra(EXTRA_ACCOUNT); - i.setData(account.getContentUri()); + Intent i = actionHandleAccountIntent(context, id, initialFolder); + i.removeExtra(EXTRA_ACCOUNT_ID); + Uri uri = ContentUris.withAppendedId(EmailStore.Account.CONTENT_URI, id); + i.setData(uri); return i; } @@ -479,11 +469,14 @@ public class FolderMessageList extends ExpandableListActivity { mInflater = getLayoutInflater(); Intent intent = getIntent(); - mAccount = (Account)intent.getSerializableExtra(EXTRA_ACCOUNT); + mAccountId = intent.getLongExtra(EXTRA_ACCOUNT_ID, -1); + mAccount = EmailStore.Account.restoreAccountWithId(this, mAccountId); if (mAccount == null) { Uri uri = intent.getData(); if (uri != null) { - mAccount = Preferences.getPreferences(this).getAccountByContentUri(uri); + // TODO - DO NOT CHECK IN - add Account.restoreFromUri() + + // mAccount = Preferences.getPreferences(this).getAccountByContentUri(uri); } } // If no useable account was specified, just go to the accounts list screen instead @@ -502,13 +495,13 @@ public class FolderMessageList extends ExpandableListActivity { * Since the color chip is always the same color for a given account we just cache the id * of the chip right here. */ - colorChipResId = colorChipResIds[mAccount.getAccountNumber() % colorChipResIds.length]; + colorChipResId = colorChipResIds[(int)mAccountId % colorChipResIds.length]; /** * "User" means the user adjusts the sync window in the UI (load more messages). * Non-user means that it's set to a fixed window e.g. 3 days */ - mSyncWindowUser = mAccount.getSyncWindow() == Account.SYNC_WINDOW_USER; + mSyncWindowUser = mAccount.getSyncWindow() == EmailStore.Account.SYNC_WINDOW_USER; mAdapter = new FolderMessageListAdapter(); @@ -567,7 +560,7 @@ public class FolderMessageList extends ExpandableListActivity { notifMgr.cancel(1); MessagingController.getInstance(getApplication()).addListener(mAdapter.mListener); - mAccount.refresh(Preferences.getPreferences(this)); + mAccount.refresh(this); onRefresh(false); } @@ -624,7 +617,7 @@ public class FolderMessageList extends ExpandableListActivity { FolderInfoHolder folder = (FolderInfoHolder) mAdapter.getGroup(groupPosition); if (folder.outbox) { if (childPosition == folder.messages.size() && !folder.loading) { - mHandler.folderLoading(mAccount.getOutboxFolderName(), true); + mHandler.folderLoading(mAccount.getOutboxFolderName(this), true); mHandler.progress(true); MessagingController.getInstance(getApplication()).sendPendingMessages( mAccount, @@ -671,7 +664,8 @@ public class FolderMessageList extends ExpandableListActivity { mRefreshRemote, mAdapter.mListener); if (forceRemote) { - mHandler.folderLoading(mAccount.getOutboxFolderName(), true); + mHandler.folderLoading(mAccount.getOutboxFolderName(FolderMessageList.this), + true); mHandler.progress(true); MessagingController.getInstance(getApplication()).sendPendingMessages( mAccount, @@ -695,14 +689,14 @@ public class FolderMessageList extends ExpandableListActivity { } if (folder.drafts) { - MessageCompose.actionEditDraft(this, mAccount, message.message); + MessageCompose.actionEditDraft(this, mAccountId, message.message); } else { ArrayList folderUids = new ArrayList(); for (MessageInfoHolder holder : folder.messages) { folderUids.add(holder.uid); } - MessageView.actionView(this, mAccount, folder.name, message.uid, folderUids); + MessageView.actionView(this, mAccountId, folder.name, message.uid, folderUids); } } @@ -710,7 +704,7 @@ public class FolderMessageList extends ExpandableListActivity { // We request a remote refresh *after* the account settings because user changes may // change the results we get from the server. This will be picked up in onResume(). mRefreshRemote = true; - AccountSettings.actionSettings(this, mAccount); + AccountSettings.actionSettings(this, mAccountId); } private void onAccounts() { @@ -719,7 +713,7 @@ public class FolderMessageList extends ExpandableListActivity { } private void onCompose() { - MessageCompose.actionCompose(this, mAccount); + MessageCompose.actionCompose(this, mAccountId); } private void onDelete(MessageInfoHolder holder) { @@ -733,15 +727,15 @@ public class FolderMessageList extends ExpandableListActivity { } private void onReply(MessageInfoHolder holder) { - MessageCompose.actionReply(this, mAccount, holder.message, false); + MessageCompose.actionReply(this, mAccountId, holder.message, false); } private void onReplyAll(MessageInfoHolder holder) { - MessageCompose.actionReply(this, mAccount, holder.message, true); + MessageCompose.actionReply(this, mAccountId, holder.message, true); } private void onForward(MessageInfoHolder holder) { - MessageCompose.actionForward(this, mAccount, holder.message); + MessageCompose.actionForward(this, mAccountId, holder.message); } private void onToggleRead(MessageInfoHolder holder) { @@ -846,7 +840,7 @@ public class FolderMessageList extends ExpandableListActivity { private MessagingListener mListener = new MessagingListener() { @Override - public void listFoldersStarted(Account account) { + public void listFoldersStarted(EmailStore.Account account) { if (!account.equals(mAccount)) { return; } @@ -854,7 +848,7 @@ public class FolderMessageList extends ExpandableListActivity { } @Override - public void listFoldersFailed(Account account, String message) { + public void listFoldersFailed(EmailStore.Account account, String message) { if (!account.equals(mAccount)) { return; } @@ -865,7 +859,7 @@ public class FolderMessageList extends ExpandableListActivity { } @Override - public void listFoldersFinished(Account account) { + public void listFoldersFinished(EmailStore.Account account) { if (!account.equals(mAccount)) { return; } @@ -874,7 +868,7 @@ public class FolderMessageList extends ExpandableListActivity { } @Override - public void listFolders(Account account, Folder[] folders) { + public void listFolders(EmailStore.Account account, Folder[] folders) { if (!account.equals(mAccount)) { return; } @@ -882,7 +876,7 @@ public class FolderMessageList extends ExpandableListActivity { } @Override - public void listLocalMessagesStarted(Account account, String folder) { + public void listLocalMessagesStarted(EmailStore.Account account, String folder) { if (!account.equals(mAccount)) { return; } @@ -891,7 +885,8 @@ public class FolderMessageList extends ExpandableListActivity { } @Override - public void listLocalMessagesFailed(Account account, String folder, String message) { + public void listLocalMessagesFailed(EmailStore.Account account, String folder, + String message) { if (!account.equals(mAccount)) { return; } @@ -900,7 +895,7 @@ public class FolderMessageList extends ExpandableListActivity { } @Override - public void listLocalMessagesFinished(Account account, String folder) { + public void listLocalMessagesFinished(EmailStore.Account account, String folder) { if (!account.equals(mAccount)) { return; } @@ -909,7 +904,8 @@ public class FolderMessageList extends ExpandableListActivity { } @Override - public void listLocalMessages(Account account, String folder, Message[] messages) { + public void listLocalMessages(EmailStore.Account account, String folder, + Message[] messages) { if (!account.equals(mAccount)) { return; } @@ -917,9 +913,7 @@ public class FolderMessageList extends ExpandableListActivity { } @Override - public void synchronizeMailboxStarted( - Account account, - String folder) { + public void synchronizeMailboxStarted(EmailStore.Account account, String folder) { if (!account.equals(mAccount)) { return; } @@ -929,11 +923,8 @@ public class FolderMessageList extends ExpandableListActivity { } @Override - public void synchronizeMailboxFinished( - Account account, - String folder, - int totalMessagesInMailbox, - int numNewMessages) { + public void synchronizeMailboxFinished(EmailStore.Account account, String folder, + int totalMessagesInMailbox, int numNewMessages) { if (!account.equals(mAccount)) { return; } @@ -944,7 +935,8 @@ public class FolderMessageList extends ExpandableListActivity { } @Override - public void synchronizeMailboxFailed(Account account, String folder, Exception e) { + public void synchronizeMailboxFailed(EmailStore.Account account, String folder, + Exception e) { if (!account.equals(mAccount)) { return; } @@ -978,9 +970,7 @@ public class FolderMessageList extends ExpandableListActivity { } @Override - public void synchronizeMailboxNewMessage( - Account account, - String folder, + public void synchronizeMailboxNewMessage(EmailStore.Account account, String folder, Message message) { if (!account.equals(mAccount)) { return; @@ -989,9 +979,7 @@ public class FolderMessageList extends ExpandableListActivity { } @Override - public void synchronizeMailboxRemovedMessage( - Account account, - String folder, + public void synchronizeMailboxRemovedMessage(EmailStore.Account account, String folder, Message message) { if (!account.equals(mAccount)) { return; @@ -1000,7 +988,7 @@ public class FolderMessageList extends ExpandableListActivity { } @Override - public void emptyTrashCompleted(Account account) { + public void emptyTrashCompleted(EmailStore.Account account) { if (!account.equals(mAccount)) { return; } @@ -1008,21 +996,21 @@ public class FolderMessageList extends ExpandableListActivity { } @Override - public void sendPendingMessagesCompleted(Account account) { + public void sendPendingMessagesCompleted(EmailStore.Account account) { if (!account.equals(mAccount)) { return; } - mHandler.folderLoading(account.getOutboxFolderName(), false); + mHandler.folderLoading(account.getOutboxFolderName(FolderMessageList.this), false); mHandler.progress(false); onRefresh(false); } @Override - public void sendPendingMessagesFailed(Account account, Exception reason) { + public void sendPendingMessagesFailed(EmailStore.Account account, Exception reason) { if (!account.equals(mAccount)) { return; } - String outboxName = account.getOutboxFolderName(); + String outboxName = account.getOutboxFolderName(FolderMessageList.this); mHandler.folderLoading(outboxName, false); mHandler.progress(false); mHandler.folderStatus(outboxName, reason.getMessage(), false); @@ -1030,7 +1018,7 @@ public class FolderMessageList extends ExpandableListActivity { } @Override - public void sendPendingMessageFailed(Account account, Message message, + public void sendPendingMessageFailed(EmailStore.Account account, Message message, Exception reason) { if (!account.equals(mAccount)) { return; @@ -1041,11 +1029,8 @@ public class FolderMessageList extends ExpandableListActivity { } @Override - public void messageUidChanged( - Account account, - String folder, - String oldUid, - String newUid) { + public void messageUidChanged(EmailStore.Account account, String folder, + String oldUid, String newUid) { if (!mAccount.equals(account)) { return; } @@ -1068,16 +1053,16 @@ public class FolderMessageList extends ExpandableListActivity { if (folderName.equalsIgnoreCase(Email.INBOX)) { holder.inbox = true; holder.displayName = getString(R.string.special_mailbox_name_inbox); - } else if (folderName.equals(mAccount.getDraftsFolderName())) { + } else if (folderName.equals(mAccount.getDraftsFolderName(FolderMessageList.this))) { holder.drafts = true; holder.displayName = getString(R.string.special_mailbox_display_name_drafts); - } else if (folderName.equals(mAccount.getOutboxFolderName())) { + } else if (folderName.equals(mAccount.getOutboxFolderName(FolderMessageList.this))) { holder.outbox = true; holder.displayName = getString(R.string.special_mailbox_display_name_outbox); - } else if (folderName.equals(mAccount.getSentFolderName())) { + } else if (folderName.equals(mAccount.getSentFolderName(FolderMessageList.this))) { holder.sent = true; holder.displayName = getString(R.string.special_mailbox_display_name_sent); - } else if (folderName.equals(mAccount.getTrashFolderName())) { + } else if (folderName.equals(mAccount.getTrashFolderName(FolderMessageList.this))) { holder.trash = true; holder.displayName = getString(R.string.special_mailbox_display_name_trash); } else { diff --git a/src/com/android/email/activity/MessageCompose.java b/src/com/android/email/activity/MessageCompose.java index 6fab86f5c..685457c5d 100644 --- a/src/com/android/email/activity/MessageCompose.java +++ b/src/com/android/email/activity/MessageCompose.java @@ -16,13 +16,11 @@ package com.android.email.activity; -import com.android.email.Account; import com.android.email.Email; import com.android.email.EmailAddressAdapter; import com.android.email.EmailAddressValidator; import com.android.email.MessagingController; import com.android.email.MessagingListener; -import com.android.email.Preferences; import com.android.email.R; import com.android.email.Utility; import com.android.email.mail.Address; @@ -41,6 +39,7 @@ import com.android.email.mail.internet.MimeUtility; import com.android.email.mail.internet.TextBody; import com.android.email.mail.store.LocalStore; import com.android.email.mail.store.LocalStore.LocalAttachmentBody; +import com.android.email.provider.EmailStore; import android.app.Activity; import android.content.ActivityNotFoundException; @@ -61,7 +60,6 @@ import android.text.TextWatcher; import android.text.util.Rfc822Tokenizer; import android.util.Config; import android.util.Log; -import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -91,7 +89,7 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus private static final String ACTION_FORWARD = "com.android.email.intent.action.FORWARD"; private static final String ACTION_EDIT_DRAFT = "com.android.email.intent.action.EDIT_DRAFT"; - private static final String EXTRA_ACCOUNT = "account"; + private static final String EXTRA_ACCOUNT_ID = "account_id"; private static final String EXTRA_FOLDER = "folder"; private static final String EXTRA_MESSAGE = "message"; @@ -117,7 +115,8 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus private static final int ACTIVITY_REQUEST_PICK_ATTACHMENT = 1; - private Account mAccount; + private long mAccountId; + private EmailStore.Account mAccount; private String mFolder; private String mSourceMessageUid; private Message mSourceMessage; @@ -202,16 +201,20 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus } /** - * Compose a new message using the given account. If account is null the default account + * Compose a new message using the given account. If account is -1 the default account * will be used. * @param context * @param account */ - public static void actionCompose(Context context, Account account) { + public static void actionCompose(Context context, long accountId) { try { Intent i = new Intent(context, MessageCompose.class); - i.putExtra(EXTRA_ACCOUNT, account); - i.putExtra(EXTRA_FOLDER, account.getDraftsFolderName()); + i.putExtra(EXTRA_ACCOUNT_ID, accountId); + /* + * TODO handle drafts via role # note via string + * Is this used? Do we ever compose anywhere else but in drafts? + */ + i.putExtra(EXTRA_FOLDER, context.getString(R.string.special_mailbox_name_drafts)); context.startActivity(i); } catch (ActivityNotFoundException anfe) { // Swallow it - this is usually a race condition, especially under automated test. @@ -227,7 +230,7 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus * @param context * @param defaultAccountId */ - public static void actionCompose(Accounts context, long defaultAccountId) { + public static void actionCompose(Activity context, long accountId) { // TODO Auto-generated method stub // DO NOT CHECK IN until written } @@ -242,11 +245,11 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus */ public static void actionReply( Context context, - Account account, + long accountId, Message message, boolean replyAll) { Intent i = new Intent(context, MessageCompose.class); - i.putExtra(EXTRA_ACCOUNT, account); + i.putExtra(EXTRA_ACCOUNT_ID, accountId); i.putExtra(EXTRA_FOLDER, message.getFolder().getName()); i.putExtra(EXTRA_MESSAGE, message.getUid()); if (replyAll) { @@ -264,9 +267,9 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus * @param account * @param message */ - public static void actionForward(Context context, Account account, Message message) { + public static void actionForward(Context context, long accountId, Message message) { Intent i = new Intent(context, MessageCompose.class); - i.putExtra(EXTRA_ACCOUNT, account); + i.putExtra(EXTRA_ACCOUNT_ID, accountId); i.putExtra(EXTRA_FOLDER, message.getFolder().getName()); i.putExtra(EXTRA_MESSAGE, message.getUid()); i.setAction(ACTION_FORWARD); @@ -282,9 +285,9 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus * @param account * @param message */ - public static void actionEditDraft(Context context, Account account, Message message) { + public static void actionEditDraft(Context context, long accountId, Message message) { Intent i = new Intent(context, MessageCompose.class); - i.putExtra(EXTRA_ACCOUNT, account); + i.putExtra(EXTRA_ACCOUNT_ID, accountId); i.putExtra(EXTRA_FOLDER, message.getFolder().getName()); i.putExtra(EXTRA_MESSAGE, message.getUid()); i.setAction(ACTION_EDIT_DRAFT); @@ -434,7 +437,7 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus (Intent.ACTION_SEND.equals(action))) { // Check first for a valid account - mAccount = Preferences.getPreferences(this).getDefaultAccount(); + mAccount = EmailStore.Account.getDefaultAccount(this); if (mAccount == null) { // There are no accounts set up. This should not have happened. Prompt the // user to set up an account as an acceptable bailout. @@ -449,7 +452,8 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus } else { // Otherwise, handle the internal cases (Message Composer invoked from within app) - mAccount = (Account) intent.getSerializableExtra(EXTRA_ACCOUNT); + mAccountId = intent.getLongExtra(EXTRA_ACCOUNT_ID, -1); + mAccount = EmailStore.Account.restoreAccountWithId(this, mAccountId); mFolder = intent.getStringExtra(EXTRA_FOLDER); mSourceMessageUid = intent.getStringExtra(EXTRA_MESSAGE); } @@ -728,7 +732,7 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus */ if (ACTION_EDIT_DRAFT.equals(getIntent().getAction()) && mSourceMessageUid != null - && mFolder.equals(mAccount.getDraftsFolderName())) { + && mFolder.equals(mAccount.getDraftsFolderName(this))) { /* * We're sending a previously saved draft, so delete the old draft first. */ @@ -1253,7 +1257,7 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus setNewMessageFocus(); mSourceMessageProcessed = true; - mDraftNeedsSaving = mFolder != null && !mFolder.equals(mAccount.getDraftsFolderName()); + mDraftNeedsSaving = mFolder != null && !mFolder.equals(mAccount.getDraftsFolderName(this)); } /** @@ -1280,19 +1284,20 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus class Listener extends MessagingListener { @Override - public void loadMessageForViewStarted(Account account, String folder, String uid) { + public void loadMessageForViewStarted(EmailStore.Account account, String folder, + String uid) { mHandler.sendEmptyMessage(MSG_PROGRESS_ON); } @Override - public void loadMessageForViewFinished(Account account, String folder, String uid, - Message message) { + public void loadMessageForViewFinished(EmailStore.Account account, String folder, + String uid, Message message) { mHandler.sendEmptyMessage(MSG_PROGRESS_OFF); } @Override - public void loadMessageForViewBodyAvailable(Account account, String folder, String uid, - final Message message) { + public void loadMessageForViewBodyAvailable(EmailStore.Account account, String folder, + String uid, final Message message) { mSourceMessage = message; runOnUiThread(new Runnable() { public void run() { @@ -1302,22 +1307,18 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus } @Override - public void loadMessageForViewFailed(Account account, String folder, String uid, + public void loadMessageForViewFailed(EmailStore.Account account, String folder, String uid, final String message) { mHandler.sendEmptyMessage(MSG_PROGRESS_OFF); // TODO show network error } @Override - public void messageUidChanged( - Account account, - String folder, - String oldUid, + public void messageUidChanged(EmailStore.Account account, String folder,String oldUid, String newUid) { - if (account.equals(mAccount) - && (folder.equals(mFolder) - || (mFolder == null - && folder.equals(mAccount.getDraftsFolderName())))) { + if (account.equals(mAccount) && (folder.equals(mFolder) + || (mFolder == null + && folder.equals(mAccount.getDraftsFolderName(MessageCompose.this))))) { if (oldUid.equals(mDraftUid)) { mDraftUid = newUid; } diff --git a/src/com/android/email/activity/MessageView.java b/src/com/android/email/activity/MessageView.java index a58cc367a..33b0b427d 100644 --- a/src/com/android/email/activity/MessageView.java +++ b/src/com/android/email/activity/MessageView.java @@ -16,7 +16,6 @@ package com.android.email.activity; -import com.android.email.Account; import com.android.email.Email; import com.android.email.MessagingController; import com.android.email.MessagingListener; @@ -33,6 +32,7 @@ import com.android.email.mail.internet.MimeUtility; import com.android.email.mail.store.LocalStore.LocalAttachmentBodyPart; import com.android.email.mail.store.LocalStore.LocalMessage; import com.android.email.provider.AttachmentProvider; +import com.android.email.provider.EmailStore; import org.apache.commons.io.IOUtils; @@ -83,7 +83,7 @@ import java.util.regex.Pattern; public class MessageView extends Activity implements OnClickListener { - private static final String EXTRA_ACCOUNT = "com.android.email.MessageView_account"; + private static final String EXTRA_ACCOUNT_ID = "com.android.email.MessageView_account_id"; private static final String EXTRA_FOLDER = "com.android.email.MessageView_folder"; private static final String EXTRA_MESSAGE = "com.android.email.MessageView_message"; private static final String EXTRA_FOLDER_UIDS = "com.android.email.MessageView_folderUids"; @@ -114,7 +114,8 @@ public class MessageView extends Activity private ImageView mSenderPresenceView; private ProgressDialog mProgressDialog; - private Account mAccount; + private long mAccountId; + private EmailStore.Account mAccount; private String mFolder; private String mMessageUid; private ArrayList mFolderUids; @@ -300,15 +301,15 @@ public class MessageView extends Activity public ImageView iconView; } - public static void actionView(Context context, Account account, + public static void actionView(Context context, long accountId, String folder, String messageUid, ArrayList folderUids) { - actionView(context, account, folder, messageUid, folderUids, null); + actionView(context, accountId, folder, messageUid, folderUids, null); } - public static void actionView(Context context, Account account, + public static void actionView(Context context, long accountId, String folder, String messageUid, ArrayList folderUids, Bundle extras) { Intent i = new Intent(context, MessageView.class); - i.putExtra(EXTRA_ACCOUNT, account); + i.putExtra(EXTRA_ACCOUNT_ID, accountId); i.putExtra(EXTRA_FOLDER, folder); i.putExtra(EXTRA_MESSAGE, messageUid); i.putExtra(EXTRA_FOLDER_UIDS, folderUids); @@ -362,7 +363,8 @@ public class MessageView extends Activity mTimeFormat = android.text.format.DateFormat.getTimeFormat(this); // 12/24 date format Intent intent = getIntent(); - mAccount = (Account) intent.getSerializableExtra(EXTRA_ACCOUNT); + mAccountId = intent.getLongExtra(EXTRA_ACCOUNT_ID, -1); + mAccount = EmailStore.Account.restoreAccountWithId(this, mAccountId); mFolder = intent.getStringExtra(EXTRA_FOLDER); mMessageUid = intent.getStringExtra(EXTRA_MESSAGE); mFolderUids = intent.getStringArrayListExtra(EXTRA_FOLDER_UIDS); @@ -505,21 +507,21 @@ public class MessageView extends Activity private void onReply() { if (mMessage != null) { - MessageCompose.actionReply(this, mAccount, mMessage, false); + MessageCompose.actionReply(this, mAccountId, mMessage, false); finish(); } } private void onReplyAll() { if (mMessage != null) { - MessageCompose.actionReply(this, mAccount, mMessage, true); + MessageCompose.actionReply(this, mAccountId, mMessage, true); finish(); } } private void onForward() { if (mMessage != null) { - MessageCompose.actionForward(this, mAccount, mMessage); + MessageCompose.actionForward(this, mAccountId, mMessage); finish(); } } @@ -527,12 +529,12 @@ public class MessageView extends Activity private void onNext() { Bundle extras = new Bundle(1); extras.putBoolean(EXTRA_NEXT, true); - MessageView.actionView(this, mAccount, mFolder, mNextMessageUid, mFolderUids, extras); + MessageView.actionView(this, mAccountId, mFolder, mNextMessageUid, mFolderUids, extras); finish(); } private void onPrevious() { - MessageView.actionView(this, mAccount, mFolder, mPreviousMessageUid, mFolderUids); + MessageView.actionView(this, mAccountId, mFolder, mPreviousMessageUid, mFolderUids); finish(); } @@ -875,8 +877,8 @@ public class MessageView extends Activity class Listener extends MessagingListener { @Override - public void loadMessageForViewHeadersAvailable(Account account, String folder, String uid, - final Message message) { + public void loadMessageForViewHeadersAvailable(EmailStore.Account account, String folder, + String uid, final Message message) { MessageView.this.mMessage = message; try { String subjectText = message.getSubject(); @@ -905,8 +907,8 @@ public class MessageView extends Activity } @Override - public void loadMessageForViewBodyAvailable(Account account, String folder, String uid, - Message message) { + public void loadMessageForViewBodyAvailable(EmailStore.Account account, String folder, + String uid, Message message) { MessageView.this.mMessage = message; try { Part part = MimeUtility.findFirstPartByMimeType(mMessage, "text/html"); @@ -987,7 +989,7 @@ public class MessageView extends Activity } @Override - public void loadMessageForViewFailed(Account account, String folder, String uid, + public void loadMessageForViewFailed(EmailStore.Account account, String folder, String uid, final String message) { mHandler.post(new Runnable() { public void run() { @@ -999,8 +1001,8 @@ public class MessageView extends Activity } @Override - public void loadMessageForViewFinished(Account account, String folder, String uid, - Message message) { + public void loadMessageForViewFinished(EmailStore.Account account, String folder, + String uid, Message message) { mHandler.post(new Runnable() { public void run() { setProgressBarIndeterminateVisibility(false); @@ -1009,7 +1011,8 @@ public class MessageView extends Activity } @Override - public void loadMessageForViewStarted(Account account, String folder, String uid) { + public void loadMessageForViewStarted(EmailStore.Account account, String folder, String uid) + { mHandler.post(new Runnable() { public void run() { loadMessageContentUrl("file:///android_asset/loading.html"); @@ -1019,7 +1022,7 @@ public class MessageView extends Activity } @Override - public void loadAttachmentStarted(Account account, Message message, + public void loadAttachmentStarted(EmailStore.Account account, Message message, Part part, Object tag, boolean requiresDownload) { mHandler.setAttachmentsEnabled(false); Object[] params = (Object[]) tag; @@ -1030,7 +1033,7 @@ public class MessageView extends Activity } @Override - public void loadAttachmentFinished(Account account, Message message, + public void loadAttachmentFinished(EmailStore.Account account, Message message, Part part, Object tag) { mHandler.setAttachmentsEnabled(true); mHandler.progress(false, null); @@ -1077,7 +1080,7 @@ public class MessageView extends Activity } @Override - public void loadAttachmentFailed(Account account, Message message, Part part, + public void loadAttachmentFailed(EmailStore.Account account, Message message, Part part, Object tag, String reason) { mHandler.setAttachmentsEnabled(true); mHandler.progress(false, null); diff --git a/src/com/android/email/activity/setup/AccountSettings.java b/src/com/android/email/activity/setup/AccountSettings.java index 905fe5745..6329c0281 100644 --- a/src/com/android/email/activity/setup/AccountSettings.java +++ b/src/com/android/email/activity/setup/AccountSettings.java @@ -16,10 +16,8 @@ package com.android.email.activity.setup; -import com.android.email.Account; import com.android.email.Email; import com.android.email.R; -import com.android.email.activity.Accounts; import com.android.email.mail.MessagingException; import com.android.email.mail.Sender; import com.android.email.mail.Store; @@ -41,7 +39,6 @@ import android.util.Log; import android.view.KeyEvent; public class AccountSettings extends PreferenceActivity { - private static final String EXTRA_ACCOUNT = "account"; private static final String EXTRA_ACCOUNT_ID = "account_id"; private static final String PREFERENCE_TOP_CATEGORY = "account_settings"; @@ -70,20 +67,10 @@ public class AccountSettings extends PreferenceActivity { private CheckBoxPreference mAccountVibrate; private RingtonePreference mAccountRingtone; - /** - * TODO remove - */ - @Deprecated - public static void actionSettings(Activity fromActivity, Account account) { - Intent i = new Intent(fromActivity, AccountSettings.class); - i.putExtra(EXTRA_ACCOUNT, account); - fromActivity.startActivity(i); - } - /** * Display (and edit) settings for a specific account */ - public static void actionSettings(Accounts fromActivity, long accountId) { + public static void actionSettings(Activity fromActivity, long accountId) { Intent i = new Intent(fromActivity, AccountSettings.class); i.putExtra(EXTRA_ACCOUNT_ID, accountId); fromActivity.startActivity(i); diff --git a/src/com/android/email/mail/StoreSynchronizer.java b/src/com/android/email/mail/StoreSynchronizer.java index 7fcd88a44..49792dff6 100644 --- a/src/com/android/email/mail/StoreSynchronizer.java +++ b/src/com/android/email/mail/StoreSynchronizer.java @@ -16,8 +16,8 @@ package com.android.email.mail; -import com.android.email.Account; import com.android.email.MessagingListener; +import com.android.email.provider.EmailStore; import android.content.Context; @@ -70,7 +70,7 @@ public interface StoreSynchronizer { * @param context if needed for making system calls * @return an object describing the sync results */ - public SyncResults SynchronizeMessagesSynchronous(Account account, String folder, + public SyncResults SynchronizeMessagesSynchronous(EmailStore.Account account, String folder, Collection listeners, Context context) throws MessagingException; } diff --git a/src/com/android/email/mail/internet/EmailHtmlUtil.java b/src/com/android/email/mail/internet/EmailHtmlUtil.java index bf21831ea..41c25c972 100755 --- a/src/com/android/email/mail/internet/EmailHtmlUtil.java +++ b/src/com/android/email/mail/internet/EmailHtmlUtil.java @@ -16,12 +16,12 @@ package com.android.email.mail.internet; -import com.android.email.Account; import com.android.email.mail.MessagingException; import com.android.email.mail.Multipart; import com.android.email.mail.Part; import com.android.email.mail.store.LocalStore.LocalAttachmentBodyPart; import com.android.email.provider.AttachmentProvider; +import com.android.email.provider.EmailStore; import android.content.ContentResolver; import android.net.Uri; @@ -47,7 +47,7 @@ public class EmailHtmlUtil { * @return html text in which src attribute of img tag may be replaced with content uri */ public static String resolveInlineImage( - ContentResolver resolver, Account account, String text, Part part, int depth) + ContentResolver resolver, EmailStore.Account account, String text, Part part, int depth) throws MessagingException { // avoid too deep recursive call. if (depth >= 10 || text == null) { diff --git a/src/com/android/email/provider/AttachmentProvider.java b/src/com/android/email/provider/AttachmentProvider.java index dd6a4b756..60be434e9 100644 --- a/src/com/android/email/provider/AttachmentProvider.java +++ b/src/com/android/email/provider/AttachmentProvider.java @@ -16,13 +16,7 @@ package com.android.email.provider; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.List; +import com.android.email.mail.internet.MimeUtility; import android.content.ContentProvider; import android.content.ContentResolver; @@ -34,14 +28,13 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.ParcelFileDescriptor; -import android.provider.OpenableColumns; -import android.util.Config; -import android.util.Log; -import com.android.email.Account; -import com.android.email.Email; -import com.android.email.Utility; -import com.android.email.mail.internet.MimeUtility; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; /* * A simple ContentProvider that allows file access to Email's attachments. @@ -59,7 +52,7 @@ public class AttachmentProvider extends ContentProvider { public static final String SIZE = "_size"; } - public static Uri getAttachmentUri(Account account, long id) { + public static Uri getAttachmentUri(EmailStore.Account account, long id) { return CONTENT_URI.buildUpon() .appendPath(account.getUuid() + ".db") .appendPath(Long.toString(id)) @@ -67,7 +60,8 @@ public class AttachmentProvider extends ContentProvider { .build(); } - public static Uri getAttachmentThumbnailUri(Account account, long id, int width, int height) { + public static Uri getAttachmentThumbnailUri(EmailStore.Account account, long id, + int width, int height) { return CONTENT_URI.buildUpon() .appendPath(account.getUuid() + ".db") .appendPath(Long.toString(id)) diff --git a/src/com/android/email/provider/EmailStore.java b/src/com/android/email/provider/EmailStore.java index 152528df3..df30e9d59 100644 --- a/src/com/android/email/provider/EmailStore.java +++ b/src/com/android/email/provider/EmailStore.java @@ -16,6 +16,8 @@ package com.android.email.provider; +import com.android.email.R; + import android.content.ContentProviderOperation; import android.content.ContentProviderResult; import android.content.ContentUris; @@ -612,7 +614,7 @@ public class EmailStore { } createTable(db); } - + public static Account restoreAccountWithId(Context context, long id) { Uri u = ContentUris.withAppendedId(Account.CONTENT_URI, id); Cursor c = context.getContentResolver().query(u, Account.CONTENT_PROJECTION, @@ -628,6 +630,23 @@ public class EmailStore { c.close(); } } + + /** + * Refresh an account that has already been loaded. This is slightly less expensive + * that generating a brand-new account object. + */ + public void refresh(Context context) { + Cursor c = context.getContentResolver().query(this.getUri(), Account.CONTENT_PROJECTION, + null, null, null); + try { + c.moveToFirst(); + restore(c); + } finally { + if (c != null) { + c.close(); + } + } + } @Override @SuppressWarnings("unchecked") @@ -1065,6 +1084,35 @@ public class EmailStore { return values; } + /** + * TODO don't store these names in the account - just tag the folders + */ + public String getDraftsFolderName(Context context) { + return context.getString(R.string.special_mailbox_name_drafts); + } + + /** + * TODO don't store these names in the account - just tag the folders + */ + public String getSentFolderName(Context context) { + return context.getString(R.string.special_mailbox_name_sent); + } + + /** + * TODO don't store these names in the account - just tag the folders + */ + public String getTrashFolderName(Context context) { + return context.getString(R.string.special_mailbox_name_trash); + } + + /** + * TODO don't store these names in the account - just tag the folders + */ + public String getOutboxFolderName(Context context) { + return context.getString(R.string.special_mailbox_name_outbox); + } + + /** * Supports Parcelable */ diff --git a/src/com/android/email/service/MailService.java b/src/com/android/email/service/MailService.java index a2f4f3118..fc3007584 100644 --- a/src/com/android/email/service/MailService.java +++ b/src/com/android/email/service/MailService.java @@ -27,6 +27,8 @@ import com.android.email.activity.FolderMessageList; import com.android.email.mail.MessagingException; import com.android.email.mail.Store; import com.android.email.mail.store.LocalStore; +import com.android.email.provider.EmailContent; +import com.android.email.provider.EmailStore; import android.app.AlarmManager; import android.app.Notification; @@ -35,6 +37,7 @@ import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; +import android.database.Cursor; import android.net.Uri; import android.os.IBinder; import android.os.SystemClock; @@ -109,18 +112,34 @@ public class MailService extends Service { // accounts. This needs to be cleaned up for better efficiency. String specificStoreUri = intent.getStringExtra(EXTRA_CHECK_ACCOUNT); - ArrayList accountsToCheck = new ArrayList(); - for (Account account : Preferences.getPreferences(this).getAccounts()) { - int interval = account.getAutomaticCheckIntervalMinutes(); - String storeUri = account.getStoreUri(); - if (interval > 0 || (storeUri != null && storeUri.equals(specificStoreUri))) { - accountsToCheck.add(account); + ArrayList accountsToCheck = new ArrayList(); + + Cursor c = null; + try { + c = this.getContentResolver().query( + EmailStore.Account.CONTENT_URI, + EmailStore.Account.CONTENT_PROJECTION, + null, null, null); + while (c.moveToNext()) { + EmailStore.Account account = EmailContent.getContent(c, + EmailStore.Account.class); + int interval = account.getAutomaticCheckIntervalMinutes(); + String storeUri = account.getStoreUri(this); + if (interval > 0 || (storeUri != null && storeUri.equals(specificStoreUri))) { + accountsToCheck.add(account); + } + + // For each account, switch pushmail on or off + enablePushMail(account, interval == EmailStore.Account.CHECK_INTERVAL_PUSH); + } + } finally { + if (c != null) { + c.close(); } - - // For each account, switch pushmail on or off - enablePushMail(account, interval == Account.CHECK_INTERVAL_PUSH); } - Account[] accounts = accountsToCheck.toArray(new Account[accountsToCheck.size()]); + + EmailStore.Account[] accounts = accountsToCheck.toArray( + new EmailStore.Account[accountsToCheck.size()]); controller.checkMail(this, accounts, mListener); } else if (ACTION_CANCEL.equals(intent.getAction())) { @@ -162,12 +181,25 @@ public class MailService extends Service { PendingIntent pi = PendingIntent.getService(this, 0, i, 0); int shortestInterval = -1; - for (Account account : Preferences.getPreferences(this).getAccounts()) { - int interval = account.getAutomaticCheckIntervalMinutes(); - if (interval > 0 && (interval < shortestInterval || shortestInterval == -1)) { - shortestInterval = interval; + Cursor c = null; + try { + c = this.getContentResolver().query( + EmailStore.Account.CONTENT_URI, + EmailStore.Account.CONTENT_PROJECTION, + null, null, null); + while (c.moveToNext()) { + EmailStore.Account account = EmailContent.getContent(c, + EmailStore.Account.class); + int interval = account.getAutomaticCheckIntervalMinutes(); + if (interval > 0 && (interval < shortestInterval || shortestInterval == -1)) { + shortestInterval = interval; + } + enablePushMail(account, interval == Account.CHECK_INTERVAL_PUSH); + } + } finally { + if (c != null) { + c.close(); } - enablePushMail(account, interval == Account.CHECK_INTERVAL_PUSH); } if (shortestInterval == -1) { @@ -184,19 +216,20 @@ public class MailService extends Service { } class Listener extends MessagingListener { - HashMap accountsWithNewMail = new HashMap(); + HashMap accountsWithNewMail = + new HashMap(); // TODO this should be redone because account is usually null, not very interesting. // I think it would make more sense to pass Account[] here in case anyone uses it // In any case, it should be noticed that this is called once per cycle @Override - public void checkMailStarted(Context context, Account account) { + public void checkMailStarted(Context context, EmailStore.Account account) { accountsWithNewMail.clear(); } // Called once per checked account @Override - public void checkMailFailed(Context context, Account account, String reason) { + public void checkMailFailed(Context context, EmailStore.Account account, String reason) { if (Config.LOGD && Email.DEBUG) { Log.d(Email.LOG_TAG, "*** MailService: checkMailFailed: " + reason); } @@ -206,16 +239,14 @@ public class MailService extends Service { // Called once per checked account @Override - public void synchronizeMailboxFinished( - Account account, - String folder, - int totalMessagesInMailbox, - int numNewMessages) { + public void synchronizeMailboxFinished(EmailStore.Account account, String folder, + int totalMessagesInMailbox, int numNewMessages) { if (Config.LOGD && Email.DEBUG) { Log.d(Email.LOG_TAG, "*** MailService: synchronizeMailboxFinished: total=" + totalMessagesInMailbox + " new=" + numNewMessages); } - if (account.isNotifyNewMail() && numNewMessages > 0) { + if (numNewMessages > 0 && + ((account.getFlags() & EmailStore.Account.FLAGS_NOTIFY_NEW_MAIL) != 0)) { accountsWithNewMail.put(account, numNewMessages); } } @@ -224,7 +255,7 @@ public class MailService extends Service { // I think it would make more sense to pass Account[] here in case anyone uses it // In any case, it should be noticed that this is called once per cycle @Override - public void checkMailFinished(Context context, Account account) { + public void checkMailFinished(Context context, EmailStore.Account account) { if (Config.LOGD && Email.DEBUG) { Log.d(Email.LOG_TAG, "*** MailService: checkMailFinished"); } @@ -237,8 +268,10 @@ public class MailService extends Service { boolean vibrate = false; String ringtone = null; if (accountsWithNewMail.size() > 1) { - for (Account account1 : accountsWithNewMail.keySet()) { - if (account1.isVibrate()) vibrate = true; + for (EmailStore.Account account1 : accountsWithNewMail.keySet()) { + if ((account1.getFlags() & EmailStore.Account.FLAGS_VIBRATE) != 0) { + vibrate = true; + } ringtone = account1.getRingtone(); } Intent i = new Intent(context, Accounts.class); @@ -249,16 +282,17 @@ public class MailService extends Service { accountsWithNewMail.size(), accountsWithNewMail.size()), pi); } else { - Account account1 = accountsWithNewMail.keySet().iterator().next(); + EmailStore.Account account1 = accountsWithNewMail.keySet().iterator().next(); int totalNewMails = accountsWithNewMail.get(account1); - Intent i = FolderMessageList.actionHandleAccountIntent(context, account1, Email.INBOX); + Intent i = FolderMessageList.actionHandleAccountIntent(context, + account1.mId, Email.INBOX); PendingIntent pi = PendingIntent.getActivity(context, 0, i, 0); notif.setLatestEventInfo(context, getString(R.string.notification_new_title), getResources(). getQuantityString(R.plurals.notification_new_one_account_fmt, totalNewMails, totalNewMails, account1.getDescription()), pi); - vibrate = account1.isVibrate(); + vibrate = ((account1.getFlags() & EmailStore.Account.FLAGS_VIBRATE) != 0); ringtone = account1.getRingtone(); } notif.defaults = Notification.DEFAULT_LIGHTS; @@ -281,10 +315,10 @@ public class MailService extends Service { * * @param account the account that needs push delivery enabled */ - private void enablePushMail(Account account, boolean enable) { + private void enablePushMail(EmailStore.Account account, boolean enable) { try { - String localUri = account.getLocalStoreUri(); - String storeUri = account.getStoreUri(); + String localUri = account.getLocalStoreUri(this); + String storeUri = account.getStoreUri(this); if (localUri != null && storeUri != null) { LocalStore localStore = (LocalStore) Store.getInstance( localUri, this.getBaseContext(), null); diff --git a/tests/src/com/android/email/AccountUnitTests.java b/tests/src/com/android/email/AccountUnitTests.java index 2354d519f..46ca501ef 100644 --- a/tests/src/com/android/email/AccountUnitTests.java +++ b/tests/src/com/android/email/AccountUnitTests.java @@ -16,19 +16,10 @@ package com.android.email; -import com.android.email.mail.Store; - -import android.content.Context; import android.content.SharedPreferences; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; - /** * This is a series of unit tests for the Account class. * diff --git a/tests/src/com/android/email/MessagingControllerUnitTests.java b/tests/src/com/android/email/MessagingControllerUnitTests.java index 7432f0853..930d5dacd 100644 --- a/tests/src/com/android/email/MessagingControllerUnitTests.java +++ b/tests/src/com/android/email/MessagingControllerUnitTests.java @@ -18,30 +18,25 @@ package com.android.email; import com.android.email.mail.Folder; import com.android.email.mail.MockFolder; +import com.android.email.provider.EmailStore; +import android.content.ContentUris; +import android.content.Context; +import android.net.Uri; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; /** * This is a series of unit tests for the MessagingController class. * - * Technically these are functional because they use the underlying preferences framework. + * Technically these are functional because they use the underlying provider framework. */ @SmallTest public class MessagingControllerUnitTests extends AndroidTestCase { - private Preferences mPreferences; + private long mAccountId; + private EmailStore.Account mAccount; - private String mUuid; - private Account mAccount; - - @Override - protected void setUp() throws Exception { - super.setUp(); - - mPreferences = Preferences.getPreferences(getContext()); - } - /** * Delete any dummy accounts we set up for this test */ @@ -49,20 +44,26 @@ public class MessagingControllerUnitTests extends AndroidTestCase { protected void tearDown() throws Exception { super.tearDown(); - if (mAccount != null && mPreferences != null) { - mAccount.delete(mPreferences); + if (mAccount != null) { + Uri uri = ContentUris.withAppendedId( + EmailStore.Account.CONTENT_URI, mAccountId); + getContext().getContentResolver().delete(uri, null, null); } } /** * Test the code that copies server-supplied folder names into the account data + * + * TODO: custom folder naming is being re-implemented using folder types, and the notion + * of saving the names in the Account will probably go away. This test should be replaced + * by an equivalent test, once there is a new implementation to look at. */ - public void testUpdateAccountFolderNames() { + public void disabled_testUpdateAccountFolderNames() { MessagingController mc = MessagingController.getInstance(getContext()); // Create a dummy account createTestAccount(); // Refresh it to fill in all fields (many will have default values) - mAccount.refresh(mPreferences); + mAccount.refresh(getContext()); // Replace one entry, others are not included Folder[] folders1 = new Folder[] { @@ -72,7 +73,8 @@ public class MessagingControllerUnitTests extends AndroidTestCase { checkServerFolderNames("folders1", mAccount, "DRAFTS_1", "Sent", "Trash", "Outbox"); // test that the data is shared across multiple account instantiations - Account account2 = new Account(mPreferences, mUuid); + EmailStore.Account account2 = EmailStore.Account. + restoreAccountWithId(getContext(), mAccountId); checkServerFolderNames("folders1-2", account2, "DRAFTS_1", "Sent", "Trash", "Outbox"); // Replace one entry, others are included but called out as unknown @@ -86,7 +88,7 @@ public class MessagingControllerUnitTests extends AndroidTestCase { checkServerFolderNames("folders2", mAccount, "DRAFTS_1", "SENT_2", "Trash", "Outbox"); // test that the data is shared across multiple account instantiations - account2 = new Account(mPreferences, mUuid); + account2 = EmailStore.Account.restoreAccountWithId(getContext(), mAccountId); checkServerFolderNames("folders2-2", account2, "DRAFTS_1", "SENT_2", "Trash", "Outbox"); // Replace one entry, check that "other" is ignored, check that Outbox is ignored @@ -100,19 +102,20 @@ public class MessagingControllerUnitTests extends AndroidTestCase { checkServerFolderNames("folders3", mAccount, "DRAFTS_1", "SENT_2", "TRASH_3", "Outbox"); // test that the data is shared across multiple account instantiations - account2 = new Account(mPreferences, mUuid); + account2 = EmailStore.Account.restoreAccountWithId(getContext(), mAccountId); checkServerFolderNames("folders3-2", account2, "DRAFTS_1", "SENT_2", "TRASH_3", "Outbox"); } /** * Quickly check all four folder name slots in mAccount */ - private void checkServerFolderNames(String diagnostic, Account account, + private void checkServerFolderNames(String diagnostic, EmailStore.Account account, String drafts, String sent, String trash, String outbox) { - assertEquals(diagnostic, drafts, account.getDraftsFolderName()); - assertEquals(diagnostic, sent, account.getSentFolderName()); - assertEquals(diagnostic, trash, account.getTrashFolderName()); - assertEquals(diagnostic, outbox, account.getOutboxFolderName()); + Context context = getContext(); + assertEquals(diagnostic, drafts, account.getDraftsFolderName(context)); + assertEquals(diagnostic, sent, account.getSentFolderName(context)); + assertEquals(diagnostic, trash, account.getTrashFolderName(context)); + assertEquals(diagnostic, outbox, account.getOutboxFolderName(context)); } /** @@ -141,10 +144,10 @@ public class MessagingControllerUnitTests extends AndroidTestCase { * Create a dummy account with minimal fields */ private void createTestAccount() { - mAccount = new Account(getContext()); - mAccount.save(mPreferences); + mAccount = new EmailStore.Account(); + mAccount.saveOrUpdate(getContext()); - mUuid = mAccount.getUuid(); + mAccountId = mAccount.mId; } } diff --git a/tests/src/com/android/email/activity/FolderMessageListUnitTests.java b/tests/src/com/android/email/activity/FolderMessageListUnitTests.java index e23333a57..b910466d1 100644 --- a/tests/src/com/android/email/activity/FolderMessageListUnitTests.java +++ b/tests/src/com/android/email/activity/FolderMessageListUnitTests.java @@ -16,9 +16,9 @@ package com.android.email.activity; -import com.android.email.Account; -import com.android.email.Preferences; +import com.android.email.provider.EmailStore; +import android.content.ContentUris; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; @@ -27,25 +27,16 @@ import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; /** - * This is a series of unit tests for the Preferences class. + * This is a series of unit tests for the FolderMessageList class. * * This is just unit tests of simple statics - the activity is not instantiated */ @SmallTest public class FolderMessageListUnitTests extends AndroidTestCase { - private Preferences mPreferences; + private long mAccountId; + private EmailStore.Account mAccount; - private String mUuid; - private Account mAccount; - - @Override - protected void setUp() throws Exception { - super.setUp(); - - mPreferences = Preferences.getPreferences(getContext()); - } - /** * Delete any dummy accounts we set up for this test */ @@ -53,8 +44,10 @@ public class FolderMessageListUnitTests extends AndroidTestCase { protected void tearDown() throws Exception { super.tearDown(); - if (mAccount != null && mPreferences != null) { - mAccount.delete(mPreferences); + if (mAccount != null) { + Uri uri = ContentUris.withAppendedId( + EmailStore.Account.CONTENT_URI, mAccountId); + getContext().getContentResolver().delete(uri, null, null); } } @@ -70,13 +63,13 @@ public class FolderMessageListUnitTests extends AndroidTestCase { MyContext mockContext = new MyContext(getContext()); // First, try with no initial folder - FolderMessageList.actionHandleAccount(mockContext, mAccount); + FolderMessageList.actionHandleAccount(mockContext, mAccountId); Intent i = mockContext.startActivityIntent; assertNotNull(i); checkIntent(i, null, mAccount, null); // Next try with initial folder specified - FolderMessageList.actionHandleAccount(mockContext, mAccount, "test-folder-name"); + FolderMessageList.actionHandleAccount(mockContext, mAccountId, "test-folder-name"); i = mockContext.startActivityIntent; assertNotNull(i); checkIntent(i, null, mAccount, "test-folder-name"); @@ -91,12 +84,12 @@ public class FolderMessageListUnitTests extends AndroidTestCase { // First try with no initial folder Intent result = FolderMessageList.actionHandleAccountIntent( - getContext(), mAccount, null); + getContext(), mAccountId, null); checkIntent(result, null, mAccount, null); // now try with a specified initial folder result = FolderMessageList.actionHandleAccountIntent( - getContext(), mAccount, "test-folder-name"); + getContext(), mAccountId, "test-folder-name"); checkIntent(result, null, mAccount, "test-folder-name"); } @@ -106,29 +99,31 @@ public class FolderMessageListUnitTests extends AndroidTestCase { public void testActionHandleAccountUriIntent() { // Create a dummy account createTestAccount(); + Uri uri = ContentUris.withAppendedId(EmailStore.Account.CONTENT_URI, mAccountId); // First try with no initial folder Intent result = FolderMessageList.actionHandleAccountUriIntent( - getContext(), mAccount, null); - checkIntent(result, mAccount.getContentUri(), null, null); + getContext(), mAccountId, null); + checkIntent(result, uri, null, null); // now try with a specified initial folder result = FolderMessageList.actionHandleAccountUriIntent( - getContext(), mAccount, "test-folder-name"); - checkIntent(result, mAccount.getContentUri(), null, "test-folder-name"); + getContext(), mAccountId, "test-folder-name"); + checkIntent(result, uri, null, "test-folder-name"); } /** * Check the values in a generated intent */ private void checkIntent(Intent i, - Uri expectData, Account expectAccount, String expectFolder) { + Uri expectData, EmailStore.Account expectAccount, String expectFolder) { Uri resultUri = i.getData(); assertEquals(expectData, resultUri); - Account resultAccount = (Account) i.getSerializableExtra("account"); - assertEquals(expectAccount, resultAccount); + long resultAccountId = i.getLongExtra("account", -1); + long expectAccountId = (expectAccount != null) ? expectAccount.mId : -1; + assertEquals(expectAccountId, resultAccountId); String resultFolder = i.getStringExtra("initialFolder"); assertEquals(expectFolder, resultFolder); @@ -138,10 +133,10 @@ public class FolderMessageListUnitTests extends AndroidTestCase { * Create a dummy account with minimal fields */ private void createTestAccount() { - mAccount = new Account(getContext()); - mAccount.save(mPreferences); + mAccount = new EmailStore.Account(); + mAccount.saveOrUpdate(getContext()); - mUuid = mAccount.getUuid(); + mAccountId = mAccount.mId; } /** diff --git a/tests/src/com/android/email/activity/MessageComposeInstrumentationTests.java b/tests/src/com/android/email/activity/MessageComposeInstrumentationTests.java index 33dec4f2b..80f00be79 100644 --- a/tests/src/com/android/email/activity/MessageComposeInstrumentationTests.java +++ b/tests/src/com/android/email/activity/MessageComposeInstrumentationTests.java @@ -16,9 +16,7 @@ package com.android.email.activity; -import com.android.email.Account; import com.android.email.Email; -import com.android.email.Preferences; import com.android.email.R; import com.android.email.mail.Address; import com.android.email.mail.Message; @@ -26,6 +24,7 @@ import com.android.email.mail.MessagingException; import com.android.email.mail.Message.RecipientType; import com.android.email.mail.internet.MimeMessage; import com.android.email.mail.internet.TextBody; +import com.android.email.provider.EmailStore; import android.content.Context; import android.content.Intent; @@ -101,13 +100,10 @@ public class MessageComposeInstrumentationTests protected void setUp() throws Exception { super.setUp(); Context context = getInstrumentation().getTargetContext(); - Account[] accounts = Preferences.getPreferences(context).getAccounts(); - if (accounts.length > 0) - { - // This depends on getDefaultAccount() to auto-assign the default account, if necessary - Preferences.getPreferences(context).getDefaultAccount(); - Email.setServicesEnabled(context); - } + + EmailStore.Account.getDefaultAccount(context); + Email.setServicesEnabled(context); + Intent intent = new Intent(Intent.ACTION_VIEW); setActivityIntent(intent); final MessageCompose a = getActivity(); diff --git a/tests/src/com/android/email/activity/MessageViewTests.java b/tests/src/com/android/email/activity/MessageViewTests.java index 65b6e5d7f..5795d0ec3 100644 --- a/tests/src/com/android/email/activity/MessageViewTests.java +++ b/tests/src/com/android/email/activity/MessageViewTests.java @@ -16,12 +16,11 @@ package com.android.email.activity; -import com.android.email.Account; import com.android.email.Email; import com.android.email.MessagingController; -import com.android.email.Preferences; import com.android.email.R; import com.android.email.mail.internet.BinaryTempFileBody; +import com.android.email.provider.EmailStore; import android.app.Application; import android.content.Context; @@ -51,7 +50,7 @@ public class MessageViewTests extends ActivityInstrumentationTestCase2 { // copied from MessageView (could be package class) - private static final String EXTRA_ACCOUNT = "com.android.email.MessageView_account"; + private static final String EXTRA_ACCOUNT_ID = "com.android.email.MessageView_account_id"; private static final String EXTRA_FOLDER = "com.android.email.MessageView_folder"; private static final String EXTRA_MESSAGE = "com.android.email.MessageView_message"; private static final String EXTRA_FOLDER_UIDS = "com.android.email.MessageView_folderUids"; @@ -60,7 +59,8 @@ public class MessageViewTests private static final String FOLDER_NAME = "folder"; private static final String MESSAGE_UID = "message_uid"; - private Account mAccount; + private EmailStore.Account mAccount; + private long mAccountId; private TextView mToView; private TextView mSubjectView; private WebView mMessageContentView; @@ -75,20 +75,17 @@ public class MessageViewTests super.setUp(); mContext = getInstrumentation().getTargetContext(); - Account[] accounts = Preferences.getPreferences(mContext).getAccounts(); - if (accounts.length > 0) - { - // This depends on getDefaultAccount() to auto-assign the default account, if necessary - mAccount = Preferences.getPreferences(mContext).getDefaultAccount(); - Email.setServicesEnabled(mContext); - } - + // force assignment of a default account + mAccount = EmailStore.Account.getDefaultAccount(mContext); + mAccountId = mAccount.mId; + Email.setServicesEnabled(mContext); + // setup an intent to spin up this activity with something useful ArrayList FOLDER_UIDS = new ArrayList( Arrays.asList(new String[]{ "why", "is", "java", "so", "ugly?" })); // Log.d("MessageViewTest", "--- folder:" + FOLDER_UIDS); Intent i = new Intent() - .putExtra(EXTRA_ACCOUNT, mAccount) + .putExtra(EXTRA_ACCOUNT_ID, mAccountId) .putExtra(EXTRA_FOLDER, FOLDER_NAME) .putExtra(EXTRA_MESSAGE, MESSAGE_UID) .putStringArrayListExtra(EXTRA_FOLDER_UIDS, FOLDER_UIDS); diff --git a/tests/src/com/android/email/activity/setup/AccountSettingsTests.java b/tests/src/com/android/email/activity/setup/AccountSettingsTests.java index 3a2d67741..2752f8757 100644 --- a/tests/src/com/android/email/activity/setup/AccountSettingsTests.java +++ b/tests/src/com/android/email/activity/setup/AccountSettingsTests.java @@ -16,10 +16,13 @@ package com.android.email.activity.setup; -import com.android.email.Account; import com.android.email.mail.Store; +import com.android.email.provider.EmailStore; +import android.content.ContentUris; +import android.content.Context; import android.content.Intent; +import android.net.Uri; import android.preference.ListPreference; import android.test.ActivityInstrumentationTestCase2; import android.test.suitebuilder.annotation.MediumTest; @@ -29,7 +32,14 @@ import android.test.suitebuilder.annotation.MediumTest; */ @MediumTest public class AccountSettingsTests extends ActivityInstrumentationTestCase2 { + + // Borrowed from AccountSettings + private static final String EXTRA_ACCOUNT_ID = "account_id"; + + private long mAccountId; + private EmailStore.Account mAccount; + private Context mContext; private AccountSettings mActivity; private ListPreference mCheckFrequency; @@ -39,6 +49,30 @@ public class AccountSettingsTests extends ActivityInstrumentationTestCase2 0) - { - // This depends on getDefaultAccount() to auto-assign the default account, if necessary - mAccount = Preferences.getPreferences(mContext).getAccounts()[0]; - } + // Force assignment of a default account, and retrieve it + mAccount = EmailStore.Account.getDefaultAccount(getContext()); // This is needed for mime image bodypart. BinaryTempFileBody.setTempDirectory(getContext().getCacheDir()); @@ -59,8 +54,8 @@ public class EmailHtmlUtilTest extends AndroidTestCase { */ public void testResolveInlineImage() throws MessagingException, IOException { - final LocalStore store = (LocalStore) LocalStore.newInstance(mAccount.getLocalStoreUri(), - mContext, null); + final LocalStore store = (LocalStore) LocalStore.newInstance( + mAccount.getLocalStoreUri(getContext()), mContext, null); // Single cid case. final String cid1 = "cid.1@android.com"; final long aid1 = 10;