11b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler/* 21b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * Copyright (C) 2010 The Android Open Source Project 31b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * 41b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * Licensed under the Apache License, Version 2.0 (the "License"); 51b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * you may not use this file except in compliance with the License. 61b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * You may obtain a copy of the License at 71b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * 81b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * http://www.apache.org/licenses/LICENSE-2.0 91b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * 101b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * Unless required by applicable law or agreed to in writing, software 111b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * distributed under the License is distributed on an "AS IS" BASIS, 121b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * See the License for the specific language governing permissions and 141b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * limitations under the License. 151b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler */ 161b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 171b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerpackage com.android.email.activity.setup; 181b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 191b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.app.Activity; 201b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.content.Context; 21f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport android.content.Intent; 22f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport android.net.Uri; 231b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.os.Bundle; 241b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.text.Editable; 255125c06cef67447a0ef5881d8fbfd6b73e1dfd0aBen Komaloimport android.text.TextUtils; 261b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.text.TextWatcher; 271b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.text.method.DigitsKeyListener; 281b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.view.LayoutInflater; 291b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.view.View; 301b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.view.ViewGroup; 313432bdb757c4195fb4726c8b401f2261e78d75a7Ben Komaloimport android.view.inputmethod.EditorInfo; 321b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.widget.AdapterView; 331b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.widget.ArrayAdapter; 341b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.widget.EditText; 351b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.widget.Spinner; 361b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadlerimport android.widget.TextView; 371b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 3869111b1e19456c4e861b031da3b3b7f26893d664Marc Blankimport com.android.email.R; 3969111b1e19456c4e861b031da3b3b7f26893d664Marc Blankimport com.android.email.activity.UiUtilities; 4069111b1e19456c4e861b031da3b3b7f26893d664Marc Blankimport com.android.email.provider.AccountBackupRestore; 41f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport com.android.email.service.EmailServiceUtils; 42f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport com.android.email.service.EmailServiceUtils.EmailServiceInfo; 43f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport com.android.email.view.CertificateSelector; 44f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport com.android.email.view.CertificateSelector.HostCallback; 45f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport com.android.email2.ui.MailActivityEmail; 46f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport com.android.emailcommon.Device; 4769111b1e19456c4e861b031da3b3b7f26893d664Marc Blankimport com.android.emailcommon.Logging; 48f5418f1f93b02e7fab9f15eb201800b65510998eMarc Blankimport com.android.emailcommon.provider.Account; 4969111b1e19456c4e861b031da3b3b7f26893d664Marc Blankimport com.android.emailcommon.provider.HostAuth; 50f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport com.android.emailcommon.utility.CertificateRequestor; 5169111b1e19456c4e861b031da3b3b7f26893d664Marc Blankimport com.android.emailcommon.utility.Utility; 5228a344042d0f8353d2e5c15fe3951c1e0520f1b7Paul Westbrookimport com.android.mail.utils.LogUtils; 5369111b1e19456c4e861b031da3b3b7f26893d664Marc Blank 54f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport java.io.IOException; 55f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport java.util.ArrayList; 56f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank 57fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler/** 58fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * Provides UI for IMAP/POP account settings. 59fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * 60fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * This fragment is used by AccountSetupIncoming (for creating accounts) and by AccountSettingsXL 61fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * (for editing existing accounts). 62fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler */ 63f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankpublic class AccountSetupIncomingFragment extends AccountServerBaseFragment 64f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank implements HostCallback { 651b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 66f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank private static final int CERTIFICATE_REQUEST = 0; 671f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler private final static String STATE_KEY_CREDENTIAL = "AccountSetupIncomingFragment.credential"; 681f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler private final static String STATE_KEY_LOADED = "AccountSetupIncomingFragment.loaded"; 691b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 701b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler private EditText mUsernameView; 711b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler private EditText mPasswordView; 721b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler private TextView mServerLabelView; 731b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler private EditText mServerView; 741b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler private EditText mPortView; 751b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler private Spinner mSecurityTypeView; 761b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler private TextView mDeletePolicyLabelView; 771b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler private Spinner mDeletePolicyView; 781b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler private View mImapPathPrefixSectionView; 79f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank private View mDeviceIdSectionView; 801b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler private EditText mImapPathPrefixView; 81f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank private CertificateSelector mClientCertificateSelector; 82c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy // Delete policy as loaded from the device 83c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy private int mLoadedDeletePolicy; 841b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 85ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler private TextWatcher mValidationTextWatcher; 86ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler 871b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler // Support for lifecycle 881b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler private boolean mStarted; 891b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler private boolean mLoaded; 901b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler private String mCacheLoginCredential; 91f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank private EmailServiceInfo mServiceInfo; 921b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 937985b43ab7310f76c170266da346f993d2f86051Paul Westbrook // Public no-args constructor needed for fragment re-instantiation 947985b43ab7310f76c170266da346f993d2f86051Paul Westbrook public AccountSetupIncomingFragment() {} 957985b43ab7310f76c170266da346f993d2f86051Paul Westbrook 961b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler /** 971b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * Called to do initial creation of a fragment. This is called after 981b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * {@link #onAttach(Activity)} and before {@link #onActivityCreated(Bundle)}. 991b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler */ 1001b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler @Override 1011b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler public void onCreate(Bundle savedInstanceState) { 102f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) { 103560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onCreate"); 1041b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 1051b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler super.onCreate(savedInstanceState); 1061b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 107faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler if (savedInstanceState != null) { 108faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler mCacheLoginCredential = savedInstanceState.getString(STATE_KEY_CREDENTIAL); 1091f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler mLoaded = savedInstanceState.getBoolean(STATE_KEY_LOADED, false); 110faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler } 1111b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 1121b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 1131b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler @Override 1141b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler public View onCreateView(LayoutInflater inflater, ViewGroup container, 1151b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler Bundle savedInstanceState) { 116f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) { 117560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onCreateView"); 1181b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 11926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final int layoutId = mSettingsMode 120112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler ? R.layout.account_settings_incoming_fragment 121112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler : R.layout.account_setup_incoming_fragment; 122112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler 12326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final View view = inflater.inflate(layoutId, container, false); 124219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler 125219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler mUsernameView = UiUtilities.getView(view, R.id.account_username); 126219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler mPasswordView = UiUtilities.getView(view, R.id.account_password); 127219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler mServerLabelView = UiUtilities.getView(view, R.id.account_server_label); 128219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler mServerView = UiUtilities.getView(view, R.id.account_server); 129219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler mPortView = UiUtilities.getView(view, R.id.account_port); 130219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler mSecurityTypeView = UiUtilities.getView(view, R.id.account_security_type); 131219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler mDeletePolicyLabelView = UiUtilities.getView(view, R.id.account_delete_policy_label); 132219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler mDeletePolicyView = UiUtilities.getView(view, R.id.account_delete_policy); 1332fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki mImapPathPrefixSectionView = UiUtilities.getView(view, R.id.imap_path_prefix_section); 134f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank mDeviceIdSectionView = UiUtilities.getView(view, R.id.device_id_section); 135219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler mImapPathPrefixView = UiUtilities.getView(view, R.id.imap_path_prefix); 136f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank mClientCertificateSelector = UiUtilities.getView(view, R.id.client_certificate_selector); 137f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank 1381b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler // Updates the port when the user changes the security type. This allows 1391b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler // us to show a reasonable default which the user can change. 1401b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler mSecurityTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 141560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy @Override 1421b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 1431b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler updatePortFromSecurityType(); 1441b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 1451b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 146560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy @Override 1471b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler public void onNothingSelected(AdapterView<?> arg0) { } 1481b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler }); 1491b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 1501b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler // After any text edits, call validateFields() which enables or disables the Next button 151ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mValidationTextWatcher = new TextWatcher() { 152560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy @Override 1531b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler public void afterTextChanged(Editable s) { 1541b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler validateFields(); 1551b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 1561b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 157560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy @Override 1581b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler public void beforeTextChanged(CharSequence s, int start, int count, int after) { } 159560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy @Override 1601b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler public void onTextChanged(CharSequence s, int start, int before, int count) { } 1611b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler }; 162206109cf44e27e90e4a5208daa289704aa451198Todd Kennedy // We're editing an existing account; don't allow modification of the user name 163206109cf44e27e90e4a5208daa289704aa451198Todd Kennedy if (mSettingsMode) { 164206109cf44e27e90e4a5208daa289704aa451198Todd Kennedy makeTextViewUneditable(mUsernameView, 165206109cf44e27e90e4a5208daa289704aa451198Todd Kennedy getString(R.string.account_setup_username_uneditable_error)); 166206109cf44e27e90e4a5208daa289704aa451198Todd Kennedy } 167ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mUsernameView.addTextChangedListener(mValidationTextWatcher); 168ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mPasswordView.addTextChangedListener(mValidationTextWatcher); 169ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mServerView.addTextChangedListener(mValidationTextWatcher); 170ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mPortView.addTextChangedListener(mValidationTextWatcher); 1711b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 1721b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler // Only allow digits in the port field. 1731b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler mPortView.setKeyListener(DigitsKeyListener.getInstance("0123456789")); 1741b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 175112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler // Additional setup only used while in "settings" mode 176112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler onCreateViewSettingsMode(view); 177112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler 1781b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler return view; 1791b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 1801b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 1811b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler @Override 1821b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler public void onActivityCreated(Bundle savedInstanceState) { 183f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) { 184560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onActivityCreated"); 1851b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 1861b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler super.onActivityCreated(savedInstanceState); 187f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank mClientCertificateSelector.setHostActivity(this); 18826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler 18926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final Context context = getActivity(); 19026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final SetupData.SetupDataContainer container = (SetupData.SetupDataContainer) context; 19126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler mSetupData = container.getSetupData(); 19226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler 19326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final HostAuth recvAuth = mSetupData.getAccount().mHostAuthRecv; 19426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler mServiceInfo = EmailServiceUtils.getServiceInfo(mContext, recvAuth.mProtocol); 19526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler 19626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler if (mServiceInfo.offerLocalDeletes) { 19726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler SpinnerOption deletePolicies[] = { 19826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler new SpinnerOption(Account.DELETE_POLICY_NEVER, 19926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler context.getString( 20026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler R.string.account_setup_incoming_delete_policy_never_label)), 20126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler new SpinnerOption(Account.DELETE_POLICY_ON_DELETE, 20226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler context.getString( 20326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler R.string.account_setup_incoming_delete_policy_delete_label)), 20426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler }; 20526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler ArrayAdapter<SpinnerOption> deletePoliciesAdapter = 20626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler new ArrayAdapter<SpinnerOption>(context, 20726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler android.R.layout.simple_spinner_item, deletePolicies); 20826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler deletePoliciesAdapter.setDropDownViewResource( 20926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler android.R.layout.simple_spinner_dropdown_item); 21026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler mDeletePolicyView.setAdapter(deletePoliciesAdapter); 21126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler } 21226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler 21326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler // Set up security type spinner 21426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler ArrayList<SpinnerOption> securityTypes = new ArrayList<SpinnerOption>(); 21526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler securityTypes.add( 21626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler new SpinnerOption(HostAuth.FLAG_NONE, context.getString( 21726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler R.string.account_setup_incoming_security_none_label))); 21826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler securityTypes.add( 21926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler new SpinnerOption(HostAuth.FLAG_SSL, context.getString( 22026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler R.string.account_setup_incoming_security_ssl_label))); 22126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler securityTypes.add( 22226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler new SpinnerOption(HostAuth.FLAG_SSL | HostAuth.FLAG_TRUST_ALL, context.getString( 22326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler R.string.account_setup_incoming_security_ssl_trust_certificates_label))); 22426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler if (mServiceInfo.offerTls) { 22526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler securityTypes.add( 22626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler new SpinnerOption(HostAuth.FLAG_TLS, context.getString( 22726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler R.string.account_setup_incoming_security_tls_label))); 22826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler securityTypes.add(new SpinnerOption(HostAuth.FLAG_TLS | HostAuth.FLAG_TRUST_ALL, 22926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler context.getString(R.string 23026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler .account_setup_incoming_security_tls_trust_certificates_label))); 23126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler } 23226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler ArrayAdapter<SpinnerOption> securityTypesAdapter = new ArrayAdapter<SpinnerOption>( 23326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler context, android.R.layout.simple_spinner_item, securityTypes); 23426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler securityTypesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 23526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler mSecurityTypeView.setAdapter(securityTypesAdapter); 2361b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 2371b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 2381b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler /** 2391b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * Called when the Fragment is visible to the user. 2401b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler */ 2411b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler @Override 2421b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler public void onStart() { 243f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) { 244560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onStart"); 2451b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 2461b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler super.onStart(); 2471b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler mStarted = true; 2481f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler configureEditor(); 2491f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler loadSettings(); 2501b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 2511b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 2521b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler /** 2531b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * Called when the fragment is visible to the user and actively running. 2541b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler */ 2551b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler @Override 2561b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler public void onResume() { 257f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) { 258560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onResume"); 2591b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 2601b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler super.onResume(); 2611b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler validateFields(); 2621b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 2631b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 2641b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler @Override 2651b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler public void onPause() { 266f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) { 267560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onPause"); 2681b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 2691b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler super.onPause(); 2701b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 2711b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 2721b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler /** 2731b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * Called when the Fragment is no longer started. 2741b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler */ 2751b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler @Override 2761b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler public void onStop() { 277f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) { 278560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onStop"); 2791b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 2801b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler super.onStop(); 2811b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler mStarted = false; 2821b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 2831b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 284ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler @Override 285ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler public void onDestroyView() { 286ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler // Make sure we don't get callbacks after the views are supposed to be destroyed 287ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler // and also don't hold onto them longer than we need 288ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler if (mUsernameView != null) { 289ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mUsernameView.removeTextChangedListener(mValidationTextWatcher); 290ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler } 291ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mUsernameView = null; 292ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler if (mPasswordView != null) { 293ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mPasswordView.removeTextChangedListener(mValidationTextWatcher); 294ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler } 295ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mPasswordView = null; 296ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mServerLabelView = null; 297ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler if (mServerView != null) { 298ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mServerView.removeTextChangedListener(mValidationTextWatcher); 299ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler } 300ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mServerView = null; 301ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler if (mPortView != null) { 302ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mPortView.removeTextChangedListener(mValidationTextWatcher); 303ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler } 304ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mPortView = null; 305ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler if (mSecurityTypeView != null) { 306ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mSecurityTypeView.setOnItemSelectedListener(null); 307ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler } 308ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mSecurityTypeView = null; 309ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mDeletePolicyLabelView = null; 310ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mDeletePolicyView = null; 311ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mImapPathPrefixSectionView = null; 312ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mDeviceIdSectionView = null; 313ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mImapPathPrefixView = null; 314ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler mClientCertificateSelector = null; 315ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler 316ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler super.onDestroyView(); 317ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler } 318ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler 3191b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler /** 3201b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * Called when the fragment is no longer in use. 3211b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler */ 3221b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler @Override 3231b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler public void onDestroy() { 324f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) { 325560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onDestroy"); 3261b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 3271b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler super.onDestroy(); 3281b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 3291b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 3301b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler @Override 3311b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler public void onSaveInstanceState(Bundle outState) { 332f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) { 333560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onSaveInstanceState"); 3341b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 3351b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler super.onSaveInstanceState(outState); 3361b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 3371b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler outState.putString(STATE_KEY_CREDENTIAL, mCacheLoginCredential); 3381f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler outState.putBoolean(STATE_KEY_LOADED, mLoaded); 3391b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 3401b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 3411b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler /** 3421b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * Activity provides callbacks here. This also triggers loading and setting up the UX 3431b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler */ 3441a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler @Override 3451b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler public void setCallback(Callback callback) { 3461a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler super.setCallback(callback); 3471f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler if (mStarted) { 3481f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler configureEditor(); 3491b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler loadSettings(); 3501b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 3511b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 3521b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 3531b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler /** 3541f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler * Configure the editor for the account type 3551f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler */ 3561f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler private void configureEditor() { 35726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final Account account = mSetupData.getAccount(); 35828a344042d0f8353d2e5c15fe3951c1e0520f1b7Paul Westbrook if (account == null || account.mHostAuthRecv == null) { 35928a344042d0f8353d2e5c15fe3951c1e0520f1b7Paul Westbrook LogUtils.e(Logging.LOG_TAG, 36028a344042d0f8353d2e5c15fe3951c1e0520f1b7Paul Westbrook "null account or host auth. account null: %b host auth null: %b", 36128a344042d0f8353d2e5c15fe3951c1e0520f1b7Paul Westbrook account == null, account == null || account.mHostAuthRecv == null); 362ceca4751b26b5da91cd8b2038a679be214d3b7dbMindy Pereira return; 363ceca4751b26b5da91cd8b2038a679be214d3b7dbMindy Pereira } 3643432bdb757c4195fb4726c8b401f2261e78d75a7Ben Komalo TextView lastView = mImapPathPrefixView; 365040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy mBaseScheme = account.mHostAuthRecv.mProtocol; 366f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank mServerLabelView.setText(R.string.account_setup_incoming_server_label); 367f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank mServerView.setContentDescription(getResources().getText( 368f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank R.string.account_setup_incoming_server_label)); 369f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank if (!mServiceInfo.offerPrefix) { 3701f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler mImapPathPrefixSectionView.setVisibility(View.GONE); 3713432bdb757c4195fb4726c8b401f2261e78d75a7Ben Komalo lastView = mPortView; 372f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank } 373f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank if (!mServiceInfo.offerLocalDeletes) { 3741f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler mDeletePolicyLabelView.setVisibility(View.GONE); 3751f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler mDeletePolicyView.setVisibility(View.GONE); 3763432bdb757c4195fb4726c8b401f2261e78d75a7Ben Komalo mPortView.setImeOptions(EditorInfo.IME_ACTION_NEXT); 3771f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler } 3783432bdb757c4195fb4726c8b401f2261e78d75a7Ben Komalo lastView.setOnEditorActionListener(mDismissImeOnDoneListener); 3791f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler } 3801f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler 3811f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler /** 3821b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * Load the current settings into the UI 3831b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler */ 3841b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler private void loadSettings() { 3851f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler if (mLoaded) return; 3861b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 38726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final Account account = mSetupData.getAccount(); 38826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final HostAuth recvAuth = account.getOrCreateHostAuthRecv(mContext); 3891b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 39026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final String username = recvAuth.mLogin; 391040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy if (username != null) { 392f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank //*** For eas? 393f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank // Add a backslash to the start of the username, but only if the username has no 394f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank // backslash in it. 395f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank //if (userName.indexOf('\\') < 0) { 396f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank // userName = "\\" + userName; 397f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank //} 398040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy mUsernameView.setText(username); 399040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy } 40026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final String password = recvAuth.mPassword; 401040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy if (password != null) { 402040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy mPasswordView.setText(password); 403cf194df05c31045ec734ace84ce2b739639bf12eJorge Lugo // Since username is uneditable, focus on the next editable field 404cf194df05c31045ec734ace84ce2b739639bf12eJorge Lugo if (mSettingsMode) { 405cf194df05c31045ec734ace84ce2b739639bf12eJorge Lugo mPasswordView.requestFocus(); 406cf194df05c31045ec734ace84ce2b739639bf12eJorge Lugo } 407040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy } 4081b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 409f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank if (mServiceInfo.offerPrefix) { 41026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final String prefix = recvAuth.mDomain; 411040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy if (prefix != null && prefix.length() > 0) { 412040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy mImapPathPrefixView.setText(prefix.substring(1)); 4131b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 414040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy } 4151b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 4168c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy // The delete policy is set for all legacy accounts. For POP3 accounts, the user sets 4178c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy // the policy explicitly. For IMAP accounts, the policy is set when the Account object 4188c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy // is created. @see AccountSetupBasics#populateSetupData 4198c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy mLoadedDeletePolicy = account.getDeletePolicy(); 4208c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy SpinnerOption.setSpinnerOptionValue(mDeletePolicyView, mLoadedDeletePolicy); 4218c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy 422040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy int flags = recvAuth.mFlags; 423040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy flags &= ~HostAuth.FLAG_AUTHENTICATE; 424f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank if (mServiceInfo.defaultSsl) { 425f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank flags |= HostAuth.FLAG_SSL; 426f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank } 427040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy SpinnerOption.setSpinnerOptionValue(mSecurityTypeView, flags); 4281b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 42926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final String hostname = recvAuth.mAddress; 430040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy if (hostname != null) { 431040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy mServerView.setText(hostname); 432040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy } 4331b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 43426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final int port = recvAuth.mPort; 435040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy if (port != HostAuth.PORT_UNKNOWN) { 436040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy mPortView.setText(Integer.toString(port)); 437040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy } else { 438040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy updatePortFromSecurityType(); 4391b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 440c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy 441fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy mLoadedRecvAuth = recvAuth; 4421f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler mLoaded = true; 4431b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler validateFields(); 4441b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 4451b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 4461b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler /** 4471b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * Check the values in the fields and decide if it makes sense to enable the "next" button 4481b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler */ 4491b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler private void validateFields() { 450f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank if (!mLoaded) return; 45126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler enableNextButton(!TextUtils.isEmpty(mUsernameView.getText()) 452ed4accb24facd1324948abc61b0791eb3dc97cc4Tony Mantler && !TextUtils.isEmpty(mPasswordView.getText()) 453ce4cce05b2ee5ea2d9629c189a79f7f30778f534Makoto Onuki && Utility.isServerNameValid(mServerView) 45426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler && Utility.isPortFieldValid(mPortView)); 455858c2822777f74947e81476125590ad06bfe4803Andy Stadler 456219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler mCacheLoginCredential = mUsernameView.getText().toString().trim(); 45769111b1e19456c4e861b031da3b3b7f26893d664Marc Blank 458858c2822777f74947e81476125590ad06bfe4803Andy Stadler // Warn (but don't prevent) if password has leading/trailing spaces 459858c2822777f74947e81476125590ad06bfe4803Andy Stadler AccountSettingsUtils.checkPasswordSpaces(mContext, mPasswordView); 4601b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 4611b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 462f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank private int getPortFromSecurityType(boolean useSsl) { 46326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final EmailServiceInfo info = EmailServiceUtils.getServiceInfo(mContext, 46426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler mSetupData.getAccount().mHostAuthRecv.mProtocol); 465f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank return useSsl ? info.portSsl : info.port; 466f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank } 467f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank 468f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank private boolean getSslSelected() { 46926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final int securityType = 47026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value; 471f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank return ((securityType & HostAuth.FLAG_SSL) != 0); 472f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank } 473f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank 474f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank public void onUseSslChanged(boolean useSsl) { 475f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank if (mServiceInfo.offerCerts) { 47626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final int mode = useSsl ? View.VISIBLE : View.GONE; 477f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank mClientCertificateSelector.setVisibility(mode); 478f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank String deviceId = ""; 479f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank try { 480f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank deviceId = Device.getDeviceId(mContext); 481f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank } catch (IOException e) { 482f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank // Not required 483f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank } 484f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank ((TextView) UiUtilities.getView(getView(), R.id.device_id)).setText(deviceId); 485f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank 486f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank mDeviceIdSectionView.setVisibility(mode); 487f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank //UiUtilities.setVisibilitySafe(getView(), R.id.client_certificate_divider, mode); 488040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy } 489040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy } 490040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy 491040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy private void updatePortFromSecurityType() { 49226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final boolean sslSelected = getSslSelected(); 49326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final int port = getPortFromSecurityType(sslSelected); 494040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy mPortView.setText(Integer.toString(port)); 495f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank onUseSslChanged(sslSelected); 4961b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 4971b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 4981b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler /** 4991b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * Entry point from Activity after editing settings and verifying them. Must be FLOW_MODE_EDIT. 5006e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler * Note, we update account here (as well as the account.mHostAuthRecv) because we edit 5016e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler * account's delete policy here. 5026e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler * Blocking - do not call from UI Thread. 5031b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler */ 5041a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler @Override 5051b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler public void saveSettingsAfterEdit() { 50626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final Account account = mSetupData.getAccount(); 5076e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler account.update(mContext, account.toContentValues()); 5086e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler account.mHostAuthRecv.update(mContext, account.mHostAuthRecv.toContentValues()); 5091b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler // Update the backup (side copy) of the accounts 5100993190cafebc107bd27a26996b5d63d4a4ede10Marc Blank AccountBackupRestore.backup(mContext); 5111b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 5121b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 5131b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler /** 5141b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * Entry point from Activity after entering new settings and verifying them. For setup mode. 5151b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler */ 516fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler @Override 5171b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler public void saveSettingsAfterSetup() { 51826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final Account account = mSetupData.getAccount(); 51926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final HostAuth recvAuth = account.getOrCreateHostAuthRecv(mContext); 52026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final HostAuth sendAuth = account.getOrCreateHostAuthSend(mContext); 5211b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 5221b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler // Set the username and password for the outgoing settings to the username and 523ba4e72a9474bcbe33a8001a1964a02cb41ea08bbAndy Stadler // password the user just set for incoming. Use the verified host address to try and 524ba4e72a9474bcbe33a8001a1964a02cb41ea08bbAndy Stadler // pick a smarter outgoing address. 52526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final String hostName = 526f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank AccountSettingsUtils.inferServerName(mContext, recvAuth.mAddress, null, "smtp"); 527040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy sendAuth.setLogin(recvAuth.mLogin, recvAuth.mPassword); 528040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy sendAuth.setConnection(sendAuth.mProtocol, hostName, sendAuth.mPort, sendAuth.mFlags); 5291b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 5301b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler 5311b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler /** 5321b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler * Entry point from Activity, when "next" button is clicked 5331b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler */ 5341a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler @Override 5351b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler public void onNext() { 53626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final Account account = mSetupData.getAccount(); 537040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy 53881a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank // Make sure delete policy is an valid option before using it; otherwise, the results are 53981a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank // indeterminate, I suspect... 54081a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank if (mDeletePolicyView.getVisibility() == View.VISIBLE) { 54181a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank account.setDeletePolicy( 54281a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank (Integer) ((SpinnerOption) mDeletePolicyView.getSelectedItem()).value); 54381a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank } 5448d22e85e459df3d94968389852859dacaf2baafeAndy Stadler 54526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final HostAuth recvAuth = account.getOrCreateHostAuthRecv(mContext); 54626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final String userName = mUsernameView.getText().toString().trim(); 54726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final String userPassword = mPasswordView.getText().toString(); 548040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy recvAuth.setLogin(userName, userPassword); 5498d22e85e459df3d94968389852859dacaf2baafeAndy Stadler 55026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final String serverAddress = mServerView.getText().toString().trim(); 551040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy int serverPort; 5521b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler try { 553040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy serverPort = Integer.parseInt(mPortView.getText().toString().trim()); 554040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy } catch (NumberFormatException e) { 555f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank serverPort = getPortFromSecurityType(getSslSelected()); 556560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.d(Logging.LOG_TAG, "Non-integer server port; using '" + serverPort + "'"); 5571b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 55826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final int securityType = 55926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler (Integer) ((SpinnerOption) mSecurityTypeView.getSelectedItem()).value; 560040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy recvAuth.setConnection(mBaseScheme, serverAddress, serverPort, securityType); 561f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank if (mServiceInfo.offerPrefix) { 56226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final String prefix = mImapPathPrefixView.getText().toString().trim(); 5635125c06cef67447a0ef5881d8fbfd6b73e1dfd0aBen Komalo recvAuth.mDomain = TextUtils.isEmpty(prefix) ? null : ("/" + prefix); 5645125c06cef67447a0ef5881d8fbfd6b73e1dfd0aBen Komalo } else { 5655125c06cef67447a0ef5881d8fbfd6b73e1dfd0aBen Komalo recvAuth.mDomain = null; 5665125c06cef67447a0ef5881d8fbfd6b73e1dfd0aBen Komalo } 5679d3e01c589e1f281941cff9abc59aba0b0f33e78Martin Hibdon recvAuth.mClientCertAlias = mClientCertificateSelector.getCertificate(); 568040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy 569463584d23f747cfbbd9856b39390269342363b41Tony Mantler mCallback.onProceedNext(SetupData.CHECK_INCOMING, this); 570463584d23f747cfbbd9856b39390269342363b41Tony Mantler clearButtonBounce(); 5711b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler } 572c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy 573c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy @Override 574c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy public boolean haveSettingsChanged() { 57526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final boolean deletePolicyChanged; 576c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy 577c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy // Only verify the delete policy if the control is visible (i.e. is a pop3 account) 578648a067056db91d4a1bfd3c4eac9eec3d4c6adb4Tony Mantler if (mDeletePolicyView != null && mDeletePolicyView.getVisibility() == View.VISIBLE) { 579c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy int newDeletePolicy = 580c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy (Integer)((SpinnerOption)mDeletePolicyView.getSelectedItem()).value; 581c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy deletePolicyChanged = mLoadedDeletePolicy != newDeletePolicy; 58226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler } else { 58326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler deletePolicyChanged = false; 584c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy } 585c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy 586c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy return deletePolicyChanged || super.haveSettingsChanged(); 587c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy } 588f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank 589f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank /** 590f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank * Implements AccountCheckSettingsFragment.Callbacks 591f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank */ 592f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 59326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler public void onAutoDiscoverComplete(int result, SetupData setupData) { 59426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler mSetupData = setupData; 59526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final AccountSetupIncoming activity = (AccountSetupIncoming) getActivity(); 59626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler activity.onAutoDiscoverComplete(result, setupData); 597f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank } 598f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank 599f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 600f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank public void onCertificateRequested() { 60126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final Intent intent = new Intent(CertificateRequestor.ACTION_REQUEST_CERT); 602f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank intent.setData(Uri.parse("eas://com.android.emailcommon/certrequest")); 603f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank startActivityForResult(intent, CERTIFICATE_REQUEST); 604f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank } 605f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank 606f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 607f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank public void onActivityResult(int requestCode, int resultCode, Intent data) { 608f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank if (requestCode == CERTIFICATE_REQUEST && resultCode == Activity.RESULT_OK) { 60926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler final String certAlias = data.getStringExtra(CertificateRequestor.RESULT_ALIAS); 610f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank if (certAlias != null) { 611f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank mClientCertificateSelector.setCertificate(certAlias); 612f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank } 613f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank } 614f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank } 6151b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler} 616