From fa52e6c95674aef6461a5cfc670a052e1c5b7f2f Mon Sep 17 00:00:00 2001 From: Andrew Stadler Date: Mon, 21 Sep 2009 12:57:04 -0700 Subject: [PATCH] Clean out old mailbox names logic and fix a couple of bugs. * Get rid of old Account.getxxxFolderName() calls. * Clean up any call sites to them * Properly rename the existing special folder name identifiers * Use a hash table in MessagingController to improve identification of special folders for IMAP accounts * Fix a bug in Controller, which was creating new server-side folders using localized names. * Fix a bunch of code in Controller that was using mContext, instead of using mProviderContext to support testability. * Fix broken unit tests in ControllerProviderOpsTests Fixes bug 1904373 --- res/values/arrays.xml | 24 ++--- res/values/strings.xml | 60 ++++++++---- src/com/android/email/Controller.java | 67 +++++++------ src/com/android/email/Email.java | 6 -- .../android/email/MessagingController.java | 93 ++++++------------- src/com/android/email/Utility.java | 5 +- .../email/activity/FolderMessageList.java | 42 ++++----- .../android/email/provider/EmailContent.java | 29 ------ .../email/ControllerProviderOpsTests.java | 42 +++++++-- .../email/MessagingControllerUnitTests.java | 69 -------------- .../com/android/email/UtilityUnitTests.java | 13 +-- 11 files changed, 183 insertions(+), 267 deletions(-) diff --git a/res/values/arrays.xml b/res/values/arrays.xml index d16cc568c..a10d720be 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -81,30 +81,30 @@ 5 - - + + - @string/special_mailbox_display_name_inbox + @string/mailbox_name_display_inbox - @string/special_mailbox_display_name_drafts + @string/mailbox_name_display_drafts - @string/special_mailbox_display_name_outbox + @string/mailbox_name_display_outbox - @string/special_mailbox_display_name_sent + @string/mailbox_name_display_sent - @string/special_mailbox_display_name_trash + @string/mailbox_name_display_trash - @string/special_mailbox_display_name_junk + @string/mailbox_name_display_junk - - + + @drawable/ic_list_inbox diff --git a/res/values/strings.xml b/res/values/strings.xml index 5f29ee3a6..44181a8b6 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -16,6 +16,24 @@ + + + + + + + + + + + + + + + + + Read Email attachments @@ -144,29 +162,33 @@ in %d accounts - - - Inbox + + + Inbox - Outbox + Outbox - Drafts + Drafts - Trash + Trash - Sent - - Inbox - - Outbox - - Drafts - - Trash - - Sent - - Junk + Sent + + Junk + + + + Inbox + + Outbox + + Drafts + + Trash + + Sent + + Junk Version: %s diff --git a/src/com/android/email/Controller.java b/src/com/android/email/Controller.java index 19c022f07..01ac9d1f2 100644 --- a/src/com/android/email/Controller.java +++ b/src/com/android/email/Controller.java @@ -262,7 +262,7 @@ public class Controller { Uri uri = ContentUris.withAppendedId(Message.CONTENT_URI, messageId); ContentValues cv = new ContentValues(); cv.put(MessageColumns.FLAG_LOADED, Message.FLAG_LOADED_COMPLETE); - mContext.getContentResolver().update(uri, cv, null, null); + mProviderContext.getContentResolver().update(uri, cv, null, null); Log.d(Email.LOG_TAG, "Unexpected loadMessageForView() for service-based message."); synchronized (mListeners) { for (Result listener : mListeners) { @@ -292,7 +292,7 @@ public class Controller { long accountId = message.mAccountKey; long mailboxId = findOrCreateMailboxOfType(accountId, mailboxType); message.mMailboxKey = mailboxId; - message.save(mContext); + message.save(mProviderContext); } /** @@ -312,27 +312,31 @@ public class Controller { } /** + * Returns the server-side name for a specific mailbox. + * * @param mailboxType the mailbox type * @return the resource string corresponding to the mailbox type, empty if not found. */ - /* package */ String getSpecialMailboxDisplayName(int mailboxType) { + /* package */ String getMailboxServerName(int mailboxType) { int resId = -1; switch (mailboxType) { case Mailbox.TYPE_INBOX: - // TODO: there is no special_mailbox_display_name_inbox; why? - resId = R.string.special_mailbox_name_inbox; + resId = R.string.mailbox_name_server_inbox; break; case Mailbox.TYPE_OUTBOX: - resId = R.string.special_mailbox_display_name_outbox; + resId = R.string.mailbox_name_server_outbox; break; case Mailbox.TYPE_DRAFTS: - resId = R.string.special_mailbox_display_name_drafts; + resId = R.string.mailbox_name_server_drafts; break; case Mailbox.TYPE_TRASH: - resId = R.string.special_mailbox_display_name_trash; + resId = R.string.mailbox_name_server_trash; break; case Mailbox.TYPE_SENT: - resId = R.string.special_mailbox_display_name_sent; + resId = R.string.mailbox_name_server_sent; + break; + case Mailbox.TYPE_JUNK: + resId = R.string.mailbox_name_server_junk; break; } return resId != -1 ? mContext.getString(resId) : ""; @@ -341,8 +345,6 @@ public class Controller { /** * Create a mailbox given the account and mailboxType. * TODO: Does this need to be signaled explicitly to the sync engines? - * As this method is only used internally ('private'), it does not - * validate its inputs (accountId and mailboxType). */ /* package */ long createMailbox(long accountId, int mailboxType) { if (accountId < 0 || mailboxType < 0) { @@ -355,7 +357,7 @@ public class Controller { box.mType = mailboxType; box.mSyncInterval = EmailContent.Account.CHECK_INTERVAL_NEVER; box.mFlagVisible = true; - box.mDisplayName = getSpecialMailboxDisplayName(mailboxType); + box.mDisplayName = getMailboxServerName(mailboxType); box.save(mProviderContext); return box.mId; } @@ -391,7 +393,7 @@ public class Controller { // for IMAP & POP only, (attempt to) send the message now final EmailContent.Account account = - EmailContent.Account.restoreAccountWithId(mContext, accountId); + EmailContent.Account.restoreAccountWithId(mProviderContext, accountId); if (this.isMessagingController(account)) { final long sentboxId = findOrCreateMailboxOfType(accountId, Mailbox.TYPE_SENT); new Thread() { @@ -431,7 +433,7 @@ public class Controller { } else { // MessagingController implementation final EmailContent.Account account = - EmailContent.Account.restoreAccountWithId(mContext, accountId); + EmailContent.Account.restoreAccountWithId(mProviderContext, accountId); final long sentboxId = findOrCreateMailboxOfType(accountId, Mailbox.TYPE_SENT); new Thread() { @Override @@ -452,7 +454,7 @@ public class Controller { new Thread() { @Override public void run() { - ContentResolver resolver = mContext.getContentResolver(); + ContentResolver resolver = mProviderContext.getContentResolver(); Cursor c = null; try { c = resolver.query( @@ -461,10 +463,10 @@ public class Controller { null, null, null); while (c.moveToNext()) { long accountId = c.getLong(Account.ID_PROJECTION_COLUMN); - Account account = Account.restoreAccountWithId(mContext, accountId); + Account account = Account.restoreAccountWithId(mProviderContext, accountId); if (account != null) { Store.StoreInfo info = Store.StoreInfo.getStoreInfo( - account.getStoreUri(mContext), mContext); + account.getStoreUri(mProviderContext), mContext); if (info != null && info.mVisibleLimitDefault > 0) { int limit = info.mVisibleLimitDefault; ContentValues cv = new ContentValues(); @@ -493,23 +495,24 @@ public class Controller { new Thread() { @Override public void run() { - Mailbox mailbox = Mailbox.restoreMailboxWithId(mContext, mailboxId); + Mailbox mailbox = Mailbox.restoreMailboxWithId(mProviderContext, mailboxId); if (mailbox == null) { return; } - Account account = Account.restoreAccountWithId(mContext, mailbox.mAccountKey); + Account account = Account.restoreAccountWithId(mProviderContext, + mailbox.mAccountKey); if (account == null) { return; } Store.StoreInfo info = Store.StoreInfo.getStoreInfo( - account.getStoreUri(mContext), mContext); + account.getStoreUri(mProviderContext), mContext); if (info != null && info.mVisibleLimitIncrement > 0) { // Use provider math to increment the field ContentValues cv = new ContentValues();; cv.put(EmailContent.FIELD_COLUMN_NAME, MailboxColumns.VISIBLE_LIMIT); cv.put(EmailContent.ADD_COLUMN_NAME, info.mVisibleLimitIncrement); Uri uri = ContentUris.withAppendedId(Mailbox.ADD_TO_FIELD_URI, mailboxId); - mContext.getContentResolver().update(uri, cv, null, null); + mProviderContext.getContentResolver().update(uri, cv, null, null); // Trigger a refresh using the new, longer limit mailbox.mVisibleLimit += info.mVisibleLimitIncrement; mLegacyController.synchronizeMailbox(account, mailbox, mLegacyListener); @@ -577,7 +580,7 @@ public class Controller { } // 4. Drop non-essential data for the message (e.g. attachment files) - AttachmentProvider.deleteAllAttachmentFiles(mContext, accountId, messageId); + AttachmentProvider.deleteAllAttachmentFiles(mProviderContext, accountId, messageId); Uri uri = ContentUris.withAppendedId(EmailContent.Message.SYNCED_CONTENT_URI, messageId); @@ -593,7 +596,7 @@ public class Controller { } // 6. Service runs automatically, MessagingController needs a kick - Account account = Account.restoreAccountWithId(mContext, accountId); + Account account = Account.restoreAccountWithId(mProviderContext, accountId); if (isMessagingController(account)) { final long syncAccountId = accountId; new Thread() { @@ -621,8 +624,8 @@ public class Controller { mProviderContext.getContentResolver().update(uri, cv, null, null); // Service runs automatically, MessagingController needs a kick - final Message message = Message.restoreMessageWithId(mContext, messageId); - Account account = Account.restoreAccountWithId(mContext, message.mAccountKey); + final Message message = Message.restoreMessageWithId(mProviderContext, messageId); + Account account = Account.restoreAccountWithId(mProviderContext, message.mAccountKey); if (isMessagingController(account)) { new Thread() { @Override @@ -649,8 +652,8 @@ public class Controller { mProviderContext.getContentResolver().update(uri, cv, null, null); // Service runs automatically, MessagingController needs a kick - final Message message = Message.restoreMessageWithId(mContext, messageId); - Account account = Account.restoreAccountWithId(mContext, message.mAccountKey); + final Message message = Message.restoreMessageWithId(mProviderContext, messageId); + Account account = Account.restoreAccountWithId(mProviderContext, message.mAccountKey); if (isMessagingController(account)) { new Thread() { @Override @@ -674,7 +677,7 @@ public class Controller { public void loadAttachment(final long attachmentId, final long messageId, final long mailboxId, final long accountId, final Result callback) { - File saveToFile = AttachmentProvider.getAttachmentFilename(mContext, + File saveToFile = AttachmentProvider.getAttachmentFilename(mProviderContext, accountId, attachmentId); if (saveToFile.exists()) { // The attachment has already been downloaded, so we will just "pretend" to download it @@ -753,7 +756,11 @@ public class Controller { */ public boolean isMessagingController(EmailContent.Account account) { Store.StoreInfo info = - Store.StoreInfo.getStoreInfo(account.getStoreUri(mContext), mContext); + Store.StoreInfo.getStoreInfo(account.getStoreUri(mProviderContext), mContext); + // This null happens in testing. + if (info == null) { + return false; + } String scheme = info.mScheme; return ("pop3".equals(scheme) || "imap".equals(scheme)); @@ -1088,7 +1095,7 @@ public class Controller { // TODO where do we get "number of new messages" as well? // TODO should pass this back instead of looking it up here // TODO smaller projection - Mailbox mbx = Mailbox.restoreMailboxWithId(mContext, mailboxId); + Mailbox mbx = Mailbox.restoreMailboxWithId(mProviderContext, mailboxId); // The mailbox could have disappeared if the server commanded it if (mbx == null) return; long accountId = mbx.mAccountKey; diff --git a/src/com/android/email/Email.java b/src/com/android/email/Email.java index 2b0b54dd9..86355e9ee 100644 --- a/src/com/android/email/Email.java +++ b/src/com/android/email/Email.java @@ -106,12 +106,6 @@ public class Email extends Application { public static final String[] UNACCEPTABLE_ATTACHMENT_DOWNLOAD_TYPES = new String[] { }; - /** - * The special name "INBOX" is used throughout the application to mean "Whatever folder - * the server refers to as the user's Inbox. Placed here to ease use. - */ - public static final String INBOX = "INBOX"; - /** * Specifies how many messages will be shown in a folder by default. This number is set * on each new folder and can be incremented with "Load more messages..." by the diff --git a/src/com/android/email/MessagingController.java b/src/com/android/email/MessagingController.java index a74597315..e14681f6a 100644 --- a/src/com/android/email/MessagingController.java +++ b/src/com/android/email/MessagingController.java @@ -114,6 +114,7 @@ public class MessagingController implements Runnable { private static MessagingController inst = null; private BlockingQueue mCommands = new LinkedBlockingQueue(); private Thread mThread; + private final HashMap mServerMailboxNames = new HashMap(); /** * All access to mListeners *must* be synchronized @@ -124,6 +125,27 @@ public class MessagingController implements Runnable { protected MessagingController(Context _context) { mContext = _context; + + // Create lookup table for server-side mailbox names + mServerMailboxNames.put( + mContext.getString(R.string.mailbox_name_server_inbox).toLowerCase(), + Mailbox.TYPE_INBOX); + mServerMailboxNames.put( + mContext.getString(R.string.mailbox_name_server_outbox).toLowerCase(), + Mailbox.TYPE_OUTBOX); + mServerMailboxNames.put( + mContext.getString(R.string.mailbox_name_server_drafts).toLowerCase(), + Mailbox.TYPE_DRAFTS); + mServerMailboxNames.put( + mContext.getString(R.string.mailbox_name_server_trash).toLowerCase(), + Mailbox.TYPE_TRASH); + mServerMailboxNames.put( + mContext.getString(R.string.mailbox_name_server_sent).toLowerCase(), + Mailbox.TYPE_SENT); + mServerMailboxNames.put( + mContext.getString(R.string.mailbox_name_server_junk).toLowerCase(), + Mailbox.TYPE_JUNK); + mThread = new Thread(this); mThread.start(); } @@ -253,7 +275,6 @@ public class MessagingController implements Runnable { Store store = Store.getInstance(account.getStoreUri(mContext), mContext, null); Folder[] remoteFolders = store.getPersonalNamespaces(); - updateAccountFolderNames(account, remoteFolders); HashSet remoteFolderNames = new HashSet(); for (int i = 0, count = remoteFolders.length; i < count; i++) { @@ -333,71 +354,14 @@ public class MessagingController implements Runnable { if (mailboxName == null || mailboxName.length() == 0) { return EmailContent.Mailbox.TYPE_MAIL; } - if (mailboxName.equals(Email.INBOX)) { - return EmailContent.Mailbox.TYPE_INBOX; + String lowerCaseName = mailboxName.toLowerCase(); + Integer type = mServerMailboxNames.get(lowerCaseName); + if (type != null) { + return type; } - if (mailboxName.equals(account.getTrashFolderName(mContext))) { - return EmailContent.Mailbox.TYPE_TRASH; - } - if (mailboxName.equals(account.getOutboxFolderName(mContext))) { - return EmailContent.Mailbox.TYPE_OUTBOX; - } - if (mailboxName.equals(account.getDraftsFolderName(mContext))) { - return EmailContent.Mailbox.TYPE_DRAFTS; - } - if (mailboxName.equals(account.getSentFolderName(mContext))) { - return EmailContent.Mailbox.TYPE_SENT; - } - return EmailContent.Mailbox.TYPE_MAIL; } - /** - * Asks the store for a list of server-specific folder names and, if provided, updates - * the account record for future getFolder() operations. - * - * 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(EmailContent.Account account, - Folder[] remoteFolders) { - String trash = null; - String sent = null; - String drafts = null; - - for (Folder folder : remoteFolders) { - Folder.FolderRole role = folder.getRole(); - if (role == Folder.FolderRole.TRASH) { - trash = folder.getName(); - } else if (role == Folder.FolderRole.SENT) { - sent = folder.getName(); - } else if (role == Folder.FolderRole.DRAFTS) { - drafts = folder.getName(); - } - } -/* - // Do not update when null (defaults are already in place) - boolean commit = false; - if (trash != null && !trash.equals(account.getTrashFolderName(mContext))) { - account.setTrashFolderName(trash); - commit = true; - } - if (sent != null && !sent.equals(account.getSentFolderName(mContext))) { - account.setSentFolderName(sent); - commit = true; - } - if (drafts != null && !drafts.equals(account.getDraftsFolderName(mContext))) { - account.setDraftsFolderName(drafts); - commit = true; - } - if (commit) { - account.saveOrUpdate(mContext); - } -*/ - } - /** * Start background synchronization of the specified folder. * @param account @@ -566,9 +530,8 @@ 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(mContext)) || - folder.equals(account.getSentFolderName(mContext)) || - folder.equals(account.getDraftsFolderName(mContext))) { + if (folder.mType == Mailbox.TYPE_TRASH || folder.mType == Mailbox.TYPE_SENT + || folder.mType == Mailbox.TYPE_DRAFTS) { if (!remoteFolder.exists()) { if (!remoteFolder.create(FolderType.HOLDS_MESSAGES)) { return new StoreSynchronizer.SyncResults(0, 0); diff --git a/src/com/android/email/Utility.java b/src/com/android/email/Utility.java index ca3f61974..921c4f1a4 100644 --- a/src/com/android/email/Utility.java +++ b/src/com/android/email/Utility.java @@ -293,8 +293,7 @@ public class Utility { private Drawable mDefaultMailboxDrawable; private FolderProperties(Context context) { - mSpecialMailbox = context.getResources().getStringArray( - R.array.special_mailbox_display_names); + mSpecialMailbox = context.getResources().getStringArray(R.array.mailbox_display_names); for (int i = 0; i < mSpecialMailbox.length; ++i) { if ("".equals(mSpecialMailbox[i])) { // there is no localized name, so use the display name from the server @@ -302,7 +301,7 @@ public class Utility { } } mSpecialMailboxDrawable = - context.getResources().obtainTypedArray(R.array.special_mailbox_icons); + context.getResources().obtainTypedArray(R.array.mailbox_display_icons); mDefaultMailboxDrawable = context.getResources().getDrawable(R.drawable.ic_list_folder); } diff --git a/src/com/android/email/activity/FolderMessageList.java b/src/com/android/email/activity/FolderMessageList.java index 24cc68c7c..499ef968e 100644 --- a/src/com/android/email/activity/FolderMessageList.java +++ b/src/com/android/email/activity/FolderMessageList.java @@ -1562,25 +1562,25 @@ public class FolderMessageList extends ExpandableListActivity { private void setSpecialFolderInfo(FolderInfoHolder holder) { String folderName = holder.name; holder.special = true; - if (folderName.equalsIgnoreCase(Email.INBOX)) { - holder.inbox = true; - holder.displayName = getString(R.string.special_mailbox_name_inbox); - } 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(FolderMessageList.this))) { - holder.outbox = true; - holder.displayName = getString(R.string.special_mailbox_display_name_outbox); - } 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(FolderMessageList.this))) { - holder.trash = true; - holder.displayName = getString(R.string.special_mailbox_display_name_trash); - } else { - holder.special = false; - holder.displayName = folderName; - } +// if (folderName.equalsIgnoreCase(Email.INBOX)) { +// holder.inbox = true; +// holder.displayName = getString(R.string.special_mailbox_name_inbox); +// } 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(FolderMessageList.this))) { +// holder.outbox = true; +// holder.displayName = getString(R.string.special_mailbox_display_name_outbox); +// } 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(FolderMessageList.this))) { +// holder.trash = true; +// holder.displayName = getString(R.string.special_mailbox_display_name_trash); +// } else { +// holder.special = false; +// holder.displayName = folderName; +// } } /** @@ -1890,9 +1890,9 @@ public class FolderMessageList extends ExpandableListActivity { public int compareTo(FolderInfoHolder o) { String s1 = this.name; String s2 = o.name; - if (Email.INBOX.equalsIgnoreCase(s1)) { + if ("Inbox".equalsIgnoreCase(s1)) { return -1; - } else if (Email.INBOX.equalsIgnoreCase(s2)) { + } else if ("Inbox".equalsIgnoreCase(s2)) { return 1; } else return s1.toUpperCase().compareTo(s2.toUpperCase()); diff --git a/src/com/android/email/provider/EmailContent.java b/src/com/android/email/provider/EmailContent.java index a0a4c9925..182a6553e 100644 --- a/src/com/android/email/provider/EmailContent.java +++ b/src/com/android/email/provider/EmailContent.java @@ -1312,35 +1312,6 @@ public abstract class EmailContent { 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/tests/src/com/android/email/ControllerProviderOpsTests.java b/tests/src/com/android/email/ControllerProviderOpsTests.java index 132a6dc71..f06ef8b6b 100644 --- a/tests/src/com/android/email/ControllerProviderOpsTests.java +++ b/tests/src/com/android/email/ControllerProviderOpsTests.java @@ -20,12 +20,15 @@ import com.android.email.provider.EmailContent; import com.android.email.provider.EmailProvider; import com.android.email.provider.ProviderTestUtils; import com.android.email.provider.EmailContent.Account; +import com.android.email.provider.EmailContent.HostAuth; import com.android.email.provider.EmailContent.Mailbox; import com.android.email.provider.EmailContent.Message; import android.content.Context; import android.test.ProviderTestCase2; +import java.util.Locale; + /** * Tests of the Controller class that depend on the underlying provider. * @@ -69,10 +72,29 @@ public class ControllerProviderOpsTests extends ProviderTestCase2 } } - public void testGetSpecialMailboxName() { + /** + * These are strings that should not change per locale. + */ + public void testGetMailboxServerName() { Controller ct = new TestController(mProviderContext, mContext); - assertEquals("Outbox", ct.getSpecialMailboxDisplayName(Mailbox.TYPE_OUTBOX)); - assertEquals("", ct.getSpecialMailboxDisplayName(-1)); + + assertEquals("", ct.getMailboxServerName(-1)); + + assertEquals("Inbox", ct.getMailboxServerName(Mailbox.TYPE_INBOX)); + assertEquals("Outbox", ct.getMailboxServerName(Mailbox.TYPE_OUTBOX)); + assertEquals("Trash", ct.getMailboxServerName(Mailbox.TYPE_TRASH)); + assertEquals("Sent", ct.getMailboxServerName(Mailbox.TYPE_SENT)); + assertEquals("Junk", ct.getMailboxServerName(Mailbox.TYPE_JUNK)); + + // Now try again with translation + Locale savedLocale = Locale.getDefault(); + Locale.setDefault(Locale.FRANCE); + assertEquals("Inbox", ct.getMailboxServerName(Mailbox.TYPE_INBOX)); + assertEquals("Outbox", ct.getMailboxServerName(Mailbox.TYPE_OUTBOX)); + assertEquals("Trash", ct.getMailboxServerName(Mailbox.TYPE_TRASH)); + assertEquals("Sent", ct.getMailboxServerName(Mailbox.TYPE_SENT)); + assertEquals("Junk", ct.getMailboxServerName(Mailbox.TYPE_JUNK)); + Locale.setDefault(savedLocale); } /** @@ -207,8 +229,11 @@ public class ControllerProviderOpsTests extends ProviderTestCase2 * Test read/unread flag */ public void testReadUnread() { - // No account or mailbox needed for this test - long account1Id = 1; + Account account1 = ProviderTestUtils.setupAccount("read-unread", false, mProviderContext); + account1.mHostAuthRecv + = ProviderTestUtils.setupHostAuth("read-unread", 0, false, mProviderContext); + account1.save(mProviderContext); + long account1Id = account1.mId; long box1Id = 2; Message message1 = @@ -233,8 +258,11 @@ public class ControllerProviderOpsTests extends ProviderTestCase2 * Test favorites flag */ public void testFavorites() { - // No account or mailbox needed for this test - long account1Id = 1; + Account account1 = ProviderTestUtils.setupAccount("favorites", false, mProviderContext); + account1.mHostAuthRecv + = ProviderTestUtils.setupHostAuth("favorites", 0, false, mProviderContext); + account1.save(mProviderContext); + long account1Id = account1.mId; long box1Id = 2; Message message1 = diff --git a/tests/src/com/android/email/MessagingControllerUnitTests.java b/tests/src/com/android/email/MessagingControllerUnitTests.java index 75470e3a3..43852f2e6 100644 --- a/tests/src/com/android/email/MessagingControllerUnitTests.java +++ b/tests/src/com/android/email/MessagingControllerUnitTests.java @@ -16,12 +16,10 @@ package com.android.email; -import com.android.email.mail.Folder; import com.android.email.mail.MockFolder; import com.android.email.provider.EmailContent; import android.content.ContentUris; -import android.content.Context; import android.net.Uri; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; @@ -51,73 +49,6 @@ public class MessagingControllerUnitTests extends AndroidTestCase { } } - /** - * 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 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(getContext()); - - // Replace one entry, others are not included - Folder[] folders1 = new Folder[] { - new MyMockFolder(Folder.FolderRole.DRAFTS, "DRAFTS_1"), - }; - mc.updateAccountFolderNames(mAccount, folders1); - checkServerFolderNames("folders1", mAccount, "DRAFTS_1", "Sent", "Trash", "Outbox"); - - // test that the data is shared across multiple account instantiations - EmailContent.Account account2 = EmailContent.Account. - restoreAccountWithId(getContext(), mAccountId); - checkServerFolderNames("folders1-2", account2, "DRAFTS_1", "Sent", "Trash", "Outbox"); - - // Replace one entry, others are included but called out as unknown - Folder[] folders2 = new Folder[] { - new MyMockFolder(Folder.FolderRole.UNKNOWN, "DRAFTS_2"), - new MyMockFolder(Folder.FolderRole.SENT, "SENT_2"), - new MyMockFolder(Folder.FolderRole.UNKNOWN, "TRASH_2"), - new MyMockFolder(Folder.FolderRole.UNKNOWN, "OUTBOX_2"), - }; - mc.updateAccountFolderNames(mAccount, folders2); - checkServerFolderNames("folders2", mAccount, "DRAFTS_1", "SENT_2", "Trash", "Outbox"); - - // test that the data is shared across multiple account instantiations - account2 = EmailContent.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 - Folder[] folders3 = new Folder[] { - new MyMockFolder(Folder.FolderRole.OTHER, "OTHER_3a"), - new MyMockFolder(Folder.FolderRole.TRASH, "TRASH_3"), - new MyMockFolder(Folder.FolderRole.OTHER, "OTHER_3b"), - new MyMockFolder(Folder.FolderRole.OUTBOX, "OUTBOX_3"), - }; - mc.updateAccountFolderNames(mAccount, folders3); - checkServerFolderNames("folders3", mAccount, "DRAFTS_1", "SENT_2", "TRASH_3", "Outbox"); - - // test that the data is shared across multiple account instantiations - account2 = EmailContent.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, EmailContent.Account account, - String drafts, String sent, String trash, String outbox) { - 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)); - } - /** * MockFolder allows setting and retrieving role & name */ diff --git a/tests/src/com/android/email/UtilityUnitTests.java b/tests/src/com/android/email/UtilityUnitTests.java index eec8374d8..63b30dd51 100644 --- a/tests/src/com/android/email/UtilityUnitTests.java +++ b/tests/src/com/android/email/UtilityUnitTests.java @@ -47,13 +47,14 @@ public class UtilityUnitTests extends AndroidTestCase { // Quoting internal \ with \\ assertEquals("\"ab\\\\cd\"", Utility.imapQuoted("ab\\cd")); } + /** * Tests of the syncronization of array and types of the display folder names */ public void testGetDisplayName() { Context context = getContext(); String expect, name; - expect = context.getString(R.string.special_mailbox_display_name_inbox); + expect = context.getString(R.string.mailbox_name_display_inbox); name = Utility.FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_INBOX); assertEquals(expect, name); expect = null; @@ -62,19 +63,19 @@ public class UtilityUnitTests extends AndroidTestCase { expect = null; name = Utility.FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_PARENT); assertEquals(expect, name); - expect = context.getString(R.string.special_mailbox_display_name_drafts); + expect = context.getString(R.string.mailbox_name_display_drafts); name = Utility.FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_DRAFTS); assertEquals(expect, name); - expect = context.getString(R.string.special_mailbox_display_name_outbox); + expect = context.getString(R.string.mailbox_name_display_outbox); name = Utility.FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_OUTBOX); assertEquals(expect, name); - expect = context.getString(R.string.special_mailbox_display_name_sent); + expect = context.getString(R.string.mailbox_name_display_sent); name = Utility.FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_SENT); assertEquals(expect, name); - expect = context.getString(R.string.special_mailbox_display_name_trash); + expect = context.getString(R.string.mailbox_name_display_trash); name = Utility.FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_TRASH); assertEquals(expect, name); - expect = context.getString(R.string.special_mailbox_display_name_junk); + expect = context.getString(R.string.mailbox_name_display_junk); name = Utility.FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_JUNK); assertEquals(expect, name); // Testing illegal index