AccountSetupIncomingFragment.java revision 3432bdb757c4195fb4726c8b401f2261e78d75a7
11b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler/*
21b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * Copyright (C) 2010 The Android Open Source Project
31b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler *
41b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * Licensed under the Apache License, Version 2.0 (the "License");
51b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * you may not use this file except in compliance with the License.
61b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * You may obtain a copy of the License at
71b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler *
81b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler *      http://www.apache.org/licenses/LICENSE-2.0
91b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler *
101b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * Unless required by applicable law or agreed to in writing, software
111b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * distributed under the License is distributed on an "AS IS" BASIS,
121b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * See the License for the specific language governing permissions and
141b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * limitations under the License.
151b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler */
161b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
171b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerpackage com.android.email.activity.setup;
181b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
191b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.app.Activity;
201b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.content.Context;
211b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.os.Bundle;
221b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.text.Editable;
235125c06cef67447a0ef5881d8fbfd6b73e1dfd0aBen Komaloimport android.text.TextUtils;
241b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.text.TextWatcher;
251b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.text.method.DigitsKeyListener;
261b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.util.Log;
271b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.view.LayoutInflater;
281b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.view.View;
291b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.view.ViewGroup;
303432bdb757c4195fb4726c8b401f2261e78d75a7Ben Komaloimport android.view.inputmethod.EditorInfo;
311b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.widget.AdapterView;
321b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.widget.ArrayAdapter;
331b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.widget.EditText;
341b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.widget.Spinner;
351b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.widget.TextView;
361b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3769111b1e19456c4e861b031da3b3b7f26893d664Marc Blankimport com.android.email.Email;
3869111b1e19456c4e861b031da3b3b7f26893d664Marc Blankimport com.android.email.R;
3969111b1e19456c4e861b031da3b3b7f26893d664Marc Blankimport com.android.email.activity.UiUtilities;
4069111b1e19456c4e861b031da3b3b7f26893d664Marc Blankimport com.android.email.provider.AccountBackupRestore;
4169111b1e19456c4e861b031da3b3b7f26893d664Marc Blankimport com.android.emailcommon.Logging;
42f5418f1f93b02e7fab9f15eb201800b65510998eMarc Blankimport com.android.emailcommon.provider.Account;
4369111b1e19456c4e861b031da3b3b7f26893d664Marc Blankimport com.android.emailcommon.provider.HostAuth;
4469111b1e19456c4e861b031da3b3b7f26893d664Marc Blankimport com.android.emailcommon.utility.Utility;
4569111b1e19456c4e861b031da3b3b7f26893d664Marc Blank
46fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler/**
47fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * Provides UI for IMAP/POP account settings.
48fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler *
49fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * This fragment is used by AccountSetupIncoming (for creating accounts) and by AccountSettingsXL
50fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * (for editing existing accounts).
51fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler */
521a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadlerpublic class AccountSetupIncomingFragment extends AccountServerBaseFragment {
531b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
541f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    private final static String STATE_KEY_CREDENTIAL = "AccountSetupIncomingFragment.credential";
551f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    private final static String STATE_KEY_LOADED = "AccountSetupIncomingFragment.loaded";
561b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
57040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    private static final int POP3_PORT_NORMAL = 110;
58040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    private static final int POP3_PORT_SSL = 995;
59040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
60040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    private static final int IMAP_PORT_NORMAL = 143;
61040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    private static final int IMAP_PORT_SSL = 993;
62040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
631b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private EditText mUsernameView;
641b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private EditText mPasswordView;
651b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private TextView mServerLabelView;
661b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private EditText mServerView;
671b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private EditText mPortView;
681b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private Spinner mSecurityTypeView;
691b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private TextView mDeletePolicyLabelView;
701b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private Spinner mDeletePolicyView;
711b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private View mImapPathPrefixSectionView;
721b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private EditText mImapPathPrefixView;
73c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    // Delete policy as loaded from the device
74c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    private int mLoadedDeletePolicy;
751b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
761b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    // Support for lifecycle
771b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private boolean mStarted;
781f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    private boolean mConfigured;
791b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private boolean mLoaded;
801b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private String mCacheLoginCredential;
811b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
821b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
831b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Called to do initial creation of a fragment.  This is called after
841b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * {@link #onAttach(Activity)} and before {@link #onActivityCreated(Bundle)}.
851b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
861b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
871b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onCreate(Bundle savedInstanceState) {
88bfac9f2e8a13f6c719608a6948203bbef921c99fMakoto Onuki        if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
8931d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank            Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onCreate");
901b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
911b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onCreate(savedInstanceState);
921b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
93faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        if (savedInstanceState != null) {
94faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            mCacheLoginCredential = savedInstanceState.getString(STATE_KEY_CREDENTIAL);
951f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mLoaded = savedInstanceState.getBoolean(STATE_KEY_LOADED, false);
96faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
971b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
981b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
991b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
1001b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public View onCreateView(LayoutInflater inflater, ViewGroup container,
1011b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            Bundle savedInstanceState) {
102bfac9f2e8a13f6c719608a6948203bbef921c99fMakoto Onuki        if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
10331d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank            Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onCreateView");
1041b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
105112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        int layoutId = mSettingsMode
106112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler                ? R.layout.account_settings_incoming_fragment
107112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler                : R.layout.account_setup_incoming_fragment;
108112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler
109112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        View view = inflater.inflate(layoutId, container, false);
1101b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        Context context = getActivity();
1111b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1122fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki        mUsernameView = (EditText) UiUtilities.getView(view, R.id.account_username);
1132fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki        mPasswordView = (EditText) UiUtilities.getView(view, R.id.account_password);
1142fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki        mServerLabelView = (TextView) UiUtilities.getView(view, R.id.account_server_label);
1152fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki        mServerView = (EditText) UiUtilities.getView(view, R.id.account_server);
1162fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki        mPortView = (EditText) UiUtilities.getView(view, R.id.account_port);
1172fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki        mSecurityTypeView = (Spinner) UiUtilities.getView(view, R.id.account_security_type);
1182fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki        mDeletePolicyLabelView = (TextView) UiUtilities.getView(view,
1192fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki                R.id.account_delete_policy_label);
1202fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki        mDeletePolicyView = (Spinner) UiUtilities.getView(view, R.id.account_delete_policy);
1212fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki        mImapPathPrefixSectionView = UiUtilities.getView(view, R.id.imap_path_prefix_section);
1222fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki        mImapPathPrefixView = (EditText) UiUtilities.getView(view, R.id.imap_path_prefix);
1231b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1241b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // Set up spinners
1251b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        SpinnerOption securityTypes[] = {
126040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            new SpinnerOption(HostAuth.FLAG_NONE, context.getString(
127040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy                    R.string.account_setup_incoming_security_none_label)),
128040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            new SpinnerOption(HostAuth.FLAG_SSL, context.getString(
129040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy                    R.string.account_setup_incoming_security_ssl_label)),
130040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            new SpinnerOption(HostAuth.FLAG_SSL | HostAuth.FLAG_TRUST_ALL, context.getString(
131040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy                    R.string.account_setup_incoming_security_ssl_trust_certificates_label)),
132040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            new SpinnerOption(HostAuth.FLAG_TLS, context.getString(
133040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy                    R.string.account_setup_incoming_security_tls_label)),
134040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            new SpinnerOption(HostAuth.FLAG_TLS | HostAuth.FLAG_TRUST_ALL, context.getString(
135040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy                    R.string.account_setup_incoming_security_tls_trust_certificates_label)),
1361b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        };
1371b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1381b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        SpinnerOption deletePolicies[] = {
1391b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            new SpinnerOption(Account.DELETE_POLICY_NEVER,
1401b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    context.getString(R.string.account_setup_incoming_delete_policy_never_label)),
1411b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            new SpinnerOption(Account.DELETE_POLICY_ON_DELETE,
1421b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                    context.getString(R.string.account_setup_incoming_delete_policy_delete_label)),
1431b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        };
1441b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1451b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        ArrayAdapter<SpinnerOption> securityTypesAdapter = new ArrayAdapter<SpinnerOption>(context,
1461b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                android.R.layout.simple_spinner_item, securityTypes);
1471b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        securityTypesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
1481b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mSecurityTypeView.setAdapter(securityTypesAdapter);
1491b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1501b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        ArrayAdapter<SpinnerOption> deletePoliciesAdapter = new ArrayAdapter<SpinnerOption>(context,
1511b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                android.R.layout.simple_spinner_item, deletePolicies);
1521b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        deletePoliciesAdapter.setDropDownViewResource(
1531b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                android.R.layout.simple_spinner_dropdown_item);
1541b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mDeletePolicyView.setAdapter(deletePoliciesAdapter);
1551b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1561b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // Updates the port when the user changes the security type. This allows
1571b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // us to show a reasonable default which the user can change.
1581b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mSecurityTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
1591b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
1601b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                updatePortFromSecurityType();
1611b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
1621b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1631b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            public void onNothingSelected(AdapterView<?> arg0) { }
1641b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        });
1651b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1661b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // After any text edits, call validateFields() which enables or disables the Next button
1671b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        TextWatcher validationTextWatcher = new TextWatcher() {
1681b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            public void afterTextChanged(Editable s) {
1691b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                validateFields();
1701b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
1711b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1721b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
1731b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            public void onTextChanged(CharSequence s, int start, int before, int count) { }
1741b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        };
175206109cf44e27e90e4a5208daa289704aa451198Todd Kennedy        // We're editing an existing account; don't allow modification of the user name
176206109cf44e27e90e4a5208daa289704aa451198Todd Kennedy        if (mSettingsMode) {
177206109cf44e27e90e4a5208daa289704aa451198Todd Kennedy            makeTextViewUneditable(mUsernameView,
178206109cf44e27e90e4a5208daa289704aa451198Todd Kennedy                    getString(R.string.account_setup_username_uneditable_error));
179206109cf44e27e90e4a5208daa289704aa451198Todd Kennedy        }
1801b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mUsernameView.addTextChangedListener(validationTextWatcher);
1811b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mPasswordView.addTextChangedListener(validationTextWatcher);
1821b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mServerView.addTextChangedListener(validationTextWatcher);
1831b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mPortView.addTextChangedListener(validationTextWatcher);
1841b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1851b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // Only allow digits in the port field.
1861b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mPortView.setKeyListener(DigitsKeyListener.getInstance("0123456789"));
1871b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
188112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        // Additional setup only used while in "settings" mode
189112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        onCreateViewSettingsMode(view);
190112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler
1911b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        return view;
1921b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
1931b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
1941b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
1951b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onActivityCreated(Bundle savedInstanceState) {
196bfac9f2e8a13f6c719608a6948203bbef921c99fMakoto Onuki        if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
19731d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank            Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onActivityCreated");
1981b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
1991b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onActivityCreated(savedInstanceState);
2001b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2011b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2021b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
2031b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Called when the Fragment is visible to the user.
2041b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
2051b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2061b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onStart() {
207bfac9f2e8a13f6c719608a6948203bbef921c99fMakoto Onuki        if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
20831d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank            Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onStart");
2091b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2101b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onStart();
2111b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mStarted = true;
2121f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        configureEditor();
2131f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        loadSettings();
2141b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2151b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2161b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
2171b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Called when the fragment is visible to the user and actively running.
2181b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
2191b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2201b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onResume() {
221bfac9f2e8a13f6c719608a6948203bbef921c99fMakoto Onuki        if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
22231d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank            Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onResume");
2231b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2241b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onResume();
2251b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        validateFields();
2261b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2271b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2281b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2291b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onPause() {
230bfac9f2e8a13f6c719608a6948203bbef921c99fMakoto Onuki        if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
23131d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank            Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onPause");
2321b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2331b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onPause();
2341b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2351b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2361b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
2371b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Called when the Fragment is no longer started.
2381b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
2391b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2401b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onStop() {
241bfac9f2e8a13f6c719608a6948203bbef921c99fMakoto Onuki        if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
24231d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank            Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onStop");
2431b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2441b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onStop();
2451b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mStarted = false;
2461b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2471b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2481b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
2491b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Called when the fragment is no longer in use.
2501b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
2511b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2521b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onDestroy() {
253bfac9f2e8a13f6c719608a6948203bbef921c99fMakoto Onuki        if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
25431d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank            Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onDestroy");
2551b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2561b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onDestroy();
2571b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2581b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2591b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2601b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onSaveInstanceState(Bundle outState) {
261bfac9f2e8a13f6c719608a6948203bbef921c99fMakoto Onuki        if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
26231d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank            Log.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onSaveInstanceState");
2631b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2641b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onSaveInstanceState(outState);
2651b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2661b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        outState.putString(STATE_KEY_CREDENTIAL, mCacheLoginCredential);
2671f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        outState.putBoolean(STATE_KEY_LOADED, mLoaded);
2681b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2691b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2701b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
2711b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Activity provides callbacks here.  This also triggers loading and setting up the UX
2721b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
2731a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
2741b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void setCallback(Callback callback) {
2751a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        super.setCallback(callback);
2761f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        if (mStarted) {
2771f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            configureEditor();
2781b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            loadSettings();
2791b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2801b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2811b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2821b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
2831f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler     * Configure the editor for the account type
2841f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler     */
2851f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    private void configureEditor() {
2861f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        if (mConfigured) return;
2871f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        Account account = SetupData.getAccount();
2883432bdb757c4195fb4726c8b401f2261e78d75a7Ben Komalo        TextView lastView = mImapPathPrefixView;
289040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        mBaseScheme = account.mHostAuthRecv.mProtocol;
2906fea021e3dbe71aaa93512aba699d1bfda3d520dMarc Blank        if (HostAuth.SCHEME_POP3.equals(mBaseScheme)) {
2911f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mServerLabelView.setText(R.string.account_setup_incoming_pop_server_label);
2927667632eb24653ef208261651298996f5fdf6911Jorge Lugo            mServerView.setContentDescription(
2937667632eb24653ef208261651298996f5fdf6911Jorge Lugo                    getResources().getString(R.string.account_setup_incoming_pop_server_label));
2941f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mImapPathPrefixSectionView.setVisibility(View.GONE);
2953432bdb757c4195fb4726c8b401f2261e78d75a7Ben Komalo            lastView = mPortView;
2966fea021e3dbe71aaa93512aba699d1bfda3d520dMarc Blank        } else if (HostAuth.SCHEME_IMAP.equals(mBaseScheme)) {
2971f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mServerLabelView.setText(R.string.account_setup_incoming_imap_server_label);
2987667632eb24653ef208261651298996f5fdf6911Jorge Lugo            mServerView.setContentDescription(
2997667632eb24653ef208261651298996f5fdf6911Jorge Lugo                    getResources().getString(R.string.account_setup_incoming_imap_server_label));
3001f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mDeletePolicyLabelView.setVisibility(View.GONE);
3011f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mDeletePolicyView.setVisibility(View.GONE);
3023432bdb757c4195fb4726c8b401f2261e78d75a7Ben Komalo            mPortView.setImeOptions(EditorInfo.IME_ACTION_NEXT);
3031f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        } else {
3041f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            throw new Error("Unknown account type: " + account);
3051f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        }
3063432bdb757c4195fb4726c8b401f2261e78d75a7Ben Komalo        lastView.setOnEditorActionListener(mDismissImeOnDoneListener);
3071f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        mConfigured = true;
3081f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    }
3091f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler
3101f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    /**
3111b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Load the current settings into the UI
3121b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
3131b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private void loadSettings() {
3141f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        if (mLoaded) return;
3151b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
316040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        Account account = SetupData.getAccount();
317040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        HostAuth recvAuth = account.getOrCreateHostAuthRecv(mContext);
3181b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
319040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        String username = recvAuth.mLogin;
320040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        if (username != null) {
321040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            mUsernameView.setText(username);
322040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        }
323040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        String password = recvAuth.mPassword;
324040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        if (password != null) {
325040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            mPasswordView.setText(password);
326cf194df05c31045ec734ace84ce2b739639bf12eJorge Lugo            // Since username is uneditable, focus on the next editable field
327cf194df05c31045ec734ace84ce2b739639bf12eJorge Lugo            if (mSettingsMode) {
328cf194df05c31045ec734ace84ce2b739639bf12eJorge Lugo                mPasswordView.requestFocus();
329cf194df05c31045ec734ace84ce2b739639bf12eJorge Lugo            }
330040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        }
3311b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3326fea021e3dbe71aaa93512aba699d1bfda3d520dMarc Blank        if (HostAuth.SCHEME_IMAP.equals(recvAuth.mProtocol)) {
333040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            String prefix = recvAuth.mDomain;
334040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            if (prefix != null && prefix.length() > 0) {
335040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy                mImapPathPrefixView.setText(prefix.substring(1));
3361b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
3376fea021e3dbe71aaa93512aba699d1bfda3d520dMarc Blank        } else if (!HostAuth.SCHEME_POP3.equals(recvAuth.mProtocol)) {
3388c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy            // Account must either be IMAP or POP3
33985e4c101b014857fe40f87c3837b82564cfc5b6cMarc Blank            throw new Error("Unknown account type: " + recvAuth.mProtocol);
340040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        }
3411b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3428c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy        // The delete policy is set for all legacy accounts. For POP3 accounts, the user sets
3438c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy        // the policy explicitly. For IMAP accounts, the policy is set when the Account object
3448c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy        // is created. @see AccountSetupBasics#populateSetupData
3458c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy        mLoadedDeletePolicy = account.getDeletePolicy();
3468c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy        SpinnerOption.setSpinnerOptionValue(mDeletePolicyView, mLoadedDeletePolicy);
3478c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy
348040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        int flags = recvAuth.mFlags;
349040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        flags &= ~HostAuth.FLAG_AUTHENTICATE;
350040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        SpinnerOption.setSpinnerOptionValue(mSecurityTypeView, flags);
3511b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
352040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        String hostname = recvAuth.mAddress;
353040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        if (hostname != null) {
354040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            mServerView.setText(hostname);
355040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        }
3561b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
357040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        int port = recvAuth.mPort;
358040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        if (port != HostAuth.PORT_UNKNOWN) {
359040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            mPortView.setText(Integer.toString(port));
360040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        } else {
361040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            updatePortFromSecurityType();
3621b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
363c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
364fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        mLoadedRecvAuth = recvAuth;
3651f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        mLoaded = true;
3661b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        validateFields();
3671b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
3681b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3691b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
3701b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Check the values in the fields and decide if it makes sense to enable the "next" button
3711b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
3721b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private void validateFields() {
3731f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        if (!mConfigured || !mLoaded) return;
3741b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        boolean enabled = Utility.isTextViewNotEmpty(mUsernameView)
3751b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                && Utility.isTextViewNotEmpty(mPasswordView)
376ce4cce05b2ee5ea2d9629c189a79f7f30778f534Makoto Onuki                && Utility.isServerNameValid(mServerView)
3771b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler                && Utility.isPortFieldValid(mPortView);
3781a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        enableNextButton(enabled);
379858c2822777f74947e81476125590ad06bfe4803Andy Stadler
38069111b1e19456c4e861b031da3b3b7f26893d664Marc Blank        String userName = mUsernameView.getText().toString().trim();
38169111b1e19456c4e861b031da3b3b7f26893d664Marc Blank        mCacheLoginCredential = userName;
38269111b1e19456c4e861b031da3b3b7f26893d664Marc Blank
383858c2822777f74947e81476125590ad06bfe4803Andy Stadler        // Warn (but don't prevent) if password has leading/trailing spaces
384858c2822777f74947e81476125590ad06bfe4803Andy Stadler        AccountSettingsUtils.checkPasswordSpaces(mContext, mPasswordView);
3851b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
3861b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
387040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    private int getPortFromSecurityType() {
3881b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value;
389040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        boolean useSsl = ((securityType & HostAuth.FLAG_SSL) != 0);
390040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        int port = useSsl ? IMAP_PORT_SSL : IMAP_PORT_NORMAL;     // default to IMAP
3916fea021e3dbe71aaa93512aba699d1bfda3d520dMarc Blank        if (HostAuth.SCHEME_POP3.equals(mBaseScheme)) {
392040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            port = useSsl ? POP3_PORT_SSL : POP3_PORT_NORMAL;
393040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        }
394040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        return port;
395040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    }
396040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
397040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    private void updatePortFromSecurityType() {
398040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        int port = getPortFromSecurityType();
399040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        mPortView.setText(Integer.toString(port));
4001b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
4011b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
4021b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
4031b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Entry point from Activity after editing settings and verifying them.  Must be FLOW_MODE_EDIT.
4046e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler     * Note, we update account here (as well as the account.mHostAuthRecv) because we edit
4056e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler     * account's delete policy here.
4066e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler     * Blocking - do not call from UI Thread.
4071b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
4081a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
4091b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void saveSettingsAfterEdit() {
4106e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler        Account account = SetupData.getAccount();
4116e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler        account.update(mContext, account.toContentValues());
4126e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler        account.mHostAuthRecv.update(mContext, account.mHostAuthRecv.toContentValues());
4131b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // Update the backup (side copy) of the accounts
4140993190cafebc107bd27a26996b5d63d4a4ede10Marc Blank        AccountBackupRestore.backup(mContext);
4151b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
4161b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
4171b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
4181b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Entry point from Activity after entering new settings and verifying them.  For setup mode.
4191b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
420fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler    @Override
4211b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void saveSettingsAfterSetup() {
422040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        Account account = SetupData.getAccount();
423040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        HostAuth recvAuth = account.getOrCreateHostAuthRecv(mContext);
424040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        HostAuth sendAuth = account.getOrCreateHostAuthSend(mContext);
4251b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
4261b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // Set the username and password for the outgoing settings to the username and
427ba4e72a9474bcbe33a8001a1964a02cb41ea08bbAndy Stadler        // password the user just set for incoming.  Use the verified host address to try and
428ba4e72a9474bcbe33a8001a1964a02cb41ea08bbAndy Stadler        // pick a smarter outgoing address.
429040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        String hostName = AccountSettingsUtils.inferServerName(recvAuth.mAddress, null, "smtp");
430040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        sendAuth.setLogin(recvAuth.mLogin, recvAuth.mPassword);
431040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        sendAuth.setConnection(sendAuth.mProtocol, hostName, sendAuth.mPort, sendAuth.mFlags);
4321b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
4331b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
4341b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
4351b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Entry point from Activity, when "next" button is clicked
4361b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
4371a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
4381b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onNext() {
439040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        Account account = SetupData.getAccount();
440040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
44181a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank        // Make sure delete policy is an valid option before using it; otherwise, the results are
44281a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank        // indeterminate, I suspect...
44381a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank        if (mDeletePolicyView.getVisibility() == View.VISIBLE) {
44481a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank            account.setDeletePolicy(
44581a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank                    (Integer) ((SpinnerOption) mDeletePolicyView.getSelectedItem()).value);
44681a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank        }
4478d22e85e459df3d94968389852859dacaf2baafeAndy Stadler
448040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        HostAuth recvAuth = account.getOrCreateHostAuthRecv(mContext);
449040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        String userName = mUsernameView.getText().toString().trim();
450040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        String userPassword = mPasswordView.getText().toString();
451040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        recvAuth.setLogin(userName, userPassword);
4528d22e85e459df3d94968389852859dacaf2baafeAndy Stadler
453040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        String serverAddress = mServerView.getText().toString().trim();
454040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        int serverPort;
4551b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        try {
456040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            serverPort = Integer.parseInt(mPortView.getText().toString().trim());
457040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        } catch (NumberFormatException e) {
458040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            serverPort = getPortFromSecurityType();
459040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            Log.d(Logging.LOG_TAG, "Non-integer server port; using '" + serverPort + "'");
4601b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
461040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        int securityType = (Integer) ((SpinnerOption) mSecurityTypeView.getSelectedItem()).value;
462040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        recvAuth.setConnection(mBaseScheme, serverAddress, serverPort, securityType);
4635125c06cef67447a0ef5881d8fbfd6b73e1dfd0aBen Komalo        if (HostAuth.SCHEME_IMAP.equals(recvAuth.mProtocol)) {
4645125c06cef67447a0ef5881d8fbfd6b73e1dfd0aBen Komalo            String prefix = mImapPathPrefixView.getText().toString().trim();
4655125c06cef67447a0ef5881d8fbfd6b73e1dfd0aBen Komalo            recvAuth.mDomain = TextUtils.isEmpty(prefix) ? null : ("/" + prefix);
4665125c06cef67447a0ef5881d8fbfd6b73e1dfd0aBen Komalo        } else {
4675125c06cef67447a0ef5881d8fbfd6b73e1dfd0aBen Komalo            recvAuth.mDomain = null;
4685125c06cef67447a0ef5881d8fbfd6b73e1dfd0aBen Komalo        }
469040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
470040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        // Check for a duplicate account (requires async DB work) and if OK,
471040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        // proceed with check
472040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        startDuplicateTaskCheck(
473040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy                account.mId, serverAddress, mCacheLoginCredential, SetupData.CHECK_INCOMING);
4741b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
475c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
476c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    @Override
477c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    public boolean haveSettingsChanged() {
478c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        boolean deletePolicyChanged = false;
479c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
480c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        // Only verify the delete policy if the control is visible (i.e. is a pop3 account)
481c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        if (mDeletePolicyView.getVisibility() == View.VISIBLE) {
482c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            int newDeletePolicy =
483c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy                (Integer)((SpinnerOption)mDeletePolicyView.getSelectedItem()).value;
484c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            deletePolicyChanged = mLoadedDeletePolicy != newDeletePolicy;
485c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        }
486c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
487c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        return deletePolicyChanged || super.haveSettingsChanged();
488c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    }
4891b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler}
490