1faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler/*
2faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * Copyright (C) 2010 The Android Open Source Project
3faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler *
4faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * Licensed under the Apache License, Version 2.0 (the "License");
5faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * you may not use this file except in compliance with the License.
6faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * You may obtain a copy of the License at
7faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler *
8faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler *      http://www.apache.org/licenses/LICENSE-2.0
9faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler *
10faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * Unless required by applicable law or agreed to in writing, software
11faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * distributed under the License is distributed on an "AS IS" BASIS,
12faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * See the License for the specific language governing permissions and
14faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * limitations under the License.
15faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler */
16faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
17faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerpackage com.android.email.activity.setup;
18faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
19faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.app.Activity;
20faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.content.Context;
21faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.os.Bundle;
22faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.text.Editable;
23ed4accb24facd1324948abc61b0791eb3dc97cc4Tony Mantlerimport android.text.TextUtils;
24faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.text.TextWatcher;
25faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.text.method.DigitsKeyListener;
26faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.view.LayoutInflater;
27faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.view.View;
28faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.view.ViewGroup;
29faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.widget.AdapterView;
30faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.widget.ArrayAdapter;
31faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.widget.CheckBox;
32faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.widget.CompoundButton;
33faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.widget.CompoundButton.OnCheckedChangeListener;
34faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.widget.EditText;
35faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.widget.Spinner;
36faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
3785e4c101b014857fe40f87c3837b82564cfc5b6cMarc Blankimport com.android.email.R;
3885e4c101b014857fe40f87c3837b82564cfc5b6cMarc Blankimport com.android.email.activity.UiUtilities;
3985e4c101b014857fe40f87c3837b82564cfc5b6cMarc Blankimport com.android.email.provider.AccountBackupRestore;
40f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport com.android.email2.ui.MailActivityEmail;
4185e4c101b014857fe40f87c3837b82564cfc5b6cMarc Blankimport com.android.emailcommon.Logging;
42f5418f1f93b02e7fab9f15eb201800b65510998eMarc Blankimport com.android.emailcommon.provider.Account;
4385e4c101b014857fe40f87c3837b82564cfc5b6cMarc Blankimport com.android.emailcommon.provider.HostAuth;
4485e4c101b014857fe40f87c3837b82564cfc5b6cMarc Blankimport com.android.emailcommon.utility.Utility;
45560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedyimport com.android.mail.utils.LogUtils;
46faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
47fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler/**
48fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * Provides UI for SMTP account settings (for IMAP/POP accounts).
49fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler *
50fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * This fragment is used by AccountSetupOutgoing (for creating accounts) and by AccountSettingsXL
51fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * (for editing existing accounts).
52fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler */
531a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadlerpublic class AccountSetupOutgoingFragment extends AccountServerBaseFragment
541a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        implements OnCheckedChangeListener {
551f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler
561f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    private final static String STATE_KEY_LOADED = "AccountSetupOutgoingFragment.loaded";
571f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler
58040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    private static final int SMTP_PORT_NORMAL = 587;
59040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    private static final int SMTP_PORT_SSL    = 465;
60faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
61faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private EditText mUsernameView;
62faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private EditText mPasswordView;
63faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private EditText mServerView;
64faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private EditText mPortView;
65faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private CheckBox mRequireLoginView;
66faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private Spinner mSecurityTypeView;
67faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
68faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    // Support for lifecycle
69faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private boolean mStarted;
70faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private boolean mLoaded;
71faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
727985b43ab7310f76c170266da346f993d2f86051Paul Westbrook    // Public no-args constructor needed for fragment re-instantiation
737985b43ab7310f76c170266da346f993d2f86051Paul Westbrook    public AccountSetupOutgoingFragment() {}
747985b43ab7310f76c170266da346f993d2f86051Paul Westbrook
75faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
76faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * Called to do initial creation of a fragment.  This is called after
77faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * {@link #onAttach(Activity)} and before {@link #onActivityCreated(Bundle)}.
78faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
79faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    @Override
80faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void onCreate(Bundle savedInstanceState) {
81f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
82560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            LogUtils.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onCreate");
83faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
84faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        super.onCreate(savedInstanceState);
851f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler
861f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        if (savedInstanceState != null) {
871f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mLoaded = savedInstanceState.getBoolean(STATE_KEY_LOADED, false);
881f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        }
89f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        mBaseScheme = HostAuth.LEGACY_SCHEME_SMTP;
90faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
91faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
92faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    @Override
93faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public View onCreateView(LayoutInflater inflater, ViewGroup container,
94faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            Bundle savedInstanceState) {
95f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
96560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            LogUtils.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onCreateView");
97faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
9826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final int layoutId = mSettingsMode
99112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler                ? R.layout.account_settings_outgoing_fragment
100112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler                : R.layout.account_setup_outgoing_fragment;
101112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler
10226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final View view = inflater.inflate(layoutId, container, false);
10326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final Context context = getActivity();
104faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
105219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler        mUsernameView = UiUtilities.getView(view, R.id.account_username);
106219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler        mPasswordView = UiUtilities.getView(view, R.id.account_password);
107219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler        mServerView = UiUtilities.getView(view, R.id.account_server);
108219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler        mPortView = UiUtilities.getView(view, R.id.account_port);
109219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler        mRequireLoginView = UiUtilities.getView(view, R.id.account_require_login);
110219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler        mSecurityTypeView = UiUtilities.getView(view, R.id.account_security_type);
111faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mRequireLoginView.setOnCheckedChangeListener(this);
112faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
113faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        // Note:  Strings are shared with AccountSetupIncomingFragment
11426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final SpinnerOption securityTypes[] = {
115040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            new SpinnerOption(HostAuth.FLAG_NONE, context.getString(
116faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                    R.string.account_setup_incoming_security_none_label)),
117040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            new SpinnerOption(HostAuth.FLAG_SSL, context.getString(
118faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                    R.string.account_setup_incoming_security_ssl_label)),
119040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            new SpinnerOption(HostAuth.FLAG_SSL | HostAuth.FLAG_TRUST_ALL, context.getString(
120faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                    R.string.account_setup_incoming_security_ssl_trust_certificates_label)),
121040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            new SpinnerOption(HostAuth.FLAG_TLS, context.getString(
122faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                    R.string.account_setup_incoming_security_tls_label)),
1233ae361182a4bd7061ea4a31773cec11cd3b74d87Marc Blank            new SpinnerOption(HostAuth.FLAG_TLS | HostAuth.FLAG_TRUST_ALL, context.getString(
124faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                    R.string.account_setup_incoming_security_tls_trust_certificates_label)),
125faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        };
126faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
12726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final ArrayAdapter<SpinnerOption> securityTypesAdapter =
12826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                new ArrayAdapter<SpinnerOption>(context, android.R.layout.simple_spinner_item,
12926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                        securityTypes);
130faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        securityTypesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
131faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mSecurityTypeView.setAdapter(securityTypesAdapter);
132faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
133faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        // Updates the port when the user changes the security type. This allows
134faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        // us to show a reasonable default which the user can change.
135665b19e779cec4685c4d540abad4b03e1027cf97Marc Blank        mSecurityTypeView.post(new Runnable() {
136560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            @Override
137665b19e779cec4685c4d540abad4b03e1027cf97Marc Blank            public void run() {
138665b19e779cec4685c4d540abad4b03e1027cf97Marc Blank                mSecurityTypeView.setOnItemSelectedListener(
139665b19e779cec4685c4d540abad4b03e1027cf97Marc Blank                        new AdapterView.OnItemSelectedListener() {
140560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy                            @Override
141665b19e779cec4685c4d540abad4b03e1027cf97Marc Blank                            public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
142665b19e779cec4685c4d540abad4b03e1027cf97Marc Blank                                    long arg3) {
143665b19e779cec4685c4d540abad4b03e1027cf97Marc Blank                                updatePortFromSecurityType();
144665b19e779cec4685c4d540abad4b03e1027cf97Marc Blank                            }
145665b19e779cec4685c4d540abad4b03e1027cf97Marc Blank
146560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy                            @Override
147665b19e779cec4685c4d540abad4b03e1027cf97Marc Blank                            public void onNothingSelected(AdapterView<?> arg0) {
148665b19e779cec4685c4d540abad4b03e1027cf97Marc Blank                            }
149665b19e779cec4685c4d540abad4b03e1027cf97Marc Blank                        });
150665b19e779cec4685c4d540abad4b03e1027cf97Marc Blank            }});
151faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
152faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        // Calls validateFields() which enables or disables the Next button
15326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final TextWatcher validationTextWatcher = new TextWatcher() {
154560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            @Override
155faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            public void afterTextChanged(Editable s) {
156faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                validateFields();
157faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            }
158faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
159560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            @Override
160faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
161560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            @Override
162faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            public void onTextChanged(CharSequence s, int start, int before, int count) { }
163faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        };
164faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mUsernameView.addTextChangedListener(validationTextWatcher);
165faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mPasswordView.addTextChangedListener(validationTextWatcher);
166faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mServerView.addTextChangedListener(validationTextWatcher);
167faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mPortView.addTextChangedListener(validationTextWatcher);
168faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
169112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        // Only allow digits in the port field.
170faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mPortView.setKeyListener(DigitsKeyListener.getInstance("0123456789"));
171112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler
172112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        // Additional setup only used while in "settings" mode
173112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        onCreateViewSettingsMode(view);
174112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler
175faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        return view;
176faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
177faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
178faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    @Override
179faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void onActivityCreated(Bundle savedInstanceState) {
180f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
181560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            LogUtils.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onActivityCreated");
182faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
183faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        super.onActivityCreated(savedInstanceState);
184faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
185faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
186faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
187faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * Called when the Fragment is visible to the user.
188faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
189faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    @Override
190faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void onStart() {
191f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
192560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            LogUtils.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onStart");
193faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
194faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        super.onStart();
195faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mStarted = true;
1961f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        loadSettings();
197faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
198faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
199faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
200faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * Called when the fragment is visible to the user and actively running.
201faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
202faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    @Override
203faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void onResume() {
204f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
205560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            LogUtils.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onResume");
206faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
207faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        super.onResume();
208faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        validateFields();
209faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
210faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
211faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    @Override
212faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void onPause() {
213f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
214560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            LogUtils.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onPause");
215faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
216faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        super.onPause();
217faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
218faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
219faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
220faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * Called when the Fragment is no longer started.
221faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
222faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    @Override
223faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void onStop() {
224f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
225560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            LogUtils.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onStop");
226faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
227faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        super.onStop();
228faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mStarted = false;
229faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
230faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
231faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
232faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * Called when the fragment is no longer in use.
233faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
234faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    @Override
235faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void onDestroy() {
236f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
237560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            LogUtils.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onDestroy");
238faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
239faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        super.onDestroy();
240faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
241faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
242faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    @Override
243faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void onSaveInstanceState(Bundle outState) {
244f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
245560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            LogUtils.d(Logging.LOG_TAG, "AccountSetupOutgoingFragment onSaveInstanceState");
246faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
247faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        super.onSaveInstanceState(outState);
2481f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler
2491f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        outState.putBoolean(STATE_KEY_LOADED, mLoaded);
250faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
251faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
252faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
253faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * Activity provides callbacks here.  This also triggers loading and setting up the UX
254faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
2551a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
256faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void setCallback(Callback callback) {
2571a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        super.setCallback(callback);
2581f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        if (mStarted) {
259faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            loadSettings();
260faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
261faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
262faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
263faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
264faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * Load the current settings into the UI
265faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
266faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private void loadSettings() {
2671f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        if (mLoaded) return;
268faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
26926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final HostAuth sendAuth = mSetupData.getAccount().getOrCreateHostAuthSend(mContext);
270fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        if ((sendAuth.mFlags & HostAuth.FLAG_AUTHENTICATE) != 0) {
27126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            final String username = sendAuth.mLogin;
272faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            if (username != null) {
273faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                mUsernameView.setText(username);
274faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                mRequireLoginView.setChecked(true);
275faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            }
276faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
27726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            final String password = sendAuth.mPassword;
278faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            if (password != null) {
279faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                mPasswordView.setText(password);
280faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            }
281040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        }
282faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
28326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final int flags = sendAuth.mFlags & ~HostAuth.FLAG_AUTHENTICATE;
284040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        SpinnerOption.setSpinnerOptionValue(mSecurityTypeView, flags);
285faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
28626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final String hostname = sendAuth.mAddress;
287040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        if (hostname != null) {
288040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            mServerView.setText(hostname);
289040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        }
290faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
29126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final int port = sendAuth.mPort;
292040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        if (port != -1) {
293040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            mPortView.setText(Integer.toString(port));
294040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        } else {
295040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            updatePortFromSecurityType();
296faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
297c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
298fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        mLoadedSendAuth = sendAuth;
2991f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        mLoaded = true;
300faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        validateFields();
301faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
302faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
303faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
304faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * Preflight the values in the fields and decide if it makes sense to enable the "next" button
305faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
306faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private void validateFields() {
3071f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        if (!mLoaded) return;
308faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        boolean enabled =
309ce4cce05b2ee5ea2d9629c189a79f7f30778f534Makoto Onuki            Utility.isServerNameValid(mServerView) && Utility.isPortFieldValid(mPortView);
310faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
311faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        if (enabled && mRequireLoginView.isChecked()) {
312ed4accb24facd1324948abc61b0791eb3dc97cc4Tony Mantler            enabled = !TextUtils.isEmpty(mUsernameView.getText())
313ed4accb24facd1324948abc61b0791eb3dc97cc4Tony Mantler                    && !TextUtils.isEmpty(mPasswordView.getText());
314faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
3151a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        enableNextButton(enabled);
316858c2822777f74947e81476125590ad06bfe4803Andy Stadler        // Warn (but don't prevent) if password has leading/trailing spaces
317858c2822777f74947e81476125590ad06bfe4803Andy Stadler        AccountSettingsUtils.checkPasswordSpaces(mContext, mPasswordView);
318faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler   }
319faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
320faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
321faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * implements OnCheckedChangeListener
322faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
323faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    @Override
324faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
3252fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki        final int visibility = isChecked ? View.VISIBLE : View.GONE;
3262fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki        UiUtilities.setVisibilitySafe(getView(), R.id.account_require_login_settings, visibility);
3272fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki        UiUtilities.setVisibilitySafe(getView(), R.id.account_require_login_settings_2, visibility);
328faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        validateFields();
329faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
330faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
331040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    private int getPortFromSecurityType() {
33226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final int securityType =
33326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value;
334219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler        return (securityType & HostAuth.FLAG_SSL) != 0 ? SMTP_PORT_SSL : SMTP_PORT_NORMAL;
335040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    }
336040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
337040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    private void updatePortFromSecurityType() {
33826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final int port = getPortFromSecurityType();
339040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        mPortView.setText(Integer.toString(port));
340faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
341faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
342faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
343faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * Entry point from Activity after editing settings and verifying them.  Must be FLOW_MODE_EDIT.
3446e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler     * Blocking - do not call from UI Thread.
345faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
3461a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
347faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void saveSettingsAfterEdit() {
34826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final Account account = mSetupData.getAccount();
3496e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler        account.mHostAuthSend.update(mContext, account.mHostAuthSend.toContentValues());
350faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        // Update the backup (side copy) of the accounts
3510993190cafebc107bd27a26996b5d63d4a4ede10Marc Blank        AccountBackupRestore.backup(mContext);
352faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
353faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
354faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
355fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler     * Entry point from Activity after entering new settings and verifying them.  For setup mode.
356fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler     */
357fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler    @Override
358fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler    public void saveSettingsAfterSetup() {
359fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler    }
360fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler
361fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler    /**
362faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * Entry point from Activity, when "next" button is clicked
363faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
3641a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
365faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void onNext() {
36626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final Account account = mSetupData.getAccount();
36726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final HostAuth sendAuth = account.getOrCreateHostAuthSend(mContext);
368040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
3696f31573f00d85bb1d24536c917d72ed80156fd6cBen Komalo        if (mRequireLoginView.isChecked()) {
37026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            final String userName = mUsernameView.getText().toString().trim();
37126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            final String userPassword = mPasswordView.getText().toString();
3726f31573f00d85bb1d24536c917d72ed80156fd6cBen Komalo            sendAuth.setLogin(userName, userPassword);
3736f31573f00d85bb1d24536c917d72ed80156fd6cBen Komalo        } else {
3746f31573f00d85bb1d24536c917d72ed80156fd6cBen Komalo            sendAuth.setLogin(null, null);
3756f31573f00d85bb1d24536c917d72ed80156fd6cBen Komalo        }
376040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
37726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final String serverAddress = mServerView.getText().toString().trim();
378040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        int serverPort;
379faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        try {
380040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            serverPort = Integer.parseInt(mPortView.getText().toString().trim());
381040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        } catch (NumberFormatException e) {
382040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            serverPort = getPortFromSecurityType();
383560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            LogUtils.d(Logging.LOG_TAG, "Non-integer server port; using '" + serverPort + "'");
384faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
38526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final int securityType =
38626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value;
387040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        sendAuth.setConnection(mBaseScheme, serverAddress, serverPort, securityType);
388040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        sendAuth.mDomain = null;
38955110ca1ad8ce48a5429f9f351d013691c10b806Andrew Stadler
3908d22e85e459df3d94968389852859dacaf2baafeAndy Stadler        mCallback.onProceedNext(SetupData.CHECK_OUTGOING, this);
391463584d23f747cfbbd9856b39390269342363b41Tony Mantler        clearButtonBounce();
392faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
393faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler}
394