AccountSetupBasics.java revision 17da1767e396b873723d53b2aef93da8aca2c00e
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.Email;
20d5059731780b81c91eff85be8830cafad41f3ed1Andy Stadlerimport com.android.email.EmailAddressValidator;
21d5059731780b81c91eff85be8830cafad41f3ed1Andy Stadlerimport com.android.email.R;
22d5059731780b81c91eff85be8830cafad41f3ed1Andy Stadlerimport com.android.email.Utility;
23d5059731780b81c91eff85be8830cafad41f3ed1Andy Stadlerimport com.android.email.activity.Debug;
24f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blankimport com.android.email.activity.MessageList;
25a290f503f14432163f74548a5e5d1dc5003ad049Marc Blankimport com.android.email.provider.EmailContent;
2654c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadlerimport com.android.email.provider.EmailContent.Account;
27f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blankimport com.android.email.provider.EmailContent.Mailbox;
2896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
2996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.app.Activity;
3096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.app.AlertDialog;
3196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.app.Dialog;
32bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadlerimport android.content.Context;
3396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.content.DialogInterface;
3496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.content.Intent;
3596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.content.res.XmlResourceParser;
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.util.Log;
4196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.view.View;
4296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.view.View.OnClickListener;
4396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.widget.Button;
4496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.widget.CheckBox;
4596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.widget.EditText;
468067b54294356f375521ba3d1e7db3df117b65a4Andrew Stadlerimport android.widget.TextView;
4796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.widget.Toast;
4896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
49d5059731780b81c91eff85be8830cafad41f3ed1Andy Stadlerimport java.io.Serializable;
50d5059731780b81c91eff85be8830cafad41f3ed1Andy Stadlerimport java.net.URI;
51d5059731780b81c91eff85be8830cafad41f3ed1Andy Stadlerimport java.net.URISyntaxException;
5296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
5396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/**
5496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Prompts the user for the email address and password. Also prompts for
5596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * "Use this account as default" if this is the 2nd+ account being set up.
5696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Attempts to lookup default settings for the domain the user specified. If the
5796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * domain is known the settings are handed off to the AccountSetupCheckSettings
5896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * activity. If no settings are found the settings are handed off to the
5996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * AccountSetupAccountType activity.
6096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
6196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpublic class AccountSetupBasics extends Activity
6296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        implements OnClickListener, TextWatcher {
6396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private final static boolean ENTER_DEBUG_SCREEN = true;
64bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler
6596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private final static String EXTRA_ACCOUNT = "com.android.email.AccountSetupBasics.account";
66f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank    public final static String EXTRA_EAS_FLOW = "com.android.email.extra.eas_flow";
67f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank
68f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank    // Action asking us to return to our original caller (i.e. finish)
69f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank    private static final String ACTION_RETURN_TO_CALLER =
70f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        "com.android.email.AccountSetupBasics.return";
71f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank    // Action asking us to restart the task from the Welcome activity (which will figure out the
72f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank    // right place to go) and finish
73f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank    private static final String ACTION_START_AT_MESSAGE_LIST =
74f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        "com.android.email.AccountSetupBasics.messageList";
75bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler
7617da1767e396b873723d53b2aef93da8aca2c00eMarc Blank    private final static String EXTRA_USERNAME = "com.android.email.AccountSetupBasics.username";
7717da1767e396b873723d53b2aef93da8aca2c00eMarc Blank    private final static String EXTRA_PASSWORD = "com.android.email.AccountSetupBasics.password";
7817da1767e396b873723d53b2aef93da8aca2c00eMarc Blank
7996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private final static int DIALOG_NOTE = 1;
80da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    private final static int DIALOG_DUPLICATE_ACCOUNT = 2;
81da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler
8296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private final static String STATE_KEY_PROVIDER =
8396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        "com.android.email.AccountSetupBasics.provider";
84cc402e42ab70699fb43d23e69a724639b9507738Marc Blank
8596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // NOTE: If you change this value, confirm that the new interval exists in arrays.xml
8696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private final static int DEFAULT_ACCOUNT_CHECK_INTERVAL = 15;
8796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
8896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private EditText mEmailView;
8996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private EditText mPasswordView;
9096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private CheckBox mDefaultView;
9196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private Button mNextButton;
9296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private Button mManualSetupButton;
93a290f503f14432163f74548a5e5d1dc5003ad049Marc Blank    private EmailContent.Account mAccount;
9496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private Provider mProvider;
95bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler    private boolean mEasFlowMode;
96da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    private String mDuplicateAccountName;
9796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
9896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private EmailAddressValidator mEmailValidator = new EmailAddressValidator();
9996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
100d5059731780b81c91eff85be8830cafad41f3ed1Andy Stadler    public static void actionNewAccount(Activity fromActivity) {
101d5059731780b81c91eff85be8830cafad41f3ed1Andy Stadler        Intent i = new Intent(fromActivity, AccountSetupBasics.class);
102d5059731780b81c91eff85be8830cafad41f3ed1Andy Stadler        fromActivity.startActivity(i);
10396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
10496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
10517da1767e396b873723d53b2aef93da8aca2c00eMarc Blank    public static void actionNewAccountWithCredentials(Activity fromActivity,
10617da1767e396b873723d53b2aef93da8aca2c00eMarc Blank            String username, String password, boolean easFlow) {
10717da1767e396b873723d53b2aef93da8aca2c00eMarc Blank        Intent i = new Intent(fromActivity, AccountSetupBasics.class);
10817da1767e396b873723d53b2aef93da8aca2c00eMarc Blank        i.putExtra(EXTRA_USERNAME, username);
10917da1767e396b873723d53b2aef93da8aca2c00eMarc Blank        i.putExtra(EXTRA_PASSWORD, password);
11017da1767e396b873723d53b2aef93da8aca2c00eMarc Blank        i.putExtra(EXTRA_EAS_FLOW, easFlow);
11117da1767e396b873723d53b2aef93da8aca2c00eMarc Blank        fromActivity.startActivity(i);
11217da1767e396b873723d53b2aef93da8aca2c00eMarc Blank    }
11317da1767e396b873723d53b2aef93da8aca2c00eMarc Blank
114bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler    /**
115bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler     * This creates an intent that can be used to start a self-contained account creation flow
116bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler     * for exchange accounts.
117bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler     */
118bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler    public static Intent actionSetupExchangeIntent(Context context) {
119bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler        Intent i = new Intent(context, AccountSetupBasics.class);
120bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler        i.putExtra(EXTRA_EAS_FLOW, true);
121bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler        return i;
122bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler    }
123bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler
124f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank    public static void actionAccountCreateFinishedEas(Activity fromActivity) {
125f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        Intent i= new Intent(fromActivity, AccountSetupBasics.class);
126f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        // If we're in the "eas flow" (from AccountManager), we want to return to the caller
127f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        // (in the settings app)
128f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        i.putExtra(AccountSetupBasics.ACTION_RETURN_TO_CALLER, true);
129f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
130f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        fromActivity.startActivity(i);
131f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank    }
132f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank
133f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank    public static void actionAccountCreateFinished(Activity fromActivity, long accountId) {
134f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        Intent i= new Intent(fromActivity, AccountSetupBasics.class);
135f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        // If we're not in the "eas flow" (from AccountManager), we want to show the message list
136f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        // for the new inbox
137f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        i.putExtra(AccountSetupBasics.ACTION_START_AT_MESSAGE_LIST, accountId);
138f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
139f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        fromActivity.startActivity(i);
140f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank    }
141f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank
14296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    @Override
14396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void onCreate(Bundle savedInstanceState) {
14496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        super.onCreate(savedInstanceState);
145f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank
146f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        Intent intent = getIntent();
147f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        if (intent.getBooleanExtra(ACTION_RETURN_TO_CALLER, false)) {
148f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank            // Return to the caller who initiated account creation
149f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank            finish();
150f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank            return;
151f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        } else {
152f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank            long accountId = intent.getLongExtra(ACTION_START_AT_MESSAGE_LIST, -1);
153f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank            if (accountId >= 0) {
154f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank                // Show the message list for the new account
155f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank                MessageList.actionHandleAccount(this, accountId, Mailbox.TYPE_INBOX);
156f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank                finish();
157f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank                return;
158f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank            }
159f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        }
160f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank
16196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        setContentView(R.layout.account_setup_basics);
16217da1767e396b873723d53b2aef93da8aca2c00eMarc Blank
16396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mEmailView = (EditText)findViewById(R.id.account_email);
16496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mPasswordView = (EditText)findViewById(R.id.account_password);
16596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mDefaultView = (CheckBox)findViewById(R.id.account_default);
16696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mNextButton = (Button)findViewById(R.id.next);
16796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mManualSetupButton = (Button)findViewById(R.id.manual_setup);
16896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
16996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mNextButton.setOnClickListener(this);
17096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mManualSetupButton.setOnClickListener(this);
17196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
17296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mEmailView.addTextChangedListener(this);
17396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mPasswordView.addTextChangedListener(this);
17496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
17568a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler        // Find out how many accounts we have, and if there one or more, then we have a choice
17668a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler        // about being default or not.
17768a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler        Cursor c = null;
17868a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler        try {
17968a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler            c = getContentResolver().query(
180cc402e42ab70699fb43d23e69a724639b9507738Marc Blank                    EmailContent.Account.CONTENT_URI,
181a290f503f14432163f74548a5e5d1dc5003ad049Marc Blank                    EmailContent.Account.ID_PROJECTION,
18268a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler                    null, null, null);
18368a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler            if (c.getCount() > 0) {
18468a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler                mDefaultView.setVisibility(View.VISIBLE);
18568a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler            }
18668a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler        } finally {
18768a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler            if (c != null) {
18868a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler                c.close();
18968a9ccfcde85505f06ddba28c22481c80419ddd4Andrew Stadler            }
19096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
19196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
192f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        mEasFlowMode = intent.getBooleanExtra(EXTRA_EAS_FLOW, false);
193bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler        if (mEasFlowMode) {
1948067b54294356f375521ba3d1e7db3df117b65a4Andrew Stadler            // No need for manual button -> next is appropriate
195bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler            mManualSetupButton.setVisibility(View.GONE);
1968067b54294356f375521ba3d1e7db3df117b65a4Andrew Stadler            // Swap welcome text for EAS-specific text
1978067b54294356f375521ba3d1e7db3df117b65a4Andrew Stadler            TextView welcomeView = (TextView) findViewById(R.id.instructions);
1988067b54294356f375521ba3d1e7db3df117b65a4Andrew Stadler            welcomeView.setText(R.string.accounts_welcome_exchange);
199bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler        }
200bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler
20117da1767e396b873723d53b2aef93da8aca2c00eMarc Blank        if (intent.hasExtra(EXTRA_USERNAME)) {
20217da1767e396b873723d53b2aef93da8aca2c00eMarc Blank            mEmailView.setText(intent.getStringExtra(EXTRA_USERNAME));
20317da1767e396b873723d53b2aef93da8aca2c00eMarc Blank        }
20417da1767e396b873723d53b2aef93da8aca2c00eMarc Blank        if (intent.hasExtra(EXTRA_PASSWORD)) {
20517da1767e396b873723d53b2aef93da8aca2c00eMarc Blank            mPasswordView.setText(intent.getStringExtra(EXTRA_PASSWORD));
20617da1767e396b873723d53b2aef93da8aca2c00eMarc Blank        }
20717da1767e396b873723d53b2aef93da8aca2c00eMarc Blank
20896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_ACCOUNT)) {
209a290f503f14432163f74548a5e5d1dc5003ad049Marc Blank            mAccount = (EmailContent.Account)savedInstanceState.getParcelable(EXTRA_ACCOUNT);
21096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
21196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
21296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        if (savedInstanceState != null && savedInstanceState.containsKey(STATE_KEY_PROVIDER)) {
21396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            mProvider = (Provider)savedInstanceState.getSerializable(STATE_KEY_PROVIDER);
21496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
21596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
21696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
21796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    @Override
21896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void onResume() {
21996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        super.onResume();
22096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        validateFields();
22196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
22296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
22396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    @Override
22496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void onSaveInstanceState(Bundle outState) {
22596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        super.onSaveInstanceState(outState);
226294a4fd0c6b15c1f8f41ca03be66ed95e16e5a6dAndrew Stadler        outState.putParcelable(EXTRA_ACCOUNT, mAccount);
22796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        if (mProvider != null) {
22896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            outState.putSerializable(STATE_KEY_PROVIDER, mProvider);
22996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
23096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
23196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
23296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void afterTextChanged(Editable s) {
23396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        validateFields();
23496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
23596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
23696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
23796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
23896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
23996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void onTextChanged(CharSequence s, int start, int before, int count) {
24096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
24196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
24296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private void validateFields() {
24396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        boolean valid = Utility.requiredFieldValid(mEmailView)
24496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                && Utility.requiredFieldValid(mPasswordView)
24596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                && mEmailValidator.isValid(mEmailView.getText().toString().trim());
24696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mNextButton.setEnabled(valid);
24796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mManualSetupButton.setEnabled(valid);
24896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        /*
24996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         * Dim the next button's icon to 50% if the button is disabled.
25096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         * TODO this can probably be done with a stateful drawable. Check into it.
25196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         * android:state_enabled
25296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         */
25396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        Utility.setCompoundDrawablesAlpha(mNextButton, mNextButton.isEnabled() ? 255 : 128);
25496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
25596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
25696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private String getOwnerName() {
25796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        String name = null;
258d382107bdc95d4472050d0879dff7e30193ef1c2Jeff Hamilton/* TODO figure out another way to get the owner name
25996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        String projection[] = {
26096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ContactMethods.NAME
26196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        };
26296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        Cursor c = getContentResolver().query(
26396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                Uri.withAppendedPath(Contacts.People.CONTENT_URI, "owner"), projection, null, null,
26496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                null);
265fb67ec958c44fcd46b524cc85d5f8ad3aeb4d2fdJeff Hamilton        if (c != null) {
266fb67ec958c44fcd46b524cc85d5f8ad3aeb4d2fdJeff Hamilton            if (c.moveToFirst()) {
267fb67ec958c44fcd46b524cc85d5f8ad3aeb4d2fdJeff Hamilton                name = c.getString(0);
268fb67ec958c44fcd46b524cc85d5f8ad3aeb4d2fdJeff Hamilton            }
26996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            c.close();
27096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
271d382107bdc95d4472050d0879dff7e30193ef1c2Jeff Hamilton*/
27296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
27396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        if (name == null || name.length() == 0) {
27454c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler            long defaultId = Account.getDefaultAccountId(this);
27554c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler            if (defaultId != -1) {
27654c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler                Account account = Account.restoreAccountWithId(this, defaultId);
27754c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler                if (account != null) {
2789e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler                    name = account.getSenderName();
27954c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler                }
28096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            }
28196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
28296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return name;
28396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
28496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
28596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    @Override
28696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public Dialog onCreateDialog(int id) {
28796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        if (id == DIALOG_NOTE) {
28896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            if (mProvider != null && mProvider.note != null) {
28996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                return new AlertDialog.Builder(this)
29017da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                .setIcon(android.R.drawable.ic_dialog_alert)
29117da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                .setTitle(android.R.string.dialog_alert_title)
29217da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                .setMessage(mProvider.note)
29317da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                .setPositiveButton(
29417da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                        getString(R.string.okay_action),
29517da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                        new DialogInterface.OnClickListener() {
29617da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                            public void onClick(DialogInterface dialog, int which) {
29717da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                                finishAutoSetup();
29817da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                            }
29917da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                        })
30017da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                        .setNegativeButton(
30117da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                                getString(R.string.cancel_action),
30217da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                                null)
30317da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                                .create();
30496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            }
305da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        } else if (id == DIALOG_DUPLICATE_ACCOUNT) {
306da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler            return new AlertDialog.Builder(this)
30717da1767e396b873723d53b2aef93da8aca2c00eMarc Blank            .setIcon(android.R.drawable.ic_dialog_alert)
30817da1767e396b873723d53b2aef93da8aca2c00eMarc Blank            .setTitle(R.string.account_duplicate_dlg_title)
30917da1767e396b873723d53b2aef93da8aca2c00eMarc Blank            .setMessage(getString(R.string.account_duplicate_dlg_message_fmt,
31017da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                    mDuplicateAccountName))
31117da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                    .setPositiveButton(R.string.okay_action,
31217da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                            new DialogInterface.OnClickListener() {
31317da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                        public void onClick(DialogInterface dialog, int which) {
31417da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                            dismissDialog(DIALOG_DUPLICATE_ACCOUNT);
31517da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                        }
31617da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                    })
31717da1767e396b873723d53b2aef93da8aca2c00eMarc Blank                    .create();
31896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
31996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return null;
32096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
32196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
322da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    /**
323da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler     * Update a cached dialog with current values (e.g. account name)
324da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler     */
325da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    @Override
326da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    public void onPrepareDialog(int id, Dialog dialog) {
327da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        switch (id) {
328da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler            case DIALOG_NOTE:
329da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                if (mProvider != null && mProvider.note != null) {
330da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                    AlertDialog alert = (AlertDialog) dialog;
331da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                    alert.setMessage(mProvider.note);
332da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                }
333da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                break;
334da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler            case DIALOG_DUPLICATE_ACCOUNT:
335da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                if (mDuplicateAccountName != null) {
336da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                    AlertDialog alert = (AlertDialog) dialog;
337da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                    alert.setMessage(getString(R.string.account_duplicate_dlg_message_fmt,
338da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                            mDuplicateAccountName));
339da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                }
340da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                break;
341da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        }
342da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    }
343da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler
34496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private void finishAutoSetup() {
34596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        String email = mEmailView.getText().toString().trim();
34696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        String password = mPasswordView.getText().toString().trim();
34796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        String[] emailParts = email.split("@");
34896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        String user = emailParts[0];
34996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        String domain = emailParts[1];
35096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        URI incomingUri = null;
35196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        URI outgoingUri = null;
35296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        try {
35396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            String incomingUsername = mProvider.incomingUsernameTemplate;
35496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            incomingUsername = incomingUsername.replaceAll("\\$email", email);
35596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            incomingUsername = incomingUsername.replaceAll("\\$user", user);
35696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            incomingUsername = incomingUsername.replaceAll("\\$domain", domain);
35796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
35896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            URI incomingUriTemplate = mProvider.incomingUriTemplate;
35996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            incomingUri = new URI(incomingUriTemplate.getScheme(), incomingUsername + ":"
360bd681454608d518e938e2e7b3ce801f560b14131Andy Stadler                    + password, incomingUriTemplate.getHost(), incomingUriTemplate.getPort(),
361bd681454608d518e938e2e7b3ce801f560b14131Andy Stadler                    incomingUriTemplate.getPath(), null, null);
36296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
36396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            String outgoingUsername = mProvider.outgoingUsernameTemplate;
36496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            outgoingUsername = outgoingUsername.replaceAll("\\$email", email);
36596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            outgoingUsername = outgoingUsername.replaceAll("\\$user", user);
36696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            outgoingUsername = outgoingUsername.replaceAll("\\$domain", domain);
36796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
36896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            URI outgoingUriTemplate = mProvider.outgoingUriTemplate;
36996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            outgoingUri = new URI(outgoingUriTemplate.getScheme(), outgoingUsername + ":"
370bd681454608d518e938e2e7b3ce801f560b14131Andy Stadler                    + password, outgoingUriTemplate.getHost(), outgoingUriTemplate.getPort(),
371bd681454608d518e938e2e7b3ce801f560b14131Andy Stadler                    outgoingUriTemplate.getPath(), null, null);
372da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler
373da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler            // Stop here if the login credentials duplicate an existing account
374da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler            mDuplicateAccountName = Utility.findDuplicateAccount(this, -1,
375da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                    incomingUri.getHost(), incomingUsername);
376da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler            if (mDuplicateAccountName != null) {
377da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                this.showDialog(DIALOG_DUPLICATE_ACCOUNT);
378da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                return;
379da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler            }
380da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler
38196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        } catch (URISyntaxException use) {
38296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            /*
38396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project             * If there is some problem with the URI we give up and go on to
38496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project             * manual setup.
38596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project             */
38696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            onManualSetup();
38796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            return;
38896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
38996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
390a290f503f14432163f74548a5e5d1dc5003ad049Marc Blank        mAccount = new EmailContent.Account();
3919e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        mAccount.setSenderName(getOwnerName());
3929e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        mAccount.setEmailAddress(email);
393294a4fd0c6b15c1f8f41ca03be66ed95e16e5a6dAndrew Stadler        mAccount.setStoreUri(this, incomingUri.toString());
394294a4fd0c6b15c1f8f41ca03be66ed95e16e5a6dAndrew Stadler        mAccount.setSenderUri(this, outgoingUri.toString());
395294a4fd0c6b15c1f8f41ca03be66ed95e16e5a6dAndrew Stadler/* TODO figure out the best way to implement this concept
39696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mAccount.setDraftsFolderName(getString(R.string.special_mailbox_name_drafts));
39796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mAccount.setTrashFolderName(getString(R.string.special_mailbox_name_trash));
39896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mAccount.setOutboxFolderName(getString(R.string.special_mailbox_name_outbox));
39996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mAccount.setSentFolderName(getString(R.string.special_mailbox_name_sent));
400294a4fd0c6b15c1f8f41ca03be66ed95e16e5a6dAndrew Stadler*/
40196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        if (incomingUri.toString().startsWith("imap")) {
40296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            // Delete policy must be set explicitly, because IMAP does not provide a UI selection
40396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            // for it. This logic needs to be followed in the auto setup flow as well.
404a290f503f14432163f74548a5e5d1dc5003ad049Marc Blank            mAccount.setDeletePolicy(EmailContent.Account.DELETE_POLICY_ON_DELETE);
40596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
4069e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        mAccount.setSyncInterval(DEFAULT_ACCOUNT_CHECK_INTERVAL);
40717da1767e396b873723d53b2aef93da8aca2c00eMarc Blank        AccountSetupCheckSettings.actionValidateSettings(this, mAccount, true, true);
40896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
40996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
41096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private void onNext() {
411e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank        // If this is EAS flow, don't try to find a provider for the domain!
412e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank        if (!mEasFlowMode) {
413e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank            String email = mEmailView.getText().toString().trim();
414e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank            String[] emailParts = email.split("@");
415e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank            String domain = emailParts[1].trim();
416e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank            mProvider = findProviderForDomain(domain);
417e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank            if (mProvider != null) {
418e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank                if (mProvider.note != null) {
419e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank                    showDialog(DIALOG_NOTE);
420e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank                } else {
421e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank                    finishAutoSetup();
422e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank                }
423e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank                return;
424e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank            }
42596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
426e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank        // Can't use auto setup
427e1145d173971ebe741e42e9caa209ef2f7bbefa4Marc Blank        onManualSetup();
42896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
42996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
430bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler    /**
431bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler     * This is used in automatic setup mode to jump directly down to the names screen.
432bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler     *
433bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler     * NOTE:  With this organization, it is *not* possible to auto-create an exchange account,
434bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler     * because certain necessary actions happen during AccountSetupOptions (which we are
435bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler     * skipping here).
436bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler     */
43796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    @Override
43896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void onActivityResult(int requestCode, int resultCode, Intent data) {
43996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        if (resultCode == RESULT_OK) {
4409e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler            String email = mAccount.getEmailAddress();
4419e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler            boolean isDefault = mDefaultView.isChecked();
442180d69e08546c6498e0e710c5db6c4fe6296001aMihai Preda            mAccount.setDisplayName(email);
443180d69e08546c6498e0e710c5db6c4fe6296001aMihai Preda            mAccount.setDefaultAccount(isDefault);
444180d69e08546c6498e0e710c5db6c4fe6296001aMihai Preda            // At this point we write the Account object to the DB for the first time.
445180d69e08546c6498e0e710c5db6c4fe6296001aMihai Preda            // From now on we'll only pass the accountId around.
446180d69e08546c6498e0e710c5db6c4fe6296001aMihai Preda            mAccount.save(this);
44796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            Email.setServicesEnabled(this);
448bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler            AccountSetupNames.actionSetNames(this, mAccount.mId, false);
44996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            finish();
45096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
45196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
45296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
45396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private void onManualSetup() {
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("");
46696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            startActivity(new Intent(this, Debug.class));
46796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            return;
46896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
46996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
470a290f503f14432163f74548a5e5d1dc5003ad049Marc Blank        mAccount = new EmailContent.Account();
4719e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        mAccount.setSenderName(getOwnerName());
4729e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        mAccount.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);
475294a4fd0c6b15c1f8f41ca03be66ed95e16e5a6dAndrew Stadler            mAccount.setStoreUri(this, uri.toString());
476294a4fd0c6b15c1f8f41ca03be66ed95e16e5a6dAndrew Stadler            mAccount.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();
48196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            mAccount = 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*/
4909e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        mAccount.setSyncInterval(DEFAULT_ACCOUNT_CHECK_INTERVAL);
49196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
492bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler        AccountSetupAccountType.actionSelectAccountType(this, mAccount, mDefaultView.isChecked(),
493bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler                mEasFlowMode);
49496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
49596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
49696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void onClick(View v) {
49796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        switch (v.getId()) {
49896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            case R.id.next:
49996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                onNext();
50096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                break;
50196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            case R.id.manual_setup:
50296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                onManualSetup();
50396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                break;
50496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
50596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
50696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
50796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
50896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Attempts to get the given attribute as a String resource first, and if it fails
50996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * returns the attribute as a simple String value.
51096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param xml
51196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param name
512294a4fd0c6b15c1f8f41ca03be66ed95e16e5a6dAndrew Stadler     * @return the requested resource
51396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
51496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private String getXmlAttribute(XmlResourceParser xml, String name) {
51596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        int resId = xml.getAttributeResourceValue(null, name, 0);
51696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        if (resId == 0) {
51796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            return xml.getAttributeValue(null, name);
51896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
51996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        else {
52096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            return getString(resId);
52196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
52296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
52396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
52496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
52596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Search the list of known Email providers looking for one that matches the user's email
52696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * domain.  We look in providers_product.xml first, followed by the entries in
52796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * platform providers.xml.  This provides a nominal override capability.
528cc402e42ab70699fb43d23e69a724639b9507738Marc Blank     *
52996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * A match is defined as any provider entry for which the "domain" attribute matches.
530cc402e42ab70699fb43d23e69a724639b9507738Marc Blank     *
53196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param domain The domain portion of the user's email address
53296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return suitable Provider definition, or null if no match found
53396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
53496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private Provider findProviderForDomain(String domain) {
53596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        Provider p = findProviderForDomain(domain, R.xml.providers_product);
53696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        if (p == null) {
53796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            p = findProviderForDomain(domain, R.xml.providers);
53896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
53996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return p;
54096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
54196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
54296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
54396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Search a single resource containing known Email provider definitions.
54496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
54596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param domain The domain portion of the user's email address
54696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param resourceId Id of the provider resource to scan
54796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return suitable Provider definition, or null if no match found
54896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
54996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private Provider findProviderForDomain(String domain, int resourceId) {
55096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        try {
55196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            XmlResourceParser xml = getResources().getXml(resourceId);
55296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            int xmlEventType;
55396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            Provider provider = null;
55496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            while ((xmlEventType = xml.next()) != XmlResourceParser.END_DOCUMENT) {
55596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                if (xmlEventType == XmlResourceParser.START_TAG
55696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                        && "provider".equals(xml.getName())
55796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                        && domain.equalsIgnoreCase(getXmlAttribute(xml, "domain"))) {
55896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                    provider = new Provider();
55996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                    provider.id = getXmlAttribute(xml, "id");
56096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                    provider.label = getXmlAttribute(xml, "label");
56196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                    provider.domain = getXmlAttribute(xml, "domain");
56296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                    provider.note = getXmlAttribute(xml, "note");
56396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                }
56496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                else if (xmlEventType == XmlResourceParser.START_TAG
56596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                        && "incoming".equals(xml.getName())
56696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                        && provider != null) {
56796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                    provider.incomingUriTemplate = new URI(getXmlAttribute(xml, "uri"));
56896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                    provider.incomingUsernameTemplate = getXmlAttribute(xml, "username");
56996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                }
57096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                else if (xmlEventType == XmlResourceParser.START_TAG
57196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                        && "outgoing".equals(xml.getName())
57296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                        && provider != null) {
57396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                    provider.outgoingUriTemplate = new URI(getXmlAttribute(xml, "uri"));
57496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                    provider.outgoingUsernameTemplate = getXmlAttribute(xml, "username");
57596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                }
57696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                else if (xmlEventType == XmlResourceParser.END_TAG
57796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                        && "provider".equals(xml.getName())
57896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                        && provider != null) {
57996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                    return provider;
58096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                }
58196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            }
58296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
58396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        catch (Exception e) {
58496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            Log.e(Email.LOG_TAG, "Error while trying to load provider settings.", e);
58596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
58696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return null;
58796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
58896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
58996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    static class Provider implements Serializable {
59096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        private static final long serialVersionUID = 8511656164616538989L;
59196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
59296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public String id;
59396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
59496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public String label;
59596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
59696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public String domain;
59796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
59896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public URI incomingUriTemplate;
59996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
60096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public String incomingUsernameTemplate;
60196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
60296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public URI outgoingUriTemplate;
60396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
60496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public String outgoingUsernameTemplate;
60596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
60696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public String note;
60796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
60896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project}
609