11b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler/*
21b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * Copyright (C) 2010 The Android Open Source Project
31b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler *
41b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * Licensed under the Apache License, Version 2.0 (the "License");
51b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * you may not use this file except in compliance with the License.
61b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * You may obtain a copy of the License at
71b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler *
81b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler *      http://www.apache.org/licenses/LICENSE-2.0
91b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler *
101b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * Unless required by applicable law or agreed to in writing, software
111b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * distributed under the License is distributed on an "AS IS" BASIS,
121b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * See the License for the specific language governing permissions and
141b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * limitations under the License.
151b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler */
161b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
171b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerpackage com.android.email.activity.setup;
181b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
191b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.app.Activity;
201b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.content.Context;
21d23fa61a014fc567592592eac629680764f042b5Martin Hibdonimport android.content.Intent;
2276472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantlerimport android.content.Loader;
231b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.os.Bundle;
24294593c5f592f4eec6994909cca60450936a0812Tony Mantlerimport android.os.Parcel;
251b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.text.Editable;
265125c06cef67447a0ef5881d8fbfd6b73e1dfd0aBen Komaloimport android.text.TextUtils;
271b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.text.TextWatcher;
281b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.text.method.DigitsKeyListener;
291b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.view.LayoutInflater;
301b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.view.View;
311b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.view.ViewGroup;
323432bdb757c4195fb4726c8b401f2261e78d75a7Ben Komaloimport android.view.inputmethod.EditorInfo;
331b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.widget.AdapterView;
341b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.widget.ArrayAdapter;
351b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.widget.EditText;
361b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.widget.Spinner;
371b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.widget.TextView;
381b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3969111b1e19456c4e861b031da3b3b7f26893d664Marc Blankimport com.android.email.R;
4069111b1e19456c4e861b031da3b3b7f26893d664Marc Blankimport com.android.email.activity.UiUtilities;
4126ff609ebff3ef0f5ff841eb5d78c11edf8f0936Martin Hibdonimport com.android.email.activity.setup.AuthenticationView.AuthenticationCallback;
4269111b1e19456c4e861b031da3b3b7f26893d664Marc Blankimport com.android.email.provider.AccountBackupRestore;
43f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport com.android.email.service.EmailServiceUtils.EmailServiceInfo;
44719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdonimport com.android.email.view.CertificateSelector;
45719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdonimport com.android.email.view.CertificateSelector.HostCallback;
46719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdonimport com.android.emailcommon.Device;
479c0463e6b485b3b50d9c6f110a9ece650cd4a692Martin Hibdonimport com.android.emailcommon.VendorPolicyLoader;
48f5418f1f93b02e7fab9f15eb201800b65510998eMarc Blankimport com.android.emailcommon.provider.Account;
4958fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdonimport com.android.emailcommon.provider.Credential;
5069111b1e19456c4e861b031da3b3b7f26893d664Marc Blankimport com.android.emailcommon.provider.HostAuth;
51d23fa61a014fc567592592eac629680764f042b5Martin Hibdonimport com.android.emailcommon.utility.CertificateRequestor;
5269111b1e19456c4e861b031da3b3b7f26893d664Marc Blankimport com.android.emailcommon.utility.Utility;
5376472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantlerimport com.android.mail.ui.MailAsyncTaskLoader;
5428a344042d0f8353d2e5c15fe3951c1e0520f1b7Paul Westbrookimport com.android.mail.utils.LogUtils;
5569111b1e19456c4e861b031da3b3b7f26893d664Marc Blank
56719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdonimport java.io.IOException;
57f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport java.util.ArrayList;
589c0463e6b485b3b50d9c6f110a9ece650cd4a692Martin Hibdonimport java.util.List;
59f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank
60fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler/**
61fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * Provides UI for IMAP/POP account settings.
62fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler *
63fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * This fragment is used by AccountSetupIncoming (for creating accounts) and by AccountSettingsXL
64fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * (for editing existing accounts).
65fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler */
66f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankpublic class AccountSetupIncomingFragment extends AccountServerBaseFragment
67719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon        implements HostCallback, AuthenticationCallback {
681b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
69d23fa61a014fc567592592eac629680764f042b5Martin Hibdon    private static final int CERTIFICATE_REQUEST = 0;
7058fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdon    private static final int SIGN_IN_REQUEST = 1;
71d23fa61a014fc567592592eac629680764f042b5Martin Hibdon
721f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    private final static String STATE_KEY_CREDENTIAL = "AccountSetupIncomingFragment.credential";
731f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    private final static String STATE_KEY_LOADED = "AccountSetupIncomingFragment.loaded";
741b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
751b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private EditText mUsernameView;
7626ff609ebff3ef0f5ff841eb5d78c11edf8f0936Martin Hibdon    private AuthenticationView mAuthenticationView;
77719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon    private TextView mAuthenticationLabel;
781b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private TextView mServerLabelView;
791b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private EditText mServerView;
801b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private EditText mPortView;
811b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private Spinner mSecurityTypeView;
821b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private TextView mDeletePolicyLabelView;
831b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private Spinner mDeletePolicyView;
84719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon    private CertificateSelector mClientCertificateSelector;
85719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon    private View mDeviceIdSection;
861b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private View mImapPathPrefixSectionView;
871b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private EditText mImapPathPrefixView;
889c0463e6b485b3b50d9c6f110a9ece650cd4a692Martin Hibdon    private boolean mOAuthProviderPresent;
89c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    // Delete policy as loaded from the device
90c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    private int mLoadedDeletePolicy;
911b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
92ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler    private TextWatcher mValidationTextWatcher;
93ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler
941b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    // Support for lifecycle
951b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private boolean mLoaded;
961b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private String mCacheLoginCredential;
97f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    private EmailServiceInfo mServiceInfo;
981b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
9976472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler    public static AccountSetupIncomingFragment newInstance(boolean settingsMode) {
10076472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        final AccountSetupIncomingFragment f = new AccountSetupIncomingFragment();
10176472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        f.setArguments(getArgs(settingsMode));
10276472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        return f;
10376472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler    }
10476472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler
1057985b43ab7310f76c170266da346f993d2f86051Paul Westbrook    // Public no-args constructor needed for fragment re-instantiation
1067985b43ab7310f76c170266da346f993d2f86051Paul Westbrook    public AccountSetupIncomingFragment() {}
1077985b43ab7310f76c170266da346f993d2f86051Paul Westbrook
1081b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
1091b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Called to do initial creation of a fragment.  This is called after
1101b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * {@link #onAttach(Activity)} and before {@link #onActivityCreated(Bundle)}.
1111b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
1121b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
1131b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onCreate(Bundle savedInstanceState) {
1141b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onCreate(savedInstanceState);
1151b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
116faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        if (savedInstanceState != null) {
117faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            mCacheLoginCredential = savedInstanceState.getString(STATE_KEY_CREDENTIAL);
1181f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mLoaded = savedInstanceState.getBoolean(STATE_KEY_LOADED, false);
119faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
1201b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
1211b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1221b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
1231b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public View onCreateView(LayoutInflater inflater, ViewGroup container,
1241b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Bundle savedInstanceState) {
125ae980cd685a867b3fecfd38c876fd18d98b7c86bTony Mantler        final View view;
126ae980cd685a867b3fecfd38c876fd18d98b7c86bTony Mantler        if (mSettingsMode) {
127ae980cd685a867b3fecfd38c876fd18d98b7c86bTony Mantler            view = inflater.inflate(R.layout.account_settings_incoming_fragment, container, false);
128ae980cd685a867b3fecfd38c876fd18d98b7c86bTony Mantler        } else {
129ae980cd685a867b3fecfd38c876fd18d98b7c86bTony Mantler            view = inflateTemplatedView(inflater, container,
130ae980cd685a867b3fecfd38c876fd18d98b7c86bTony Mantler                    R.layout.account_setup_incoming_fragment,
131ae980cd685a867b3fecfd38c876fd18d98b7c86bTony Mantler                    R.string.account_setup_incoming_headline);
132ae980cd685a867b3fecfd38c876fd18d98b7c86bTony Mantler        }
133219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler
134219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler        mUsernameView = UiUtilities.getView(view, R.id.account_username);
135219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler        mServerLabelView = UiUtilities.getView(view, R.id.account_server_label);
136219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler        mServerView = UiUtilities.getView(view, R.id.account_server);
137219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler        mPortView = UiUtilities.getView(view, R.id.account_port);
138219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler        mSecurityTypeView = UiUtilities.getView(view, R.id.account_security_type);
139219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler        mDeletePolicyLabelView = UiUtilities.getView(view, R.id.account_delete_policy_label);
140219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler        mDeletePolicyView = UiUtilities.getView(view, R.id.account_delete_policy);
1412fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki        mImapPathPrefixSectionView = UiUtilities.getView(view, R.id.imap_path_prefix_section);
142219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler        mImapPathPrefixView = UiUtilities.getView(view, R.id.imap_path_prefix);
14326ff609ebff3ef0f5ff841eb5d78c11edf8f0936Martin Hibdon        mAuthenticationView = UiUtilities.getView(view, R.id.authentication_view);
144719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon        mClientCertificateSelector = UiUtilities.getView(view, R.id.client_certificate_selector);
145719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon        mDeviceIdSection = UiUtilities.getView(view, R.id.device_id_section);
146719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon        // Don't use UiUtilities here. In some configurations this view does not exist, and
147719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon        // UiUtilities throws an exception in this case.
148719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon        mAuthenticationLabel = (TextView)view.findViewById(R.id.authentication_label);
149f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank
1501b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // Updates the port when the user changes the security type. This allows
1511b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // us to show a reasonable default which the user can change.
1521b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mSecurityTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
153560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            @Override
1541b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
1551b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                updatePortFromSecurityType();
1561b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
1571b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
158560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            @Override
1591b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            public void onNothingSelected(AdapterView<?> arg0) { }
1601b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        });
1611b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1621b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // After any text edits, call validateFields() which enables or disables the Next button
163ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mValidationTextWatcher = new TextWatcher() {
164560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            @Override
1651b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            public void afterTextChanged(Editable s) {
1661b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                validateFields();
1671b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
1681b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
169560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            @Override
1701b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
171560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            @Override
1721b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            public void onTextChanged(CharSequence s, int start, int before, int count) { }
1731b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        };
1745da2f12dc5b180195f2849738bbce47fcd875d2dTony Mantler
175ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mUsernameView.addTextChangedListener(mValidationTextWatcher);
176ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mServerView.addTextChangedListener(mValidationTextWatcher);
177ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mPortView.addTextChangedListener(mValidationTextWatcher);
1781b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1791b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // Only allow digits in the port field.
1801b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mPortView.setKeyListener(DigitsKeyListener.getInstance("0123456789"));
1811b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
182112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        // Additional setup only used while in "settings" mode
183112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        onCreateViewSettingsMode(view);
184112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler
18526ff609ebff3ef0f5ff841eb5d78c11edf8f0936Martin Hibdon        mAuthenticationView.setAuthenticationCallback(this);
1869195a1202483053606f43e871915a5405e955306Martin Hibdon
1871b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        return view;
1881b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
1891b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1901b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
1911b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onActivityCreated(Bundle savedInstanceState) {
1921b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onActivityCreated(savedInstanceState);
193719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon        mClientCertificateSelector.setHostCallback(this);
19426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler
19526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final Context context = getActivity();
1969c8c471f971f9c8e40002503a0799ce56c5bfd76Tony Mantler        final SetupDataFragment.SetupDataContainer container =
1979c8c471f971f9c8e40002503a0799ce56c5bfd76Tony Mantler                (SetupDataFragment.SetupDataContainer) context;
19826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        mSetupData = container.getSetupData();
1999195a1202483053606f43e871915a5405e955306Martin Hibdon        final Account account = mSetupData.getAccount();
20076472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        final HostAuth recvAuth = account.getOrCreateHostAuthRecv(mAppContext);
20176472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler
20276472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        // Pre-fill info as appropriate
20376472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        if (!mSetupData.isIncomingCredLoaded()) {
20476472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler            recvAuth.mLogin = mSetupData.getEmail();
20576472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler            AccountSetupCredentialsFragment.populateHostAuthWithResults(context, recvAuth,
20676472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler                    mSetupData.getCredentialResults());
20776472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler            final String[] emailParts = mSetupData.getEmail().split("@");
20876472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler            final String domain = emailParts[1];
20976472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler            recvAuth.setConnection(recvAuth.mProtocol, domain, HostAuth.PORT_UNKNOWN,
21076472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler                    HostAuth.FLAG_NONE);
21176472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler            mSetupData.setIncomingCredLoaded(true);
21276472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        }
21376472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler
214064726d9f9fb7c38a252fc9c4fe2b7cf645eade0Tony Mantler        mServiceInfo = mSetupData.getIncomingServiceInfo(context);
21526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler
21626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        if (mServiceInfo.offerLocalDeletes) {
21726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            SpinnerOption deletePolicies[] = {
21826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                    new SpinnerOption(Account.DELETE_POLICY_NEVER,
21926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                            context.getString(
22026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                                    R.string.account_setup_incoming_delete_policy_never_label)),
22126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                    new SpinnerOption(Account.DELETE_POLICY_ON_DELETE,
22226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                            context.getString(
22326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                                    R.string.account_setup_incoming_delete_policy_delete_label)),
22426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            };
22526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            ArrayAdapter<SpinnerOption> deletePoliciesAdapter =
22626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                    new ArrayAdapter<SpinnerOption>(context,
22726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                            android.R.layout.simple_spinner_item, deletePolicies);
22826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            deletePoliciesAdapter.setDropDownViewResource(
22926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                    android.R.layout.simple_spinner_dropdown_item);
23026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            mDeletePolicyView.setAdapter(deletePoliciesAdapter);
23126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        }
23226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler
23326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        // Set up security type spinner
23426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        ArrayList<SpinnerOption> securityTypes = new ArrayList<SpinnerOption>();
23526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        securityTypes.add(
23626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                new SpinnerOption(HostAuth.FLAG_NONE, context.getString(
23726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                        R.string.account_setup_incoming_security_none_label)));
23826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        securityTypes.add(
23926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                new SpinnerOption(HostAuth.FLAG_SSL, context.getString(
24026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                        R.string.account_setup_incoming_security_ssl_label)));
24126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        securityTypes.add(
24226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                new SpinnerOption(HostAuth.FLAG_SSL | HostAuth.FLAG_TRUST_ALL, context.getString(
24326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                        R.string.account_setup_incoming_security_ssl_trust_certificates_label)));
24426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        if (mServiceInfo.offerTls) {
24526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            securityTypes.add(
24626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                    new SpinnerOption(HostAuth.FLAG_TLS, context.getString(
24726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                            R.string.account_setup_incoming_security_tls_label)));
24826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            securityTypes.add(new SpinnerOption(HostAuth.FLAG_TLS | HostAuth.FLAG_TRUST_ALL,
24926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                    context.getString(R.string
25026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                            .account_setup_incoming_security_tls_trust_certificates_label)));
25126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        }
25226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        ArrayAdapter<SpinnerOption> securityTypesAdapter = new ArrayAdapter<SpinnerOption>(
25326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                context, android.R.layout.simple_spinner_item, securityTypes);
25426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        securityTypesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
25526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        mSecurityTypeView.setAdapter(securityTypesAdapter);
2561b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2571f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        configureEditor();
2581f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        loadSettings();
259606213ea022c75e156249c37d4374e8ceb4d2340Martin Hibdon
260606213ea022c75e156249c37d4374e8ceb4d2340Martin Hibdon        final List<VendorPolicyLoader.OAuthProvider> oauthProviders =
261606213ea022c75e156249c37d4374e8ceb4d2340Martin Hibdon                AccountSettingsUtils.getAllOAuthProviders(getActivity());
262606213ea022c75e156249c37d4374e8ceb4d2340Martin Hibdon        final boolean offerOAuth = (mServiceInfo.offerOAuth && oauthProviders.size() > 0);
263606213ea022c75e156249c37d4374e8ceb4d2340Martin Hibdon        if (mAuthenticationLabel != null) {
264606213ea022c75e156249c37d4374e8ceb4d2340Martin Hibdon            if (offerOAuth) {
265606213ea022c75e156249c37d4374e8ceb4d2340Martin Hibdon                mAuthenticationLabel.setText(R.string.authentication_label);
266606213ea022c75e156249c37d4374e8ceb4d2340Martin Hibdon            } else {
267606213ea022c75e156249c37d4374e8ceb4d2340Martin Hibdon                mAuthenticationLabel.setText(R.string.account_setup_basics_password_label);
268606213ea022c75e156249c37d4374e8ceb4d2340Martin Hibdon            }
269606213ea022c75e156249c37d4374e8ceb4d2340Martin Hibdon        }
2701b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2711b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2721b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
2731b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Called when the fragment is visible to the user and actively running.
2741b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
2751b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2761b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onResume() {
2771b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onResume();
2781b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        validateFields();
2791b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2801b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2811b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
282ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler    public void onDestroyView() {
283ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        // Make sure we don't get callbacks after the views are supposed to be destroyed
284ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        // and also don't hold onto them longer than we need
285ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        if (mUsernameView != null) {
286ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler            mUsernameView.removeTextChangedListener(mValidationTextWatcher);
287ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        }
288ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mUsernameView = null;
289ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mServerLabelView = null;
290ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        if (mServerView != null) {
291ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler            mServerView.removeTextChangedListener(mValidationTextWatcher);
292ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        }
293ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mServerView = null;
294ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        if (mPortView != null) {
295ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler            mPortView.removeTextChangedListener(mValidationTextWatcher);
296ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        }
297ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mPortView = null;
298ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        if (mSecurityTypeView != null) {
299ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler            mSecurityTypeView.setOnItemSelectedListener(null);
300ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        }
301ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mSecurityTypeView = null;
302ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mDeletePolicyLabelView = null;
303ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mDeletePolicyView = null;
304ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mImapPathPrefixSectionView = null;
305ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mImapPathPrefixView = null;
306719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon        mDeviceIdSection = null;
307719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon        mClientCertificateSelector = null;
308ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler
309ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        super.onDestroyView();
310ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler    }
311ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler
3121b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
3131b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onSaveInstanceState(Bundle outState) {
3141b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onSaveInstanceState(outState);
3151b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3161b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        outState.putString(STATE_KEY_CREDENTIAL, mCacheLoginCredential);
3171f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        outState.putBoolean(STATE_KEY_LOADED, mLoaded);
3181b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
3191b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3201b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
3211f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler     * Configure the editor for the account type
3221f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler     */
3231f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    private void configureEditor() {
32426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final Account account = mSetupData.getAccount();
32528a344042d0f8353d2e5c15fe3951c1e0520f1b7Paul Westbrook        if (account == null || account.mHostAuthRecv == null) {
32676472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler            LogUtils.e(LogUtils.TAG,
32728a344042d0f8353d2e5c15fe3951c1e0520f1b7Paul Westbrook                    "null account or host auth. account null: %b host auth null: %b",
32828a344042d0f8353d2e5c15fe3951c1e0520f1b7Paul Westbrook                    account == null, account == null || account.mHostAuthRecv == null);
329ceca4751b26b5da91cd8b2038a679be214d3b7dbMindy Pereira            return;
330ceca4751b26b5da91cd8b2038a679be214d3b7dbMindy Pereira        }
331040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        mBaseScheme = account.mHostAuthRecv.mProtocol;
332f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        mServerLabelView.setText(R.string.account_setup_incoming_server_label);
333f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        mServerView.setContentDescription(getResources().getText(
334f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank                R.string.account_setup_incoming_server_label));
335f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (!mServiceInfo.offerPrefix) {
3361f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mImapPathPrefixSectionView.setVisibility(View.GONE);
337f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        }
338f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (!mServiceInfo.offerLocalDeletes) {
3391f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mDeletePolicyLabelView.setVisibility(View.GONE);
3401f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mDeletePolicyView.setVisibility(View.GONE);
3413432bdb757c4195fb4726c8b401f2261e78d75a7Ben Komalo            mPortView.setImeOptions(EditorInfo.IME_ACTION_NEXT);
3421f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        }
3431f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    }
3441f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler
3451f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    /**
3461b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Load the current settings into the UI
3471b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
3481b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private void loadSettings() {
3491f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        if (mLoaded) return;
3501b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
35126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final Account account = mSetupData.getAccount();
35276472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        final HostAuth recvAuth = account.getOrCreateHostAuthRecv(mAppContext);
353064726d9f9fb7c38a252fc9c4fe2b7cf645eade0Tony Mantler        mServiceInfo = mSetupData.getIncomingServiceInfo(getActivity());
3549c0463e6b485b3b50d9c6f110a9ece650cd4a692Martin Hibdon        final List<VendorPolicyLoader.OAuthProvider> oauthProviders =
3559c0463e6b485b3b50d9c6f110a9ece650cd4a692Martin Hibdon                AccountSettingsUtils.getAllOAuthProviders(getActivity());
3569c0463e6b485b3b50d9c6f110a9ece650cd4a692Martin Hibdon
357606213ea022c75e156249c37d4374e8ceb4d2340Martin Hibdon        final boolean offerOAuth = (mServiceInfo.offerOAuth && oauthProviders.size() > 0);
3589c0463e6b485b3b50d9c6f110a9ece650cd4a692Martin Hibdon        mAuthenticationView.setAuthInfo(offerOAuth, recvAuth);
3591b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
36026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final String username = recvAuth.mLogin;
361040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        if (username != null) {
362f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            //*** For eas?
363f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            // Add a backslash to the start of the username, but only if the username has no
364f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            // backslash in it.
365f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            //if (userName.indexOf('\\') < 0) {
366f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            //    userName = "\\" + userName;
367f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            //}
368040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            mUsernameView.setText(username);
369040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        }
3701b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
371f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (mServiceInfo.offerPrefix) {
37226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            final String prefix = recvAuth.mDomain;
373040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            if (prefix != null && prefix.length() > 0) {
374040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy                mImapPathPrefixView.setText(prefix.substring(1));
3751b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
376040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        }
3771b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3788c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy        // The delete policy is set for all legacy accounts. For POP3 accounts, the user sets
3798c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy        // the policy explicitly. For IMAP accounts, the policy is set when the Account object
3808c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy        // is created. @see AccountSetupBasics#populateSetupData
3818c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy        mLoadedDeletePolicy = account.getDeletePolicy();
3828c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy        SpinnerOption.setSpinnerOptionValue(mDeletePolicyView, mLoadedDeletePolicy);
3838c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy
384040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        int flags = recvAuth.mFlags;
385f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (mServiceInfo.defaultSsl) {
386f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            flags |= HostAuth.FLAG_SSL;
387f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        }
38858fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdon        // Strip out any flags that are not related to security type.
38976472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        int securityTypeFlags = (flags & HostAuth.FLAG_TRANSPORTSECURITY_MASK);
39058fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdon        SpinnerOption.setSpinnerOptionValue(mSecurityTypeView, securityTypeFlags);
3911b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
39226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final String hostname = recvAuth.mAddress;
393040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        if (hostname != null) {
394040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            mServerView.setText(hostname);
395040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        }
3961b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
39726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final int port = recvAuth.mPort;
398040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        if (port != HostAuth.PORT_UNKNOWN) {
399040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            mPortView.setText(Integer.toString(port));
400040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        } else {
401040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            updatePortFromSecurityType();
4021b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
403c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
404f1789afa535b113047ef20623d79fdfb257537aaTony Mantler        if (!TextUtils.isEmpty(recvAuth.mClientCertAlias)) {
4056ecdc1845778367f3c72d8f31cc63026539004d7Tony Mantler            mClientCertificateSelector.setCertificate(recvAuth.mClientCertAlias);
4066ecdc1845778367f3c72d8f31cc63026539004d7Tony Mantler        }
4076ecdc1845778367f3c72d8f31cc63026539004d7Tony Mantler
408294593c5f592f4eec6994909cca60450936a0812Tony Mantler        // Make a deep copy of the HostAuth to compare with later
409294593c5f592f4eec6994909cca60450936a0812Tony Mantler        final Parcel parcel = Parcel.obtain();
410294593c5f592f4eec6994909cca60450936a0812Tony Mantler        parcel.writeParcelable(recvAuth, recvAuth.describeContents());
411294593c5f592f4eec6994909cca60450936a0812Tony Mantler        parcel.setDataPosition(0);
412294593c5f592f4eec6994909cca60450936a0812Tony Mantler        mLoadedRecvAuth = parcel.readParcelable(HostAuth.class.getClassLoader());
413294593c5f592f4eec6994909cca60450936a0812Tony Mantler        parcel.recycle();
414294593c5f592f4eec6994909cca60450936a0812Tony Mantler
4151f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        mLoaded = true;
4161b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        validateFields();
4171b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
4181b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
4191b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
4201b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Check the values in the fields and decide if it makes sense to enable the "next" button
4211b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
4221b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private void validateFields() {
423f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (!mLoaded) return;
42426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        enableNextButton(!TextUtils.isEmpty(mUsernameView.getText())
42526ff609ebff3ef0f5ff841eb5d78c11edf8f0936Martin Hibdon                && mAuthenticationView.getAuthValid()
426ce4cce05b2ee5ea2d9629c189a79f7f30778f534Makoto Onuki                && Utility.isServerNameValid(mServerView)
42726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                && Utility.isPortFieldValid(mPortView));
428858c2822777f74947e81476125590ad06bfe4803Andy Stadler
429219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler        mCacheLoginCredential = mUsernameView.getText().toString().trim();
4301b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
4311b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
432f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    private int getPortFromSecurityType(boolean useSsl) {
433064726d9f9fb7c38a252fc9c4fe2b7cf645eade0Tony Mantler        return useSsl ? mServiceInfo.portSsl : mServiceInfo.port;
434f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    }
435f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank
436f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    private boolean getSslSelected() {
43726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final int securityType =
43826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value;
439f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        return ((securityType & HostAuth.FLAG_SSL) != 0);
440f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    }
441f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank
442f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    public void onUseSslChanged(boolean useSsl) {
443719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon        if (mServiceInfo.offerCerts) {
444719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon            final int mode = useSsl ? View.VISIBLE : View.GONE;
445719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon            mClientCertificateSelector.setVisibility(mode);
446719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon            String deviceId = "";
447719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon            try {
44876472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler                deviceId = Device.getDeviceId(mAppContext);
449719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon            } catch (IOException e) {
450719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon                // Not required
451719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon            }
452719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon            ((TextView) UiUtilities.getView(getView(), R.id.device_id)).setText(deviceId);
453719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon
454719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon            mDeviceIdSection.setVisibility(mode);
455719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon        }
456040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    }
457040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
458040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    private void updatePortFromSecurityType() {
45926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final boolean sslSelected = getSslSelected();
46026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final int port = getPortFromSecurityType(sslSelected);
461040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        mPortView.setText(Integer.toString(port));
462f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        onUseSslChanged(sslSelected);
4631b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
4641b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
465c83366c88770f336a8e9976af42389c616de0b62Tony Mantler    @Override
466c83366c88770f336a8e9976af42389c616de0b62Tony Mantler    public void saveSettings() {
467c83366c88770f336a8e9976af42389c616de0b62Tony Mantler        // Reset this here so we don't get stuck on this screen
468c83366c88770f336a8e9976af42389c616de0b62Tony Mantler        mLoadedDeletePolicy = mSetupData.getAccount().getDeletePolicy();
469c83366c88770f336a8e9976af42389c616de0b62Tony Mantler        super.saveSettings();
470c83366c88770f336a8e9976af42389c616de0b62Tony Mantler    }
471c83366c88770f336a8e9976af42389c616de0b62Tony Mantler
47276472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler    private static class SaveSettingsLoader extends MailAsyncTaskLoader<Boolean> {
47376472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        private final SetupDataFragment mSetupData;
47476472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        private final boolean mSettingsMode;
47576472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler
47676472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        private SaveSettingsLoader(Context context, SetupDataFragment setupData,
47776472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler                boolean settingsMode) {
47876472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler            super(context);
47976472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler            mSetupData = setupData;
48076472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler            mSettingsMode = settingsMode;
48176472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        }
48276472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler
48376472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        @Override
48476472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        public Boolean loadInBackground() {
48576472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler            if (mSettingsMode) {
48676472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler                saveSettingsAfterEdit(getContext(), mSetupData);
48776472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler            } else {
48876472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler                saveSettingsAfterSetup(getContext(), mSetupData);
48976472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler            }
49076472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler            return true;
49176472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        }
49276472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler
49376472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        @Override
49476472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        protected void onDiscardResult(Boolean result) {}
49576472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler    }
49676472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler
49776472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler    @Override
49876472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler    public Loader<Boolean> getSaveSettingsLoader() {
49976472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        return new SaveSettingsLoader(mAppContext, mSetupData, mSettingsMode);
50076472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler    }
50176472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler
5021b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
5031b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Entry point from Activity after editing settings and verifying them.  Must be FLOW_MODE_EDIT.
5046e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler     * Note, we update account here (as well as the account.mHostAuthRecv) because we edit
5056e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler     * account's delete policy here.
5066e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler     * Blocking - do not call from UI Thread.
5071b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
50876472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler    public static void saveSettingsAfterEdit(Context context, SetupDataFragment setupData) {
50976472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        final Account account = setupData.getAccount();
51076472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        account.update(context, account.toContentValues());
51158fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdon        final Credential cred = account.mHostAuthRecv.mCredential;
51258fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdon        if (cred != null) {
51358fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdon            if (cred.isSaved()) {
51476472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler                cred.update(context, cred.toContentValues());
51558fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdon            } else {
51676472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler                cred.save(context);
51758fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdon                account.mHostAuthRecv.mCredentialKey = cred.mId;
51858fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdon            }
51958fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdon        }
52076472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        account.mHostAuthRecv.update(context, account.mHostAuthRecv.toContentValues());
5211b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // Update the backup (side copy) of the accounts
52276472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        AccountBackupRestore.backup(context);
5231b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
5241b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
5251b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
5261b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Entry point from Activity after entering new settings and verifying them.  For setup mode.
5271b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
52876472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler    public static void saveSettingsAfterSetup(Context context, SetupDataFragment setupData) {
52976472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        final Account account = setupData.getAccount();
53076472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        final HostAuth recvAuth = account.getOrCreateHostAuthRecv(context);
53176472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        final HostAuth sendAuth = account.getOrCreateHostAuthSend(context);
5321b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
5331b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // Set the username and password for the outgoing settings to the username and
534ba4e72a9474bcbe33a8001a1964a02cb41ea08bbAndy Stadler        // password the user just set for incoming.  Use the verified host address to try and
535ba4e72a9474bcbe33a8001a1964a02cb41ea08bbAndy Stadler        // pick a smarter outgoing address.
53626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final String hostName =
53776472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler                AccountSettingsUtils.inferServerName(context, recvAuth.mAddress, null, "smtp");
538040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        sendAuth.setLogin(recvAuth.mLogin, recvAuth.mPassword);
539040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        sendAuth.setConnection(sendAuth.mProtocol, hostName, sendAuth.mPort, sendAuth.mFlags);
5401b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
5411b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
5421b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
5431b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Entry point from Activity, when "next" button is clicked
5441b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
5451a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
546294593c5f592f4eec6994909cca60450936a0812Tony Mantler    public int collectUserInputInternal() {
54726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final Account account = mSetupData.getAccount();
548040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
54981a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank        // Make sure delete policy is an valid option before using it; otherwise, the results are
55081a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank        // indeterminate, I suspect...
55181a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank        if (mDeletePolicyView.getVisibility() == View.VISIBLE) {
55281a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank            account.setDeletePolicy(
55381a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank                    (Integer) ((SpinnerOption) mDeletePolicyView.getSelectedItem()).value);
55481a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank        }
5558d22e85e459df3d94968389852859dacaf2baafeAndy Stadler
55676472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        final HostAuth recvAuth = account.getOrCreateHostAuthRecv(mAppContext);
55726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final String userName = mUsernameView.getText().toString().trim();
55876472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        final String userPassword = mAuthenticationView.getPassword();
559040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        recvAuth.setLogin(userName, userPassword);
56058fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdon        if (!TextUtils.isEmpty(mAuthenticationView.getOAuthProvider())) {
56158fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdon            Credential cred = recvAuth.getOrCreateCredential(getActivity());
56258fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdon            cred.mProviderId = mAuthenticationView.getOAuthProvider();
56358fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdon        }
5648d22e85e459df3d94968389852859dacaf2baafeAndy Stadler
56526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final String serverAddress = mServerView.getText().toString().trim();
566040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        int serverPort;
5671b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        try {
568040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            serverPort = Integer.parseInt(mPortView.getText().toString().trim());
569040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        } catch (NumberFormatException e) {
570f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            serverPort = getPortFromSecurityType(getSslSelected());
57176472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler            LogUtils.d(LogUtils.TAG, "Non-integer server port; using '" + serverPort + "'");
5721b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
57326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final int securityType =
57426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                (Integer) ((SpinnerOption) mSecurityTypeView.getSelectedItem()).value;
575040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        recvAuth.setConnection(mBaseScheme, serverAddress, serverPort, securityType);
576f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (mServiceInfo.offerPrefix) {
57726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            final String prefix = mImapPathPrefixView.getText().toString().trim();
5785125c06cef67447a0ef5881d8fbfd6b73e1dfd0aBen Komalo            recvAuth.mDomain = TextUtils.isEmpty(prefix) ? null : ("/" + prefix);
5795125c06cef67447a0ef5881d8fbfd6b73e1dfd0aBen Komalo        } else {
5805125c06cef67447a0ef5881d8fbfd6b73e1dfd0aBen Komalo            recvAuth.mDomain = null;
5815125c06cef67447a0ef5881d8fbfd6b73e1dfd0aBen Komalo        }
582719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon        recvAuth.mClientCertAlias = mClientCertificateSelector.getCertificate();
583040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
584294593c5f592f4eec6994909cca60450936a0812Tony Mantler        return SetupDataFragment.CHECK_INCOMING;
5851b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
586c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
587c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    @Override
588c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    public boolean haveSettingsChanged() {
58926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final boolean deletePolicyChanged;
590c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
591c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        // Only verify the delete policy if the control is visible (i.e. is a pop3 account)
592648a067056db91d4a1bfd3c4eac9eec3d4c6adb4Tony Mantler        if (mDeletePolicyView != null && mDeletePolicyView.getVisibility() == View.VISIBLE) {
593c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            int newDeletePolicy =
594c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy                (Integer)((SpinnerOption)mDeletePolicyView.getSelectedItem()).value;
595c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            deletePolicyChanged = mLoadedDeletePolicy != newDeletePolicy;
59626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        } else {
59726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            deletePolicyChanged = false;
598c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        }
599c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
600c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        return deletePolicyChanged || super.haveSettingsChanged();
601c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    }
602f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank
603f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    @Override
6049195a1202483053606f43e871915a5405e955306Martin Hibdon    public void onValidateStateChanged() {
6059195a1202483053606f43e871915a5405e955306Martin Hibdon        validateFields();
606f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    }
607d23fa61a014fc567592592eac629680764f042b5Martin Hibdon
60858fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdon    @Override
60958fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdon    public void onRequestSignIn() {
61076472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        // Launch the credentials activity.
61176472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        final String protocol =
61276472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler                mSetupData.getAccount().getOrCreateHostAuthRecv(mAppContext).mProtocol;
61376472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        final Intent intent = AccountCredentials.getAccountCredentialsIntent(getActivity(),
61476472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler                mUsernameView.getText().toString(), protocol);
61558fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdon        startActivityForResult(intent, SIGN_IN_REQUEST);
61658fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdon    }
617d23fa61a014fc567592592eac629680764f042b5Martin Hibdon
618d23fa61a014fc567592592eac629680764f042b5Martin Hibdon    @Override
619d23fa61a014fc567592592eac629680764f042b5Martin Hibdon    public void onCertificateRequested() {
620f765f9b976222a8a0e45d4b04883566ecf355937Tony Mantler        final Intent intent = new Intent(getString(R.string.intent_exchange_cert_action));
621f765f9b976222a8a0e45d4b04883566ecf355937Tony Mantler        intent.setData(CertificateRequestor.CERTIFICATE_REQUEST_URI);
622f765f9b976222a8a0e45d4b04883566ecf355937Tony Mantler        intent.putExtra(CertificateRequestor.EXTRA_HOST, mServerView.getText().toString().trim());
623f765f9b976222a8a0e45d4b04883566ecf355937Tony Mantler        try {
624f765f9b976222a8a0e45d4b04883566ecf355937Tony Mantler            intent.putExtra(CertificateRequestor.EXTRA_PORT,
625f765f9b976222a8a0e45d4b04883566ecf355937Tony Mantler                    Integer.parseInt(mPortView.getText().toString().trim()));
626f765f9b976222a8a0e45d4b04883566ecf355937Tony Mantler        } catch (final NumberFormatException e) {
627f765f9b976222a8a0e45d4b04883566ecf355937Tony Mantler            LogUtils.d(LogUtils.TAG, "Couldn't parse port %s", mPortView.getText());
628f765f9b976222a8a0e45d4b04883566ecf355937Tony Mantler        }
629d23fa61a014fc567592592eac629680764f042b5Martin Hibdon        startActivityForResult(intent, CERTIFICATE_REQUEST);
630d23fa61a014fc567592592eac629680764f042b5Martin Hibdon    }
631d23fa61a014fc567592592eac629680764f042b5Martin Hibdon
632d23fa61a014fc567592592eac629680764f042b5Martin Hibdon    @Override
633d23fa61a014fc567592592eac629680764f042b5Martin Hibdon    public void onActivityResult(int requestCode, int resultCode, Intent data) {
634d23fa61a014fc567592592eac629680764f042b5Martin Hibdon        if (requestCode == CERTIFICATE_REQUEST && resultCode == Activity.RESULT_OK) {
635d23fa61a014fc567592592eac629680764f042b5Martin Hibdon            final String certAlias = data.getStringExtra(CertificateRequestor.RESULT_ALIAS);
636719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon            if (certAlias != null) {
637719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon                mClientCertificateSelector.setCertificate(certAlias);
638719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon            }
63958fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdon        } else if (requestCode == SIGN_IN_REQUEST && resultCode == Activity.RESULT_OK) {
64058fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdon            final Account account = mSetupData.getAccount();
64158fbd2a47729bd21b5e3001c76bd0723ea868728Martin Hibdon            final HostAuth recvAuth = account.getOrCreateHostAuthRecv(getActivity());
64276472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler            AccountSetupCredentialsFragment.populateHostAuthWithResults(mAppContext, recvAuth,
64376472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler                    data.getExtras());
644719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon            mAuthenticationView.setAuthInfo(mServiceInfo.offerOAuth, recvAuth);
645d23fa61a014fc567592592eac629680764f042b5Martin Hibdon        }
646d23fa61a014fc567592592eac629680764f042b5Martin Hibdon    }
6471b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler}
648