diff --git a/src/com/android/email/activity/setup/AccountSetupFinal.java b/src/com/android/email/activity/setup/AccountSetupFinal.java index 269de5d4e..20249aa43 100644 --- a/src/com/android/email/activity/setup/AccountSetupFinal.java +++ b/src/com/android/email/activity/setup/AccountSetupFinal.java @@ -562,7 +562,7 @@ public class AccountSetupFinal extends AccountSetupActivity updateContentFragment(true /* addToBackstack */); } else { mState = STATE_AUTO_DISCOVER; - initiateCheckSettingsFragment(SetupDataFragment.CHECK_AUTODISCOVER); + initiateAutoDiscover(); } break; case STATE_AUTO_DISCOVER: @@ -578,8 +578,7 @@ public class AccountSetupFinal extends AccountSetupActivity break; case STATE_CHECKING_INCOMING: final EmailServiceUtils.EmailServiceInfo serviceInfo = - EmailServiceUtils.getServiceInfo(this, - getSetupData().getAccount().getProtocol(this)); + mSetupData.getIncomingServiceInfo(this); if (serviceInfo.usesSmtp) { mState = STATE_MANUAL_OUTGOING; } else { @@ -762,17 +761,20 @@ public class AccountSetupFinal extends AccountSetupActivity recvAuth.setUserName(mProvider.incomingUsername); AccountSetupCredentialsFragment.populateHostAuthWithResults(this, recvAuth, mSetupData.getCredentialResults()); + mSetupData.setIncomingCredLoaded(true); - final EmailServiceUtils.EmailServiceInfo info = EmailServiceUtils.getServiceInfo(this, - recvAuth.mProtocol); + final EmailServiceUtils.EmailServiceInfo info = mSetupData.getIncomingServiceInfo(this); recvAuth.mPort = ((recvAuth.mFlags & HostAuth.FLAG_SSL) != 0) ? info.portSsl : info.port; - final HostAuth sendAuth = account.getOrCreateHostAuthSend(this); - sendAuth.setHostAuthFromString(mProvider.outgoingUri); - sendAuth.setUserName(mProvider.outgoingUsername); - AccountSetupCredentialsFragment.populateHostAuthWithResults(this, sendAuth, - mSetupData.getCredentialResults()); + if (info.usesSmtp) { + final HostAuth sendAuth = account.getOrCreateHostAuthSend(this); + sendAuth.setHostAuthFromString(mProvider.outgoingUri); + sendAuth.setUserName(mProvider.outgoingUsername); + AccountSetupCredentialsFragment.populateHostAuthWithResults(this, sendAuth, + mSetupData.getCredentialResults()); + mSetupData.setOutgoingCredLoaded(true); + } // Populate the setup data, assuming that the duplicate account check will succeed populateSetupData(mOwnerName, email); @@ -798,10 +800,8 @@ public class AccountSetupFinal extends AccountSetupActivity * @param account Account object to fill in */ public void setDefaultsForProtocol(Account account) { - final String protocol = account.getOrCreateHostAuthRecv(this).mProtocol; - if (protocol == null) return; - final EmailServiceUtils.EmailServiceInfo info = - EmailServiceUtils.getServiceInfo(this, protocol); + final EmailServiceUtils.EmailServiceInfo info = mSetupData.getIncomingServiceInfo(this); + if (info == null) return; account.mSyncInterval = info.defaultSyncInterval; account.mSyncLookback = info.defaultLookback; if (info.offerLocalDeletes) { @@ -839,6 +839,37 @@ public class AccountSetupFinal extends AccountSetupActivity @Override public void onAccountServerSaveComplete() {} + private void initiateAutoDiscover() { + final String email = mSetupData.getEmail(); + final String[] emailParts = email.split("@"); + final String domain = emailParts[1]; + + final Account account = mSetupData.getAccount(); + + final HostAuth recvAuth = account.getOrCreateHostAuthRecv(this); + recvAuth.setUserName(email); + recvAuth.setConnection(mSetupData.getIncomingProtocol(), domain, + HostAuth.PORT_UNKNOWN, HostAuth.FLAG_NONE); + AccountSetupCredentialsFragment.populateHostAuthWithResults(this, recvAuth, + mSetupData.getCredentialResults()); + mSetupData.setIncomingCredLoaded(true); + + final EmailServiceUtils.EmailServiceInfo info = + mSetupData.getIncomingServiceInfo(this); + if (info.usesSmtp) { + final HostAuth sendAuth = account.getOrCreateHostAuthSend(this); + sendAuth.setUserName(email); + sendAuth.setConnection(HostAuth.LEGACY_SCHEME_SMTP, domain, + HostAuth.PORT_UNKNOWN, HostAuth.FLAG_NONE); + AccountSetupCredentialsFragment.populateHostAuthWithResults(this, sendAuth, + mSetupData.getCredentialResults()); + mSetupData.setOutgoingCredLoaded(true); + } + + // Populate the setup data, assuming that the duplicate account check will succeed + initiateCheckSettingsFragment(SetupDataFragment.CHECK_AUTODISCOVER); + } + private void initiateCheckSettingsFragment(int checkMode) { final Fragment f = AccountCheckSettingsFragment.newInstance(checkMode); final Fragment d = CheckSettingsProgressDialogFragment.newInstance(checkMode); @@ -925,11 +956,8 @@ public class AccountSetupFinal extends AccountSetupActivity @Override public void onChooseProtocol(String protocol) { + mSetupData.setIncomingProtocol(this, protocol); final Account account = mSetupData.getAccount(); - final HostAuth recvAuth = account.getOrCreateHostAuthRecv(this); - recvAuth.setConnection(protocol, recvAuth.mAddress, recvAuth.mPort, recvAuth.mFlags); - - recvAuth.mLogin = mSetupData.getEmail(); setDefaultsForProtocol(account); proceed(); } @@ -957,8 +985,7 @@ public class AccountSetupFinal extends AccountSetupActivity account.setDisplayName(account.getEmailAddress()); int newFlags = account.getFlags() & ~(Account.FLAGS_BACKGROUND_ATTACHMENTS); final EmailServiceUtils.EmailServiceInfo serviceInfo = - EmailServiceUtils.getServiceInfo(getApplicationContext(), - account.mHostAuthRecv.mProtocol); + mSetupData.getIncomingServiceInfo(this); if (serviceInfo.offerAttachmentPreload && fragment.getBackgroundAttachmentsValue()) { newFlags |= Account.FLAGS_BACKGROUND_ATTACHMENTS; } @@ -1003,11 +1030,9 @@ public class AccountSetupFinal extends AccountSetupActivity // If the account manager initiated the creation, and success was not reported, // then we assume that we're giving up (for any reason) - report failure. if (mAccountAuthenticatorResponse != null) { - final Account account = getSetupData().getAccount(); - final EmailServiceUtils.EmailServiceInfo info = - EmailServiceUtils.getServiceInfo(this, account.getProtocol(this)); + final EmailServiceUtils.EmailServiceInfo info = mSetupData.getIncomingServiceInfo(this); final Bundle b = new Bundle(2); - b.putString(AccountManager.KEY_ACCOUNT_NAME, account.getEmailAddress()); + b.putString(AccountManager.KEY_ACCOUNT_NAME, mSetupData.getEmail()); b.putString(AccountManager.KEY_ACCOUNT_TYPE, info.accountType); mAccountAuthenticatorResponse.onResult(b); mAccountAuthenticatorResponse = null; diff --git a/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java b/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java index 29d74d78b..9276b0bc4 100644 --- a/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java +++ b/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java @@ -40,7 +40,6 @@ import com.android.email.R; import com.android.email.activity.UiUtilities; import com.android.email.activity.setup.AuthenticationView.AuthenticationCallback; import com.android.email.provider.AccountBackupRestore; -import com.android.email.service.EmailServiceUtils; import com.android.email.service.EmailServiceUtils.EmailServiceInfo; import com.android.email.view.CertificateSelector; import com.android.email.view.CertificateSelector.HostCallback; @@ -210,7 +209,7 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment mSetupData.setIncomingCredLoaded(true); } - mServiceInfo = EmailServiceUtils.getServiceInfo(mAppContext, recvAuth.mProtocol); + mServiceInfo = mSetupData.getIncomingServiceInfo(context); if (mServiceInfo.offerLocalDeletes) { SpinnerOption deletePolicies[] = { @@ -341,7 +340,7 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment final Account account = mSetupData.getAccount(); final HostAuth recvAuth = account.getOrCreateHostAuthRecv(mAppContext); - mServiceInfo = EmailServiceUtils.getServiceInfo(mAppContext, recvAuth.mProtocol); + mServiceInfo = mSetupData.getIncomingServiceInfo(getActivity()); mAuthenticationView.setAuthInfo(mServiceInfo.offerOAuth, recvAuth); if (mAuthenticationLabel != null) { if (mServiceInfo.offerOAuth) { @@ -418,9 +417,7 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment } private int getPortFromSecurityType(boolean useSsl) { - final EmailServiceInfo info = EmailServiceUtils.getServiceInfo(mAppContext, - mSetupData.getAccount().mHostAuthRecv.mProtocol); - return useSsl ? info.portSsl : info.port; + return useSsl ? mServiceInfo.portSsl : mServiceInfo.port; } private boolean getSslSelected() { diff --git a/src/com/android/email/activity/setup/AccountSetupNamesFragment.java b/src/com/android/email/activity/setup/AccountSetupNamesFragment.java index 0e52ad307..00d40975d 100644 --- a/src/com/android/email/activity/setup/AccountSetupNamesFragment.java +++ b/src/com/android/email/activity/setup/AccountSetupNamesFragment.java @@ -105,7 +105,7 @@ public class AccountSetupNamesFragment extends AccountSetupFragment { // Remember whether we're an EAS account, since it doesn't require the user name field final EmailServiceUtils.EmailServiceInfo info = - EmailServiceUtils.getServiceInfo(getActivity(), account.mHostAuthRecv.mProtocol); + setupData.getIncomingServiceInfo(getActivity()); if (!info.usesSmtp) { mRequiresName = false; mName.setVisibility(View.GONE); diff --git a/src/com/android/email/activity/setup/AccountSetupOptionsFragment.java b/src/com/android/email/activity/setup/AccountSetupOptionsFragment.java index 272045503..8903eb5ee 100644 --- a/src/com/android/email/activity/setup/AccountSetupOptionsFragment.java +++ b/src/com/android/email/activity/setup/AccountSetupOptionsFragment.java @@ -79,13 +79,12 @@ public class AccountSetupOptionsFragment extends AccountSetupFragment { final View view = getView(); - final SetupDataFragment.SetupDataContainer container = - (SetupDataFragment.SetupDataContainer) getActivity(); - final Account account = container.getSetupData().getAccount(); + final SetupDataFragment setupData = + ((SetupDataFragment.SetupDataContainer) getActivity()).getSetupData(); + final Account account = setupData.getAccount(); final EmailServiceUtils.EmailServiceInfo serviceInfo = - EmailServiceUtils.getServiceInfo(getActivity().getApplicationContext(), - account.mHostAuthRecv.mProtocol); + setupData.getIncomingServiceInfo(getActivity()); final CharSequence[] frequencyValues = serviceInfo.syncIntervals; final CharSequence[] frequencyEntries = serviceInfo.syncIntervalStrings; diff --git a/src/com/android/email/activity/setup/SetupDataFragment.java b/src/com/android/email/activity/setup/SetupDataFragment.java index 48f1be9b0..ab5e435f0 100644 --- a/src/com/android/email/activity/setup/SetupDataFragment.java +++ b/src/com/android/email/activity/setup/SetupDataFragment.java @@ -1,11 +1,14 @@ package com.android.email.activity.setup; import android.app.Fragment; +import android.content.Context; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; +import com.android.email.service.EmailServiceUtils; import com.android.emailcommon.provider.Account; +import com.android.emailcommon.provider.HostAuth; import com.android.emailcommon.provider.Policy; /** @@ -42,6 +45,7 @@ public class SetupDataFragment extends Fragment implements Parcelable { private static final String SAVESTATE_INCOMING_LOADED = "SetupDataFragment.incomingLoaded"; private static final String SAVESTATE_OUTGOING_LOADED = "SetupDataFragment.outgoingLoaded"; private static final String SAVESTATE_POLICY = "SetupDataFragment.policy"; + private static final String SAVESTATE_INCOMING_PROTOCOL = "SetupDataFragment.incomingProtocol"; // All access will be through getters/setters private int mFlowMode = FLOW_MODE_NORMAL; @@ -54,6 +58,9 @@ public class SetupDataFragment extends Fragment implements Parcelable { private boolean mOutgoingCredLoaded = true; // This is accessed off-thread in AccountCheckSettingsFragment private volatile Policy mPolicy; + // Cache incoming protocol and service info here + private EmailServiceUtils.EmailServiceInfo mIncomingServiceInfo; + private String mIncomingProtocol; public interface SetupDataContainer { public SetupDataFragment getSetupData(); @@ -86,6 +93,7 @@ public class SetupDataFragment extends Fragment implements Parcelable { outState.putBoolean(SAVESTATE_INCOMING_LOADED, mIncomingCredLoaded); outState.putBoolean(SAVESTATE_OUTGOING_LOADED, mOutgoingCredLoaded); outState.putParcelable(SAVESTATE_POLICY, mPolicy); + outState.putString(SAVESTATE_INCOMING_PROTOCOL, mIncomingProtocol); } @Override @@ -99,6 +107,7 @@ public class SetupDataFragment extends Fragment implements Parcelable { mIncomingCredLoaded = savedInstanceState.getBoolean(SAVESTATE_INCOMING_LOADED); mOutgoingCredLoaded = savedInstanceState.getBoolean(SAVESTATE_OUTGOING_LOADED); mPolicy = savedInstanceState.getParcelable(SAVESTATE_POLICY); + mIncomingProtocol = savedInstanceState.getString(SAVESTATE_INCOMING_PROTOCOL); } setRetainInstance(true); } @@ -165,6 +174,51 @@ public class SetupDataFragment extends Fragment implements Parcelable { mPolicy = policy; } + /** + * Retrieve the service info for the incoming protocol + * @param context For resolving the service info, and possibly loading the {@link HostAuth} + * @return service info object + */ + public EmailServiceUtils.EmailServiceInfo getIncomingServiceInfo(Context context) { + if (mIncomingServiceInfo == null) { + mIncomingServiceInfo = EmailServiceUtils.getServiceInfo(context, + getIncomingProtocol(context)); + } + return mIncomingServiceInfo; + } + + /** + * Retrieve the protocol as previously set in setIncomingProtocol, but don't attempt to look at + * {@link #mAccount#hostAuthRecv } + * @return Protocol string + */ + public String getIncomingProtocol() { + return mIncomingProtocol; + } + + /** + * Retrieve the protocol as previously set in setIncomingProtocol, or from + * {@link #mAccount#hostAuthRecv}. Try not to call this on the main thread if it's unlikely that + * the hostauth isn't already loaded. + * @param context context to possibly load the {@link HostAuth} from the provider + * @return Protocol string + */ + public String getIncomingProtocol(Context context) { + if (mIncomingProtocol != null) { + return mIncomingProtocol; + } + + final HostAuth recvAuth = mAccount.getOrCreateHostAuthRecv(context); + return recvAuth.mProtocol; + } + + public void setIncomingProtocol(final Context context, final String protocol) { + final HostAuth recvAuth = mAccount.getOrCreateHostAuthRecv(context); + recvAuth.setConnection(protocol, recvAuth.mAddress, recvAuth.mPort, recvAuth.mFlags); + mIncomingProtocol = protocol; + mIncomingServiceInfo = null; + } + // Parcelable methods @Override public int describeContents() {