diff --git a/emailcommon/src/com/android/emailcommon/provider/EmailContent.java b/emailcommon/src/com/android/emailcommon/provider/EmailContent.java index 1f5c237f8..77d806714 100644 --- a/emailcommon/src/com/android/emailcommon/provider/EmailContent.java +++ b/emailcommon/src/com/android/emailcommon/provider/EmailContent.java @@ -1392,46 +1392,6 @@ public abstract class EmailContent { return mCompatibilityUuid; } - /** - * For compatibility while converting to provider model, generate a "store URI" - * - * @return a string in the form of a Uri, as used by the other parts of the email app - */ - public String getStoreUri(Context context) { - // reconstitute if necessary - if (mHostAuthRecv == null) { - mHostAuthRecv = HostAuth.restoreHostAuthWithId(context, mHostAuthKeyRecv); - } - // convert if available - if (mHostAuthRecv != null) { - String storeUri = mHostAuthRecv.getStoreUri(); - if (storeUri != null) { - return storeUri; - } - } - return ""; - } - - /** - * For compatibility while converting to provider model, generate a "sender URI" - * - * @return a string in the form of a Uri, as used by the other parts of the email app - */ - public String getSenderUri(Context context) { - // reconstitute if necessary - if (mHostAuthSend == null) { - mHostAuthSend = HostAuth.restoreHostAuthWithId(context, mHostAuthKeySend); - } - // convert if available - if (mHostAuthSend != null) { - String senderUri = mHostAuthSend.getStoreUri(); - if (senderUri != null) { - return senderUri; - } - } - return ""; - } - public HostAuth getOrCreateHostAuthSend(Context context) { if (mHostAuthSend == null) { if (mHostAuthKeySend != 0) { diff --git a/emailcommon/src/com/android/emailcommon/provider/HostAuth.java b/emailcommon/src/com/android/emailcommon/provider/HostAuth.java index 88884fd08..22a9bd058 100644 --- a/emailcommon/src/com/android/emailcommon/provider/HostAuth.java +++ b/emailcommon/src/com/android/emailcommon/provider/HostAuth.java @@ -195,66 +195,6 @@ public final class HostAuth extends EmailContent implements HostAuthColumns, Par return values; } - /** - * For compatibility while converting to provider model, generate a "store URI" - * TODO cache this so we don't rebuild every time - * - * @return a string in the form of a Uri, as used by the other parts of the email app - */ - public String getStoreUri() { - String userInfo = null; - if ((mFlags & FLAG_AUTHENTICATE) != 0) { - String trimUser = (mLogin != null) ? mLogin.trim() : ""; - String password = (mPassword != null) ? mPassword : ""; - userInfo = trimUser + ":" + password; - } - String scheme = getSchemeString(mProtocol, mFlags); - String address = (mAddress != null) ? mAddress.trim() : null; - String path = (mDomain != null) ? "/" + mDomain : null; - - URI uri; - try { - uri = new URI( - scheme, - userInfo, - address, - mPort, - path, - null, - null); - return uri.toString(); - } catch (URISyntaxException e) { - return null; - } - } - - /** - * Legacy URI parser. Used in one of three different scenarios: - * 1. Backup / Restore of account - * 2. Parsing template from provider.xml - * 3. Forcefully creating URI for test - * Example string: - * "eas+ssl+trustallcerts://user:password@server/domain:123" - * - * Note that the use of client certificate is specified in the URI, a secure connection type - * must be used. - */ - public static void setHostAuthFromString(HostAuth auth, String uriString) - throws URISyntaxException { - URI uri = new URI(uriString); - String path = uri.getPath(); - String domain = null; - if (!TextUtils.isEmpty(path)) { - // Strip off the leading slash that begins the path. - domain = path.substring(1); - } - auth.mDomain = domain; - auth.setLogin(uri.getUserInfo()); - - String scheme = uri.getScheme(); - auth.setConnection(scheme, uri.getHost(), uri.getPort()); - } - /** * Sets the user name and password from URI user info string */ @@ -298,27 +238,6 @@ public final class HostAuth extends EmailContent implements HostAuthColumns, Par return null; } - /** - * Sets the connection values of the auth structure per the given scheme, host and port. - */ - public void setConnection(String scheme, String host, int port) { - String[] schemeParts = scheme.split("\\+"); - String protocol = schemeParts[0]; - String clientCertAlias = null; - int flags = getSchemeFlags(scheme); - - // Example scheme: "eas+ssl+trustallcerts" or "eas+tls+trustallcerts+client-cert-alias" - if (schemeParts.length > 3) { - clientCertAlias = schemeParts[3]; - } else if (schemeParts.length > 2) { - if (!SCHEME_TRUST_ALL_CERTS.equals(schemeParts[2])) { - mClientCertAlias = schemeParts[2]; - } - } - - setConnection(protocol, host, port, flags, clientCertAlias); - } - public void setConnection(String protocol, String address, int port, int flags) { setConnection(protocol, address, port, flags, null); } @@ -432,14 +351,6 @@ public final class HostAuth extends EmailContent implements HostAuthColumns, Par mClientCertAlias = in.readString(); } - /** - * For debugger support only - DO NOT use for code. - */ - @Override - public String toString() { - return getStoreUri(); - } - @Override public boolean equals(Object o) { if (!(o instanceof HostAuth)) { @@ -455,4 +366,50 @@ public final class HostAuth extends EmailContent implements HostAuthColumns, Par && Utility.areStringsEqual(mDomain, that.mDomain) && Utility.areStringsEqual(mClientCertAlias, that.mClientCertAlias); } + + /** + * Legacy URI parser. Used in parsing template from provider.xml + * Example string: + * "eas+ssl+trustallcerts://user:password@server/domain:123" + * + * Note that the use of client certificate is specified in the URI, a secure connection type + * must be used. + */ + public static void setHostAuthFromString(HostAuth auth, String uriString) + throws URISyntaxException { + URI uri = new URI(uriString); + String path = uri.getPath(); + String domain = null; + if (!TextUtils.isEmpty(path)) { + // Strip off the leading slash that begins the path. + domain = path.substring(1); + } + auth.mDomain = domain; + auth.setLogin(uri.getUserInfo()); + + String scheme = uri.getScheme(); + auth.setConnection(scheme, uri.getHost(), uri.getPort()); + } + + /** + * Legacy code for setting connection values from a "scheme" (see above) + */ + public void setConnection(String scheme, String host, int port) { + String[] schemeParts = scheme.split("\\+"); + String protocol = schemeParts[0]; + String clientCertAlias = null; + int flags = getSchemeFlags(scheme); + + // Example scheme: "eas+ssl+trustallcerts" or "eas+tls+trustallcerts+client-cert-alias" + if (schemeParts.length > 3) { + clientCertAlias = schemeParts[3]; + } else if (schemeParts.length > 2) { + if (!SCHEME_TRUST_ALL_CERTS.equals(schemeParts[2])) { + mClientCertAlias = schemeParts[2]; + } + } + + setConnection(protocol, host, port, flags, clientCertAlias); + } + } diff --git a/src/com/android/email/Controller.java b/src/com/android/email/Controller.java index 5d46a4750..b2dd9be99 100644 --- a/src/com/android/email/Controller.java +++ b/src/com/android/email/Controller.java @@ -16,6 +16,21 @@ package com.android.email; +import android.app.Service; +import android.content.ContentResolver; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Bundle; +import android.os.IBinder; +import android.os.RemoteCallbackList; +import android.os.RemoteException; +import android.util.Log; + import com.android.email.mail.Store; import com.android.email.mail.store.Pop3Store.Pop3Message; import com.android.email.provider.AccountBackupRestore; @@ -31,6 +46,7 @@ import com.android.emailcommon.provider.EmailContent.Body; import com.android.emailcommon.provider.EmailContent.MailboxColumns; import com.android.emailcommon.provider.EmailContent.Message; import com.android.emailcommon.provider.EmailContent.MessageColumns; +import com.android.emailcommon.provider.HostAuth; import com.android.emailcommon.provider.Mailbox; import com.android.emailcommon.service.EmailServiceStatus; import com.android.emailcommon.service.IEmailService; @@ -41,21 +57,6 @@ import com.android.emailcommon.utility.EmailAsyncTask; import com.android.emailcommon.utility.Utility; import com.google.common.annotations.VisibleForTesting; -import android.app.Service; -import android.content.ContentResolver; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Context; -import android.content.Intent; -import android.database.Cursor; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.IBinder; -import android.os.RemoteCallbackList; -import android.os.RemoteException; -import android.util.Log; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -642,18 +643,13 @@ public class Controller { null, null, null); while (c.moveToNext()) { long accountId = c.getLong(Account.ID_PROJECTION_COLUMN); - Account account = Account.restoreAccountWithId(mProviderContext, accountId); - if (account != null) { - Store.StoreInfo info = Store.StoreInfo.getStoreInfo( - account.getStoreUri(mProviderContext), mContext); - if (info != null && info.mVisibleLimitDefault > 0) { - int limit = info.mVisibleLimitDefault; - ContentValues cv = new ContentValues(); - cv.put(MailboxColumns.VISIBLE_LIMIT, limit); - resolver.update(Mailbox.CONTENT_URI, cv, - MailboxColumns.ACCOUNT_KEY + "=?", - new String[] { Long.toString(accountId) }); - } + String protocol = Account.getProtocol(mProviderContext, accountId); + if (!HostAuth.SCHEME_EAS.equals(protocol)) { + ContentValues cv = new ContentValues(); + cv.put(MailboxColumns.VISIBLE_LIMIT, Email.VISIBLE_LIMIT_DEFAULT); + resolver.update(Mailbox.CONTENT_URI, cv, + MailboxColumns.ACCOUNT_KEY + "=?", + new String[] { Long.toString(accountId) }); } } } finally { @@ -683,19 +679,15 @@ public class Controller { if (account == null) { return; } - Store.StoreInfo info = Store.StoreInfo.getStoreInfo( - 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); - mProviderContext.getContentResolver().update(uri, cv, null, null); - // Trigger a refresh using the new, longer limit - mailbox.mVisibleLimit += info.mVisibleLimitIncrement; - mLegacyController.synchronizeMailbox(account, mailbox, mLegacyListener); - } + // 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, Email.VISIBLE_LIMIT_INCREMENT); + Uri uri = ContentUris.withAppendedId(Mailbox.ADD_TO_FIELD_URI, mailboxId); + mProviderContext.getContentResolver().update(uri, cv, null, null); + // Trigger a refresh using the new, longer limit + mailbox.mVisibleLimit += Email.VISIBLE_LIMIT_INCREMENT; + mLegacyController.synchronizeMailbox(account, mailbox, mLegacyListener); } }); } diff --git a/src/com/android/email/MessagingController.java b/src/com/android/email/MessagingController.java index 027e8f15c..d48d13ea2 100644 --- a/src/com/android/email/MessagingController.java +++ b/src/com/android/email/MessagingController.java @@ -495,9 +495,7 @@ public class MessagingController implements Runnable { // 6. Determine the limit # of messages to download int visibleLimit = folder.mVisibleLimit; if (visibleLimit <= 0) { - Store.StoreInfo info = Store.StoreInfo.getStoreInfo(account.getStoreUri(mContext), - mContext); - visibleLimit = info.mVisibleLimitDefault; + visibleLimit = Email.VISIBLE_LIMIT_DEFAULT; } // 7. Create a list of messages to download diff --git a/src/com/android/email/activity/setup/AccountServerBaseFragment.java b/src/com/android/email/activity/setup/AccountServerBaseFragment.java index 2c34527cb..efe4c5903 100644 --- a/src/com/android/email/activity/setup/AccountServerBaseFragment.java +++ b/src/com/android/email/activity/setup/AccountServerBaseFragment.java @@ -373,7 +373,4 @@ public abstract class AccountServerBaseFragment extends Fragment * Respond to a click of the "Next" button. Concrete classes must implement. */ public abstract void onNext(); - - protected abstract URI getUri() throws URISyntaxException; - } diff --git a/src/com/android/email/activity/setup/AccountSettingsFragment.java b/src/com/android/email/activity/setup/AccountSettingsFragment.java index 10654c392..4913d055e 100644 --- a/src/com/android/email/activity/setup/AccountSettingsFragment.java +++ b/src/com/android/email/activity/setup/AccountSettingsFragment.java @@ -16,19 +16,6 @@ package com.android.email.activity.setup; -import com.android.email.Email; -import com.android.email.R; -import com.android.email.mail.Sender; -import com.android.email.mail.Store; -import com.android.emailcommon.AccountManagerTypes; -import com.android.emailcommon.CalendarProviderStub; -import com.android.emailcommon.Logging; -import com.android.emailcommon.mail.MessagingException; -import com.android.emailcommon.provider.EmailContent; -import com.android.emailcommon.provider.EmailContent.Account; -import com.android.emailcommon.provider.HostAuth; -import com.android.emailcommon.utility.Utility; - import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; @@ -47,7 +34,6 @@ import android.preference.CheckBoxPreference; import android.preference.EditTextPreference; import android.preference.ListPreference; import android.preference.Preference; -import android.preference.PreferenceActivity; import android.preference.PreferenceCategory; import android.preference.PreferenceFragment; import android.preference.RingtonePreference; @@ -55,6 +41,18 @@ import android.provider.ContactsContract; import android.text.TextUtils; import android.util.Log; +import com.android.email.Email; +import com.android.email.R; +import com.android.email.mail.Sender; +import com.android.emailcommon.AccountManagerTypes; +import com.android.emailcommon.CalendarProviderStub; +import com.android.emailcommon.Logging; +import com.android.emailcommon.mail.MessagingException; +import com.android.emailcommon.provider.EmailContent; +import com.android.emailcommon.provider.EmailContent.Account; +import com.android.emailcommon.provider.HostAuth; +import com.android.emailcommon.utility.Utility; + /** * Fragment containing the main logic for account settings. This also calls out to other * fragments for server settings. @@ -419,10 +417,9 @@ public class AccountSettingsFragment extends PreferenceFragment { mCheckFrequency = (ListPreference) findPreference(PREFERENCE_FREQUENCY); - // Before setting value, we may need to adjust the lists - Store.StoreInfo info = Store.StoreInfo.getStoreInfo(mAccount.getStoreUri(mContext), - mContext); - if (info.mPushSupported) { + // TODO Move protocol into Account to avoid retrieving the HostAuth (implicitly) + String protocol = Account.getProtocol(mContext, mAccount.mId); + if (HostAuth.SCHEME_EAS.equals(protocol)) { mCheckFrequency.setEntries(R.array.account_settings_check_frequency_entries_push); mCheckFrequency.setEntryValues(R.array.account_settings_check_frequency_values_push); } @@ -442,7 +439,7 @@ public class AccountSettingsFragment extends PreferenceFragment { // Add check window preference mSyncWindow = null; - if (info.mVisibleLimitDefault == -1) { + if (!HostAuth.SCHEME_EAS.equals(protocol)) { mSyncWindow = new ListPreference(mContext); mSyncWindow.setTitle(R.string.account_setup_options_mail_window_label); mSyncWindow.setEntries(R.array.account_settings_mail_window_entries); @@ -466,7 +463,7 @@ public class AccountSettingsFragment extends PreferenceFragment { // Show "background attachments" for IMAP & EAS - hide it for POP3. mAccountBackgroundAttachments = (CheckBoxPreference) findPreference(PREFERENCE_BACKGROUND_ATTACHMENTS); - if ("pop3".equals(mAccount.mHostAuthRecv.mProtocol)) { + if (HostAuth.SCHEME_POP3.equals(mAccount.mHostAuthRecv.mProtocol)) { topCategory.removePreference(mAccountBackgroundAttachments); } else { mAccountBackgroundAttachments.setChecked( diff --git a/src/com/android/email/activity/setup/AccountSetupAccountType.java b/src/com/android/email/activity/setup/AccountSetupAccountType.java index e30889659..a53a72f4a 100644 --- a/src/com/android/email/activity/setup/AccountSetupAccountType.java +++ b/src/com/android/email/activity/setup/AccountSetupAccountType.java @@ -16,24 +16,21 @@ package com.android.email.activity.setup; +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; + import com.android.email.ExchangeUtils; import com.android.email.R; import com.android.email.VendorPolicyLoader; import com.android.email.activity.ActivityHelper; import com.android.email.activity.UiUtilities; -import com.android.email.mail.Store; -import com.android.emailcommon.provider.EmailContent; import com.android.emailcommon.provider.EmailContent.Account; import com.android.emailcommon.provider.HostAuth; -import android.app.Activity; -import android.content.Intent; -import android.database.Cursor; -import android.os.Bundle; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.Button; - /** * Prompts the user to select an account type. The account type, along with the * passed in email address, password and makeDefault are then passed on to the @@ -87,9 +84,10 @@ public class AccountSetupAccountType extends AccountSetupActivity implements OnC private void onPop() { Account account = SetupData.getAccount(); HostAuth hostAuth = account.mHostAuthRecv; - hostAuth.mProtocol = "pop3"; + hostAuth.mProtocol = HostAuth.SCHEME_POP3; hostAuth.mLogin = hostAuth.mLogin + "@" + hostAuth.mAddress; - hostAuth.mAddress = AccountSettingsUtils.inferServerName(hostAuth.mAddress, "pop3", null); + hostAuth.mAddress = AccountSettingsUtils.inferServerName(hostAuth.mAddress, + HostAuth.SCHEME_POP3, null); SetupData.setCheckSettingsMode(SetupData.CHECK_INCOMING | SetupData.CHECK_OUTGOING); AccountSetupIncoming.actionIncomingSettings(this, SetupData.getFlowMode(), account); finish(); @@ -102,9 +100,10 @@ public class AccountSetupAccountType extends AccountSetupActivity implements OnC private void onImap() { Account account = SetupData.getAccount(); HostAuth hostAuth = account.mHostAuthRecv; - hostAuth.mProtocol = "imap"; + hostAuth.mProtocol = HostAuth.SCHEME_IMAP; hostAuth.mLogin = hostAuth.mLogin + "@" + hostAuth.mAddress; - hostAuth.mAddress = AccountSettingsUtils.inferServerName(hostAuth.mAddress, "imap", null); + hostAuth.mAddress = AccountSettingsUtils.inferServerName(hostAuth.mAddress, + HostAuth.SCHEME_IMAP, null); // Delete policy must be set explicitly, because IMAP does not provide a UI selection // for it. This logic needs to be followed in the auto setup flow as well. account.setDeletePolicy(Account.DELETE_POLICY_ON_DELETE); @@ -120,11 +119,11 @@ public class AccountSetupAccountType extends AccountSetupActivity implements OnC private void onExchange() { Account account = SetupData.getAccount(); HostAuth recvAuth = account.getOrCreateHostAuthRecv(this); - recvAuth.setConnection( - "eas", recvAuth.mAddress, recvAuth.mPort, recvAuth.mFlags | HostAuth.FLAG_SSL); + recvAuth.setConnection(HostAuth.SCHEME_EAS, recvAuth.mAddress, recvAuth.mPort, + recvAuth.mFlags | HostAuth.FLAG_SSL); HostAuth sendAuth = account.getOrCreateHostAuthSend(this); - sendAuth.setConnection( - "eas", sendAuth.mAddress, sendAuth.mPort, sendAuth.mFlags | HostAuth.FLAG_SSL); + sendAuth.setConnection(HostAuth.SCHEME_EAS, sendAuth.mAddress, sendAuth.mPort, + sendAuth.mFlags | HostAuth.FLAG_SSL); // TODO: Confirm correct delete policy for exchange account.setDeletePolicy(Account.DELETE_POLICY_ON_DELETE); account.setSyncInterval(Account.CHECK_INTERVAL_PUSH); @@ -134,42 +133,6 @@ public class AccountSetupAccountType extends AccountSetupActivity implements OnC finish(); } - /** - * If the optional store specifies a limit on the number of accounts, make sure that we - * don't violate that limit. - * @return true if OK to create another account, false if not OK (limit reached) - */ - /* package */ boolean checkAccountInstanceLimit(Store.StoreInfo storeInfo) { - // return immediately if account defines no limit - if (storeInfo.mAccountInstanceLimit < 0) { - return true; - } - - // count existing accounts - int currentAccountsCount = 0; - Cursor c = null; - try { - c = this.getContentResolver().query( - Account.CONTENT_URI, - Account.CONTENT_PROJECTION, - null, null, null); - while (c.moveToNext()) { - Account account = EmailContent.getContent(c, Account.class); - String storeUri = account.getStoreUri(this); - if (storeUri != null && storeUri.startsWith(storeInfo.mScheme)) { - currentAccountsCount++; - } - } - } finally { - if (c != null) { - c.close(); - } - } - - // return true if we can accept another account - return (currentAccountsCount < storeInfo.mAccountInstanceLimit); - } - public void onClick(View v) { switch (v.getId()) { case R.id.pop: diff --git a/src/com/android/email/activity/setup/AccountSetupExchangeFragment.java b/src/com/android/email/activity/setup/AccountSetupExchangeFragment.java index db5fad87f..ed1565b21 100644 --- a/src/com/android/email/activity/setup/AccountSetupExchangeFragment.java +++ b/src/com/android/email/activity/setup/AccountSetupExchangeFragment.java @@ -46,8 +46,6 @@ import android.widget.EditText; import android.widget.TextView; import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; /** * Provides generic setup for Exchange accounts. @@ -267,7 +265,7 @@ public class AccountSetupExchangeFragment extends AccountServerBaseFragment String protocol = hostAuth.mProtocol; if (protocol == null || !protocol.startsWith("eas")) { - throw new Error("Unknown account type: " + account.getStoreUri(mContext)); + throw new Error("Unknown account type: " + protocol); } if (hostAuth.mAddress != null) { @@ -299,13 +297,6 @@ public class AccountSetupExchangeFragment extends AccountServerBaseFragment boolean enabled = usernameFieldValid(mUsernameView) && Utility.isTextViewNotEmpty(mPasswordView) && Utility.isTextViewNotEmpty(mServerView); - if (enabled) { - try { - URI uri = getUri(); - } catch (URISyntaxException use) { - enabled = false; - } - } enableNextButton(enabled); // Warn (but don't prevent) if password has leading/trailing spaces @@ -363,41 +354,6 @@ public class AccountSetupExchangeFragment extends AccountServerBaseFragment return forceLoadSettings(account); } - /** - * Attempt to create a URI from the fields provided. Throws URISyntaxException if there's - * a problem with the user input. - * @return a URI built from the account setup fields - */ - @Override - protected URI getUri() throws URISyntaxException { - Account account = SetupData.getAccount(); - boolean sslRequired = mSslSecurityView.isChecked(); - boolean trustCertificates = mTrustCertificatesView.isChecked(); - String userName = mUsernameView.getText().toString().trim(); - // Remove a leading backslash, if there is one, since we now automatically put one at - // the start of the username field - if (userName.startsWith("\\")) { - userName = userName.substring(1); - } - mCacheLoginCredential = userName; - String userInfo = userName + ":" + mPasswordView.getText(); - String host = mServerView.getText().toString().trim(); - String path = null; - int port = mSslSecurityView.isChecked() ? 443 : 80; - // Ensure TLS is not set - int flags = account.getOrCreateHostAuthRecv(mContext).mFlags & ~HostAuth.FLAG_TLS; - - URI uri = new URI( - HostAuth.getSchemeString(mBaseScheme, flags), - userInfo, - host, - port, - path, - null, - null); - return uri; - } - /** * Implements AccountCheckSettingsFragment.Callbacks */ diff --git a/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java b/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java index fb5c40902..5bac68ed7 100644 --- a/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java +++ b/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java @@ -42,9 +42,6 @@ import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; -import java.net.URI; -import java.net.URISyntaxException; - /** * Provides UI for IMAP/POP account settings. * @@ -326,7 +323,7 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment { } } else if (!Store.STORE_SCHEME_POP3.equals(recvAuth.mProtocol)) { // Account must either be IMAP or POP3 - throw new Error("Unknown account type: " + account.getStoreUri(mContext)); + throw new Error("Unknown account type: " + recvAuth.mProtocol); } // The delete policy is set for all legacy accounts. For POP3 accounts, the user sets @@ -365,13 +362,6 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment { && Utility.isTextViewNotEmpty(mPasswordView) && Utility.isTextViewNotEmpty(mServerView) && Utility.isPortFieldValid(mPortView); - if (enabled) { - try { - URI uri = getUri(); - } catch (URISyntaxException use) { - enabled = false; - } - } enableNextButton(enabled); // Warn (but don't prevent) if password has leading/trailing spaces @@ -425,35 +415,6 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment { sendAuth.setConnection(sendAuth.mProtocol, hostName, sendAuth.mPort, sendAuth.mFlags); } - /** - * Attempt to create a URI from the fields provided. Throws URISyntaxException if there's - * a problem with the user input. - * @return a URI built from the account setup fields - */ - @Override - protected URI getUri() throws URISyntaxException { - int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value; - String path = null; - if (Store.STORE_SCHEME_IMAP.equals(mBaseScheme)) { - path = "/" + mImapPathPrefixView.getText().toString().trim(); - } - String userName = mUsernameView.getText().toString().trim(); - mCacheLoginCredential = userName; - String userInfo = userName + ":" + mPasswordView.getText(); - String host = mServerView.getText().toString().trim(); - int port = Integer.parseInt(mPortView.getText().toString().trim()); - - URI uri = new URI( - HostAuth.getSchemeString(mBaseScheme, securityType), - userInfo, - host, - port, - path, // path - null, // query - null); - return uri; - } - /** * Entry point from Activity, when "next" button is clicked */ diff --git a/src/com/android/email/activity/setup/AccountSetupOptions.java b/src/com/android/email/activity/setup/AccountSetupOptions.java index e51f4cdfa..41e0f518e 100644 --- a/src/com/android/email/activity/setup/AccountSetupOptions.java +++ b/src/com/android/email/activity/setup/AccountSetupOptions.java @@ -16,19 +16,6 @@ package com.android.email.activity.setup; -import com.android.email.Email; -import com.android.email.ExchangeUtils; -import com.android.email.R; -import com.android.email.activity.ActivityHelper; -import com.android.email.activity.UiUtilities; -import com.android.email.mail.Store; -import com.android.email.service.MailService; -import com.android.emailcommon.Logging; -import com.android.emailcommon.provider.EmailContent; -import com.android.emailcommon.provider.EmailContent.Account; -import com.android.emailcommon.service.SyncWindow; -import com.android.emailcommon.utility.Utility; - import android.accounts.AccountAuthenticatorResponse; import android.accounts.AccountManager; import android.accounts.AccountManagerCallback; @@ -48,6 +35,19 @@ import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.Spinner; +import com.android.email.Email; +import com.android.email.ExchangeUtils; +import com.android.email.R; +import com.android.email.activity.ActivityHelper; +import com.android.email.activity.UiUtilities; +import com.android.email.service.MailService; +import com.android.emailcommon.Logging; +import com.android.emailcommon.provider.EmailContent; +import com.android.emailcommon.provider.EmailContent.Account; +import com.android.emailcommon.provider.HostAuth; +import com.android.emailcommon.service.SyncWindow; +import com.android.emailcommon.utility.Utility; + import java.io.IOException; /** @@ -102,8 +102,9 @@ public class AccountSetupOptions extends AccountSetupActivity implements OnClick int frequencyValuesId; int frequencyEntriesId; Account account = SetupData.getAccount(); - Store.StoreInfo info = Store.StoreInfo.getStoreInfo(account.getStoreUri(this), this); - if (info.mPushSupported) { + String protocol = account.mHostAuthRecv.mProtocol; + boolean eas = HostAuth.SCHEME_EAS.equals(protocol); + if (eas) { frequencyValuesId = R.array.account_settings_check_frequency_values_push; frequencyEntriesId = R.array.account_settings_check_frequency_entries_push; } else { @@ -126,7 +127,7 @@ public class AccountSetupOptions extends AccountSetupActivity implements OnClick .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mCheckFrequencyView.setAdapter(checkFrequenciesAdapter); - if (info.mVisibleLimitDefault == -1) { + if (eas) { enableEASSyncWindowSpinner(); } @@ -140,7 +141,7 @@ public class AccountSetupOptions extends AccountSetupActivity implements OnClick SpinnerOption.setSpinnerOptionValue(mCheckFrequencyView, account.getSyncInterval()); // Setup any additional items to support EAS & EAS flow mode - if ("eas".equals(info.mScheme)) { + if (eas) { // "also sync contacts" == "true" mSyncContactsView.setVisibility(View.VISIBLE); mSyncContactsView.setChecked(true); @@ -152,7 +153,7 @@ public class AccountSetupOptions extends AccountSetupActivity implements OnClick } // If we are in POP3, hide the "Background Attachments" mode - if ("pop3".equals(info.mScheme)) { + if (HostAuth.SCHEME_POP3.equals(protocol)) { mBackgroundAttachmentsView.setVisibility(View.GONE); UiUtilities.setVisibilitySafe(this, R.id.account_background_attachments_divider, View.GONE); diff --git a/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java b/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java index 32f6a7d46..649df417f 100644 --- a/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java +++ b/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java @@ -16,16 +16,6 @@ package com.android.email.activity.setup; -import com.android.email.Email; -import com.android.email.R; -import com.android.email.activity.UiUtilities; -import com.android.email.provider.AccountBackupRestore; -import com.android.emailcommon.Logging; -import com.android.emailcommon.provider.EmailContent; -import com.android.emailcommon.provider.EmailContent.Account; -import com.android.emailcommon.provider.HostAuth; -import com.android.emailcommon.utility.Utility; - import android.app.Activity; import android.content.Context; import android.os.Bundle; @@ -44,8 +34,15 @@ import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.EditText; import android.widget.Spinner; -import java.net.URI; -import java.net.URISyntaxException; +import com.android.email.Email; +import com.android.email.R; +import com.android.email.activity.UiUtilities; +import com.android.email.provider.AccountBackupRestore; +import com.android.emailcommon.Logging; +import com.android.emailcommon.provider.EmailContent; +import com.android.emailcommon.provider.EmailContent.Account; +import com.android.emailcommon.provider.HostAuth; +import com.android.emailcommon.utility.Utility; /** * Provides UI for SMTP account settings (for IMAP/POP accounts). @@ -86,7 +83,7 @@ public class AccountSetupOutgoingFragment extends AccountServerBaseFragment if (savedInstanceState != null) { mLoaded = savedInstanceState.getBoolean(STATE_KEY_LOADED, false); } - mBaseScheme = "smtp"; + mBaseScheme = HostAuth.SCHEME_SMTP; } @Override @@ -299,16 +296,7 @@ public class AccountSetupOutgoingFragment extends AccountServerBaseFragment enabled = (Utility.isTextViewNotEmpty(mUsernameView) && Utility.isTextViewNotEmpty(mPasswordView)); } - - if (enabled) { - try { - URI uri = getUri(); - } catch (URISyntaxException use) { - enabled = false; - } - } enableNextButton(enabled); - // Warn (but don't prevent) if password has leading/trailing spaces AccountSettingsUtils.checkPasswordSpaces(mContext, mPasswordView); } @@ -354,33 +342,6 @@ public class AccountSetupOutgoingFragment extends AccountServerBaseFragment public void saveSettingsAfterSetup() { } - /** - * Attempt to create a URI from the fields provided. Throws URISyntaxException if there's - * a problem with the user input. - * @return a URI built from the account setup fields - */ - @Override - protected URI getUri() throws URISyntaxException { - int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value; - String userInfo = null; - if (mRequireLoginView.isChecked()) { - userInfo = mUsernameView.getText().toString().trim() + ":" + mPasswordView.getText(); - } - String host = mServerView.getText().toString().trim(); - String path = null; - int port = Integer.parseInt(mPortView.getText().toString().trim()); - - URI uri = new URI( - HostAuth.getSchemeString(mBaseScheme, securityType), - userInfo, - host, - port, - path, - null, - null); - return uri; - } - /** * Entry point from Activity, when "next" button is clicked */ diff --git a/src/com/android/email/mail/Store.java b/src/com/android/email/mail/Store.java index 98be260d4..01d1c55e7 100644 --- a/src/com/android/email/mail/Store.java +++ b/src/com/android/email/mail/Store.java @@ -16,11 +16,17 @@ package com.android.email.mail; +import android.content.Context; +import android.content.res.XmlResourceParser; +import android.os.Bundle; +import android.util.Log; + import com.android.email.Email; import com.android.email.R; import com.android.emailcommon.Logging; import com.android.emailcommon.mail.Folder; import com.android.emailcommon.mail.MessagingException; +import com.android.emailcommon.provider.EmailContent; import com.android.emailcommon.provider.EmailContent.Account; import com.android.emailcommon.provider.HostAuth; import com.android.emailcommon.provider.Mailbox; @@ -28,11 +34,6 @@ import com.google.common.annotations.VisibleForTesting; import org.xmlpull.v1.XmlPullParserException; -import android.content.Context; -import android.content.res.XmlResourceParser; -import android.os.Bundle; -import android.util.Log; - import java.io.IOException; import java.util.HashMap; @@ -49,9 +50,9 @@ public abstract class Store { /** * String constants for known store schemes. */ - public static final String STORE_SCHEME_IMAP = "imap"; - public static final String STORE_SCHEME_POP3 = "pop3"; - public static final String STORE_SCHEME_EAS = "eas"; + public static final String STORE_SCHEME_IMAP = HostAuth.SCHEME_IMAP; + public static final String STORE_SCHEME_POP3 = HostAuth.SCHEME_POP3; + public static final String STORE_SCHEME_EAS = HostAuth.SCHEME_EAS; public static final String STORE_SCHEME_LOCAL = "local"; public static final String STORE_SECURITY_SSL = "+ssl"; @@ -65,7 +66,7 @@ public abstract class Store { public static final int FETCH_BODY_SANE_SUGGESTED_SIZE = (50 * 1024); @VisibleForTesting - static final HashMap sStores = new HashMap(); + static final HashMap sStores = new HashMap(); protected Context mContext; protected Account mAccount; @@ -162,23 +163,12 @@ public abstract class Store { } } - protected static String getStoreKey(Context context, Account account) - throws MessagingException { - HostAuth recvAuth = account.getOrCreateHostAuthRecv(context); - String key = recvAuth.getStoreUri(); - if (key == null) { - throw new MessagingException("Could not find store for account: " + - account.mDisplayName); - } - return key; - } - /** * Get an instance of a mail store for the given account. The account must be valid (i.e. has * at least an incoming server name). * - * NOTE: The internal algorithm used to find a cached store depends upon the URI of the - * account's HostAuth object. If this ever changes (e.g. such as the user updating the + * NOTE: The internal algorithm used to find a cached store depends upon the id of the + * account's HostAuth row. If this ever changes (e.g. such as the user updating the * host name or port), we will leak entries. This should not be typical, so, it is not * a critical problem. However, it is something we should consider fixing. * @@ -188,17 +178,17 @@ public abstract class Store { */ public synchronized static Store getInstance(Account account, Context context, PersistentDataCallbacks callbacks) throws MessagingException { - String storeKey = getStoreKey(context, account); + HostAuth recvAuth = account.getOrCreateHostAuthRecv(context); + long storeKey = recvAuth.mId; Store store = sStores.get(storeKey); if (store == null) { Context appContext = context.getApplicationContext(); - HostAuth recvAuth = account.getOrCreateHostAuthRecv(context); StoreInfo info = StoreInfo.getStoreInfo(recvAuth.mProtocol, context); if (info != null) { store = instantiateStore(info.mClassName, account, appContext, callbacks); } - - if (store != null) { + // Don't cache this unless it's we've got a saved HostAUth + if (store != null && (storeKey != EmailContent.NOT_SAVED)) { sStores.put(storeKey, store); } } else { diff --git a/src/com/android/email/mail/store/ExchangeStore.java b/src/com/android/email/mail/store/ExchangeStore.java index 251d2f0f1..5f1da8cbb 100644 --- a/src/com/android/email/mail/store/ExchangeStore.java +++ b/src/com/android/email/mail/store/ExchangeStore.java @@ -20,6 +20,7 @@ import com.android.email.ExchangeUtils; import com.android.email.mail.Store; import com.android.emailcommon.mail.Folder; import com.android.emailcommon.mail.MessagingException; +import com.android.emailcommon.provider.EmailContent; import com.android.emailcommon.provider.EmailContent.Account; import com.android.emailcommon.provider.HostAuth; import com.android.emailcommon.service.EmailServiceProxy; @@ -102,19 +103,26 @@ public class ExchangeStore extends Store { private String mUsername; private String mPassword; - private static final HashMap sUriToInstanceMap = - new HashMap(); + private static final HashMap sHostAuthToInstanceMap = + new HashMap(); /** - * Public factory. The transport should be a singleton (per Uri) + * Public factory. The transport should be a singleton */ public synchronized static ExchangeTransport getInstance(Account account, Context context) throws MessagingException { - final String storeKey = getStoreKey(context, account); - ExchangeTransport transport = sUriToInstanceMap.get(storeKey); + HostAuth hostAuth = HostAuth.restoreHostAuthWithId(context, account.mHostAuthKeyRecv); + if (hostAuth == null) { + hostAuth = new HostAuth(); + } + final long storeKey = hostAuth.mId; + ExchangeTransport transport = sHostAuthToInstanceMap.get(storeKey); if (transport == null) { transport = new ExchangeTransport(account, context); - sUriToInstanceMap.put(storeKey, transport); + // Only cache a saved HostAuth key + if (storeKey != EmailContent.NOT_SAVED) { + sHostAuthToInstanceMap.put(storeKey, transport); + } } return transport; } diff --git a/tests/src/com/android/email/activity/setup/AccountSetupAccountTypeTests.java b/tests/src/com/android/email/activity/setup/AccountSetupAccountTypeTests.java index 9b0bd92f7..86f394a86 100644 --- a/tests/src/com/android/email/activity/setup/AccountSetupAccountTypeTests.java +++ b/tests/src/com/android/email/activity/setup/AccountSetupAccountTypeTests.java @@ -16,11 +16,6 @@ package com.android.email.activity.setup; -import com.android.email.R; -import com.android.email.mail.Store; -import com.android.emailcommon.provider.EmailContent.Account; -import com.android.emailcommon.provider.HostAuth; - import android.content.ContentUris; import android.content.Context; import android.content.Intent; @@ -29,6 +24,10 @@ import android.test.ActivityUnitTestCase; import android.test.suitebuilder.annotation.SmallTest; import android.view.View; +import com.android.email.R; +import com.android.emailcommon.provider.EmailContent.Account; +import com.android.emailcommon.provider.HostAuth; + import java.net.URISyntaxException; import java.util.HashSet; @@ -68,37 +67,10 @@ public class AccountSetupAccountTypeTests super.tearDown(); } - /** - * Test store type limit enforcement - */ - public void testStoreTypeLimits() - throws URISyntaxException { - createTestAccount("scheme1"); - createTestAccount("scheme1"); - createTestAccount("scheme2"); - - AccountSetupAccountType activity = startActivity(getTestIntent(), null, null); - - // Test with no limit - Store.StoreInfo info = new Store.StoreInfo(); - info.mAccountInstanceLimit = -1; - info.mScheme = "scheme1"; - assertTrue("no limit", activity.checkAccountInstanceLimit(info)); - - // Test with limit, but not reached - info.mAccountInstanceLimit = 3; - assertTrue("limit, but not reached", activity.checkAccountInstanceLimit(info)); - - // Test with limit, reached - info.mAccountInstanceLimit = 2; - assertFalse("limit, reached", activity.checkAccountInstanceLimit(info)); - } - /** * Confirm that EAS is presented, when supported. */ - public void testEasOffered() - throws URISyntaxException { + public void testEasOffered() throws URISyntaxException { createTestAccount("scheme1"); AccountSetupAccountType activity = startActivity(getTestIntent(), null, null); View exchangeButton = activity.findViewById(R.id.exchange); @@ -114,8 +86,7 @@ public class AccountSetupAccountTypeTests /** * Create a dummy account with minimal fields */ - private Account createTestAccount(String scheme) - throws URISyntaxException { + private Account createTestAccount(String scheme) throws URISyntaxException { Account account = new Account(); HostAuth auth = account.getOrCreateHostAuthRecv(mContext); HostAuth.setHostAuthFromString(auth, scheme + "://user:pass@server.com:123"); diff --git a/tests/src/com/android/email/activity/setup/AccountSetupExchangeTests.java b/tests/src/com/android/email/activity/setup/AccountSetupExchangeTests.java index 9734a9d2e..be76e07ea 100644 --- a/tests/src/com/android/email/activity/setup/AccountSetupExchangeTests.java +++ b/tests/src/com/android/email/activity/setup/AccountSetupExchangeTests.java @@ -16,12 +16,6 @@ package com.android.email.activity.setup; -import com.android.email.R; -import com.android.email.provider.ProviderTestUtils; -import com.android.emailcommon.provider.EmailContent; -import com.android.emailcommon.provider.EmailContent.Account; -import com.android.emailcommon.provider.HostAuth; - import android.content.Context; import android.content.Intent; import android.test.ActivityInstrumentationTestCase2; @@ -31,7 +25,12 @@ import android.view.View; import android.widget.CheckBox; import android.widget.EditText; -import java.net.URI; +import com.android.email.R; +import com.android.email.provider.ProviderTestUtils; +import com.android.emailcommon.provider.EmailContent; +import com.android.emailcommon.provider.EmailContent.Account; +import com.android.emailcommon.provider.HostAuth; + import java.net.URISyntaxException; /** @@ -74,8 +73,7 @@ public class AccountSetupExchangeTests extends /** * Test processing with a complete, good URI -> good fields */ - public void testGoodUri() - throws URISyntaxException { + public void testGoodUri() throws URISyntaxException { Intent i = getTestIntent("eas://user:password@server.com"); setActivityIntent(i); getActivityAndFields(); @@ -88,8 +86,7 @@ public class AccountSetupExchangeTests extends /** * No user is not OK - not enabled */ - public void testBadUriNoUser() - throws URISyntaxException { + public void testBadUriNoUser() throws URISyntaxException { Intent i = getTestIntent("eas://:password@server.com"); setActivityIntent(i); getActivityAndFields(); @@ -99,8 +96,7 @@ public class AccountSetupExchangeTests extends /** * No password is not OK - not enabled */ - public void testBadUriNoPassword() - throws URISyntaxException { + public void testBadUriNoPassword() throws URISyntaxException { Intent i = getTestIntent("eas://user@server.com"); setActivityIntent(i); getActivityAndFields(); @@ -138,7 +134,7 @@ public class AccountSetupExchangeTests extends * Test to confirm that passwords with leading or trailing spaces are accepted verbatim. */ @UiThreadTest - public void testPasswordNoTrim() throws URISyntaxException { + public void testPasswordNoTrim() { getActivityAndFields(); // Clear the password - should disable @@ -158,14 +154,10 @@ public class AccountSetupExchangeTests extends * @param password the password to test with * @param expectNext true if expected that this password will enable the "next" button */ - private void checkPassword(String password, boolean expectNext) throws URISyntaxException { + private void checkPassword(String password, boolean expectNext) { mPasswordView.setText(password); if (expectNext) { assertTrue(mActivity.mNextButtonEnabled); - URI uri = mFragment.getUri(); - String actualUserInfo = uri.getUserInfo(); - String actualPassword = actualUserInfo.split(":", 2)[1]; - assertEquals(password, actualPassword); } else { assertFalse(mActivity.mNextButtonEnabled); } @@ -236,8 +228,7 @@ public class AccountSetupExchangeTests extends /** * Create an intent with the Account in it */ - private Intent getTestIntent(String storeUriString) - throws URISyntaxException { + private Intent getTestIntent(String storeUriString) throws URISyntaxException { EmailContent.Account account = new EmailContent.Account(); Context context = getInstrumentation().getTargetContext(); HostAuth auth = account.getOrCreateHostAuthRecv(context); diff --git a/tests/src/com/android/email/activity/setup/AccountSetupIncomingTests.java b/tests/src/com/android/email/activity/setup/AccountSetupIncomingTests.java index 4a3042782..5395c4f99 100644 --- a/tests/src/com/android/email/activity/setup/AccountSetupIncomingTests.java +++ b/tests/src/com/android/email/activity/setup/AccountSetupIncomingTests.java @@ -27,7 +27,6 @@ import android.test.UiThreadTest; import android.test.suitebuilder.annotation.MediumTest; import android.widget.EditText; -import java.net.URI; import java.net.URISyntaxException; /** @@ -162,10 +161,6 @@ public class AccountSetupIncomingTests extends mPasswordView.setText(password); if (expectNext) { assertTrue(mActivity.mNextButtonEnabled); - URI uri = mFragment.getUri(); - String actualUserInfo = uri.getUserInfo(); - String actualPassword = actualUserInfo.split(":", 2)[1]; - assertEquals(password, actualPassword); } else { assertFalse(mActivity.mNextButtonEnabled); } diff --git a/tests/src/com/android/email/activity/setup/AccountSetupOutgoingTests.java b/tests/src/com/android/email/activity/setup/AccountSetupOutgoingTests.java index ae366846b..42e268a40 100644 --- a/tests/src/com/android/email/activity/setup/AccountSetupOutgoingTests.java +++ b/tests/src/com/android/email/activity/setup/AccountSetupOutgoingTests.java @@ -27,7 +27,6 @@ import android.test.UiThreadTest; import android.test.suitebuilder.annotation.MediumTest; import android.widget.EditText; -import java.net.URI; import java.net.URISyntaxException; /** @@ -159,10 +158,6 @@ public class AccountSetupOutgoingTests extends mPasswordView.setText(password); if (expectNext) { assertTrue(mActivity.mNextButtonEnabled); - URI uri = mFragment.getUri(); - String actualUserInfo = uri.getUserInfo(); - String actualPassword = actualUserInfo.split(":", 2)[1]; - assertEquals(password, actualPassword); } else { assertFalse(mActivity.mNextButtonEnabled); } diff --git a/tests/src/com/android/email/mail/StoreTests.java b/tests/src/com/android/email/mail/StoreTests.java index fea255ea2..12286bdcb 100644 --- a/tests/src/com/android/email/mail/StoreTests.java +++ b/tests/src/com/android/email/mail/StoreTests.java @@ -16,64 +16,42 @@ package com.android.email.mail; +import android.content.Context; +import android.test.ProviderTestCase2; +import android.test.suitebuilder.annotation.MediumTest; + import com.android.email.Email; import com.android.email.mail.Store.StoreInfo; +import com.android.email.provider.EmailProvider; +import com.android.email.provider.ProviderTestUtils; import com.android.emailcommon.mail.MessagingException; +import com.android.emailcommon.provider.EmailContent; import com.android.emailcommon.provider.EmailContent.Account; import com.android.emailcommon.provider.HostAuth; import com.android.emailcommon.provider.Mailbox; -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.MediumTest; - /** * Tests of StoreInfo & Store lookup in the Store abstract class + * + * You can run this entire test case with: + * runtest -c com.android.email.mail.store.StoreTests email + * */ + @MediumTest -public class StoreTests extends AndroidTestCase { +public class StoreTests extends ProviderTestCase2 { + + private Context mMockContext; @Override - public void setUp() { + public void setUp() throws Exception { + super.setUp(); + mMockContext = getMockContext(); Store.sStores.clear(); } - public void testGetStoreKey() throws MessagingException { - HostAuth testAuth = new HostAuth(); - Account testAccount = new Account(); - String testKey; - - // Make sure to set the host auth; otherwise we create entries in the hostauth db - testAccount.mHostAuthRecv = testAuth; - testAuth.mProtocol = "protocol"; - testAuth.mPort = 80; - - // No address defined; throws an exception - try { - testKey = Store.getStoreKey(mContext, testAccount); - fail("MesasginException not thrown for missing address"); - } catch (MessagingException expected) { - } - - // Empty address defined; throws an exception - testAuth.mAddress = " \t "; - try { - testKey = Store.getStoreKey(mContext, testAccount); - fail("MesasginException not thrown for empty address"); - } catch (MessagingException expected) { - } - - // Address defined, no login - testAuth.mAddress = "a.valid.address.com"; - testKey = Store.getStoreKey(mContext, testAccount); - assertEquals("protocol://a.valid.address.com:80", testKey); - - // Address & login defined - testAuth.mAddress = "address.org"; - testAuth.mFlags = HostAuth.FLAG_AUTHENTICATE; - testAuth.mLogin = "auser"; - testAuth.mPassword = "password"; - testKey = Store.getStoreKey(mContext, testAccount); - assertEquals("protocol://auser:password@address.org:80", testKey); + public StoreTests(Class providerClass, String providerAuthority) { + super(EmailProvider.class, EmailContent.AUTHORITY); } public void testGetStoreInfo() { @@ -103,42 +81,36 @@ public class StoreTests extends AndroidTestCase { } public void testGetInstance() throws MessagingException { - HostAuth testAuth = new HostAuth(); - Account testAccount = new Account(); Store testStore; - // Make sure to set the host auth; otherwise we create entries in the hostauth db - testAccount.mHostAuthRecv = testAuth; - // POP3 + Account testAccount = ProviderTestUtils.setupAccount("pop", false, mMockContext); + HostAuth testAuth = new HostAuth(); + testAccount.mHostAuthRecv = testAuth; testAuth.mAddress = "pop3.google.com"; testAuth.mProtocol = "pop3"; + testAccount.save(mMockContext); + testStore = Store.getInstance(testAccount, getContext(), null); assertEquals(1, Store.sStores.size()); - assertSame(testStore, Store.sStores.get(testAuth.getStoreUri())); + assertSame(testStore, Store.sStores.get(testAccount.mId)); Store.sStores.clear(); // IMAP + testAccount = ProviderTestUtils.setupAccount("pop", false, mMockContext); + testAuth = new HostAuth(); + testAccount.mHostAuthRecv = testAuth; testAuth.mAddress = "imap.google.com"; testAuth.mProtocol = "imap"; + testAccount.save(mMockContext); testStore = Store.getInstance(testAccount, getContext(), null); assertEquals(1, Store.sStores.size()); - assertSame(testStore, Store.sStores.get(testAuth.getStoreUri())); - Store.sStores.clear(); - - // IMAP; host auth changes - testAuth.mAddress = "imap.google.com"; - testAuth.mProtocol = "imap"; - testStore = Store.getInstance(testAccount, getContext(), null); // cache first store - assertEquals(1, Store.sStores.size()); - assertSame(testStore, Store.sStores.get(testAuth.getStoreUri())); - testAuth.mAddress = "mail.google.com"; // change the auth hostname - Store.getInstance(testAccount, getContext(), null); // cache second store - assertEquals(2, Store.sStores.size()); // Now there are two entries ... - assertNotSame(testStore, Store.sStores.get(testAuth.getStoreUri())); + assertSame(testStore, Store.sStores.get(testAccount.mId)); Store.sStores.clear(); // Unknown + testAccount = ProviderTestUtils.setupAccount("unknown", false, mMockContext); + testAuth = new HostAuth(); testAuth.mAddress = "unknown.google.com"; testAuth.mProtocol = "unknown"; try { diff --git a/tests/src/com/android/emailcommon/provider/HostAuthTests.java b/tests/src/com/android/emailcommon/provider/HostAuthTests.java index 0665e6c58..27e77dcd4 100644 --- a/tests/src/com/android/emailcommon/provider/HostAuthTests.java +++ b/tests/src/com/android/emailcommon/provider/HostAuthTests.java @@ -16,145 +16,15 @@ package com.android.emailcommon.provider; -import com.android.email.provider.ProviderTestUtils; - import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; -import java.net.URISyntaxException; - /** * Unit tests for the HostAuth inner class. * These tests must be locally complete - no server(s) required. */ @SmallTest public class HostAuthTests extends AndroidTestCase { - /** - * Test the various combinations of SSL, TLS, and trust-certificates encoded as Uris - */ - public void testSecurityUri() - throws URISyntaxException { - HostAuth ha = ProviderTestUtils.setupHostAuth("uri-security", 1, false, mContext); - - final int MASK = - HostAuth.FLAG_SSL | HostAuth.FLAG_TLS | HostAuth.FLAG_TRUST_ALL; - - // Set various URIs and check the resulting flags - HostAuth.setHostAuthFromString(ha, "protocol://user:password@server:123"); - assertEquals(0, ha.mFlags & MASK); - HostAuth.setHostAuthFromString(ha, "protocol+ssl+://user:password@server:123"); - assertEquals(HostAuth.FLAG_SSL, ha.mFlags & MASK); - HostAuth.setHostAuthFromString(ha, "protocol+ssl+trustallcerts://user:password@server:123"); - assertEquals(HostAuth.FLAG_SSL | HostAuth.FLAG_TRUST_ALL, ha.mFlags & MASK); - HostAuth.setHostAuthFromString(ha, "protocol+tls+://user:password@server:123"); - assertEquals(HostAuth.FLAG_TLS, ha.mFlags & MASK); - HostAuth.setHostAuthFromString(ha, "protocol+tls+trustallcerts://user:password@server:123"); - assertEquals(HostAuth.FLAG_TLS | HostAuth.FLAG_TRUST_ALL, ha.mFlags & MASK); - - // Now check the retrival method (building URI from flags) - ha.mFlags &= ~MASK; - String uriString = ha.getStoreUri(); - assertTrue(uriString.startsWith("protocol://")); - ha.mFlags |= HostAuth.FLAG_SSL; - uriString = ha.getStoreUri(); - assertTrue(uriString.startsWith("protocol+ssl+://")); - ha.mFlags |= HostAuth.FLAG_TRUST_ALL; - uriString = ha.getStoreUri(); - assertTrue(uriString.startsWith("protocol+ssl+trustallcerts://")); - ha.mFlags &= ~MASK; - ha.mFlags |= HostAuth.FLAG_TLS; - uriString = ha.getStoreUri(); - assertTrue(uriString.startsWith("protocol+tls+://")); - ha.mFlags |= HostAuth.FLAG_TRUST_ALL; - uriString = ha.getStoreUri(); - assertTrue(uriString.startsWith("protocol+tls+trustallcerts://")); - } - - /** - * Test port assignments made from Uris - */ - public void testPortAssignments() - throws URISyntaxException { - HostAuth ha = ProviderTestUtils.setupHostAuth("uri-port", 1, false, mContext); - - // Set various URIs and check the resulting flags - // Hardwired port - HostAuth.setHostAuthFromString(ha, "imap://user:password@server:123"); - assertEquals(123, ha.mPort); - // Auto-assigned ports - HostAuth.setHostAuthFromString(ha, "imap://user:password@server"); - assertEquals(143, ha.mPort); - HostAuth.setHostAuthFromString(ha, "imap+ssl://user:password@server"); - assertEquals(993, ha.mPort); - HostAuth.setHostAuthFromString(ha, "imap+ssl+trustallcerts://user:password@server"); - assertEquals(993, ha.mPort); - HostAuth.setHostAuthFromString(ha, "imap+tls://user:password@server"); - assertEquals(143, ha.mPort); - HostAuth.setHostAuthFromString(ha, "imap+tls+trustallcerts://user:password@server"); - assertEquals(143, ha.mPort); - - // Hardwired port - HostAuth.setHostAuthFromString(ha, "pop3://user:password@server:123"); - assertEquals(123, ha.mPort); - // Auto-assigned ports - HostAuth.setHostAuthFromString(ha, "pop3://user:password@server"); - assertEquals(110, ha.mPort); - HostAuth.setHostAuthFromString(ha, "pop3+ssl://user:password@server"); - assertEquals(995, ha.mPort); - HostAuth.setHostAuthFromString(ha, "pop3+ssl+trustallcerts://user:password@server"); - assertEquals(995, ha.mPort); - HostAuth.setHostAuthFromString(ha, "pop3+tls://user:password@server"); - assertEquals(110, ha.mPort); - HostAuth.setHostAuthFromString(ha, "pop3+tls+trustallcerts://user:password@server"); - assertEquals(110, ha.mPort); - - // Hardwired port - HostAuth.setHostAuthFromString(ha, "eas://user:password@server:123"); - assertEquals(123, ha.mPort); - // Auto-assigned ports - HostAuth.setHostAuthFromString(ha, "eas://user:password@server"); - assertEquals(80, ha.mPort); - HostAuth.setHostAuthFromString(ha, "eas+ssl://user:password@server"); - assertEquals(443, ha.mPort); - HostAuth.setHostAuthFromString(ha, "eas+ssl+trustallcerts://user:password@server"); - assertEquals(443, ha.mPort); - - // Hardwired port - HostAuth.setHostAuthFromString(ha, "smtp://user:password@server:123"); - assertEquals(123, ha.mPort); - // Auto-assigned ports - HostAuth.setHostAuthFromString(ha, "smtp://user:password@server"); - assertEquals(587, ha.mPort); - HostAuth.setHostAuthFromString(ha, "smtp+ssl://user:password@server"); - assertEquals(465, ha.mPort); - HostAuth.setHostAuthFromString(ha, "smtp+ssl+trustallcerts://user:password@server"); - assertEquals(465, ha.mPort); - HostAuth.setHostAuthFromString(ha, "smtp+tls://user:password@server"); - assertEquals(587, ha.mPort); - HostAuth.setHostAuthFromString(ha, "smtp+tls+trustallcerts://user:password@server"); - assertEquals(587, ha.mPort); - } - - /** - * Test preservation of username & password in URI - */ - public void testGetStoreUri() - throws URISyntaxException { - HostAuth ha = new HostAuth(); - HostAuth.setHostAuthFromString(ha, "protocol://user:password@server:123"); - String getUri = ha.getStoreUri(); - assertEquals("protocol://user:password@server:123", getUri); - - // Now put spaces in/around username (they are trimmed) - HostAuth.setHostAuthFromString(ha, "protocol://%20us%20er%20:password@server:123"); - getUri = ha.getStoreUri(); - assertEquals("protocol://us%20er:password@server:123", getUri); - - // Now put spaces around password (should not be trimmed) - HostAuth.setHostAuthFromString(ha, "protocol://user:%20pass%20word%20@server:123"); - getUri = ha.getStoreUri(); - assertEquals("protocol://user:%20pass%20word%20@server:123", getUri); - } /** * Test user name and password are set correctly @@ -227,122 +97,6 @@ public class HostAuthTests extends AndroidTestCase { assertEquals(~HostAuth.FLAG_AUTHENTICATE, ha.mFlags); } - public void testImapConnectionScheme() { - HostAuth ha = new HostAuth(); - - // Set URIs for IMAP - // Hardwired port - ha.setConnection("imap", "server", 123); - assertEquals(0, ha.mFlags); - assertEquals(123, ha.mPort); - - // Auto-assigned ports - ha.setConnection("imap", "server", -1); - assertEquals(0, ha.mFlags); - assertEquals(143, ha.mPort); - - ha.setConnection("imap+ssl", "server", -1); - assertEquals(HostAuth.FLAG_SSL, ha.mFlags); - assertEquals(993, ha.mPort); - - ha.setConnection("imap+ssl+trustallcerts", "server", -1); - assertEquals(HostAuth.FLAG_SSL|HostAuth.FLAG_TRUST_ALL, ha.mFlags); - assertEquals(993, ha.mPort); - - ha.setConnection("imap+tls", "server", -1); - assertEquals(HostAuth.FLAG_TLS, ha.mFlags); - assertEquals(143, ha.mPort); - - ha.setConnection("imap+tls+trustallcerts", "server", -1); - assertEquals(HostAuth.FLAG_TLS|HostAuth.FLAG_TRUST_ALL, ha.mFlags); - assertEquals(143, ha.mPort); - } - - public void testPopConnectionScheme() { - HostAuth ha = new HostAuth(); - - // Set URIs for POP3 - // Hardwired port - ha.setConnection("pop3", "server", 123); - assertEquals(0, ha.mFlags); - assertEquals(123, ha.mPort); - - // Auto-assigned ports - ha.setConnection("pop3", "server", -1); - assertEquals(0, ha.mFlags); - assertEquals(110, ha.mPort); - - ha.setConnection("pop3+ssl", "server", -1); - assertEquals(HostAuth.FLAG_SSL, ha.mFlags); - assertEquals(995, ha.mPort); - - ha.setConnection("pop3+ssl+trustallcerts", "server", -1); - assertEquals(HostAuth.FLAG_SSL|HostAuth.FLAG_TRUST_ALL, ha.mFlags); - assertEquals(995, ha.mPort); - - ha.setConnection("pop3+tls", "server", -1); - assertEquals(HostAuth.FLAG_TLS, ha.mFlags); - assertEquals(110, ha.mPort); - - ha.setConnection("pop3+tls+trustallcerts", "server", -1); - assertEquals(HostAuth.FLAG_TLS|HostAuth.FLAG_TRUST_ALL, ha.mFlags); - assertEquals(110, ha.mPort); - } - - public void testEasConnectionScheme() { - HostAuth ha = new HostAuth(); - - // Set URIs for Exchange - // Hardwired port - ha.setConnection("eas", "server", 123); - assertEquals(0, ha.mFlags); - assertEquals(123, ha.mPort); - - // Auto-assigned ports - ha.setConnection("eas", "server", -1); - assertEquals(0, ha.mFlags); - assertEquals(80, ha.mPort); - - ha.setConnection("eas+ssl", "server", -1); - assertEquals(HostAuth.FLAG_SSL, ha.mFlags); - assertEquals(443, ha.mPort); - - ha.setConnection("eas+ssl+trustallcerts", "server", -1); - assertEquals(HostAuth.FLAG_SSL|HostAuth.FLAG_TRUST_ALL, ha.mFlags); - assertEquals(443, ha.mPort); - } - - public void testSmtpConnectionScheme() { - HostAuth ha = new HostAuth(); - - // Set URIs for SMTP - // Hardwired port - ha.setConnection("smtp", "server", 123); - assertEquals(0, ha.mFlags); - assertEquals(123, ha.mPort); - - // Auto-assigned ports - ha.setConnection("smtp", "server", -1); - assertEquals(0, ha.mFlags); - assertEquals(587, ha.mPort); - - ha.setConnection("smtp+ssl", "server", -1); - assertEquals(HostAuth.FLAG_SSL, ha.mFlags); - assertEquals(465, ha.mPort); - - ha.setConnection("smtp+ssl+trustallcerts", "server", -1); - assertEquals(HostAuth.FLAG_SSL|HostAuth.FLAG_TRUST_ALL, ha.mFlags); - assertEquals(465, ha.mPort); - - ha.setConnection("smtp+tls", "server", -1); - assertEquals(HostAuth.FLAG_TLS, ha.mFlags); - assertEquals(587, ha.mPort); - - ha.setConnection("smtp+tls+trustallcerts", "server", -1); - assertEquals(HostAuth.FLAG_TLS|HostAuth.FLAG_TRUST_ALL, ha.mFlags); - assertEquals(587, ha.mPort); - } - /** * Test setting the connection using a protocol and flags */ @@ -421,155 +175,5 @@ public class HostAuthTests extends AndroidTestCase { } catch (IllegalArgumentException expected) { } } - - public void testGetSchemeString() { - String scheme; - - scheme = HostAuth.getSchemeString("foo", 0); - assertEquals("foo", scheme); - scheme = HostAuth.getSchemeString("foo", HostAuth.FLAG_SSL); - assertEquals("foo+ssl+", scheme); - scheme = HostAuth.getSchemeString("foo", HostAuth.FLAG_SSL | HostAuth.FLAG_TRUST_ALL); - assertEquals("foo+ssl+trustallcerts", scheme); - scheme = HostAuth.getSchemeString("foo", HostAuth.FLAG_TLS); - assertEquals("foo+tls+", scheme); - scheme = HostAuth.getSchemeString("foo", HostAuth.FLAG_TLS | HostAuth.FLAG_TRUST_ALL); - assertEquals("foo+tls+trustallcerts", scheme); - // error cases; no security string appended to protocol - scheme = HostAuth.getSchemeString("foo", HostAuth.FLAG_TRUST_ALL); - assertEquals("foo", scheme); - scheme = HostAuth.getSchemeString("foo", HostAuth.FLAG_SSL | HostAuth.FLAG_TLS); - assertEquals("foo", scheme); - scheme = HostAuth.getSchemeString("foo", - HostAuth.FLAG_SSL | HostAuth.FLAG_TLS | HostAuth.FLAG_TRUST_ALL); - scheme = HostAuth.getSchemeString("foo", 0xfffffff4); - assertEquals("foo", scheme); - // Use of custom client certs. - scheme = HostAuth.getSchemeString("foo", HostAuth.FLAG_SSL, "custom-client-cert-alias"); - assertEquals("foo+ssl+custom-client-cert-alias", scheme); - scheme = HostAuth.getSchemeString("foo", HostAuth.FLAG_TLS, "custom-client-cert-alias"); - assertEquals("foo+tls+custom-client-cert-alias", scheme); - scheme = HostAuth.getSchemeString( - "foo", HostAuth.FLAG_SSL | HostAuth.FLAG_TRUST_ALL, "custom-client-cert-alias"); - assertEquals("foo+ssl+trustallcerts+custom-client-cert-alias", scheme); - scheme = HostAuth.getSchemeString( - "foo", HostAuth.FLAG_TLS | HostAuth.FLAG_TRUST_ALL, "custom-client-cert-alias"); - assertEquals("foo+tls+trustallcerts+custom-client-cert-alias", scheme); - - try { - scheme = HostAuth.getSchemeString( - "foo", 0 /* no security flags */, "custom-client-cert-alias"); - fail("Should not be able to set a custom client cert on an insecure connection"); - } catch (IllegalArgumentException expected) { - } - } - - - public void testGetSchemeFlags() { - int flags; - - flags = HostAuth.getSchemeFlags(""); - assertEquals(0, flags); - flags = HostAuth.getSchemeFlags("+"); - assertEquals(0, flags); - flags = HostAuth.getSchemeFlags("foo+"); - assertEquals(0, flags); - flags = HostAuth.getSchemeFlags("foo+ssl"); - assertEquals(HostAuth.FLAG_SSL, flags); - flags = HostAuth.getSchemeFlags("foo+ssl+"); - assertEquals(HostAuth.FLAG_SSL, flags); - flags = HostAuth.getSchemeFlags("foo+ssl+trustallcerts"); - assertEquals(HostAuth.FLAG_SSL | HostAuth.FLAG_TRUST_ALL, flags); - flags = HostAuth.getSchemeFlags("foo+tls+"); - assertEquals(HostAuth.FLAG_TLS, flags); - flags = HostAuth.getSchemeFlags("foo+tls+trustallcerts"); - assertEquals(HostAuth.FLAG_TLS | HostAuth.FLAG_TRUST_ALL, flags); - flags = HostAuth.getSchemeFlags("foo+bogus"); - assertEquals(0, flags); - flags = HostAuth.getSchemeFlags("foo+bogus+trustallcerts"); - assertEquals(HostAuth.FLAG_TRUST_ALL, flags); - flags = HostAuth.getSchemeFlags("foo+ssl+bogus"); - assertEquals(HostAuth.FLAG_SSL, flags); - flags = HostAuth.getSchemeFlags("foo+ssl+trustallcerts+bogus"); - assertEquals(HostAuth.FLAG_SSL | HostAuth.FLAG_TRUST_ALL, flags); - flags = HostAuth.getSchemeFlags("foo+bogus+bogus"); - assertEquals(0, flags); - flags = HostAuth.getSchemeFlags("foo+bogus+bogus+bogus"); - assertEquals(0, flags); - } - - public void testEquals() throws URISyntaxException { - HostAuth ha1; - HostAuth ha2; - - ha1 = new HostAuth(); - ha2 = new HostAuth(); - assertTrue(ha1.equals(ha2)); - assertTrue(ha2.equals(ha1)); - - HostAuth.setHostAuthFromString(ha1, "smtp+tls+://user:password@server/domain"); - HostAuth.setHostAuthFromString(ha2, "smtp+tls+://user:password@server/domain"); - assertTrue(ha1.equals(ha2)); - assertTrue(ha2.equals(ha1)); - - // Different protocol - HostAuth.setHostAuthFromString(ha2, "imap+tls+://user:password@server/domain"); - assertFalse(ha1.equals(ha2)); - assertFalse(ha2.equals(ha1)); - // Different domain - HostAuth.setHostAuthFromString(ha2, "smtp+tls+://user:password@server/domain2"); - assertFalse(ha1.equals(ha2)); - assertFalse(ha2.equals(ha1)); - // Missing server - HostAuth.setHostAuthFromString(ha2, "smtp+tls+://user:password/domain"); - assertFalse(ha1.equals(ha2)); - assertFalse(ha2.equals(ha1)); - // Missing domain - HostAuth.setHostAuthFromString(ha2, "smtp+tls+://user:password@server"); - assertFalse(ha1.equals(ha2)); - assertFalse(ha2.equals(ha1)); - // Different server - HostAuth.setHostAuthFromString(ha2, "smtp+tls+://user:password@server2/domain"); - assertFalse(ha1.equals(ha2)); - assertFalse(ha2.equals(ha1)); - // Different password - HostAuth.setHostAuthFromString(ha2, "smtp+tls+://user:password2@server/domain"); - assertFalse(ha1.equals(ha2)); - assertFalse(ha2.equals(ha1)); - // Different user name - HostAuth.setHostAuthFromString(ha2, "smtp+tls+://user2:password@server/domain"); - assertFalse(ha1.equals(ha2)); - assertFalse(ha2.equals(ha1)); - // Missing password - HostAuth.setHostAuthFromString(ha2, "smtp+tls+://user@server/domain"); - assertFalse(ha1.equals(ha2)); - assertFalse(ha2.equals(ha1)); - // Missing user name - HostAuth.setHostAuthFromString(ha2, "smtp+tls+://password@server/domain"); - assertFalse(ha1.equals(ha2)); - assertFalse(ha2.equals(ha1)); - // Missing user name & password - HostAuth.setHostAuthFromString(ha2, "smtp+tls+://server/domain"); - assertFalse(ha1.equals(ha2)); - assertFalse(ha2.equals(ha1)); - // Added "trustallcerts" - HostAuth.setHostAuthFromString(ha2, "smtp+tls+trustallcerts://user:password@server/domain"); - assertFalse(ha1.equals(ha2)); - assertFalse(ha2.equals(ha1)); - // Different authentication - HostAuth.setHostAuthFromString(ha2, "smtp+ssl+://user:password@server/domain"); - assertFalse(ha1.equals(ha2)); - assertFalse(ha2.equals(ha1)); - // Missing authentication - HostAuth.setHostAuthFromString(ha2, "smtp+://user:password@server/domain"); - assertFalse(ha1.equals(ha2)); - assertFalse(ha2.equals(ha1)); - // Use of custom certificate - HostAuth.setHostAuthFromString(ha2, "smtp+ssl+clientcert://user:password@server/domain"); - assertFalse(ha1.equals(ha2)); - assertFalse(ha2.equals(ha1)); - ha2 = null; - assertFalse(ha1.equals(ha2)); - } }