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