AccountSetupBasics.java revision e6cc662abc0b5fffe223cda5e980b4f05a4e91dd
196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/*
296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * you may not use this file except in compliance with the License.
696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * You may obtain a copy of the License at
796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
1096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * See the License for the specific language governing permissions and
1496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * limitations under the License.
1596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
1696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
1796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpackage com.android.email.activity.setup;
1896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
19d5059731780b81c91eff85be8830cafad41f3ed1Andy Stadlerimport com.android.email.EmailAddressValidator;
20d5059731780b81c91eff85be8830cafad41f3ed1Andy Stadlerimport com.android.email.R;
21d5059731780b81c91eff85be8830cafad41f3ed1Andy Stadlerimport com.android.email.Utility;
22f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onukiimport com.android.email.VendorPolicyLoader;
23d5059731780b81c91eff85be8830cafad41f3ed1Andy Stadlerimport com.android.email.activity.Debug;
24f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blankimport com.android.email.activity.MessageList;
259f73249031303856670651305adff255a00918b7Andrew Stadlerimport com.android.email.activity.setup.AccountSettingsUtils.Provider;
26a290f503f14432163f74548a5e5d1dc5003ad049Marc Blankimport com.android.email.provider.EmailContent;
2754c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadlerimport com.android.email.provider.EmailContent.Account;
28f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blankimport com.android.email.provider.EmailContent.Mailbox;
2996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
3096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.app.Activity;
3196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.app.AlertDialog;
3296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.app.Dialog;
33bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadlerimport android.content.Context;
3496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.content.DialogInterface;
3596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.content.Intent;
3696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.database.Cursor;
3796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.os.Bundle;
3896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.text.Editable;
3996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.text.TextWatcher;
4096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.view.View;
4196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.view.View.OnClickListener;
4296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.widget.Button;
4396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.widget.CheckBox;
4496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.widget.EditText;
458067b54294356f375521ba3d1e7db3df117b65a4Andrew Stadlerimport android.widget.TextView;
4696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.widget.Toast;
4796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
48d5059731780b81c91eff85be8830cafad41f3ed1Andy Stadlerimport java.net.URI;
49d5059731780b81c91eff85be8830cafad41f3ed1Andy Stadlerimport java.net.URISyntaxException;
5096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
5196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/**
5296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Prompts the user for the email address and password. Also prompts for
5396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * "Use this account as default" if this is the 2nd+ account being set up.
5496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Attempts to lookup default settings for the domain the user specified. If the
5596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * domain is known the settings are handed off to the AccountSetupCheckSettings
5696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * activity. If no settings are found the settings are handed off to the
5796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * AccountSetupAccountType activity.
5896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
59e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blankpublic class AccountSetupBasics extends AccountSetupActivity
6096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        implements OnClickListener, TextWatcher {
6196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private final static boolean ENTER_DEBUG_SCREEN = true;
62bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler
6396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private final static int DIALOG_NOTE = 1;
64da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    private final static int DIALOG_DUPLICATE_ACCOUNT = 2;
65da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler
6696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private final static String STATE_KEY_PROVIDER =
6796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        "com.android.email.AccountSetupBasics.provider";
68cc402e42ab70699fb43d23e69a724639b9507738Marc Blank
6996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // NOTE: If you change this value, confirm that the new interval exists in arrays.xml
7096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private final static int DEFAULT_ACCOUNT_CHECK_INTERVAL = 15;
7196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
7296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private EditText mEmailView;
7396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private EditText mPasswordView;
7496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private CheckBox mDefaultView;
7596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private Button mNextButton;
7696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private Button mManualSetupButton;
77e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank
7896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private Provider mProvider;
79da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    private String mDuplicateAccountName;
8096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
8196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private EmailAddressValidator mEmailValidator = new EmailAddressValidator();
8296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
83d5059731780b81c91eff85be8830cafad41f3ed1Andy Stadler    public static void actionNewAccount(Activity fromActivity) {
84e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        SetupData.init(SetupData.FLOW_MODE_NORMAL);
85e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        fromActivity.startActivity(new Intent(fromActivity, AccountSetupBasics.class));
8696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
8796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
8817da1767e396b873723d53b2aef93da8aca2c00eMarc Blank    public static void actionNewAccountWithCredentials(Activity fromActivity,
89e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            String username, String password, int accountFlowMode) {
90e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        SetupData.init(accountFlowMode, username, password);
91e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        fromActivity.startActivity(new Intent(fromActivity, AccountSetupBasics.class));
9217da1767e396b873723d53b2aef93da8aca2c00eMarc Blank    }
9317da1767e396b873723d53b2aef93da8aca2c00eMarc Blank
94bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler    /**
95e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank     * This generates setup data that can be used to start a self-contained account creation flow
96bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler     * for exchange accounts.
97bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler     */
98bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler    public static Intent actionSetupExchangeIntent(Context context) {
99e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        SetupData.init(SetupData.FLOW_MODE_ACCOUNT_MANAGER_EAS);
100e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        return new Intent(context, AccountSetupBasics.class);
101e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank    }
102e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank
103e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank    /**
104e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank     * This generates setup data that can be used to start a self-contained account creation flow
105e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank     * for pop/imap accounts.
106e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank     */
107e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank    public static Intent actionSetupPopImapIntent(Context context) {
108e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        SetupData.init(SetupData.FLOW_MODE_ACCOUNT_MAANGER_POP_IMAP);
109e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        return new Intent(context, AccountSetupBasics.class);
110bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler    }
111bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler
112e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank    public static void actionAccountCreateFinishedAccountFlow(Activity fromActivity) {
113f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        Intent i= new Intent(fromActivity, AccountSetupBasics.class);
114e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        // If we're in the "account flow" (from AccountManager), we want to return to the caller
115f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        // (in the settings app)
116e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        SetupData.init(SetupData.FLOW_MODE_RETURN_TO_CALLER);
117f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
118f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        fromActivity.startActivity(i);
119f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank    }
120f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank
121e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank    public static void actionAccountCreateFinished(final Activity fromActivity,
122e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            final long accountId) {
123e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        Utility.runAsync(new Runnable() {
124e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank           public void run() {
125e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank               Intent i = new Intent(fromActivity, AccountSetupBasics.class);
126e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank               // If we're not in the "account flow" (from AccountManager), we want to show the
127e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank               // message list for the new inbox
128e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank               Account account = Account.restoreAccountWithId(fromActivity, accountId);
129e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank               SetupData.init(SetupData.FLOW_MODE_RETURN_TO_MESSAGE_LIST, account);
130e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank               i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
131e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank               fromActivity.startActivity(i);
132e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            }});
133f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank    }
134f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank
13596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    @Override
13696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void onCreate(Bundle savedInstanceState) {
13796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        super.onCreate(savedInstanceState);
138f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank
139e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        int flowMode = SetupData.getFlowMode();
140e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        if (flowMode == SetupData.FLOW_MODE_RETURN_TO_CALLER) {
141f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank            // Return to the caller who initiated account creation
142f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank            finish();
143f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank            return;
144e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        } else if (flowMode == SetupData.FLOW_MODE_RETURN_TO_MESSAGE_LIST) {
145e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            Account account = SetupData.getAccount();
146e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            if (account != null && account.mId >= 0) {
147f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank                // Show the message list for the new account
148e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank                MessageList.actionHandleAccount(this, account.mId, Mailbox.TYPE_INBOX);
149f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank                finish();
150f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank                return;
151f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank            }
152f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        }
153f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank
15496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        setContentView(R.layout.account_setup_basics);
15517da1767e396b873723d53b2aef93da8aca2c00eMarc Blank
15696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mEmailView = (EditText)findViewById(R.id.account_email);
15796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mPasswordView = (EditText)findViewById(R.id.account_password);
15896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mDefaultView = (CheckBox)findViewById(R.id.account_default);
15996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mNextButton = (Button)findViewById(R.id.next);
16096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mManualSetupButton = (Button)findViewById(R.id.manual_setup);
16196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
16296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mNextButton.setOnClickListener(this);
16396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mManualSetupButton.setOnClickListener(this);
16496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
16596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mEmailView.addTextChangedListener(this);
16696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mPasswordView.addTextChangedListener(this);
16796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
16868a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler        // Find out how many accounts we have, and if there one or more, then we have a choice
16968a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler        // about being default or not.
17068a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler        Cursor c = null;
17168a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler        try {
17268a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler            c = getContentResolver().query(
173cc402e42ab70699fb43d23e69a724639b9507738Marc Blank                    EmailContent.Account.CONTENT_URI,
174a290f503f14432163f74548a5e5d1dc5003ad049Marc Blank                    EmailContent.Account.ID_PROJECTION,
17568a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler                    null, null, null);
176e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            if (c != null && c.getCount() > 0) {
17768a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler                mDefaultView.setVisibility(View.VISIBLE);
17868a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler            }
17968a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler        } finally {
18068a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler            if (c != null) {
18168a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler                c.close();
18268a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler            }
18396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
18496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
185e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        if (flowMode == SetupData.FLOW_MODE_ACCOUNT_MANAGER_EAS) {
1868067b54294356f375521ba3d1e7db3df117b65a4Andrew Stadler            // No need for manual button -> next is appropriate
187bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler            mManualSetupButton.setVisibility(View.GONE);
1888067b54294356f375521ba3d1e7db3df117b65a4Andrew Stadler            // Swap welcome text for EAS-specific text
1898067b54294356f375521ba3d1e7db3df117b65a4Andrew Stadler            TextView welcomeView = (TextView) findViewById(R.id.instructions);
190e5c3c98e9a85198e0b023fd25529512baeb88cdbMakoto Onuki            final boolean alternateStrings =
191e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank                VendorPolicyLoader.getInstance(this).useAlternateExchangeStrings();
192e5c3c98e9a85198e0b023fd25529512baeb88cdbMakoto Onuki            setTitle(alternateStrings
193e5c3c98e9a85198e0b023fd25529512baeb88cdbMakoto Onuki                    ? R.string.account_setup_basics_exchange_title_alternate
194e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank                            : R.string.account_setup_basics_exchange_title);
195e5c3c98e9a85198e0b023fd25529512baeb88cdbMakoto Onuki            welcomeView.setText(alternateStrings
196f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki                    ? R.string.accounts_welcome_exchange_alternate
197e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank                            : R.string.accounts_welcome_exchange);
198bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler        }
199bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler
200e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        if (SetupData.getUsername() != null) {
201e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            mEmailView.setText(SetupData.getUsername());
20217da1767e396b873723d53b2aef93da8aca2c00eMarc Blank        }
203e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        if (SetupData.getPassword() != null) {
204e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            mPasswordView.setText(SetupData.getPassword());
20596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
20696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        if (savedInstanceState != null && savedInstanceState.containsKey(STATE_KEY_PROVIDER)) {
20796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            mProvider = (Provider)savedInstanceState.getSerializable(STATE_KEY_PROVIDER);
20896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
20996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
21096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
21196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    @Override
21296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void onResume() {
21396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        super.onResume();
21496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        validateFields();
21596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
21696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
21796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    @Override
21896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void onSaveInstanceState(Bundle outState) {
21996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        super.onSaveInstanceState(outState);
22096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        if (mProvider != null) {
22196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            outState.putSerializable(STATE_KEY_PROVIDER, mProvider);
22296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
22396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
22496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
22596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void afterTextChanged(Editable s) {
22696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        validateFields();
22796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
22896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
22996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
23096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
23196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
23296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void onTextChanged(CharSequence s, int start, int before, int count) {
23396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
23496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
23596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private void validateFields() {
236e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        boolean valid = Utility.isTextViewNotEmpty(mEmailView)
237e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank                && Utility.isTextViewNotEmpty(mPasswordView)
23896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                && mEmailValidator.isValid(mEmailView.getText().toString().trim());
23996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mNextButton.setEnabled(valid);
24096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mManualSetupButton.setEnabled(valid);
24196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        /*
24296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         * Dim the next button's icon to 50% if the button is disabled.
24396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         * TODO this can probably be done with a stateful drawable. Check into it.
24496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         * android:state_enabled
24596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         */
24696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        Utility.setCompoundDrawablesAlpha(mNextButton, mNextButton.isEnabled() ? 255 : 128);
24796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
24896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
24996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private String getOwnerName() {
25096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        String name = null;
251d382107bdc95d4472050d0879dff7e30193ef1c2Jeff Hamilton/* TODO figure out another way to get the owner name
25296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        String projection[] = {
25396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ContactMethods.NAME
25496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        };
25596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        Cursor c = getContentResolver().query(
25696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                Uri.withAppendedPath(Contacts.People.CONTENT_URI, "owner"), projection, null, null,
25796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                null);
258fb67ec958c44fcd46b524cc85d5f8ad3aeb4d2fdJeff Hamilton        if (c != null) {
259fb67ec958c44fcd46b524cc85d5f8ad3aeb4d2fdJeff Hamilton            if (c.moveToFirst()) {
260fb67ec958c44fcd46b524cc85d5f8ad3aeb4d2fdJeff Hamilton                name = c.getString(0);
261fb67ec958c44fcd46b524cc85d5f8ad3aeb4d2fdJeff Hamilton            }
26296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            c.close();
26396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
264d382107bdc95d4472050d0879dff7e30193ef1c2Jeff Hamilton*/
26596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
26696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        if (name == null || name.length() == 0) {
26754c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler            long defaultId = Account.getDefaultAccountId(this);
26854c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler            if (defaultId != -1) {
26954c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler                Account account = Account.restoreAccountWithId(this, defaultId);
27054c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler                if (account != null) {
2719e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler                    name = account.getSenderName();
27254c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler                }
27396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            }
27496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
27596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return name;
27696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
27796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
27896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    @Override
27996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public Dialog onCreateDialog(int id) {
28096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        if (id == DIALOG_NOTE) {
28196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            if (mProvider != null && mProvider.note != null) {
28296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                return new AlertDialog.Builder(this)
28317da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                .setIcon(android.R.drawable.ic_dialog_alert)
28417da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                .setTitle(android.R.string.dialog_alert_title)
28517da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                .setMessage(mProvider.note)
28617da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                .setPositiveButton(
28717da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                        getString(R.string.okay_action),
28817da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                        new DialogInterface.OnClickListener() {
28917da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                            public void onClick(DialogInterface dialog, int which) {
29017da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                                finishAutoSetup();
29117da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                            }
29217da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                        })
29317da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                        .setNegativeButton(
29417da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                                getString(R.string.cancel_action),
29517da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                                null)
29617da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                                .create();
29796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            }
298da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        } else if (id == DIALOG_DUPLICATE_ACCOUNT) {
299da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler            return new AlertDialog.Builder(this)
30017da1767e396b873723d53b2aef93da8aca2c00eMarc Blank            .setIcon(android.R.drawable.ic_dialog_alert)
30117da1767e396b873723d53b2aef93da8aca2c00eMarc Blank            .setTitle(R.string.account_duplicate_dlg_title)
30217da1767e396b873723d53b2aef93da8aca2c00eMarc Blank            .setMessage(getString(R.string.account_duplicate_dlg_message_fmt,
30317da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                    mDuplicateAccountName))
30417da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                    .setPositiveButton(R.string.okay_action,
30517da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                            new DialogInterface.OnClickListener() {
30617da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                        public void onClick(DialogInterface dialog, int which) {
30717da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                            dismissDialog(DIALOG_DUPLICATE_ACCOUNT);
30817da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                        }
30917da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                    })
31017da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                    .create();
31196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
31296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return null;
31396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
31496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
315da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    /**
316da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler     * Update a cached dialog with current values (e.g. account name)
317da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler     */
318da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    @Override
319da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    public void onPrepareDialog(int id, Dialog dialog) {
320da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        switch (id) {
321da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler            case DIALOG_NOTE:
322da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                if (mProvider != null && mProvider.note != null) {
323da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                    AlertDialog alert = (AlertDialog) dialog;
324da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                    alert.setMessage(mProvider.note);
325da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                }
326da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                break;
327da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler            case DIALOG_DUPLICATE_ACCOUNT:
328da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                if (mDuplicateAccountName != null) {
329da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                    AlertDialog alert = (AlertDialog) dialog;
330da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                    alert.setMessage(getString(R.string.account_duplicate_dlg_message_fmt,
331da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                            mDuplicateAccountName));
332da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                }
333da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                break;
334da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        }
335da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    }
336da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler
33796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private void finishAutoSetup() {
33896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        String email = mEmailView.getText().toString().trim();
33996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        String password = mPasswordView.getText().toString().trim();
34096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        String[] emailParts = email.split("@");
34196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        String user = emailParts[0];
34296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        String domain = emailParts[1];
34396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        URI incomingUri = null;
34496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        URI outgoingUri = null;
34596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        try {
34696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            String incomingUsername = mProvider.incomingUsernameTemplate;
34796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            incomingUsername = incomingUsername.replaceAll("\\$email", email);
34896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            incomingUsername = incomingUsername.replaceAll("\\$user", user);
34996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            incomingUsername = incomingUsername.replaceAll("\\$domain", domain);
35096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
35196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            URI incomingUriTemplate = mProvider.incomingUriTemplate;
35296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            incomingUri = new URI(incomingUriTemplate.getScheme(), incomingUsername + ":"
353bd681454608d518e938e2e7b3ce801f560b14131Andy Stadler                    + password, incomingUriTemplate.getHost(), incomingUriTemplate.getPort(),
354bd681454608d518e938e2e7b3ce801f560b14131Andy Stadler                    incomingUriTemplate.getPath(), null, null);
35596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
35696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            String outgoingUsername = mProvider.outgoingUsernameTemplate;
35796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            outgoingUsername = outgoingUsername.replaceAll("\\$email", email);
35896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            outgoingUsername = outgoingUsername.replaceAll("\\$user", user);
35996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            outgoingUsername = outgoingUsername.replaceAll("\\$domain", domain);
36096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
36196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            URI outgoingUriTemplate = mProvider.outgoingUriTemplate;
36296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            outgoingUri = new URI(outgoingUriTemplate.getScheme(), outgoingUsername + ":"
363bd681454608d518e938e2e7b3ce801f560b14131Andy Stadler                    + password, outgoingUriTemplate.getHost(), outgoingUriTemplate.getPort(),
364bd681454608d518e938e2e7b3ce801f560b14131Andy Stadler                    outgoingUriTemplate.getPath(), null, null);
365da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler
366da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler            // Stop here if the login credentials duplicate an existing account
3679d387ff0bb88ad952b53c956b468dcbcec248752Marc Blank            Account account = Utility.findExistingAccount(this, -1,
368da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                    incomingUri.getHost(), incomingUsername);
3699d387ff0bb88ad952b53c956b468dcbcec248752Marc Blank            if (account != null) {
3709d387ff0bb88ad952b53c956b468dcbcec248752Marc Blank                mDuplicateAccountName = account.mDisplayName;
371da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                this.showDialog(DIALOG_DUPLICATE_ACCOUNT);
372da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                return;
373da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler            }
374da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler
37596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        } catch (URISyntaxException use) {
37696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            /*
37796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project             * If there is some problem with the URI we give up and go on to
37863ab9de1b881bf1496228285511cab213501f404Andrew Stadler             * manual setup.  Technically speaking, AutoDiscover is OK here, since user clicked
37963ab9de1b881bf1496228285511cab213501f404Andrew Stadler             * "Next" to get here.  This would never happen in practice because we don't expect
38063ab9de1b881bf1496228285511cab213501f404Andrew Stadler             * to find any EAS accounts in the providers list.
38196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project             */
38263ab9de1b881bf1496228285511cab213501f404Andrew Stadler            onManualSetup(true);
38396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            return;
38496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
38596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
386e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        Account account = SetupData.getAccount();
387e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        account.setSenderName(getOwnerName());
388e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        account.setEmailAddress(email);
389e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        account.setStoreUri(this, incomingUri.toString());
390e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        account.setSenderUri(this, outgoingUri.toString());
391294a4fd0c6b15c1f8f41ca03be66ed95e16e5a6dAndrew Stadler/* TODO figure out the best way to implement this concept
39296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mAccount.setDraftsFolderName(getString(R.string.special_mailbox_name_drafts));
39396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mAccount.setTrashFolderName(getString(R.string.special_mailbox_name_trash));
39496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mAccount.setOutboxFolderName(getString(R.string.special_mailbox_name_outbox));
39596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mAccount.setSentFolderName(getString(R.string.special_mailbox_name_sent));
396294a4fd0c6b15c1f8f41ca03be66ed95e16e5a6dAndrew Stadler*/
39796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        if (incomingUri.toString().startsWith("imap")) {
39896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            // Delete policy must be set explicitly, because IMAP does not provide a UI selection
39996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            // for it. This logic needs to be followed in the auto setup flow as well.
400e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            account.setDeletePolicy(EmailContent.Account.DELETE_POLICY_ON_DELETE);
40196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
402e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        account.setSyncInterval(DEFAULT_ACCOUNT_CHECK_INTERVAL);
403e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        AccountSetupCheckSettings.actionCheckSettings(this,
404e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank                SetupData.CHECK_INCOMING | SetupData.CHECK_OUTGOING);
40596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
40696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
40796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private void onNext() {
408e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank        // If this is EAS flow, don't try to find a provider for the domain!
409e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        if (SetupData.getFlowMode() != SetupData.FLOW_MODE_ACCOUNT_MANAGER_EAS) {
410e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank            String email = mEmailView.getText().toString().trim();
411e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank            String[] emailParts = email.split("@");
412e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank            String domain = emailParts[1].trim();
4139f73249031303856670651305adff255a00918b7Andrew Stadler            mProvider = AccountSettingsUtils.findProviderForDomain(this, domain);
414e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank            if (mProvider != null) {
415e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank                if (mProvider.note != null) {
416e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank                    showDialog(DIALOG_NOTE);
417e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank                } else {
418e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank                    finishAutoSetup();
419e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank                }
420e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank                return;
421e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank            }
42296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
42363ab9de1b881bf1496228285511cab213501f404Andrew Stadler        // Can't use auto setup (although EAS accounts may still be able to AutoDiscover)
42463ab9de1b881bf1496228285511cab213501f404Andrew Stadler        onManualSetup(true);
42596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
42696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
427bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler    /**
428bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler     * This is used in automatic setup mode to jump directly down to the names screen.
429bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler     *
430bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler     * NOTE:  With this organization, it is *not* possible to auto-create an exchange account,
431bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler     * because certain necessary actions happen during AccountSetupOptions (which we are
432bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler     * skipping here).
433bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler     */
43496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    @Override
43596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void onActivityResult(int requestCode, int resultCode, Intent data) {
43696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        if (resultCode == RESULT_OK) {
437e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            Account account = SetupData.getAccount();
438e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            String email = account.getEmailAddress();
439e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            account.setDisplayName(email);
4409e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler            boolean isDefault = mDefaultView.isChecked();
441e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            account.setDefaultAccount(isDefault);
442e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            SetupData.setDefault(isDefault);
443e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            AccountSetupOptions.actionOptions(this);
44496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            finish();
44596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
44696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
44796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
44863ab9de1b881bf1496228285511cab213501f404Andrew Stadler    /**
44963ab9de1b881bf1496228285511cab213501f404Andrew Stadler     * @param allowAutoDiscover - true if the user clicked 'next' and (if the account is EAS)
45063ab9de1b881bf1496228285511cab213501f404Andrew Stadler     * it's OK to use autodiscover.  false to prevent autodiscover and go straight to manual setup.
45163ab9de1b881bf1496228285511cab213501f404Andrew Stadler     * Ignored for IMAP & POP accounts.
45263ab9de1b881bf1496228285511cab213501f404Andrew Stadler     */
45363ab9de1b881bf1496228285511cab213501f404Andrew Stadler    private void onManualSetup(boolean allowAutoDiscover) {
45496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        String email = mEmailView.getText().toString().trim();
45596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        String password = mPasswordView.getText().toString().trim();
45696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        String[] emailParts = email.split("@");
45796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        String user = emailParts[0].trim();
45896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        String domain = emailParts[1].trim();
459cc402e42ab70699fb43d23e69a724639b9507738Marc Blank
46096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        // Alternate entry to the debug options screen (for devices without a physical keyboard:
461a5af05f1a94ba9d0a91bd6507492cf6946f88a4dMihai Preda        //  Username: d@d.d
46296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        //  Password: debug
463a5af05f1a94ba9d0a91bd6507492cf6946f88a4dMihai Preda        if (ENTER_DEBUG_SCREEN && "d@d.d".equals(email) && "debug".equals(password)) {
464cc402e42ab70699fb43d23e69a724639b9507738Marc Blank            mEmailView.setText("");
465cc402e42ab70699fb43d23e69a724639b9507738Marc Blank            mPasswordView.setText("");
46642e3f10a9575e277ba6f121e6cac56ddb02fda12Makoto Onuki            Debug.actionShow(this);
46796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            return;
46896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
46996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
470e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        Account account = SetupData.getAccount();
471e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        account.setSenderName(getOwnerName());
472e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        account.setEmailAddress(email);
47396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        try {
47496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            URI uri = new URI("placeholder", user + ":" + password, domain, -1, null, null, null);
475e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            account.setStoreUri(this, uri.toString());
476e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            account.setSenderUri(this, uri.toString());
47796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        } catch (URISyntaxException use) {
47896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            // If we can't set up the URL, don't continue - account setup pages will fail too
47996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            Toast.makeText(this, R.string.account_setup_username_password_toast, Toast.LENGTH_LONG)
48096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                    .show();
481e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            account = null;
48296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            return;
48396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
484294a4fd0c6b15c1f8f41ca03be66ed95e16e5a6dAndrew Stadler/* TODO figure out the best way to implement this concept
48596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mAccount.setDraftsFolderName(getString(R.string.special_mailbox_name_drafts));
48696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mAccount.setTrashFolderName(getString(R.string.special_mailbox_name_trash));
48796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mAccount.setOutboxFolderName(getString(R.string.special_mailbox_name_outbox));
48896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mAccount.setSentFolderName(getString(R.string.special_mailbox_name_sent));
489294a4fd0c6b15c1f8f41ca03be66ed95e16e5a6dAndrew Stadler*/
490e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        account.setSyncInterval(DEFAULT_ACCOUNT_CHECK_INTERVAL);
49196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
492e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        AccountSetupAccountType.actionSelectAccountType(this);
49396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
49496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
49596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void onClick(View v) {
49696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        switch (v.getId()) {
49796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            case R.id.next:
49896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                onNext();
49996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                break;
50096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            case R.id.manual_setup:
50163ab9de1b881bf1496228285511cab213501f404Andrew Stadler                // no AutoDiscover - user clicked "manual"
50263ab9de1b881bf1496228285511cab213501f404Andrew Stadler                onManualSetup(false);
50396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                break;
50496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
50596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
50696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project}
507