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