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