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 */);
} 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 {
@ -761,17 +760,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);
@ -797,10 +799,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) {
@ -838,6 +838,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);
@ -924,11 +955,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();
}
@ -956,8 +984,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;
}
@ -1001,11 +1028,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;

View File

@ -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) {
@ -414,9 +413,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() {

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
final EmailServiceUtils.EmailServiceInfo info =
EmailServiceUtils.getServiceInfo(getActivity(), account.mHostAuthRecv.mProtocol);
setupData.getIncomingServiceInfo(getActivity());
if (!info.usesSmtp) {
mRequiresName = false;
mName.setVisibility(View.GONE);

View File

@ -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;

View File

@ -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() {