Centralize EmailServiceInfo retreival and pre-fill data for autodiscover

b/13341957
b/13356801

Change-Id: I9ed399bd6a695e14cf8019d3f62c7e5753e1f4d8
This commit is contained in:
Tony Mantler 2014-03-07 11:15:44 -08:00
parent 094656be6e
commit 064726d9f9
5 changed files with 111 additions and 36 deletions

View File

@ -562,7 +562,7 @@ public class AccountSetupFinal extends AccountSetupActivity
updateContentFragment(true /* addToBackstack */); updateContentFragment(true /* addToBackstack */);
} else { } else {
mState = STATE_AUTO_DISCOVER; mState = STATE_AUTO_DISCOVER;
initiateCheckSettingsFragment(SetupDataFragment.CHECK_AUTODISCOVER); initiateAutoDiscover();
} }
break; break;
case STATE_AUTO_DISCOVER: case STATE_AUTO_DISCOVER:
@ -578,8 +578,7 @@ public class AccountSetupFinal extends AccountSetupActivity
break; break;
case STATE_CHECKING_INCOMING: case STATE_CHECKING_INCOMING:
final EmailServiceUtils.EmailServiceInfo serviceInfo = final EmailServiceUtils.EmailServiceInfo serviceInfo =
EmailServiceUtils.getServiceInfo(this, mSetupData.getIncomingServiceInfo(this);
getSetupData().getAccount().getProtocol(this));
if (serviceInfo.usesSmtp) { if (serviceInfo.usesSmtp) {
mState = STATE_MANUAL_OUTGOING; mState = STATE_MANUAL_OUTGOING;
} else { } else {
@ -761,17 +760,20 @@ public class AccountSetupFinal extends AccountSetupActivity
recvAuth.setUserName(mProvider.incomingUsername); recvAuth.setUserName(mProvider.incomingUsername);
AccountSetupCredentialsFragment.populateHostAuthWithResults(this, recvAuth, AccountSetupCredentialsFragment.populateHostAuthWithResults(this, recvAuth,
mSetupData.getCredentialResults()); mSetupData.getCredentialResults());
mSetupData.setIncomingCredLoaded(true);
final EmailServiceUtils.EmailServiceInfo info = EmailServiceUtils.getServiceInfo(this, final EmailServiceUtils.EmailServiceInfo info = mSetupData.getIncomingServiceInfo(this);
recvAuth.mProtocol);
recvAuth.mPort = recvAuth.mPort =
((recvAuth.mFlags & HostAuth.FLAG_SSL) != 0) ? info.portSsl : info.port; ((recvAuth.mFlags & HostAuth.FLAG_SSL) != 0) ? info.portSsl : info.port;
final HostAuth sendAuth = account.getOrCreateHostAuthSend(this); if (info.usesSmtp) {
sendAuth.setHostAuthFromString(mProvider.outgoingUri); final HostAuth sendAuth = account.getOrCreateHostAuthSend(this);
sendAuth.setUserName(mProvider.outgoingUsername); sendAuth.setHostAuthFromString(mProvider.outgoingUri);
AccountSetupCredentialsFragment.populateHostAuthWithResults(this, sendAuth, sendAuth.setUserName(mProvider.outgoingUsername);
mSetupData.getCredentialResults()); AccountSetupCredentialsFragment.populateHostAuthWithResults(this, sendAuth,
mSetupData.getCredentialResults());
mSetupData.setOutgoingCredLoaded(true);
}
// Populate the setup data, assuming that the duplicate account check will succeed // Populate the setup data, assuming that the duplicate account check will succeed
populateSetupData(mOwnerName, email); populateSetupData(mOwnerName, email);
@ -797,10 +799,8 @@ public class AccountSetupFinal extends AccountSetupActivity
* @param account Account object to fill in * @param account Account object to fill in
*/ */
public void setDefaultsForProtocol(Account account) { public void setDefaultsForProtocol(Account account) {
final String protocol = account.getOrCreateHostAuthRecv(this).mProtocol; final EmailServiceUtils.EmailServiceInfo info = mSetupData.getIncomingServiceInfo(this);
if (protocol == null) return; if (info == null) return;
final EmailServiceUtils.EmailServiceInfo info =
EmailServiceUtils.getServiceInfo(this, protocol);
account.mSyncInterval = info.defaultSyncInterval; account.mSyncInterval = info.defaultSyncInterval;
account.mSyncLookback = info.defaultLookback; account.mSyncLookback = info.defaultLookback;
if (info.offerLocalDeletes) { if (info.offerLocalDeletes) {
@ -838,6 +838,37 @@ public class AccountSetupFinal extends AccountSetupActivity
@Override @Override
public void onAccountServerSaveComplete() {} 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) { private void initiateCheckSettingsFragment(int checkMode) {
final Fragment f = AccountCheckSettingsFragment.newInstance(checkMode); final Fragment f = AccountCheckSettingsFragment.newInstance(checkMode);
final Fragment d = CheckSettingsProgressDialogFragment.newInstance(checkMode); final Fragment d = CheckSettingsProgressDialogFragment.newInstance(checkMode);
@ -924,11 +955,8 @@ public class AccountSetupFinal extends AccountSetupActivity
@Override @Override
public void onChooseProtocol(String protocol) { public void onChooseProtocol(String protocol) {
mSetupData.setIncomingProtocol(this, protocol);
final Account account = mSetupData.getAccount(); 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); setDefaultsForProtocol(account);
proceed(); proceed();
} }
@ -956,8 +984,7 @@ public class AccountSetupFinal extends AccountSetupActivity
account.setDisplayName(account.getEmailAddress()); account.setDisplayName(account.getEmailAddress());
int newFlags = account.getFlags() & ~(Account.FLAGS_BACKGROUND_ATTACHMENTS); int newFlags = account.getFlags() & ~(Account.FLAGS_BACKGROUND_ATTACHMENTS);
final EmailServiceUtils.EmailServiceInfo serviceInfo = final EmailServiceUtils.EmailServiceInfo serviceInfo =
EmailServiceUtils.getServiceInfo(getApplicationContext(), mSetupData.getIncomingServiceInfo(this);
account.mHostAuthRecv.mProtocol);
if (serviceInfo.offerAttachmentPreload && fragment.getBackgroundAttachmentsValue()) { if (serviceInfo.offerAttachmentPreload && fragment.getBackgroundAttachmentsValue()) {
newFlags |= Account.FLAGS_BACKGROUND_ATTACHMENTS; newFlags |= Account.FLAGS_BACKGROUND_ATTACHMENTS;
} }
@ -1001,11 +1028,9 @@ public class AccountSetupFinal extends AccountSetupActivity
// If the account manager initiated the creation, and success was not reported, // 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. // then we assume that we're giving up (for any reason) - report failure.
if (mAccountAuthenticatorResponse != null) { if (mAccountAuthenticatorResponse != null) {
final Account account = getSetupData().getAccount(); final EmailServiceUtils.EmailServiceInfo info = mSetupData.getIncomingServiceInfo(this);
final EmailServiceUtils.EmailServiceInfo info =
EmailServiceUtils.getServiceInfo(this, account.getProtocol(this));
final Bundle b = new Bundle(2); 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); b.putString(AccountManager.KEY_ACCOUNT_TYPE, info.accountType);
mAccountAuthenticatorResponse.onResult(b); mAccountAuthenticatorResponse.onResult(b);
mAccountAuthenticatorResponse = null; mAccountAuthenticatorResponse = null;

View File

@ -40,7 +40,6 @@ import com.android.email.R;
import com.android.email.activity.UiUtilities; import com.android.email.activity.UiUtilities;
import com.android.email.activity.setup.AuthenticationView.AuthenticationCallback; import com.android.email.activity.setup.AuthenticationView.AuthenticationCallback;
import com.android.email.provider.AccountBackupRestore; import com.android.email.provider.AccountBackupRestore;
import com.android.email.service.EmailServiceUtils;
import com.android.email.service.EmailServiceUtils.EmailServiceInfo; import com.android.email.service.EmailServiceUtils.EmailServiceInfo;
import com.android.email.view.CertificateSelector; import com.android.email.view.CertificateSelector;
import com.android.email.view.CertificateSelector.HostCallback; import com.android.email.view.CertificateSelector.HostCallback;
@ -210,7 +209,7 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment
mSetupData.setIncomingCredLoaded(true); mSetupData.setIncomingCredLoaded(true);
} }
mServiceInfo = EmailServiceUtils.getServiceInfo(mAppContext, recvAuth.mProtocol); mServiceInfo = mSetupData.getIncomingServiceInfo(context);
if (mServiceInfo.offerLocalDeletes) { if (mServiceInfo.offerLocalDeletes) {
SpinnerOption deletePolicies[] = { SpinnerOption deletePolicies[] = {
@ -341,7 +340,7 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment
final Account account = mSetupData.getAccount(); final Account account = mSetupData.getAccount();
final HostAuth recvAuth = account.getOrCreateHostAuthRecv(mAppContext); final HostAuth recvAuth = account.getOrCreateHostAuthRecv(mAppContext);
mServiceInfo = EmailServiceUtils.getServiceInfo(mAppContext, recvAuth.mProtocol); mServiceInfo = mSetupData.getIncomingServiceInfo(getActivity());
mAuthenticationView.setAuthInfo(mServiceInfo.offerOAuth, recvAuth); mAuthenticationView.setAuthInfo(mServiceInfo.offerOAuth, recvAuth);
if (mAuthenticationLabel != null) { if (mAuthenticationLabel != null) {
if (mServiceInfo.offerOAuth) { if (mServiceInfo.offerOAuth) {
@ -414,9 +413,7 @@ public class AccountSetupIncomingFragment extends AccountServerBaseFragment
} }
private int getPortFromSecurityType(boolean useSsl) { private int getPortFromSecurityType(boolean useSsl) {
final EmailServiceInfo info = EmailServiceUtils.getServiceInfo(mAppContext, return useSsl ? mServiceInfo.portSsl : mServiceInfo.port;
mSetupData.getAccount().mHostAuthRecv.mProtocol);
return useSsl ? info.portSsl : info.port;
} }
private boolean getSslSelected() { private boolean getSslSelected() {

View File

@ -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 // Remember whether we're an EAS account, since it doesn't require the user name field
final EmailServiceUtils.EmailServiceInfo info = final EmailServiceUtils.EmailServiceInfo info =
EmailServiceUtils.getServiceInfo(getActivity(), account.mHostAuthRecv.mProtocol); setupData.getIncomingServiceInfo(getActivity());
if (!info.usesSmtp) { if (!info.usesSmtp) {
mRequiresName = false; mRequiresName = false;
mName.setVisibility(View.GONE); mName.setVisibility(View.GONE);

View File

@ -79,13 +79,12 @@ public class AccountSetupOptionsFragment extends AccountSetupFragment {
final View view = getView(); final View view = getView();
final SetupDataFragment.SetupDataContainer container = final SetupDataFragment setupData =
(SetupDataFragment.SetupDataContainer) getActivity(); ((SetupDataFragment.SetupDataContainer) getActivity()).getSetupData();
final Account account = container.getSetupData().getAccount(); final Account account = setupData.getAccount();
final EmailServiceUtils.EmailServiceInfo serviceInfo = final EmailServiceUtils.EmailServiceInfo serviceInfo =
EmailServiceUtils.getServiceInfo(getActivity().getApplicationContext(), setupData.getIncomingServiceInfo(getActivity());
account.mHostAuthRecv.mProtocol);
final CharSequence[] frequencyValues = serviceInfo.syncIntervals; final CharSequence[] frequencyValues = serviceInfo.syncIntervals;
final CharSequence[] frequencyEntries = serviceInfo.syncIntervalStrings; final CharSequence[] frequencyEntries = serviceInfo.syncIntervalStrings;

View File

@ -1,11 +1,14 @@
package com.android.email.activity.setup; package com.android.email.activity.setup;
import android.app.Fragment; import android.app.Fragment;
import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import com.android.email.service.EmailServiceUtils;
import com.android.emailcommon.provider.Account; import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.HostAuth;
import com.android.emailcommon.provider.Policy; 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_INCOMING_LOADED = "SetupDataFragment.incomingLoaded";
private static final String SAVESTATE_OUTGOING_LOADED = "SetupDataFragment.outgoingLoaded"; private static final String SAVESTATE_OUTGOING_LOADED = "SetupDataFragment.outgoingLoaded";
private static final String SAVESTATE_POLICY = "SetupDataFragment.policy"; private static final String SAVESTATE_POLICY = "SetupDataFragment.policy";
private static final String SAVESTATE_INCOMING_PROTOCOL = "SetupDataFragment.incomingProtocol";
// All access will be through getters/setters // All access will be through getters/setters
private int mFlowMode = FLOW_MODE_NORMAL; private int mFlowMode = FLOW_MODE_NORMAL;
@ -54,6 +58,9 @@ public class SetupDataFragment extends Fragment implements Parcelable {
private boolean mOutgoingCredLoaded = true; private boolean mOutgoingCredLoaded = true;
// This is accessed off-thread in AccountCheckSettingsFragment // This is accessed off-thread in AccountCheckSettingsFragment
private volatile Policy mPolicy; private volatile Policy mPolicy;
// Cache incoming protocol and service info here
private EmailServiceUtils.EmailServiceInfo mIncomingServiceInfo;
private String mIncomingProtocol;
public interface SetupDataContainer { public interface SetupDataContainer {
public SetupDataFragment getSetupData(); public SetupDataFragment getSetupData();
@ -86,6 +93,7 @@ public class SetupDataFragment extends Fragment implements Parcelable {
outState.putBoolean(SAVESTATE_INCOMING_LOADED, mIncomingCredLoaded); outState.putBoolean(SAVESTATE_INCOMING_LOADED, mIncomingCredLoaded);
outState.putBoolean(SAVESTATE_OUTGOING_LOADED, mOutgoingCredLoaded); outState.putBoolean(SAVESTATE_OUTGOING_LOADED, mOutgoingCredLoaded);
outState.putParcelable(SAVESTATE_POLICY, mPolicy); outState.putParcelable(SAVESTATE_POLICY, mPolicy);
outState.putString(SAVESTATE_INCOMING_PROTOCOL, mIncomingProtocol);
} }
@Override @Override
@ -99,6 +107,7 @@ public class SetupDataFragment extends Fragment implements Parcelable {
mIncomingCredLoaded = savedInstanceState.getBoolean(SAVESTATE_INCOMING_LOADED); mIncomingCredLoaded = savedInstanceState.getBoolean(SAVESTATE_INCOMING_LOADED);
mOutgoingCredLoaded = savedInstanceState.getBoolean(SAVESTATE_OUTGOING_LOADED); mOutgoingCredLoaded = savedInstanceState.getBoolean(SAVESTATE_OUTGOING_LOADED);
mPolicy = savedInstanceState.getParcelable(SAVESTATE_POLICY); mPolicy = savedInstanceState.getParcelable(SAVESTATE_POLICY);
mIncomingProtocol = savedInstanceState.getString(SAVESTATE_INCOMING_PROTOCOL);
} }
setRetainInstance(true); setRetainInstance(true);
} }
@ -165,6 +174,51 @@ public class SetupDataFragment extends Fragment implements Parcelable {
mPolicy = policy; 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 // Parcelable methods
@Override @Override
public int describeContents() { public int describeContents() {