AccountSetupBasics.java revision 3dedc8b19172066e45a146f1e5065d7cdc00236a
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
19d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadlerimport com.android.email.Email;
203dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadlerimport com.android.email.EmailAddressValidator;
21d5059731780b81c91eff85be8830cafad41f3ed1Andy Stadlerimport com.android.email.R;
22d5059731780b81c91eff85be8830cafad41f3ed1Andy Stadlerimport com.android.email.Utility;
23f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onukiimport com.android.email.VendorPolicyLoader;
24cd09545b87979fa6b4337f17b5a001f0ef7b5269Andrew Stadlerimport com.android.email.activity.ActivityHelper;
25b98f219cf088fef9288045813c963be070dde9d0Makoto Onukiimport com.android.email.activity.Welcome;
263dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadlerimport com.android.email.activity.setup.AccountSettingsUtils.Provider;
273dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadlerimport com.android.email.provider.EmailContent;
2854c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadlerimport com.android.email.provider.EmailContent.Account;
292731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadlerimport com.android.email.provider.EmailContent.HostAuth;
3096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
319dac94975f31013d4b31ffb15eba27f352b2e758Daisuke Miyakawaimport android.accounts.AccountAuthenticatorResponse;
329dac94975f31013d4b31ffb15eba27f352b2e758Daisuke Miyakawaimport android.accounts.AccountManager;
3396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.app.Activity;
34d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadlerimport android.app.ActivityManager;
353dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadlerimport android.app.AlertDialog;
363dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadlerimport android.app.Dialog;
373dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadlerimport android.app.DialogFragment;
38fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadlerimport android.app.FragmentTransaction;
39bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadlerimport android.content.Context;
403dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadlerimport android.content.DialogInterface;
4196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.content.Intent;
423dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadlerimport android.os.AsyncTask;
4396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.os.Bundle;
443dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadlerimport android.text.Editable;
45d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadlerimport android.text.TextUtils;
463dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadlerimport android.text.TextWatcher;
47d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadlerimport android.util.Log;
487988164ddfdf2837314fa1763614422bcc90867bAndy Stadlerimport android.view.View;
497988164ddfdf2837314fa1763614422bcc90867bAndy Stadlerimport android.view.View.OnClickListener;
507988164ddfdf2837314fa1763614422bcc90867bAndy Stadlerimport android.widget.Button;
513dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadlerimport android.widget.CheckBox;
523dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadlerimport android.widget.EditText;
533dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadlerimport android.widget.TextView;
543dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadlerimport android.widget.Toast;
553dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
563dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadlerimport java.net.URI;
573dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadlerimport java.net.URISyntaxException;
5896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
5996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/**
60fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * Prompts the user for the email address and password. Also prompts for "Use this account as
61fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * default" if this is the 2nd+ account being set up.
62fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler *
63fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * If the domain is well-known, the account is configured fully and checked immediately
64fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * using AccountCheckSettingsFragment.  If this succeeds we proceed directly to AccountSetupOptions.
65fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler *
66fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * If the domain is not known, or the user selects Manual setup, we invoke the
67fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * AccountSetupAccountType activity where the user can begin to manually configure the account.
68d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler *
69d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler * === Support for automated testing ==
70d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler * This activity can also be launched directly via ACTION_CREATE_ACCOUNT.  This is intended
71d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler * only for use by continuous test systems, and is currently only available when "ro.monkey"
72d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler * is set.  To use this mode, you must construct an intent which contains all necessary information
73d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler * to create the account.  No connection checking is done, so the account may or may not actually
74d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler * work.  Here is a sample command, for a gmail account "test_account" with a password of
75d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler * "test_password".
76d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler *
77d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler *      $ adb shell am start -a com.android.email.CREATE_ACCOUNT \
78d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler *          -e EMAIL test_account@gmail.com \
79d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler *          -e USER "Test Account Name" \
80d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler *          -e INCOMING imap+ssl+://test_account:test_password@imap.gmail.com \
81d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler *          -e OUTGOING smtp+ssl+://test_account:test_password@smtp.gmail.com
82d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler *
83d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler * Note: For accounts that require the full email address in the login, encode the @ as %40.
84d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler * Note: Exchange accounts that require device security policies cannot be created automatically.
8596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
86e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blankpublic class AccountSetupBasics extends AccountSetupActivity
873dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        implements OnClickListener, TextWatcher, AccountCheckSettingsFragment.Callbacks {
883dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
893dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    private final static boolean ENTER_DEBUG_SCREEN = true;
9096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
91d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler    /**
92d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler     * Direct access for forcing account creation
93d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler     * For use by continuous automated test system (e.g. in conjunction with monkey tests)
94d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler     */
95d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler    private final String ACTION_CREATE_ACCOUNT = "com.android.email.CREATE_ACCOUNT";
96d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler    private final String EXTRA_CREATE_ACCOUNT_EMAIL = "EMAIL";
97d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler    private final String EXTRA_CREATE_ACCOUNT_USER = "USER";
98d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler    private final String EXTRA_CREATE_ACCOUNT_INCOMING = "INCOMING";
99d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler    private final String EXTRA_CREATE_ACCOUNT_OUTGOING = "OUTGOING";
1006175300474f01460523ccb3efc9f93722cadf2e0Andy Stadler    private final Boolean DEBUG_ALLOW_NON_MONKEY_CREATION = true;  // STOPSHIP - must be FALSE
101d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler
1023dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    private final static String STATE_KEY_PROVIDER = "AccountSetupBasics.provider";
1033dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
1043dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    // NOTE: If you change this value, confirm that the new interval exists in arrays.xml
1053dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    private final static int DEFAULT_ACCOUNT_CHECK_INTERVAL = 15;
1063dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
1073dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    // Support for UI
1083dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    private TextView mWelcomeView;
1093dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    private EditText mEmailView;
1103dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    private EditText mPasswordView;
1113dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    private CheckBox mDefaultView;
1123dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    private EmailAddressValidator mEmailValidator = new EmailAddressValidator();
1133dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    private Provider mProvider;
1147988164ddfdf2837314fa1763614422bcc90867bAndy Stadler    private Button mManualButton;
1157988164ddfdf2837314fa1763614422bcc90867bAndy Stadler    private Button mNextButton;
116e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank
1179dac94975f31013d4b31ffb15eba27f352b2e758Daisuke Miyakawa    // Used when this Activity is called as part of account authentification flow,
1189dac94975f31013d4b31ffb15eba27f352b2e758Daisuke Miyakawa    // which requires to do extra work before and after the account creation.
1199dac94975f31013d4b31ffb15eba27f352b2e758Daisuke Miyakawa    // See also AccountAuthenticatorActivity.
1209dac94975f31013d4b31ffb15eba27f352b2e758Daisuke Miyakawa    private AccountAuthenticatorResponse mAccountAuthenticatorResponse = null;
1219dac94975f31013d4b31ffb15eba27f352b2e758Daisuke Miyakawa    private Bundle mResultBundle = null;
1229dac94975f31013d4b31ffb15eba27f352b2e758Daisuke Miyakawa
123d5059731780b81c91eff85be8830cafad41f3ed1Andy Stadler    public static void actionNewAccount(Activity fromActivity) {
124e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        SetupData.init(SetupData.FLOW_MODE_NORMAL);
125e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        fromActivity.startActivity(new Intent(fromActivity, AccountSetupBasics.class));
12696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
12796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
128bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler    /**
129e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank     * This generates setup data that can be used to start a self-contained account creation flow
130bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler     * for exchange accounts.
131bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler     */
132bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler    public static Intent actionSetupExchangeIntent(Context context) {
133e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        SetupData.init(SetupData.FLOW_MODE_ACCOUNT_MANAGER_EAS);
134e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        return new Intent(context, AccountSetupBasics.class);
135e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank    }
136e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank
137e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank    /**
138e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank     * This generates setup data that can be used to start a self-contained account creation flow
139e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank     * for pop/imap accounts.
140e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank     */
141e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank    public static Intent actionSetupPopImapIntent(Context context) {
142d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler        SetupData.init(SetupData.FLOW_MODE_ACCOUNT_MANAGER_POP_IMAP);
143e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        return new Intent(context, AccountSetupBasics.class);
144bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler    }
145bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler
146e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank    public static void actionAccountCreateFinishedAccountFlow(Activity fromActivity) {
147f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        Intent i= new Intent(fromActivity, AccountSetupBasics.class);
148e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        // If we're in the "account flow" (from AccountManager), we want to return to the caller
149f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        // (in the settings app)
150e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        SetupData.init(SetupData.FLOW_MODE_RETURN_TO_CALLER);
151f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
152f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        fromActivity.startActivity(i);
153f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank    }
154f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank
155e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank    public static void actionAccountCreateFinished(final Activity fromActivity,
156e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            final long accountId) {
157e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        Utility.runAsync(new Runnable() {
158e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank           public void run() {
159e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank               Intent i = new Intent(fromActivity, AccountSetupBasics.class);
160e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank               // If we're not in the "account flow" (from AccountManager), we want to show the
161e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank               // message list for the new inbox
162e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank               Account account = Account.restoreAccountWithId(fromActivity, accountId);
163e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank               SetupData.init(SetupData.FLOW_MODE_RETURN_TO_MESSAGE_LIST, account);
164e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank               i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
165e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank               fromActivity.startActivity(i);
166e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            }});
167f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank    }
168f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank
16996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    @Override
17096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void onCreate(Bundle savedInstanceState) {
17196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        super.onCreate(savedInstanceState);
172cd09545b87979fa6b4337f17b5a001f0ef7b5269Andrew Stadler        ActivityHelper.debugSetWindowFlags(this);
173f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank
174d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler        // Check for forced account creation first, as it comes from an externally-generated
175d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler        // intent and won't have any SetupData prepared.
176d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler        String action = getIntent().getAction();
177d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler        if (ACTION_CREATE_ACCOUNT.equals(action)) {
178d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler            SetupData.init(SetupData.FLOW_MODE_FORCE_CREATE);
179d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler        }
180d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler
181e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        int flowMode = SetupData.getFlowMode();
182e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        if (flowMode == SetupData.FLOW_MODE_RETURN_TO_CALLER) {
183f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank            // Return to the caller who initiated account creation
184f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank            finish();
185f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank            return;
186e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        } else if (flowMode == SetupData.FLOW_MODE_RETURN_TO_MESSAGE_LIST) {
187e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            Account account = SetupData.getAccount();
188e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            if (account != null && account.mId >= 0) {
189f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank                // Show the message list for the new account
190b98f219cf088fef9288045813c963be070dde9d0Makoto Onuki                Welcome.actionOpenAccountInbox(this, account.mId);
191f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank                finish();
192f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank                return;
193f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank            }
194f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank        }
195f1efd65a5ebac0a2f1e218c0ae6bb8ceb1a19af6Marc Blank
19696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        setContentView(R.layout.account_setup_basics);
19717da1767e396b873723d53b2aef93da8aca2c00eMarc Blank
1983dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        mWelcomeView = (TextView) findViewById(R.id.instructions);
1993dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        mEmailView = (EditText) findViewById(R.id.account_email);
2003dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        mPasswordView = (EditText) findViewById(R.id.account_password);
2013dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        mDefaultView = (CheckBox) findViewById(R.id.account_default);
2023dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
2033dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        mEmailView.addTextChangedListener(this);
2043dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        mPasswordView.addTextChangedListener(this);
2053dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
2063dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        // If there are one or more accounts already in existence, then display
2073dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        // the "use as default" checkbox (it defaults to hidden).
2083dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        new DisplayCheckboxTask().execute();
2093dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
2103dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        boolean manualButtonDisplayed = true;
211a75bab550423e0cd0b2d58379d8210ce6c7c7aa9Andrew Stadler        boolean alternateStrings = false;
212e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        if (flowMode == SetupData.FLOW_MODE_ACCOUNT_MANAGER_EAS) {
2138067b54294356f375521ba3d1e7db3df117b65a4Andrew Stadler            // No need for manual button -> next is appropriate
2143dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            manualButtonDisplayed = false;
2158067b54294356f375521ba3d1e7db3df117b65a4Andrew Stadler            // Swap welcome text for EAS-specific text
216a75bab550423e0cd0b2d58379d8210ce6c7c7aa9Andrew Stadler            alternateStrings = VendorPolicyLoader.getInstance(this).useAlternateExchangeStrings();
217e5c3c98e9a85198e0b023fd25529512baeb88cdbMakoto Onuki            setTitle(alternateStrings
218e5c3c98e9a85198e0b023fd25529512baeb88cdbMakoto Onuki                    ? R.string.account_setup_basics_exchange_title_alternate
2193dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                    : R.string.account_setup_basics_exchange_title);
2203dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            mWelcomeView.setText(alternateStrings
2213dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                    ? R.string.accounts_welcome_exchange_alternate
2223dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                    : R.string.accounts_welcome_exchange);
223bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler        }
224bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler
2257988164ddfdf2837314fa1763614422bcc90867bAndy Stadler        // Configure buttons
2267988164ddfdf2837314fa1763614422bcc90867bAndy Stadler        mManualButton = (Button) findViewById(R.id.manual_setup);
2277988164ddfdf2837314fa1763614422bcc90867bAndy Stadler        mNextButton = (Button) findViewById(R.id.next);
2283dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        mManualButton.setVisibility(manualButtonDisplayed ? View.VISIBLE : View.INVISIBLE);
2297988164ddfdf2837314fa1763614422bcc90867bAndy Stadler        mManualButton.setOnClickListener(this);
2307988164ddfdf2837314fa1763614422bcc90867bAndy Stadler        mNextButton.setOnClickListener(this);
2313dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        // Force disabled until validator notifies otherwise
2323dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        onEnableProceedButtons(false);
2337988164ddfdf2837314fa1763614422bcc90867bAndy Stadler
2349dac94975f31013d4b31ffb15eba27f352b2e758Daisuke Miyakawa        mAccountAuthenticatorResponse =
2359dac94975f31013d4b31ffb15eba27f352b2e758Daisuke Miyakawa            getIntent().getParcelableExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE);
2369dac94975f31013d4b31ffb15eba27f352b2e758Daisuke Miyakawa
2379dac94975f31013d4b31ffb15eba27f352b2e758Daisuke Miyakawa        if (mAccountAuthenticatorResponse != null) {
2389dac94975f31013d4b31ffb15eba27f352b2e758Daisuke Miyakawa            mAccountAuthenticatorResponse.onRequestContinued();
2399dac94975f31013d4b31ffb15eba27f352b2e758Daisuke Miyakawa        }
240d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler
2413dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        // Load fields, but only once
2423dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        String userName = SetupData.getUsername();
2433dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        if (userName != null) {
2443dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            mEmailView.setText(userName);
2453dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            SetupData.setUsername(null);
2463dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        }
2473dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        String password = SetupData.getPassword();
2483dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        if (userName != null) {
2493dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            mPasswordView.setText(password);
2503dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            SetupData.setPassword(null);
2513dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        }
2523dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
253d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler        // Handle force account creation immediately (now that fragment is set up)
254d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler        // This is never allowed in a normal user build and will exit immediately.
255d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler        if (SetupData.getFlowMode() == SetupData.FLOW_MODE_FORCE_CREATE) {
256d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler            if (!DEBUG_ALLOW_NON_MONKEY_CREATION && !ActivityManager.isUserAMonkey()) {
257d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler                Log.e(Email.LOG_TAG, "ERROR: Force account create only allowed for monkeys");
258d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler                finish();
259d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler                return;
260d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler            }
261d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler            Intent intent = getIntent();
262d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler            String email = intent.getStringExtra(EXTRA_CREATE_ACCOUNT_EMAIL);
263d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler            String user = intent.getStringExtra(EXTRA_CREATE_ACCOUNT_USER);
264d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler            String incoming = intent.getStringExtra(EXTRA_CREATE_ACCOUNT_INCOMING);
265d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler            String outgoing = intent.getStringExtra(EXTRA_CREATE_ACCOUNT_OUTGOING);
266d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler            if (TextUtils.isEmpty(email) || TextUtils.isEmpty(user) ||
267d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler                    TextUtils.isEmpty(incoming) || TextUtils.isEmpty(outgoing)) {
268d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler                Log.e(Email.LOG_TAG, "ERROR: Force account create requires extras EMAIL, USER, " +
269d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler                        "INCOMING, OUTGOING");
270d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler                finish();
271d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler                return;
272d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler            }
2733dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            forceCreateAccount(email, user, incoming, outgoing);
274d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler            onCheckSettingsComplete(AccountCheckSettingsFragment.CHECK_SETTINGS_OK); // calls finish
275d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler            return;
276d685b469c73c3479c09301da2e65cd7c11fd4aceAndy Stadler        }
2773dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
2783dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        if (savedInstanceState != null && savedInstanceState.containsKey(STATE_KEY_PROVIDER)) {
2793dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            mProvider = (Provider) savedInstanceState.getSerializable(STATE_KEY_PROVIDER);
2803dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        }
28196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
28296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
28343f2321d10a9ec3efd649cd257aee8d88ea87e08Daisuke Miyakawa    @Override
28443f2321d10a9ec3efd649cd257aee8d88ea87e08Daisuke Miyakawa    public void finish() {
28543f2321d10a9ec3efd649cd257aee8d88ea87e08Daisuke Miyakawa        if (mAccountAuthenticatorResponse != null) {
28643f2321d10a9ec3efd649cd257aee8d88ea87e08Daisuke Miyakawa            // send the result bundle back if set, otherwise send an error.
28743f2321d10a9ec3efd649cd257aee8d88ea87e08Daisuke Miyakawa            if (mResultBundle != null) {
28843f2321d10a9ec3efd649cd257aee8d88ea87e08Daisuke Miyakawa                mAccountAuthenticatorResponse.onResult(mResultBundle);
28943f2321d10a9ec3efd649cd257aee8d88ea87e08Daisuke Miyakawa            } else {
29043f2321d10a9ec3efd649cd257aee8d88ea87e08Daisuke Miyakawa                mAccountAuthenticatorResponse.onError(AccountManager.ERROR_CODE_CANCELED,
29143f2321d10a9ec3efd649cd257aee8d88ea87e08Daisuke Miyakawa                        "canceled");
29243f2321d10a9ec3efd649cd257aee8d88ea87e08Daisuke Miyakawa            }
29343f2321d10a9ec3efd649cd257aee8d88ea87e08Daisuke Miyakawa            mAccountAuthenticatorResponse = null;
29443f2321d10a9ec3efd649cd257aee8d88ea87e08Daisuke Miyakawa        }
29543f2321d10a9ec3efd649cd257aee8d88ea87e08Daisuke Miyakawa        super.finish();
29643f2321d10a9ec3efd649cd257aee8d88ea87e08Daisuke Miyakawa    }
29743f2321d10a9ec3efd649cd257aee8d88ea87e08Daisuke Miyakawa
29896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    @Override
2993dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    public void onSaveInstanceState(Bundle outState) {
3003dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        super.onSaveInstanceState(outState);
3013dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        if (mProvider != null) {
3023dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            outState.putSerializable(STATE_KEY_PROVIDER, mProvider);
3032731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler        }
3042731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler    }
3052731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler
3062731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler    /**
3077988164ddfdf2837314fa1763614422bcc90867bAndy Stadler     * Implements OnClickListener
3088bcb572ccfdac6974c111fe6dfc753a5e0d4e7caAndrew Stadler     */
3098bcb572ccfdac6974c111fe6dfc753a5e0d4e7caAndrew Stadler    @Override
3107988164ddfdf2837314fa1763614422bcc90867bAndy Stadler    public void onClick(View v) {
3117988164ddfdf2837314fa1763614422bcc90867bAndy Stadler        switch (v.getId()) {
312a75bab550423e0cd0b2d58379d8210ce6c7c7aa9Andrew Stadler            case R.id.next:
3133dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                onNext();
3147988164ddfdf2837314fa1763614422bcc90867bAndy Stadler                break;
315a75bab550423e0cd0b2d58379d8210ce6c7c7aa9Andrew Stadler            case R.id.manual_setup:
3163dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                onManualSetup(false);
3177988164ddfdf2837314fa1763614422bcc90867bAndy Stadler                break;
318a75bab550423e0cd0b2d58379d8210ce6c7c7aa9Andrew Stadler        }
31996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
32096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
321a75bab550423e0cd0b2d58379d8210ce6c7c7aa9Andrew Stadler    /**
3223dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * Implements TextWatcher
323a75bab550423e0cd0b2d58379d8210ce6c7c7aa9Andrew Stadler     */
3243dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    public void afterTextChanged(Editable s) {
3253dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        validateFields();
3263dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    }
3278bcb572ccfdac6974c111fe6dfc753a5e0d4e7caAndrew Stadler
3283dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    /**
3293dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * Implements TextWatcher
3303dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     */
3313dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
3323dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    }
3333dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
3343dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    /**
3353dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * Implements TextWatcher
3363dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     */
3373dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    public void onTextChanged(CharSequence s, int start, int before, int count) {
3383dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    }
3393dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
3403dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    private void validateFields() {
3413dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        boolean valid = Utility.isTextViewNotEmpty(mEmailView)
3423dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                && Utility.isTextViewNotEmpty(mPasswordView)
3433dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                && mEmailValidator.isValid(mEmailView.getText().toString().trim());
3443dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        onEnableProceedButtons(valid);
3453dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    }
3463dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
3473dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    /**
3483dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * TODO this should also be in AsyncTask
3493dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * TODO figure out another way to get the owner name
3503dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     */
3513dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    private String getOwnerName() {
3523dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        String name = null;
3533dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        long defaultId = Account.getDefaultAccountId(this);
3543dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        if (defaultId != -1) {
3553dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            Account account = Account.restoreAccountWithId(this, defaultId);
3563dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            if (account != null) {
3573dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                name = account.getSenderName();
3583dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            }
3598bcb572ccfdac6974c111fe6dfc753a5e0d4e7caAndrew Stadler        }
3603dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        return name;
36196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
36296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
363da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    /**
3643dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * Finish the auto setup process, in some cases after showing a warning dialog.
365da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler     */
3663dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    private void finishAutoSetup() {
3673dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        String email = mEmailView.getText().toString().trim();
3683dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        String password = mPasswordView.getText().toString().trim();
3693dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        String[] emailParts = email.split("@");
3703dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        String user = emailParts[0];
3713dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        String domain = emailParts[1];
3723dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        URI incomingUri = null;
3733dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        URI outgoingUri = null;
3743dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        try {
3753dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            String incomingUsername = mProvider.incomingUsernameTemplate;
3763dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            incomingUsername = incomingUsername.replaceAll("\\$email", email);
3773dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            incomingUsername = incomingUsername.replaceAll("\\$user", user);
3783dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            incomingUsername = incomingUsername.replaceAll("\\$domain", domain);
3793dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
3803dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            URI incomingUriTemplate = mProvider.incomingUriTemplate;
3813dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            incomingUri = new URI(incomingUriTemplate.getScheme(), incomingUsername + ":"
3823dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                    + password, incomingUriTemplate.getHost(), incomingUriTemplate.getPort(),
3833dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                    incomingUriTemplate.getPath(), null, null);
3843dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
3853dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            String outgoingUsername = mProvider.outgoingUsernameTemplate;
3863dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            outgoingUsername = outgoingUsername.replaceAll("\\$email", email);
3873dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            outgoingUsername = outgoingUsername.replaceAll("\\$user", user);
3883dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            outgoingUsername = outgoingUsername.replaceAll("\\$domain", domain);
3893dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
3903dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            URI outgoingUriTemplate = mProvider.outgoingUriTemplate;
3913dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            outgoingUri = new URI(outgoingUriTemplate.getScheme(), outgoingUsername + ":"
3923dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                    + password, outgoingUriTemplate.getHost(), outgoingUriTemplate.getPort(),
3933dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                    outgoingUriTemplate.getPath(), null, null);
3943dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
3953dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            // Stop here if the login credentials duplicate an existing account
3963dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            // TODO this shouldn't be in UI thread
3973dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            Account account = Utility.findExistingAccount(this, -1,
3983dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                    incomingUri.getHost(), incomingUsername);
3993dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            if (account != null) {
4003dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                DuplicateAccountDialogFragment dialogFragment =
4013dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                    DuplicateAccountDialogFragment.newInstance(account.mDisplayName);
4023dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                dialogFragment.show(getFragmentManager(), DuplicateAccountDialogFragment.TAG);
4033dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                return;
4043dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            }
4053dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
4063dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        } catch (URISyntaxException use) {
4073dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            /*
4083dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler             * If there is some problem with the URI we give up and go on to
4093dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler             * manual setup.  Technically speaking, AutoDiscover is OK here, since user clicked
4103dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler             * "Next" to get here.  This would never happen in practice because we don't expect
4113dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler             * to find any EAS accounts in the providers list.
4123dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler             */
4133dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            onManualSetup(true);
4143dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            return;
4153dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        }
4163dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
4173dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        populateSetupData(getOwnerName(), email, mDefaultView.isChecked(),
4183dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                incomingUri.toString(), outgoingUri.toString());
4193dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
4203dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        /**
4213dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler         * Start the account checker fragment
4223dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler         * TODO how to link directly from activity<-->fragment
4233dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler         */
4243dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        AccountCheckSettingsFragment checkerFragment = AccountCheckSettingsFragment.newInstance(
4253dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                SetupData.CHECK_INCOMING | SetupData.CHECK_OUTGOING, null);
426fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler        FragmentTransaction transaction = getFragmentManager().openTransaction();
4273dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        transaction.add(checkerFragment, AccountCheckSettingsFragment.TAG);
428fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler        transaction.addToBackStack("back");
429fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler        transaction.commit();
43096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
43196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
432bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler    /**
4333dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * When "next" button is clicked
434bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler     */
4353dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    private void onNext() {
4363dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        // Try auto-configuration from XML providers (unless in EAS mode, we can skip it)
4373dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        if (SetupData.getFlowMode() != SetupData.FLOW_MODE_ACCOUNT_MANAGER_EAS) {
4383dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            String email = mEmailView.getText().toString().trim();
4393dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            String[] emailParts = email.split("@");
4403dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            String domain = emailParts[1].trim();
4413dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            mProvider = AccountSettingsUtils.findProviderForDomain(this, domain);
4423dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            if (mProvider != null) {
4433dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                if (mProvider.note != null) {
4443dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                    NoteDialogFragment dialogFragment =
4453dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                            NoteDialogFragment.newInstance(mProvider.note);
4463dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                    dialogFragment.show(getFragmentManager(), NoteDialogFragment.TAG);
4473dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                } else {
4483dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                    finishAutoSetup();
4493dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                }
4503dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                return;
4513dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            }
4523dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        }
4533dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        // Can't use auto setup (although EAS accounts may still be able to AutoDiscover)
4543dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        onManualSetup(true);
45596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
45696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
45763ab9de1b881bf1496228285511cab213501f404Andrew Stadler    /**
4583dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * When "manual setup" button is clicked
4593dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     *
4603dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * @param allowAutoDiscover - true if the user clicked 'next' and (if the account is EAS)
4613dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * it's OK to use autodiscover.  false to prevent autodiscover and go straight to manual setup.
4623dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * Ignored for IMAP & POP accounts.
46363ab9de1b881bf1496228285511cab213501f404Andrew Stadler     */
4643dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    private void onManualSetup(boolean allowAutoDiscover) {
4653dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        String email = mEmailView.getText().toString().trim();
4663dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        String password = mPasswordView.getText().toString();
4673dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        String[] emailParts = email.split("@");
4683dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        String user = emailParts[0].trim();
4693dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        String domain = emailParts[1].trim();
4703dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
4713dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        // Alternate entry to the debug options screen (for devices without a physical keyboard:
4723dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        //  Username: d@d.d
4733dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        //  Password: debug
4743dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        if (ENTER_DEBUG_SCREEN && "d@d.d".equals(email) && "debug".equals(password)) {
4753dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            mEmailView.setText("");
4763dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            mPasswordView.setText("");
4773dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            AccountSettingsXL.actionSettingsWithDebug(this);
4783dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            return;
4793dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        }
4803dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
4813dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        String uriString = null;
4823dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        try {
4833dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            URI uri = new URI("placeholder", user + ":" + password, domain, -1, null, null, null);
4843dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            uriString = uri.toString();
4853dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        } catch (URISyntaxException use) {
4863dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            // If we can't set up the URL, don't continue - account setup pages will fail too
4873dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            Toast.makeText(this, R.string.account_setup_username_password_toast,
4883dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                    Toast.LENGTH_LONG).show();
4893dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            return;
4903dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        }
4913dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
4923dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        populateSetupData(getOwnerName(), email, mDefaultView.isChecked(), uriString, uriString);
4933dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
4942731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler        SetupData.setAllowAutodiscover(allowAutoDiscover);
495e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        AccountSetupAccountType.actionSelectAccountType(this);
49696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
4973dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
4983dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    /**
4993dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * To support continuous testing, we allow the forced creation of accounts.
5003dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * This works in a manner fairly similar to automatic setup, in which the complete server
5013dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * Uri's are available, except that we will also skip checking (as if both checks were true)
5023dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * and all other UI.
5033dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     *
5043dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * @param email The email address for the new account
5053dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * @param user The user name for the new account
5063dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * @param incoming The URI-style string defining the incoming account
5073dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * @param outgoing The URI-style string defining the outgoing account
5083dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     */
5093dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    private void forceCreateAccount(String email, String user, String incoming, String outgoing) {
5103dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        populateSetupData(user, email, false, incoming, outgoing);
5113dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    }
5123dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
5133dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    /**
5143dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * Populate SetupData's account with complete setup info.
5153dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     */
5163dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    private void populateSetupData(String senderName, String senderEmail, boolean isDefault,
5173dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            String incoming, String outgoing) {
5183dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        Account account = SetupData.getAccount();
5193dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        account.setSenderName(senderName);
5203dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        account.setEmailAddress(senderEmail);
5213dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        account.setDisplayName(senderEmail);
5223dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        account.setDefaultAccount(isDefault);
5233dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        SetupData.setDefault(isDefault);        // TODO - why duplicated, if already set in account
5243dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        account.setStoreUri(this, incoming);
5253dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        account.setSenderUri(this, outgoing);
5263dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
5273dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        // Set sync and delete policies for specific account types
5283dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        if (incoming.startsWith("imap")) {
5293dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            // Delete policy must be set explicitly, because IMAP does not provide a UI selection
5303dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            // for it. This logic needs to be followed in the auto setup flow as well.
5313dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            account.setDeletePolicy(EmailContent.Account.DELETE_POLICY_ON_DELETE);
5323dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        }
5333dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
5343dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        if (incoming.startsWith("eas")) {
5353dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            account.setSyncInterval(Account.CHECK_INTERVAL_PUSH);
5363dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        } else {
5373dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            account.setSyncInterval(DEFAULT_ACCOUNT_CHECK_INTERVAL);
5383dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        }
5393dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    }
5403dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
5413dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    /**
5423dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * Implements AccountCheckSettingsFragment.Callbacks
5433dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     *
5443dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * This is used in automatic setup mode to jump directly down to the options screen.
5453dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     */
5463dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    @Override
5473dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    public void onCheckSettingsComplete(int result) {
5483dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        if (result == AccountCheckSettingsFragment.CHECK_SETTINGS_OK) {
5493dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            AccountSetupOptions.actionOptions(this);
5503dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            finish();
5513dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        }
5523dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    }
5533dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
5543dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    /**
5553dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * Implements AccountCheckSettingsFragment.Callbacks
5563dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * This is overridden only by AccountSetupExchange
5573dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     */
5583dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    @Override
5593dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    public void onAutoDiscoverComplete(int result, HostAuth hostAuth) {
5603dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        throw new IllegalStateException();
5613dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    }
5623dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
5633dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    /**
5643dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * AsyncTask checks count of accounts and displays "use this account as default" checkbox
5653dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * if there are more than one.
5663dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     */
5673dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    private class DisplayCheckboxTask extends AsyncTask<Void, Void, Integer> {
5683dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
5693dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        @Override
5703dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        protected Integer doInBackground(Void... params) {
5713dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            return EmailContent.count(AccountSetupBasics.this, EmailContent.Account.CONTENT_URI);
5723dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        }
5733dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
5743dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        @Override
5753dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        protected void onPostExecute(Integer numAccounts) {
5763dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            if (numAccounts > 0) {
5773dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                Activity activity = AccountSetupBasics.this;
5783dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                activity.findViewById(R.id.account_default_divider_1).setVisibility(View.VISIBLE);
5793dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                mDefaultView.setVisibility(View.VISIBLE);
5803dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                activity.findViewById(R.id.account_default_divider_2).setVisibility(View.VISIBLE);
5813dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            }
5823dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        }
5833dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    }
5843dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
5853dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    private void onEnableProceedButtons(boolean enabled) {
5863dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        mManualButton.setEnabled(enabled);
5873dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        mNextButton.setEnabled(enabled);
5883dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    }
5893dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
5903dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    /**
5913dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     * Dialog fragment to show "setup note" dialog
5923dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler     */
5933dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    public static class NoteDialogFragment extends DialogFragment {
5943dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        private final static String TAG = "NoteDialogFragment";
5953dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
5963dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        // Argument bundle keys
5973dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        private final static String BUNDLE_KEY_NOTE = "NoteDialogFragment.Note";
5983dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
5993dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        /**
6003dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler         * Create the dialog with parameters
6013dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler         */
6023dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        public static NoteDialogFragment newInstance(String note) {
6033dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            NoteDialogFragment f = new NoteDialogFragment();
6043dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            Bundle b = new Bundle();
6053dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            b.putString(BUNDLE_KEY_NOTE, note);
6063dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            f.setArguments(b);
6073dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            return f;
6083dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        }
6093dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
6103dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        @Override
6113dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        public Dialog onCreateDialog(Bundle savedInstanceState) {
6123dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            Context context = getActivity();
6133dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            final String note = getArguments().getString(BUNDLE_KEY_NOTE);
6143dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler
6153dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler            return new AlertDialog.Builder(context)
6163dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                .setIcon(android.R.drawable.ic_dialog_alert)
6173dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                .setTitle(android.R.string.dialog_alert_title)
6183dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                .setMessage(note)
6193dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                .setPositiveButton(
6203dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                        R.string.okay_action,
6213dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                        new DialogInterface.OnClickListener() {
6223dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                            public void onClick(DialogInterface dialog, int which) {
6233dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                                Activity a = getActivity();
6243dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                                if (a instanceof AccountSetupBasics) {
6253dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                                    ((AccountSetupBasics)a).finishAutoSetup();
6263dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                                }
6273dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                                dismiss();
6283dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                            }
6293dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                        })
6303dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                .setNegativeButton(
6313dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                        context.getString(R.string.cancel_action),
6323dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                        null)
6333dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler                .create();
6343dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler        }
6353dedc8b19172066e45a146f1e5065d7cdc00236aAndy Stadler    }
63696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project}
637