AccountSetupIncomingFragment.java revision 9c8c471f971f9c8e40002503a0799ce56c5bfd76
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();
1909c8c471f971f9c8e40002503a0799ce56c5bfd76Tony Mantler        final SetupDataFragment.SetupDataContainer container =
1919c8c471f971f9c8e40002503a0799ce56c5bfd76Tony Mantler                (SetupDataFragment.SetupDataContainer) context;
19226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        mSetupData = container.getSetupData();
19326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler
19426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final HostAuth recvAuth = mSetupData.getAccount().mHostAuthRecv;
19526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        mServiceInfo = EmailServiceUtils.getServiceInfo(mContext, recvAuth.mProtocol);
19626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler
19726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        if (mServiceInfo.offerLocalDeletes) {
19826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            SpinnerOption deletePolicies[] = {
19926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                    new SpinnerOption(Account.DELETE_POLICY_NEVER,
20026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                            context.getString(
20126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                                    R.string.account_setup_incoming_delete_policy_never_label)),
20226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                    new SpinnerOption(Account.DELETE_POLICY_ON_DELETE,
20326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                            context.getString(
20426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                                    R.string.account_setup_incoming_delete_policy_delete_label)),
20526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            };
20626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            ArrayAdapter<SpinnerOption> deletePoliciesAdapter =
20726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                    new ArrayAdapter<SpinnerOption>(context,
20826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                            android.R.layout.simple_spinner_item, deletePolicies);
20926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            deletePoliciesAdapter.setDropDownViewResource(
21026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                    android.R.layout.simple_spinner_dropdown_item);
21126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            mDeletePolicyView.setAdapter(deletePoliciesAdapter);
21226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        }
21326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler
21426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        // Set up security type spinner
21526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        ArrayList<SpinnerOption> securityTypes = new ArrayList<SpinnerOption>();
21626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        securityTypes.add(
21726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                new SpinnerOption(HostAuth.FLAG_NONE, context.getString(
21826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                        R.string.account_setup_incoming_security_none_label)));
21926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        securityTypes.add(
22026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                new SpinnerOption(HostAuth.FLAG_SSL, context.getString(
22126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                        R.string.account_setup_incoming_security_ssl_label)));
22226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        securityTypes.add(
22326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                new SpinnerOption(HostAuth.FLAG_SSL | HostAuth.FLAG_TRUST_ALL, context.getString(
22426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                        R.string.account_setup_incoming_security_ssl_trust_certificates_label)));
22526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        if (mServiceInfo.offerTls) {
22626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            securityTypes.add(
22726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                    new SpinnerOption(HostAuth.FLAG_TLS, context.getString(
22826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                            R.string.account_setup_incoming_security_tls_label)));
22926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            securityTypes.add(new SpinnerOption(HostAuth.FLAG_TLS | HostAuth.FLAG_TRUST_ALL,
23026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                    context.getString(R.string
23126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                            .account_setup_incoming_security_tls_trust_certificates_label)));
23226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        }
23326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        ArrayAdapter<SpinnerOption> securityTypesAdapter = new ArrayAdapter<SpinnerOption>(
23426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                context, android.R.layout.simple_spinner_item, securityTypes);
23526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        securityTypesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
23626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        mSecurityTypeView.setAdapter(securityTypesAdapter);
2371b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2381b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2391b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
2401b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Called when the Fragment is visible to the user.
2411b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
2421b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2431b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onStart() {
244f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
245560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            LogUtils.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onStart");
2461b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2471b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onStart();
2481b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mStarted = true;
2491f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        configureEditor();
2501f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        loadSettings();
2511b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2521b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2531b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
2541b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Called when the fragment is visible to the user and actively running.
2551b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
2561b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2571b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onResume() {
258f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
259560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            LogUtils.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onResume");
2601b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2611b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onResume();
2621b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        validateFields();
2631b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2641b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2651b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2661b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onPause() {
267f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
268560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            LogUtils.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onPause");
2691b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2701b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onPause();
2711b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2721b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
2731b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
2741b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Called when the Fragment is no longer started.
2751b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
2761b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
2771b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onStop() {
278f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
279560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            LogUtils.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onStop");
2801b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
2811b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onStop();
2821b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        mStarted = false;
2831b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
2841b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
285ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler    @Override
286ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler    public void onDestroyView() {
287ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        // Make sure we don't get callbacks after the views are supposed to be destroyed
288ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        // and also don't hold onto them longer than we need
289ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        if (mUsernameView != null) {
290ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler            mUsernameView.removeTextChangedListener(mValidationTextWatcher);
291ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        }
292ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mUsernameView = null;
293ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        if (mPasswordView != null) {
294ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler            mPasswordView.removeTextChangedListener(mValidationTextWatcher);
295ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        }
296ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mPasswordView = null;
297ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mServerLabelView = null;
298ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        if (mServerView != null) {
299ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler            mServerView.removeTextChangedListener(mValidationTextWatcher);
300ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        }
301ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mServerView = null;
302ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        if (mPortView != null) {
303ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler            mPortView.removeTextChangedListener(mValidationTextWatcher);
304ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        }
305ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mPortView = null;
306ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        if (mSecurityTypeView != null) {
307ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler            mSecurityTypeView.setOnItemSelectedListener(null);
308ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        }
309ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mSecurityTypeView = null;
310ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mDeletePolicyLabelView = null;
311ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mDeletePolicyView = null;
312ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mImapPathPrefixSectionView = null;
313ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mDeviceIdSectionView = null;
314ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mImapPathPrefixView = null;
315ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        mClientCertificateSelector = null;
316ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler
317ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler        super.onDestroyView();
318ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler    }
319ecac654c6666072d3ed9627f0524fa46ea8c03fcTony Mantler
3201b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
3211b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Called when the fragment is no longer in use.
3221b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
3231b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
3241b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onDestroy() {
325f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
326560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            LogUtils.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onDestroy");
3271b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
3281b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onDestroy();
3291b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
3301b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3311b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    @Override
3321b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onSaveInstanceState(Bundle outState) {
333f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (Logging.DEBUG_LIFECYCLE && MailActivityEmail.DEBUG) {
334560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            LogUtils.d(Logging.LOG_TAG, "AccountSetupIncomingFragment onSaveInstanceState");
3351b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
3361b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        super.onSaveInstanceState(outState);
3371b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3381b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        outState.putString(STATE_KEY_CREDENTIAL, mCacheLoginCredential);
3391f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        outState.putBoolean(STATE_KEY_LOADED, mLoaded);
3401b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
3411b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3421b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
3431b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Activity provides callbacks here.  This also triggers loading and setting up the UX
3441b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
3451a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
3461b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void setCallback(Callback callback) {
3471a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        super.setCallback(callback);
3481f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        if (mStarted) {
3491f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            configureEditor();
3501b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            loadSettings();
3511b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
3521b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
3531b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
3541b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
3551f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler     * Configure the editor for the account type
3561f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler     */
3571f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    private void configureEditor() {
35826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final Account account = mSetupData.getAccount();
35928a344042d0f8353d2e5c15fe3951c1e0520f1b7Paul Westbrook        if (account == null || account.mHostAuthRecv == null) {
36028a344042d0f8353d2e5c15fe3951c1e0520f1b7Paul Westbrook            LogUtils.e(Logging.LOG_TAG,
36128a344042d0f8353d2e5c15fe3951c1e0520f1b7Paul Westbrook                    "null account or host auth. account null: %b host auth null: %b",
36228a344042d0f8353d2e5c15fe3951c1e0520f1b7Paul Westbrook                    account == null, account == null || account.mHostAuthRecv == null);
363ceca4751b26b5da91cd8b2038a679be214d3b7dbMindy Pereira            return;
364ceca4751b26b5da91cd8b2038a679be214d3b7dbMindy Pereira        }
3653432bdb757c4195fb4726c8b401f2261e78d75a7Ben Komalo        TextView lastView = mImapPathPrefixView;
366040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        mBaseScheme = account.mHostAuthRecv.mProtocol;
367f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        mServerLabelView.setText(R.string.account_setup_incoming_server_label);
368f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        mServerView.setContentDescription(getResources().getText(
369f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank                R.string.account_setup_incoming_server_label));
370f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (!mServiceInfo.offerPrefix) {
3711f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mImapPathPrefixSectionView.setVisibility(View.GONE);
3723432bdb757c4195fb4726c8b401f2261e78d75a7Ben Komalo            lastView = mPortView;
373f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        }
374f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (!mServiceInfo.offerLocalDeletes) {
3751f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mDeletePolicyLabelView.setVisibility(View.GONE);
3761f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mDeletePolicyView.setVisibility(View.GONE);
3773432bdb757c4195fb4726c8b401f2261e78d75a7Ben Komalo            mPortView.setImeOptions(EditorInfo.IME_ACTION_NEXT);
3781f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        }
3793432bdb757c4195fb4726c8b401f2261e78d75a7Ben Komalo        lastView.setOnEditorActionListener(mDismissImeOnDoneListener);
3801f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    }
3811f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler
3821f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    /**
3831b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Load the current settings into the UI
3841b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
3851b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private void loadSettings() {
3861f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        if (mLoaded) return;
3871b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
38826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final Account account = mSetupData.getAccount();
38926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final HostAuth recvAuth = account.getOrCreateHostAuthRecv(mContext);
3901b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
39126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final String username = recvAuth.mLogin;
392040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        if (username != null) {
393f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            //*** For eas?
394f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            // Add a backslash to the start of the username, but only if the username has no
395f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            // backslash in it.
396f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            //if (userName.indexOf('\\') < 0) {
397f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            //    userName = "\\" + userName;
398f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            //}
399040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            mUsernameView.setText(username);
400040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        }
40126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final String password = recvAuth.mPassword;
402040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        if (password != null) {
403040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            mPasswordView.setText(password);
404cf194df05c31045ec734ace84ce2b739639bf12eJorge Lugo            // Since username is uneditable, focus on the next editable field
405cf194df05c31045ec734ace84ce2b739639bf12eJorge Lugo            if (mSettingsMode) {
406cf194df05c31045ec734ace84ce2b739639bf12eJorge Lugo                mPasswordView.requestFocus();
407cf194df05c31045ec734ace84ce2b739639bf12eJorge Lugo            }
408040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        }
4091b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
410f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (mServiceInfo.offerPrefix) {
41126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            final String prefix = recvAuth.mDomain;
412040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            if (prefix != null && prefix.length() > 0) {
413040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy                mImapPathPrefixView.setText(prefix.substring(1));
4141b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler            }
415040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        }
4161b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
4178c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy        // The delete policy is set for all legacy accounts. For POP3 accounts, the user sets
4188c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy        // the policy explicitly. For IMAP accounts, the policy is set when the Account object
4198c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy        // is created. @see AccountSetupBasics#populateSetupData
4208c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy        mLoadedDeletePolicy = account.getDeletePolicy();
4218c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy        SpinnerOption.setSpinnerOptionValue(mDeletePolicyView, mLoadedDeletePolicy);
4228c89674b64f6669fa94bf593abad0f1e2255a812Todd Kennedy
423040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        int flags = recvAuth.mFlags;
424040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        flags &= ~HostAuth.FLAG_AUTHENTICATE;
425f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (mServiceInfo.defaultSsl) {
426f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            flags |= HostAuth.FLAG_SSL;
427f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        }
428040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        SpinnerOption.setSpinnerOptionValue(mSecurityTypeView, flags);
4291b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
43026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final String hostname = recvAuth.mAddress;
431040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        if (hostname != null) {
432040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            mServerView.setText(hostname);
433040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        }
4341b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
43526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final int port = recvAuth.mPort;
436040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        if (port != HostAuth.PORT_UNKNOWN) {
437040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            mPortView.setText(Integer.toString(port));
438040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        } else {
439040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            updatePortFromSecurityType();
4401b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
441c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
442fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        mLoadedRecvAuth = recvAuth;
4431f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        mLoaded = true;
4441b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        validateFields();
4451b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
4461b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
4471b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
4481b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Check the values in the fields and decide if it makes sense to enable the "next" button
4491b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
4501b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    private void validateFields() {
451f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (!mLoaded) return;
45226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        enableNextButton(!TextUtils.isEmpty(mUsernameView.getText())
453ed4accb24facd1324948abc61b0791eb3dc97cc4Tony Mantler                && !TextUtils.isEmpty(mPasswordView.getText())
454ce4cce05b2ee5ea2d9629c189a79f7f30778f534Makoto Onuki                && Utility.isServerNameValid(mServerView)
45526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                && Utility.isPortFieldValid(mPortView));
456858c2822777f74947e81476125590ad06bfe4803Andy Stadler
457219c3b5b8474bc0b95a9dcab21067ff603fccb15Tony Mantler        mCacheLoginCredential = mUsernameView.getText().toString().trim();
45869111b1e19456c4e861b031da3b3b7f26893d664Marc Blank
459858c2822777f74947e81476125590ad06bfe4803Andy Stadler        // Warn (but don't prevent) if password has leading/trailing spaces
460858c2822777f74947e81476125590ad06bfe4803Andy Stadler        AccountSettingsUtils.checkPasswordSpaces(mContext, mPasswordView);
4611b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
4621b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
463f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    private int getPortFromSecurityType(boolean useSsl) {
46426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final EmailServiceInfo info = EmailServiceUtils.getServiceInfo(mContext,
46526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                mSetupData.getAccount().mHostAuthRecv.mProtocol);
466f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        return useSsl ? info.portSsl : info.port;
467f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    }
468f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank
469f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    private boolean getSslSelected() {
47026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final int securityType =
47126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value;
472f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        return ((securityType & HostAuth.FLAG_SSL) != 0);
473f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    }
474f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank
475f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    public void onUseSslChanged(boolean useSsl) {
476f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (mServiceInfo.offerCerts) {
47726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            final int mode = useSsl ? View.VISIBLE : View.GONE;
478f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            mClientCertificateSelector.setVisibility(mode);
479f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            String deviceId = "";
480f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            try {
481f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank                deviceId = Device.getDeviceId(mContext);
482f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            } catch (IOException e) {
483f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank                // Not required
484f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            }
485f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            ((TextView) UiUtilities.getView(getView(), R.id.device_id)).setText(deviceId);
486f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank
487f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            mDeviceIdSectionView.setVisibility(mode);
488f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            //UiUtilities.setVisibilitySafe(getView(), R.id.client_certificate_divider, mode);
489040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        }
490040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    }
491040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
492040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    private void updatePortFromSecurityType() {
49326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final boolean sslSelected = getSslSelected();
49426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final int port = getPortFromSecurityType(sslSelected);
495040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        mPortView.setText(Integer.toString(port));
496f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        onUseSslChanged(sslSelected);
4971b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
4981b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
4991b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
5001b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Entry point from Activity after editing settings and verifying them.  Must be FLOW_MODE_EDIT.
5016e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler     * Note, we update account here (as well as the account.mHostAuthRecv) because we edit
5026e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler     * account's delete policy here.
5036e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler     * Blocking - do not call from UI Thread.
5041b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
5051a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
5061b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void saveSettingsAfterEdit() {
50726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final Account account = mSetupData.getAccount();
5086e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler        account.update(mContext, account.toContentValues());
5096e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler        account.mHostAuthRecv.update(mContext, account.mHostAuthRecv.toContentValues());
5101b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // Update the backup (side copy) of the accounts
5110993190cafebc107bd27a26996b5d63d4a4ede10Marc Blank        AccountBackupRestore.backup(mContext);
5121b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
5131b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
5141b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
5151b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Entry point from Activity after entering new settings and verifying them.  For setup mode.
5161b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
517fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler    @Override
5181b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void saveSettingsAfterSetup() {
51926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final Account account = mSetupData.getAccount();
52026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final HostAuth recvAuth = account.getOrCreateHostAuthRecv(mContext);
52126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final HostAuth sendAuth = account.getOrCreateHostAuthSend(mContext);
5221b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
5231b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        // Set the username and password for the outgoing settings to the username and
524ba4e72a9474bcbe33a8001a1964a02cb41ea08bbAndy Stadler        // password the user just set for incoming.  Use the verified host address to try and
525ba4e72a9474bcbe33a8001a1964a02cb41ea08bbAndy Stadler        // pick a smarter outgoing address.
52626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final String hostName =
527f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank                AccountSettingsUtils.inferServerName(mContext, recvAuth.mAddress, null, "smtp");
528040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        sendAuth.setLogin(recvAuth.mLogin, recvAuth.mPassword);
529040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        sendAuth.setConnection(sendAuth.mProtocol, hostName, sendAuth.mPort, sendAuth.mFlags);
5301b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
5311b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler
5321b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    /**
5331b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     * Entry point from Activity, when "next" button is clicked
5341b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler     */
5351a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
5361b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    public void onNext() {
53726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final Account account = mSetupData.getAccount();
538040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
53981a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank        // Make sure delete policy is an valid option before using it; otherwise, the results are
54081a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank        // indeterminate, I suspect...
54181a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank        if (mDeletePolicyView.getVisibility() == View.VISIBLE) {
54281a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank            account.setDeletePolicy(
54381a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank                    (Integer) ((SpinnerOption) mDeletePolicyView.getSelectedItem()).value);
54481a5ba47c67c75e92772bf8adb04a5361fc79b91Marc Blank        }
5458d22e85e459df3d94968389852859dacaf2baafeAndy Stadler
54626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final HostAuth recvAuth = account.getOrCreateHostAuthRecv(mContext);
54726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final String userName = mUsernameView.getText().toString().trim();
54826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final String userPassword = mPasswordView.getText().toString();
549040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        recvAuth.setLogin(userName, userPassword);
5508d22e85e459df3d94968389852859dacaf2baafeAndy Stadler
55126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final String serverAddress = mServerView.getText().toString().trim();
552040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        int serverPort;
5531b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        try {
554040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            serverPort = Integer.parseInt(mPortView.getText().toString().trim());
555040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        } catch (NumberFormatException e) {
556f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            serverPort = getPortFromSecurityType(getSslSelected());
557560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy            LogUtils.d(Logging.LOG_TAG, "Non-integer server port; using '" + serverPort + "'");
5581b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler        }
55926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final int securityType =
56026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                (Integer) ((SpinnerOption) mSecurityTypeView.getSelectedItem()).value;
561040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        recvAuth.setConnection(mBaseScheme, serverAddress, serverPort, securityType);
562f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (mServiceInfo.offerPrefix) {
56326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            final String prefix = mImapPathPrefixView.getText().toString().trim();
5645125c06cef67447a0ef5881d8fbfd6b73e1dfd0aBen Komalo            recvAuth.mDomain = TextUtils.isEmpty(prefix) ? null : ("/" + prefix);
5655125c06cef67447a0ef5881d8fbfd6b73e1dfd0aBen Komalo        } else {
5665125c06cef67447a0ef5881d8fbfd6b73e1dfd0aBen Komalo            recvAuth.mDomain = null;
5675125c06cef67447a0ef5881d8fbfd6b73e1dfd0aBen Komalo        }
5689d3e01c589e1f281941cff9abc59aba0b0f33e78Martin Hibdon        recvAuth.mClientCertAlias = mClientCertificateSelector.getCertificate();
569040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
5709c8c471f971f9c8e40002503a0799ce56c5bfd76Tony Mantler        mCallback.onProceedNext(SetupDataFragment.CHECK_INCOMING, this);
571463584d23f747cfbbd9856b39390269342363b41Tony Mantler        clearButtonBounce();
5721b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler    }
573c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
574c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    @Override
575c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    public boolean haveSettingsChanged() {
57626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final boolean deletePolicyChanged;
577c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
578c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        // Only verify the delete policy if the control is visible (i.e. is a pop3 account)
579648a067056db91d4a1bfd3c4eac9eec3d4c6adb4Tony Mantler        if (mDeletePolicyView != null && mDeletePolicyView.getVisibility() == View.VISIBLE) {
580c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            int newDeletePolicy =
581c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy                (Integer)((SpinnerOption)mDeletePolicyView.getSelectedItem()).value;
582c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            deletePolicyChanged = mLoadedDeletePolicy != newDeletePolicy;
58326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        } else {
58426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            deletePolicyChanged = false;
585c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        }
586c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
587c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        return deletePolicyChanged || super.haveSettingsChanged();
588c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    }
589f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank
590f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    /**
591f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank     * Implements AccountCheckSettingsFragment.Callbacks
592f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank     */
593f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    @Override
5949c8c471f971f9c8e40002503a0799ce56c5bfd76Tony Mantler    public void onAutoDiscoverComplete(int result, SetupDataFragment setupData) {
59526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        mSetupData = setupData;
59626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final AccountSetupIncoming activity = (AccountSetupIncoming) getActivity();
59726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        activity.onAutoDiscoverComplete(result, setupData);
598f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    }
599f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank
600f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    @Override
601f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    public void onCertificateRequested() {
60226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final Intent intent = new Intent(CertificateRequestor.ACTION_REQUEST_CERT);
603f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        intent.setData(Uri.parse("eas://com.android.emailcommon/certrequest"));
604f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        startActivityForResult(intent, CERTIFICATE_REQUEST);
605f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    }
606f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank
607f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    @Override
608f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    public void onActivityResult(int requestCode, int resultCode, Intent data) {
609f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (requestCode == CERTIFICATE_REQUEST && resultCode == Activity.RESULT_OK) {
61026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            final String certAlias = data.getStringExtra(CertificateRequestor.RESULT_ALIAS);
611f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            if (certAlias != null) {
612f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank                mClientCertificateSelector.setCertificate(certAlias);
613f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            }
614f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        }
615f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    }
6161b156352f3fc160da5ba050c2437bcd1c995b326Andrew Stadler}
617