AccountSetupIncomingFragment.java revision 112ed496f817ebeab6b1ee1d5117259ef80342b2
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
531f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    private final static String STATE_KEY_CREDENTIAL = "AccountSetupIncomingFragment.credential";
541f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    private final static String STATE_KEY_LOADED = "AccountSetupIncomingFragment.loaded";
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;
841f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    private boolean mConfigured;
851b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private boolean mLoaded;
861b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private String mCacheLoginCredential;
871b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
881b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
89112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler     * Create the fragment with parameters - used mainly to force into settings mode (with buttons)
90112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler     * @param settingsMode if true, alters appearance for use in settings (default is "setup")
91112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler     */
92112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler    public static AccountSetupIncomingFragment newInstance(boolean settingsMode) {
93112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        AccountSetupIncomingFragment f = new AccountSetupIncomingFragment();
94112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        f.setSetupArguments(settingsMode);
95112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        return f;
96112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler    }
97112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler
98112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler    /**
991b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Called to do initial creation of a fragment.  This is called after
1001b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * {@link #onAttach(Activity)} and before {@link #onActivityCreated(Bundle)}.
1011b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
1021b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
1031b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onCreate(Bundle savedInstanceState) {
1041b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
1051b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupIncomingFragment onCreate");
1061b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
1071b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onCreate(savedInstanceState);
1081b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
109faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        if (savedInstanceState != null) {
110faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            mCacheLoginCredential = savedInstanceState.getString(STATE_KEY_CREDENTIAL);
1111f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mLoaded = savedInstanceState.getBoolean(STATE_KEY_LOADED, false);
112faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
1131b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
1141b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1151b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
1161b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public View onCreateView(LayoutInflater inflater, ViewGroup container,
1171b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Bundle savedInstanceState) {
1181b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
1191b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupIncomingFragment onCreateView");
1201b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
121112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        int layoutId = mSettingsMode
122112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler                ? R.layout.account_settings_incoming_fragment
123112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler                : R.layout.account_setup_incoming_fragment;
124112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler
125112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        View view = inflater.inflate(layoutId, container, false);
1261b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        Context context = getActivity();
1271b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1281b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mUsernameView = (EditText) view.findViewById(R.id.account_username);
1291b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mPasswordView = (EditText) view.findViewById(R.id.account_password);
1301b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mServerLabelView = (TextView) view.findViewById(R.id.account_server_label);
1311b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mServerView = (EditText) view.findViewById(R.id.account_server);
1321b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mPortView = (EditText) view.findViewById(R.id.account_port);
1331b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mSecurityTypeView = (Spinner) view.findViewById(R.id.account_security_type);
1341b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mDeletePolicyLabelView = (TextView) view.findViewById(R.id.account_delete_policy_label);
1351b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mDeletePolicyView = (Spinner) view.findViewById(R.id.account_delete_policy);
1361b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mImapPathPrefixSectionView = view.findViewById(R.id.imap_path_prefix_section);
1371b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mImapPathPrefixView = (EditText) view.findViewById(R.id.imap_path_prefix);
1381b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1391b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // Set up spinners
1401b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        SpinnerOption securityTypes[] = {
1411b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            new SpinnerOption(0,
1421b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    context.getString(R.string.account_setup_incoming_security_none_label)),
1431b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            new SpinnerOption(1,
1441b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    context.getString(R.string.account_setup_incoming_security_ssl_label)),
1451b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            new SpinnerOption(2,
1461b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    context.getString(
1471b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                            R.string.account_setup_incoming_security_ssl_trust_certificates_label)),
1481b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            new SpinnerOption(3,
1491b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    context.getString(R.string.account_setup_incoming_security_tls_label)),
1501b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            new SpinnerOption(4,
1511b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    context.getString(
1521b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                            R.string.account_setup_incoming_security_tls_trust_certificates_label)),
1531b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        };
1541b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1551b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        SpinnerOption deletePolicies[] = {
1561b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            new SpinnerOption(Account.DELETE_POLICY_NEVER,
1571b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    context.getString(R.string.account_setup_incoming_delete_policy_never_label)),
1581b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            new SpinnerOption(Account.DELETE_POLICY_ON_DELETE,
1591b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    context.getString(R.string.account_setup_incoming_delete_policy_delete_label)),
1601b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        };
1611b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1621b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        ArrayAdapter<SpinnerOption> securityTypesAdapter = new ArrayAdapter<SpinnerOption>(context,
1631b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                android.R.layout.simple_spinner_item, securityTypes);
1641b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        securityTypesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
1651b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mSecurityTypeView.setAdapter(securityTypesAdapter);
1661b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1671b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        ArrayAdapter<SpinnerOption> deletePoliciesAdapter = new ArrayAdapter<SpinnerOption>(context,
1681b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                android.R.layout.simple_spinner_item, deletePolicies);
1691b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        deletePoliciesAdapter.setDropDownViewResource(
1701b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                android.R.layout.simple_spinner_dropdown_item);
1711b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mDeletePolicyView.setAdapter(deletePoliciesAdapter);
1721b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1731b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // Updates the port when the user changes the security type. This allows
1741b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // us to show a reasonable default which the user can change.
1751b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mSecurityTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
1761b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
1771b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                updatePortFromSecurityType();
1781b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
1791b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1801b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            public void onNothingSelected(AdapterView<?> arg0) { }
1811b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        });
1821b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1831b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // After any text edits, call validateFields() which enables or disables the Next button
1841b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        TextWatcher validationTextWatcher = new TextWatcher() {
1851b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            public void afterTextChanged(Editable s) {
1861b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                validateFields();
1871b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
1881b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1891b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
1901b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            public void onTextChanged(CharSequence s, int start, int before, int count) { }
1911b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        };
1921b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mUsernameView.addTextChangedListener(validationTextWatcher);
1931b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mPasswordView.addTextChangedListener(validationTextWatcher);
1941b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mServerView.addTextChangedListener(validationTextWatcher);
1951b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mPortView.addTextChangedListener(validationTextWatcher);
1961b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1971b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // Only allow digits in the port field.
1981b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mPortView.setKeyListener(DigitsKeyListener.getInstance("0123456789"));
1991b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
200112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        // Additional setup only used while in "settings" mode
201112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        onCreateViewSettingsMode(view);
202112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler
2031b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        return view;
2041b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2051b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2061b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2071b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onActivityCreated(Bundle savedInstanceState) {
2081b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
2091b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupIncomingFragment onActivityCreated");
2101b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2111b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onActivityCreated(savedInstanceState);
2121b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2131b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2141b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
2151b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Called when the Fragment is visible to the user.
2161b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
2171b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2181b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onStart() {
2191b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
2201b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupIncomingFragment onStart");
2211b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2221b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onStart();
2231b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mStarted = true;
2241f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        configureEditor();
2251f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        loadSettings();
2261b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2271b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2281b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
2291b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Called when the fragment is visible to the user and actively running.
2301b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
2311b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2321b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onResume() {
2331b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
2341b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupIncomingFragment onResume");
2351b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2361b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onResume();
2371b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        validateFields();
2381b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2391b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2401b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2411b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onPause() {
2421b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
2431b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupIncomingFragment onPause");
2441b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2451b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onPause();
2461b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2471b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2481b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
2491b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Called when the Fragment is no longer started.
2501b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
2511b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2521b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onStop() {
2531b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
2541b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupIncomingFragment onStop");
2551b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2561b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onStop();
2571b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mStarted = false;
2581b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2591b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2601b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
2611b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Called when the fragment is no longer in use.
2621b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
2631b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2641b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onDestroy() {
2651b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
2661b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupIncomingFragment onDestroy");
2671b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2681b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onDestroy();
2691b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2701b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2711b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2721b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onSaveInstanceState(Bundle outState) {
2731b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
2741b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupIncomingFragment onSaveInstanceState");
2751b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2761b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onSaveInstanceState(outState);
2771b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2781b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        outState.putString(STATE_KEY_CREDENTIAL, mCacheLoginCredential);
2791f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        outState.putBoolean(STATE_KEY_LOADED, mLoaded);
2801b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2811b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2821b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
2831b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Activity provides callbacks here.  This also triggers loading and setting up the UX
2841b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
2851a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
2861b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void setCallback(Callback callback) {
2871a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        super.setCallback(callback);
2881f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        if (mStarted) {
2891f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            configureEditor();
2901b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            loadSettings();
2911b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2921b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2931b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2941b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
2951f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler     * Configure the editor for the account type
2961f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler     */
2971f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    private void configureEditor() {
2981f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        if (mConfigured) return;
2991f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        Account account = SetupData.getAccount();
3001f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        String protocol = account.mHostAuthRecv.mProtocol;
3011f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        if (protocol.startsWith("pop3")) {
3021f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mServerLabelView.setText(R.string.account_setup_incoming_pop_server_label);
3031f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mAccountPorts = POP_PORTS;
3041f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mAccountSchemes = POP_SCHEMES;
3051f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mImapPathPrefixSectionView.setVisibility(View.GONE);
3061f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        } else if (protocol.startsWith("imap")) {
3071f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mServerLabelView.setText(R.string.account_setup_incoming_imap_server_label);
3081f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mAccountPorts = IMAP_PORTS;
3091f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mAccountSchemes = IMAP_SCHEMES;
3101f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mDeletePolicyLabelView.setVisibility(View.GONE);
3111f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mDeletePolicyView.setVisibility(View.GONE);
3121f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        } else {
3131f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            throw new Error("Unknown account type: " + account);
3141f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        }
3151f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        mConfigured = true;
3161f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    }
3171f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler
3181f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    /**
3191b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Load the current settings into the UI
3201b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
3211b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private void loadSettings() {
3221f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        if (mLoaded) return;
3231b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        try {
3241b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            // TODO this should be accessed directly via the HostAuth structure
3251b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            EmailContent.Account account = SetupData.getAccount();
3261b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            URI uri = new URI(account.getStoreUri(mContext));
3271b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            String username = null;
3281b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            String password = null;
3291b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            if (uri.getUserInfo() != null) {
3301b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                String[] userInfoParts = uri.getUserInfo().split(":", 2);
3311b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                username = userInfoParts[0];
3321b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                if (userInfoParts.length > 1) {
3331b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    password = userInfoParts[1];
3341b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                }
3351b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
3361b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3371b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            if (username != null) {
3381b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                mUsernameView.setText(username);
3391b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
3401b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3411b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            if (password != null) {
3421b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                mPasswordView.setText(password);
3431b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
3441b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3451b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            if (uri.getScheme().startsWith("pop3")) {
3461f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler                SpinnerOption.setSpinnerOptionValue(mDeletePolicyView, account.getDeletePolicy());
3471b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            } else if (uri.getScheme().startsWith("imap")) {
3481b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                if (uri.getPath() != null && uri.getPath().length() > 0) {
3491b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    mImapPathPrefixView.setText(uri.getPath().substring(1));
3501b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                }
3511b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            } else {
3521b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                throw new Error("Unknown account type: " + account.getStoreUri(mContext));
3531b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
3541b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3551b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            for (int i = 0; i < mAccountSchemes.length; i++) {
3561b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                if (mAccountSchemes[i].equals(uri.getScheme())) {
3571b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    SpinnerOption.setSpinnerOptionValue(mSecurityTypeView, i);
3581b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                }
3591b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
3601b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3611b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            if (uri.getHost() != null) {
3621b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                mServerView.setText(uri.getHost());
3631b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
3641b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3651b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            if (uri.getPort() != -1) {
3661b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                mPortView.setText(Integer.toString(uri.getPort()));
3671b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            } else {
3681b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                updatePortFromSecurityType();
3691b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
3701b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        } catch (URISyntaxException use) {
3711b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            /*
3721b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler             * We should always be able to parse our own settings.
3731b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler             */
3741b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            throw new Error(use);
3751b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
3761f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        mLoaded = true;
3771b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        validateFields();
3781b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
3791b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3801b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
3811b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Check the values in the fields and decide if it makes sense to enable the "next" button
3821b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
3831b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private void validateFields() {
3841f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        if (!mConfigured || !mLoaded) return;
3851b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        boolean enabled = Utility.isTextViewNotEmpty(mUsernameView)
3861b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                && Utility.isTextViewNotEmpty(mPasswordView)
3871b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                && Utility.isTextViewNotEmpty(mServerView)
3881b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                && Utility.isPortFieldValid(mPortView);
3891b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (enabled) {
3901b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            try {
3911b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                URI uri = getUri();
3921b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            } catch (URISyntaxException use) {
3931b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                enabled = false;
3941b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
3951b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
3961a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        enableNextButton(enabled);
3971b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
3981b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3991b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private void updatePortFromSecurityType() {
4001b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value;
4011b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mPortView.setText(Integer.toString(mAccountPorts[securityType]));
4021b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
4031b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
4041b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
4051b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Entry point from Activity after editing settings and verifying them.  Must be FLOW_MODE_EDIT.
4061b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
4071a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
4081b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void saveSettingsAfterEdit() {
4091b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        EmailContent.Account account = SetupData.getAccount();
4101b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (account.isSaved()) {
4111b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            account.update(mContext, account.toContentValues());
4121b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            account.mHostAuthRecv.update(mContext, account.mHostAuthRecv.toContentValues());
4131b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        } else {
4141b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            account.save(mContext);
4151b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
4161b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // Update the backup (side copy) of the accounts
4171b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        AccountBackupRestore.backupAccounts(mContext);
4181b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
4191b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
4201b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
4211b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Entry point from Activity after entering new settings and verifying them.  For setup mode.
4221b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
423fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler    @Override
4241b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void saveSettingsAfterSetup() {
4251b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        EmailContent.Account account = SetupData.getAccount();
4261b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
4271b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // Set the username and password for the outgoing settings to the username and
428ba4e72a9474bcbe33a8001a1964a02cb41ea08bbAndy Stadler        // password the user just set for incoming.  Use the verified host address to try and
429ba4e72a9474bcbe33a8001a1964a02cb41ea08bbAndy Stadler        // pick a smarter outgoing address.
4301b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        try {
431ba4e72a9474bcbe33a8001a1964a02cb41ea08bbAndy Stadler            String hostName =
432ba4e72a9474bcbe33a8001a1964a02cb41ea08bbAndy Stadler                AccountSettingsUtils.inferServerName(account.mHostAuthRecv.mAddress, null, "smtp");
4331b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            URI oldUri = new URI(account.getSenderUri(mContext));
4341b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            URI uri = new URI(
4351b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    oldUri.getScheme(),
4361b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    mUsernameView.getText().toString().trim() + ":"
437ba4e72a9474bcbe33a8001a1964a02cb41ea08bbAndy Stadler                            + mPasswordView.getText().toString(),
438ba4e72a9474bcbe33a8001a1964a02cb41ea08bbAndy Stadler                    hostName,
4391b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    oldUri.getPort(),
4401b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    null,
4411b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    null,
4421b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    null);
4431b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            account.setSenderUri(mContext, uri.toString());
4441b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        } catch (URISyntaxException use) {
4451b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            // If we can't set up the URL we just continue. It's only for convenience.
4461b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
4471b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
4481b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
4491b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
4501b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Attempt to create a URI from the fields provided.  Throws URISyntaxException if there's
4511b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * a problem with the user input.
4521b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * @return a URI built from the account setup fields
4531b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
454fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler    /* package */ URI getUri() throws URISyntaxException {
4551b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value;
4561b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        String path = null;
4571b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        if (mAccountSchemes[securityType].startsWith("imap")) {
4581b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            path = "/" + mImapPathPrefixView.getText().toString().trim();
4591b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
4601b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        String userName = mUsernameView.getText().toString().trim();
4611b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mCacheLoginCredential = userName;
4621b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        URI uri = new URI(
4631b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                mAccountSchemes[securityType],
464fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler                userName + ":" + mPasswordView.getText(),
4651b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                mServerView.getText().toString().trim(),
4661b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                Integer.parseInt(mPortView.getText().toString().trim()),
4671b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                path, // path
4681b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                null, // query
4691b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                null);
4701b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
4711b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        return uri;
4721b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
4731b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
4741b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
4751b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Entry point from Activity, when "next" button is clicked
4761b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
4771a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
4781b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onNext() {
4791b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        EmailContent.Account setupAccount = SetupData.getAccount();
4801b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        try {
4811b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            URI uri = getUri();
4821b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            setupAccount.setStoreUri(mContext, uri.toString());
4831b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
4841b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            // Stop here if the login credentials duplicate an existing account
4851b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            // (unless they duplicate the existing account, as they of course will)
4861b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            EmailContent.Account account = Utility.findExistingAccount(mContext, setupAccount.mId,
4871b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    uri.getHost(), mCacheLoginCredential);
4881b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            if (account != null) {
4891b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                DuplicateAccountDialogFragment dialogFragment =
4907b5c5cf2a993d68bb8fe1a65bde3184e8d59c10fAndrew Stadler                    DuplicateAccountDialogFragment.newInstance(account.mDisplayName);
4911b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                dialogFragment.show(getActivity(), DuplicateAccountDialogFragment.TAG);
4921b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                return;
4931b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
4941b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        } catch (URISyntaxException use) {
4951b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            /*
4961b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler             * It's unrecoverable if we cannot create a URI from components that
4971b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler             * we validated to be safe.
4981b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler             */
4991b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            throw new Error(use);
5001b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
5011b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
5021b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        setupAccount.setDeletePolicy(
5031b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                (Integer)((SpinnerOption)mDeletePolicyView.getSelectedItem()).value);
5041b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
505fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler        mCallback.onProceedNext(SetupData.CHECK_INCOMING, this);
5061b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
5071b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler}
508