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