AccountSetupIncomingFragment.java revision fd14496c494a0d38c35c3788c9cc55f1984592e4
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 com.android.email.AccountBackupRestore;
201b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport com.android.email.Email;
211b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport com.android.email.R;
221b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport com.android.email.Utility;
231b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport com.android.email.provider.EmailContent;
241b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport com.android.email.provider.EmailContent.Account;
251b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
261b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.app.Activity;
271b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.content.Context;
281b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.os.Bundle;
291b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.text.Editable;
301b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.text.TextWatcher;
311b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.text.method.DigitsKeyListener;
321b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.util.Log;
331b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.view.LayoutInflater;
341b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.view.View;
351b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.view.ViewGroup;
361b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.widget.AdapterView;
371b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.widget.ArrayAdapter;
381b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.widget.EditText;
391b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.widget.Spinner;
401b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.widget.TextView;
411b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
421b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport java.net.URI;
431b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport java.net.URISyntaxException;
441b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
45fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler/**
46fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * Provides UI for IMAP/POP account settings.
47fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler *
48fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * This fragment is used by AccountSetupIncoming (for creating accounts) and by AccountSettingsXL
49fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * (for editing existing accounts).
50fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler */
511a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadlerpublic class AccountSetupIncomingFragment extends AccountServerBaseFragment {
521b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
531b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private final static String STATE_KEY_CREDENTIAL =
541b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            "AccountSetupIncomingFragment.loginCredential";
551b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
561b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private static final int POP_PORTS[] = {
571b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            110, 995, 995, 110, 110
581b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    };
591b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private static final String POP_SCHEMES[] = {
601b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            "pop3", "pop3+ssl+", "pop3+ssl+trustallcerts", "pop3+tls+", "pop3+tls+trustallcerts"
611b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    };
621b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private static final int IMAP_PORTS[] = {
631b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            143, 993, 993, 143, 143
641b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    };
651b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private static final String IMAP_SCHEMES[] = {
661b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            "imap", "imap+ssl+", "imap+ssl+trustallcerts", "imap+tls+", "imap+tls+trustallcerts"
671b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    };
681b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
691b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private int mAccountPorts[];
701b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private String mAccountSchemes[];
711b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private EditText mUsernameView;
721b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private EditText mPasswordView;
731b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private TextView mServerLabelView;
741b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private EditText mServerView;
751b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private EditText mPortView;
761b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private Spinner mSecurityTypeView;
771b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private TextView mDeletePolicyLabelView;
781b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private Spinner mDeletePolicyView;
791b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private View mImapPathPrefixSectionView;
801b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private EditText mImapPathPrefixView;
811b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
821b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    // Support for lifecycle
831b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private boolean mStarted;
841b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private boolean mLoaded;
851b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private String mCacheLoginCredential;
861b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
871b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
881b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Called to do initial creation of a fragment.  This is called after
891b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * {@link #onAttach(Activity)} and before {@link #onActivityCreated(Bundle)}.
901b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
911b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
921b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onCreate(Bundle savedInstanceState) {
931b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
941b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupIncomingFragment onCreate");
951b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
961b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onCreate(savedInstanceState);
971b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
98faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        if (savedInstanceState != null) {
99faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            mCacheLoginCredential = savedInstanceState.getString(STATE_KEY_CREDENTIAL);
100faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
1011b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
1021b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1031b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
1041b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public View onCreateView(LayoutInflater inflater, ViewGroup container,
1051b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Bundle savedInstanceState) {
1061b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
1071b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupIncomingFragment onCreateView");
1081b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
1091b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        View view = inflater.inflate(R.layout.account_setup_incoming_fragment, container, false);
1101b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        Context context = getActivity();
1111b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1121b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mUsernameView = (EditText) view.findViewById(R.id.account_username);
1131b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mPasswordView = (EditText) view.findViewById(R.id.account_password);
1141b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mServerLabelView = (TextView) view.findViewById(R.id.account_server_label);
1151b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mServerView = (EditText) view.findViewById(R.id.account_server);
1161b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mPortView = (EditText) view.findViewById(R.id.account_port);
1171b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mSecurityTypeView = (Spinner) view.findViewById(R.id.account_security_type);
1181b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mDeletePolicyLabelView = (TextView) view.findViewById(R.id.account_delete_policy_label);
1191b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mDeletePolicyView = (Spinner) view.findViewById(R.id.account_delete_policy);
1201b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mImapPathPrefixSectionView = view.findViewById(R.id.imap_path_prefix_section);
1211b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mImapPathPrefixView = (EditText) view.findViewById(R.id.imap_path_prefix);
1221b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1231b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // Set up spinners
1241b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        SpinnerOption securityTypes[] = {
1251b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            new SpinnerOption(0,
1261b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    context.getString(R.string.account_setup_incoming_security_none_label)),
1271b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            new SpinnerOption(1,
1281b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    context.getString(R.string.account_setup_incoming_security_ssl_label)),
1291b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            new SpinnerOption(2,
1301b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    context.getString(
1311b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                            R.string.account_setup_incoming_security_ssl_trust_certificates_label)),
1321b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            new SpinnerOption(3,
1331b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    context.getString(R.string.account_setup_incoming_security_tls_label)),
1341b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            new SpinnerOption(4,
1351b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    context.getString(
1361b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                            R.string.account_setup_incoming_security_tls_trust_certificates_label)),
1371b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        };
1381b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1391b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        SpinnerOption deletePolicies[] = {
1401b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            new SpinnerOption(Account.DELETE_POLICY_NEVER,
1411b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    context.getString(R.string.account_setup_incoming_delete_policy_never_label)),
1421b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            new SpinnerOption(Account.DELETE_POLICY_ON_DELETE,
1431b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    context.getString(R.string.account_setup_incoming_delete_policy_delete_label)),
1441b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        };
1451b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1461b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        ArrayAdapter<SpinnerOption> securityTypesAdapter = new ArrayAdapter<SpinnerOption>(context,
1471b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                android.R.layout.simple_spinner_item, securityTypes);
1481b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        securityTypesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
1491b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mSecurityTypeView.setAdapter(securityTypesAdapter);
1501b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1511b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        ArrayAdapter<SpinnerOption> deletePoliciesAdapter = new ArrayAdapter<SpinnerOption>(context,
1521b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                android.R.layout.simple_spinner_item, deletePolicies);
1531b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        deletePoliciesAdapter.setDropDownViewResource(
1541b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                android.R.layout.simple_spinner_dropdown_item);
1551b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mDeletePolicyView.setAdapter(deletePoliciesAdapter);
1561b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1571b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // Updates the port when the user changes the security type. This allows
1581b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // us to show a reasonable default which the user can change.
1591b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mSecurityTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
1601b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
1611b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                updatePortFromSecurityType();
1621b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
1631b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1641b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            public void onNothingSelected(AdapterView<?> arg0) { }
1651b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        });
1661b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1671b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // After any text edits, call validateFields() which enables or disables the Next button
1681b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        TextWatcher validationTextWatcher = new TextWatcher() {
1691b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            public void afterTextChanged(Editable s) {
1701b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                validateFields();
1711b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
1721b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1731b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
1741b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            public void onTextChanged(CharSequence s, int start, int before, int count) { }
1751b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        };
1761b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mUsernameView.addTextChangedListener(validationTextWatcher);
1771b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mPasswordView.addTextChangedListener(validationTextWatcher);
1781b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mServerView.addTextChangedListener(validationTextWatcher);
1791b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mPortView.addTextChangedListener(validationTextWatcher);
1801b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1811b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // Only allow digits in the port field.
1821b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mPortView.setKeyListener(DigitsKeyListener.getInstance("0123456789"));
1831b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1841b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        return view;
1851b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
1861b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1871b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
1881b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onActivityCreated(Bundle savedInstanceState) {
1891b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
1901b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupIncomingFragment onActivityCreated");
1911b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
1921b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onActivityCreated(savedInstanceState);
1931b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
1941b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1951b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
1961b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Called when the Fragment is visible to the user.
1971b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
1981b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
1991b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onStart() {
2001b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
2011b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupIncomingFragment onStart");
2021b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2031b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onStart();
2041b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mStarted = true;
2051b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (!mLoaded) {
2061b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            loadSettings();
2071b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2081b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2091b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2101b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
2111b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Called when the fragment is visible to the user and actively running.
2121b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
2131b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2141b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onResume() {
2151b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
2161b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupIncomingFragment onResume");
2171b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2181b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onResume();
2191b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        validateFields();
2201b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2211b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2221b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2231b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onPause() {
2241b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
2251b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupIncomingFragment onPause");
2261b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2271b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onPause();
2281b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2291b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2301b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
2311b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Called when the Fragment is no longer started.
2321b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
2331b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2341b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onStop() {
2351b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
2361b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupIncomingFragment onStop");
2371b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2381b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onStop();
2391b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mStarted = false;
2401b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2411b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2421b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
2431b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Called when the fragment is no longer in use.
2441b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
2451b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2461b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onDestroy() {
2471b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
2481b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupIncomingFragment onDestroy");
2491b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2501b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onDestroy();
2511b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2521b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2531b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2541b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onSaveInstanceState(Bundle outState) {
2551b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
2561b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupIncomingFragment onSaveInstanceState");
2571b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2581b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onSaveInstanceState(outState);
2591b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2601b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        outState.putString(STATE_KEY_CREDENTIAL, mCacheLoginCredential);
2611b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2621b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2631b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
2641b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Activity provides callbacks here.  This also triggers loading and setting up the UX
2651b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
2661a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
2671b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void setCallback(Callback callback) {
2681a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        super.setCallback(callback);
2691b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (mStarted && !mLoaded) {
2701b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            loadSettings();
2711b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2721b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2731b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2741b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
2751b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Load the current settings into the UI
2761b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
2771b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private void loadSettings() {
2781b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        try {
2791b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            // TODO this should be accessed directly via the HostAuth structure
2801b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            EmailContent.Account account = SetupData.getAccount();
2811b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            URI uri = new URI(account.getStoreUri(mContext));
2821b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            String username = null;
2831b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            String password = null;
2841b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            if (uri.getUserInfo() != null) {
2851b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                String[] userInfoParts = uri.getUserInfo().split(":", 2);
2861b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                username = userInfoParts[0];
2871b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                if (userInfoParts.length > 1) {
2881b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    password = userInfoParts[1];
2891b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                }
2901b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
2911b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2921b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            if (username != null) {
2931b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                mUsernameView.setText(username);
2941b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
2951b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2961b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            if (password != null) {
2971b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                mPasswordView.setText(password);
2981b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
2991b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3001b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            if (uri.getScheme().startsWith("pop3")) {
3011b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                mServerLabelView.setText(R.string.account_setup_incoming_pop_server_label);
3021b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                mAccountPorts = POP_PORTS;
3031b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                mAccountSchemes = POP_SCHEMES;
3041b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3051b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                mImapPathPrefixSectionView.setVisibility(View.GONE);
3061b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            } else if (uri.getScheme().startsWith("imap")) {
3071b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                mServerLabelView.setText(R.string.account_setup_incoming_imap_server_label);
3081b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                mAccountPorts = IMAP_PORTS;
3091b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                mAccountSchemes = IMAP_SCHEMES;
3101b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3111b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                mDeletePolicyLabelView.setVisibility(View.GONE);
3121b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                mDeletePolicyView.setVisibility(View.GONE);
3131b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                if (uri.getPath() != null && uri.getPath().length() > 0) {
3141b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    mImapPathPrefixView.setText(uri.getPath().substring(1));
3151b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                }
3161b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            } else {
3171b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                throw new Error("Unknown account type: " + account.getStoreUri(mContext));
3181b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
3191b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3201b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            for (int i = 0; i < mAccountSchemes.length; i++) {
3211b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                if (mAccountSchemes[i].equals(uri.getScheme())) {
3221b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    SpinnerOption.setSpinnerOptionValue(mSecurityTypeView, i);
3231b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                }
3241b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
3251b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3261b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            SpinnerOption.setSpinnerOptionValue(mDeletePolicyView, account.getDeletePolicy());
3271b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3281b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            if (uri.getHost() != null) {
3291b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                mServerView.setText(uri.getHost());
3301b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
3311b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3321b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            if (uri.getPort() != -1) {
3331b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                mPortView.setText(Integer.toString(uri.getPort()));
3341b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            } else {
3351b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                updatePortFromSecurityType();
3361b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
3371b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        } catch (URISyntaxException use) {
3381b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            /*
3391b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler             * We should always be able to parse our own settings.
3401b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler             */
3411b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            throw new Error(use);
3421b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
3431b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3441b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        validateFields();
3451b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
3461b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3471b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
3481b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Check the values in the fields and decide if it makes sense to enable the "next" button
3491b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
3501b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private void validateFields() {
3511b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        boolean enabled = Utility.isTextViewNotEmpty(mUsernameView)
3521b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                && Utility.isTextViewNotEmpty(mPasswordView)
3531b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                && Utility.isTextViewNotEmpty(mServerView)
3541b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                && Utility.isPortFieldValid(mPortView);
3551b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (enabled) {
3561b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            try {
3571b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                URI uri = getUri();
3581b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            } catch (URISyntaxException use) {
3591b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                enabled = false;
3601b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
3611b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
3621a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        enableNextButton(enabled);
3631b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
3641b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3651b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private void updatePortFromSecurityType() {
3661b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value;
3671b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mPortView.setText(Integer.toString(mAccountPorts[securityType]));
3681b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
3691b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3701b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
3711b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Entry point from Activity after editing settings and verifying them.  Must be FLOW_MODE_EDIT.
3721b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
3731a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
3741b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void saveSettingsAfterEdit() {
3751b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        EmailContent.Account account = SetupData.getAccount();
3761b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (account.isSaved()) {
3771b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            account.update(mContext, account.toContentValues());
3781b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            account.mHostAuthRecv.update(mContext, account.mHostAuthRecv.toContentValues());
3791b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        } else {
3801b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            account.save(mContext);
3811b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
3821b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // Update the backup (side copy) of the accounts
3831b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        AccountBackupRestore.backupAccounts(mContext);
3841b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
3851b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3861b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
3871b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Entry point from Activity after entering new settings and verifying them.  For setup mode.
3881b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
389fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler    @Override
3901b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void saveSettingsAfterSetup() {
3911b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        EmailContent.Account account = SetupData.getAccount();
3921b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3931b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // Set the username and password for the outgoing settings to the username and
3941b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // password the user just set for incoming.
3951b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        try {
3961b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            URI oldUri = new URI(account.getSenderUri(mContext));
3971b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            URI uri = new URI(
3981b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    oldUri.getScheme(),
3991b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    mUsernameView.getText().toString().trim() + ":"
4001b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                            + mPasswordView.getText().toString().trim(),
4011b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    oldUri.getHost(),
4021b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    oldUri.getPort(),
4031b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    null,
4041b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    null,
4051b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    null);
4061b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            account.setSenderUri(mContext, uri.toString());
4071b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        } catch (URISyntaxException use) {
4081b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            // If we can't set up the URL we just continue. It's only for convenience.
4091b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
4101b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
4111b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
4121b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
4131b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Attempt to create a URI from the fields provided.  Throws URISyntaxException if there's
4141b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * a problem with the user input.
4151b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * @return a URI built from the account setup fields
4161b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
4171b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private URI getUri() throws URISyntaxException {
4181b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value;
4191b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        String path = null;
4201b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (mAccountSchemes[securityType].startsWith("imap")) {
4211b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            path = "/" + mImapPathPrefixView.getText().toString().trim();
4221b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
4231b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        String userName = mUsernameView.getText().toString().trim();
4241b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mCacheLoginCredential = userName;
4251b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        URI uri = new URI(
4261b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                mAccountSchemes[securityType],
4271b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                userName + ":" + mPasswordView.getText().toString().trim(),
4281b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                mServerView.getText().toString().trim(),
4291b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                Integer.parseInt(mPortView.getText().toString().trim()),
4301b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                path, // path
4311b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                null, // query
4321b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                null);
4331b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
4341b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        return uri;
4351b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
4361b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
4371b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
4381b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Entry point from Activity, when "next" button is clicked
4391b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
4401a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
4411b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onNext() {
4421b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        EmailContent.Account setupAccount = SetupData.getAccount();
4431b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        try {
4441b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            URI uri = getUri();
4451b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            setupAccount.setStoreUri(mContext, uri.toString());
4461b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
4471b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            // Stop here if the login credentials duplicate an existing account
4481b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            // (unless they duplicate the existing account, as they of course will)
4491b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            EmailContent.Account account = Utility.findExistingAccount(mContext, setupAccount.mId,
4501b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    uri.getHost(), mCacheLoginCredential);
4511b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            if (account != null) {
4521b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                DuplicateAccountDialogFragment dialogFragment =
4537b5c5cf2a993d68bb8fe1a65bde3184e8d59c10fAndrew Stadler                    DuplicateAccountDialogFragment.newInstance(account.mDisplayName);
4541b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                dialogFragment.show(getActivity(), DuplicateAccountDialogFragment.TAG);
4551b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                return;
4561b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
4571b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        } catch (URISyntaxException use) {
4581b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            /*
4591b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler             * It's unrecoverable if we cannot create a URI from components that
4601b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler             * we validated to be safe.
4611b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler             */
4621b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            throw new Error(use);
4631b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
4641b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
4651b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        setupAccount.setDeletePolicy(
4661b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                (Integer)((SpinnerOption)mDeletePolicyView.getSelectedItem()).value);
4671b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
468fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler        mCallback.onProceedNext(SetupData.CHECK_INCOMING, this);
4691b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
4701b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler}
471