AccountSetupOutgoingFragment.java revision 6e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6
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 com.android.email.AccountBackupRestore; 20faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport com.android.email.Email; 21faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport com.android.email.R; 22faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport com.android.email.Utility; 23faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport com.android.email.provider.EmailContent; 246e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadlerimport com.android.email.provider.EmailContent.Account; 25faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 26faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.app.Activity; 27faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.content.Context; 28faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.os.Bundle; 29faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.text.Editable; 30faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.text.TextWatcher; 31faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.text.method.DigitsKeyListener; 32faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.util.Log; 33faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.view.LayoutInflater; 34faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.view.View; 35faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.view.ViewGroup; 36faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.widget.AdapterView; 37faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.widget.ArrayAdapter; 38faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.widget.CheckBox; 39faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.widget.CompoundButton; 40faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.widget.CompoundButton.OnCheckedChangeListener; 41faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.widget.EditText; 42faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.widget.Spinner; 43faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 44faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport java.net.URI; 45faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport java.net.URISyntaxException; 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 58faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler private static final int SMTP_PORTS[] = { 59faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 587, 465, 465, 587, 587 60faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler }; 61faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 62faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler private static final String SMTP_SCHEMES[] = { 63faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler "smtp", "smtp+ssl+", "smtp+ssl+trustallcerts", "smtp+tls+", "smtp+tls+trustallcerts" 64faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler }; 65faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 66faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler private EditText mUsernameView; 67faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler private EditText mPasswordView; 68faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler private EditText mServerView; 69faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler private EditText mPortView; 70faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler private CheckBox mRequireLoginView; 71e6c6587b04a589eeb04006f75759c09ea10811e0Andy Stadler private View mRequireLoginSettingsView; 72e6c6587b04a589eeb04006f75759c09ea10811e0Andy Stadler private View mRequireLoginSettingsView2; 73faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler private Spinner mSecurityTypeView; 74faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 75faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler // Support for lifecycle 76faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler private boolean mStarted; 77faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler private boolean mLoaded; 78faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 79faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler /** 80112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler * Create the fragment with parameters - used mainly to force into settings mode (with buttons) 81112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler * @param settingsMode if true, alters appearance for use in settings (default is "setup") 82112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler */ 83112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler public static AccountSetupOutgoingFragment newInstance(boolean settingsMode) { 84112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler AccountSetupOutgoingFragment f = new AccountSetupOutgoingFragment(); 85112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler f.setSetupArguments(settingsMode); 86112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler return f; 87112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler } 88112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler 89112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler /** 90faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * Called to do initial creation of a fragment. This is called after 91faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * {@link #onAttach(Activity)} and before {@link #onActivityCreated(Bundle)}. 92faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler */ 93faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler @Override 94faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler public void onCreate(Bundle savedInstanceState) { 95faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler if (Email.DEBUG_LIFECYCLE && Email.DEBUG) { 96faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler Log.d(Email.LOG_TAG, "AccountSetupOutgoingFragment onCreate"); 97faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 98faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler super.onCreate(savedInstanceState); 991f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler 1001f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler if (savedInstanceState != null) { 1011f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler mLoaded = savedInstanceState.getBoolean(STATE_KEY_LOADED, false); 1021f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler } 103faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 104faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 105faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler @Override 106faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler public View onCreateView(LayoutInflater inflater, ViewGroup container, 107faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler Bundle savedInstanceState) { 108faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler if (Email.DEBUG_LIFECYCLE && Email.DEBUG) { 109faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler Log.d(Email.LOG_TAG, "AccountSetupOutgoingFragment onCreateView"); 110faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 111112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler int layoutId = mSettingsMode 112112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler ? R.layout.account_settings_outgoing_fragment 113112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler : R.layout.account_setup_outgoing_fragment; 114112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler 115112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler View view = inflater.inflate(layoutId, container, false); 116faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler Context context = getActivity(); 117faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 118faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mUsernameView = (EditText) view.findViewById(R.id.account_username); 119faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mPasswordView = (EditText) view.findViewById(R.id.account_password); 120faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mServerView = (EditText) view.findViewById(R.id.account_server); 121faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mPortView = (EditText) view.findViewById(R.id.account_port); 122faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mRequireLoginView = (CheckBox) view.findViewById(R.id.account_require_login); 123e6c6587b04a589eeb04006f75759c09ea10811e0Andy Stadler mRequireLoginSettingsView = view.findViewById(R.id.account_require_login_settings); 124e6c6587b04a589eeb04006f75759c09ea10811e0Andy Stadler mRequireLoginSettingsView2 = view.findViewById(R.id.account_require_login_settings_2); 125faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mSecurityTypeView = (Spinner) view.findViewById(R.id.account_security_type); 126faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mRequireLoginView.setOnCheckedChangeListener(this); 127faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 128faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler // Note: Strings are shared with AccountSetupIncomingFragment 129faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler SpinnerOption securityTypes[] = { 130faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler new SpinnerOption(0, context.getString( 131faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler R.string.account_setup_incoming_security_none_label)), 132faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler new SpinnerOption(1, context.getString( 133faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler R.string.account_setup_incoming_security_ssl_label)), 134faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler new SpinnerOption(2, context.getString( 135faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler R.string.account_setup_incoming_security_ssl_trust_certificates_label)), 136faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler new SpinnerOption(3, context.getString( 137faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler R.string.account_setup_incoming_security_tls_label)), 138faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler new SpinnerOption(4, context.getString( 139faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler R.string.account_setup_incoming_security_tls_trust_certificates_label)), 140faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler }; 141faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 142faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler ArrayAdapter<SpinnerOption> securityTypesAdapter = new ArrayAdapter<SpinnerOption>(context, 143faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler android.R.layout.simple_spinner_item, securityTypes); 144faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler securityTypesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 145faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mSecurityTypeView.setAdapter(securityTypesAdapter); 146faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 147faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler // Updates the port when the user changes the security type. This allows 148faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler // us to show a reasonable default which the user can change. 149faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mSecurityTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 150faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 151faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler updatePortFromSecurityType(); 152faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 153faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 154faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler public void onNothingSelected(AdapterView<?> arg0) { } 155faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler }); 156faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 157faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler // Calls validateFields() which enables or disables the Next button 158faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler TextWatcher validationTextWatcher = new TextWatcher() { 159faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler public void afterTextChanged(Editable s) { 160faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler validateFields(); 161faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 162faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 163faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler public void beforeTextChanged(CharSequence s, int start, int count, int after) { } 164faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler public void onTextChanged(CharSequence s, int start, int before, int count) { } 165faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler }; 166faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mUsernameView.addTextChangedListener(validationTextWatcher); 167faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mPasswordView.addTextChangedListener(validationTextWatcher); 168faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mServerView.addTextChangedListener(validationTextWatcher); 169faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mPortView.addTextChangedListener(validationTextWatcher); 170faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 171112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler // Only allow digits in the port field. 172faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mPortView.setKeyListener(DigitsKeyListener.getInstance("0123456789")); 173112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler 174112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler // Additional setup only used while in "settings" mode 175112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler onCreateViewSettingsMode(view); 176112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler 177faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler return view; 178faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 179faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 180faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler @Override 181faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler public void onActivityCreated(Bundle savedInstanceState) { 182faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler if (Email.DEBUG_LIFECYCLE && Email.DEBUG) { 183faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler Log.d(Email.LOG_TAG, "AccountSetupOutgoingFragment onActivityCreated"); 184faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 185faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler super.onActivityCreated(savedInstanceState); 186faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 187faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 188faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler /** 189faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * Called when the Fragment is visible to the user. 190faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler */ 191faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler @Override 192faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler public void onStart() { 193faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler if (Email.DEBUG_LIFECYCLE && Email.DEBUG) { 194faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler Log.d(Email.LOG_TAG, "AccountSetupOutgoingFragment onStart"); 195faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 196faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler super.onStart(); 197faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mStarted = true; 1981f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler loadSettings(); 199faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 200faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 201faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler /** 202faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * Called when the fragment is visible to the user and actively running. 203faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler */ 204faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler @Override 205faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler public void onResume() { 206faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler if (Email.DEBUG_LIFECYCLE && Email.DEBUG) { 207faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler Log.d(Email.LOG_TAG, "AccountSetupOutgoingFragment onResume"); 208faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 209faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler super.onResume(); 210faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler validateFields(); 211faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 212faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 213faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler @Override 214faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler public void onPause() { 215faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler if (Email.DEBUG_LIFECYCLE && Email.DEBUG) { 216faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler Log.d(Email.LOG_TAG, "AccountSetupOutgoingFragment onPause"); 217faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 218faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler super.onPause(); 219faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 220faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 221faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler /** 222faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * Called when the Fragment is no longer started. 223faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler */ 224faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler @Override 225faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler public void onStop() { 226faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler if (Email.DEBUG_LIFECYCLE && Email.DEBUG) { 227faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler Log.d(Email.LOG_TAG, "AccountSetupOutgoingFragment onStop"); 228faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 229faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler super.onStop(); 230faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mStarted = false; 231faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 232faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 233faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler /** 234faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * Called when the fragment is no longer in use. 235faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler */ 236faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler @Override 237faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler public void onDestroy() { 238faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler if (Email.DEBUG_LIFECYCLE && Email.DEBUG) { 239faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler Log.d(Email.LOG_TAG, "AccountSetupOutgoingFragment onDestroy"); 240faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 241faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler super.onDestroy(); 242faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 243faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 244faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler @Override 245faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler public void onSaveInstanceState(Bundle outState) { 246faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler if (Email.DEBUG_LIFECYCLE && Email.DEBUG) { 247faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler Log.d(Email.LOG_TAG, "AccountSetupOutgoingFragment onSaveInstanceState"); 248faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 249faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler super.onSaveInstanceState(outState); 2501f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler 2511f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler outState.putBoolean(STATE_KEY_LOADED, mLoaded); 252faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 253faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 254faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler /** 255faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * Activity provides callbacks here. This also triggers loading and setting up the UX 256faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler */ 2571a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler @Override 258faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler public void setCallback(Callback callback) { 2591a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler super.setCallback(callback); 2601f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler if (mStarted) { 261faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler loadSettings(); 262faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 263faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 264faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 265faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler /** 266faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * Load the current settings into the UI 267faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler */ 268faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler private void loadSettings() { 2691f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler if (mLoaded) return; 270faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler try { 271faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler // TODO this should be accessed directly via the HostAuth structure 272faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler URI uri = new URI(SetupData.getAccount().getSenderUri(mContext)); 273faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler String username = null; 274faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler String password = null; 275faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler if (uri.getUserInfo() != null) { 276faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler String[] userInfoParts = uri.getUserInfo().split(":", 2); 277faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler username = userInfoParts[0]; 278faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler if (userInfoParts.length > 1) { 279faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler password = userInfoParts[1]; 280faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 281faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 282faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 283faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler if (username != null) { 284faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mUsernameView.setText(username); 285faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mRequireLoginView.setChecked(true); 286faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 287faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 288faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler if (password != null) { 289faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mPasswordView.setText(password); 290faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 291faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 292faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler for (int i = 0; i < SMTP_SCHEMES.length; i++) { 293faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler if (SMTP_SCHEMES[i].equals(uri.getScheme())) { 294faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler SpinnerOption.setSpinnerOptionValue(mSecurityTypeView, i); 295faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 296faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 297faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 298faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler if (uri.getHost() != null) { 299faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mServerView.setText(uri.getHost()); 300faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 301faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 302faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler if (uri.getPort() != -1) { 303faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mPortView.setText(Integer.toString(uri.getPort())); 304faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } else { 305faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler updatePortFromSecurityType(); 306faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 307faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } catch (URISyntaxException use) { 308faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler /* 309faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * We should always be able to parse our own settings. 310faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler */ 311faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler throw new Error(use); 312faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 3131f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler mLoaded = true; 314faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler validateFields(); 315faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 316faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 317faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler /** 318faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * Preflight the values in the fields and decide if it makes sense to enable the "next" button 319faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler */ 320faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler private void validateFields() { 3211f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler if (!mLoaded) return; 322faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler boolean enabled = 323faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler Utility.isTextViewNotEmpty(mServerView) && Utility.isPortFieldValid(mPortView); 324faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 325faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler if (enabled && mRequireLoginView.isChecked()) { 326faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler enabled = (Utility.isTextViewNotEmpty(mUsernameView) 327faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler && Utility.isTextViewNotEmpty(mPasswordView)); 328faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 329faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 330faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler if (enabled) { 331faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler try { 332faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler URI uri = getUri(); 333faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } catch (URISyntaxException use) { 334faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler enabled = false; 335faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 336faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 3371a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler enableNextButton(enabled); 338faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 339faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 340faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler /** 341faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * implements OnCheckedChangeListener 342faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler */ 343faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler @Override 344faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 345faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mRequireLoginSettingsView.setVisibility(isChecked ? View.VISIBLE : View.GONE); 346e6c6587b04a589eeb04006f75759c09ea10811e0Andy Stadler if (mRequireLoginSettingsView2 != null) { 347e6c6587b04a589eeb04006f75759c09ea10811e0Andy Stadler mRequireLoginSettingsView2.setVisibility(isChecked ? View.VISIBLE : View.GONE); 348e6c6587b04a589eeb04006f75759c09ea10811e0Andy Stadler } 349faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler validateFields(); 350faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 351faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 352faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler private void updatePortFromSecurityType() { 353faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value; 354faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mPortView.setText(Integer.toString(SMTP_PORTS[securityType])); 355faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 356faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 357faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler /** 358faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * Entry point from Activity after editing settings and verifying them. Must be FLOW_MODE_EDIT. 3596e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler * Blocking - do not call from UI Thread. 360faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler */ 3611a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler @Override 362faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler public void saveSettingsAfterEdit() { 3636e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler Account account = SetupData.getAccount(); 3646e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler account.mHostAuthSend.update(mContext, account.mHostAuthSend.toContentValues()); 365faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler // Update the backup (side copy) of the accounts 366faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler AccountBackupRestore.backupAccounts(mContext); 367faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 368faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 369faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler /** 370fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * Entry point from Activity after entering new settings and verifying them. For setup mode. 371fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler */ 372fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler @Override 373fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler public void saveSettingsAfterSetup() { 374fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler } 375fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler 376fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler /** 377faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * Attempt to create a URI from the fields provided. Throws URISyntaxException if there's 378faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * a problem with the user input. 379faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * @return a URI built from the account setup fields 380faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler */ 381fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler /* package */ URI getUri() throws URISyntaxException { 382faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value; 383faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler String userInfo = null; 384faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler if (mRequireLoginView.isChecked()) { 385fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler userInfo = mUsernameView.getText().toString().trim() + ":" + mPasswordView.getText(); 386faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 387faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler URI uri = new URI( 388faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler SMTP_SCHEMES[securityType], 389faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler userInfo, 390faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mServerView.getText().toString().trim(), 391faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler Integer.parseInt(mPortView.getText().toString().trim()), 392faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler null, null, null); 393faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler return uri; 394faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 395faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler 396faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler /** 397faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * Entry point from Activity, when "next" button is clicked 398faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler */ 3991a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler @Override 400faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler public void onNext() { 401faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler EmailContent.Account account = SetupData.getAccount(); 402faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler try { 403faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler // TODO this should be accessed directly via the HostAuth structure 404faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler URI uri = getUri(); 405faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler account.setSenderUri(mContext, uri.toString()); 406faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } catch (URISyntaxException use) { 407faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler /* 408faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * It's unrecoverable if we cannot create a URI from components that 409faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * we validated to be safe. 410faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler */ 411faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler throw new Error(use); 412faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 41355110ca1ad8ce48a5429f9f351d013691c10b806Andrew Stadler 4148d22e85e459df3d94968389852859dacaf2baafeAndy Stadler mCallback.onProceedNext(SetupData.CHECK_OUTGOING, this); 415faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 416faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler} 417