2009-03-04 03:32:22 +00:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2008 The Android Open Source Project
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package com.android.email.activity.setup;
|
|
|
|
|
2010-12-05 06:53:59 +00:00
|
|
|
import com.android.email.Email;
|
2009-04-03 22:42:31 +00:00
|
|
|
import com.android.email.R;
|
|
|
|
import com.android.email.Utility;
|
2010-01-27 00:02:45 +00:00
|
|
|
import com.android.email.VendorPolicyLoader;
|
2010-11-01 23:15:15 +00:00
|
|
|
import com.android.email.activity.ActivityHelper;
|
2010-08-09 23:17:53 +00:00
|
|
|
import com.android.email.activity.Welcome;
|
2009-07-21 23:44:16 +00:00
|
|
|
import com.android.email.provider.EmailContent.Account;
|
2010-09-13 21:04:45 +00:00
|
|
|
import com.android.email.provider.EmailContent.HostAuth;
|
2009-03-04 03:32:22 +00:00
|
|
|
|
2010-10-07 21:17:11 +00:00
|
|
|
import android.accounts.AccountAuthenticatorResponse;
|
|
|
|
import android.accounts.AccountManager;
|
2009-03-04 03:32:22 +00:00
|
|
|
import android.app.Activity;
|
2010-12-05 06:53:59 +00:00
|
|
|
import android.app.ActivityManager;
|
2010-09-10 22:50:55 +00:00
|
|
|
import android.app.FragmentTransaction;
|
2009-08-20 22:51:36 +00:00
|
|
|
import android.content.Context;
|
2009-03-04 03:32:22 +00:00
|
|
|
import android.content.Intent;
|
|
|
|
import android.os.Bundle;
|
2010-12-05 06:53:59 +00:00
|
|
|
import android.text.TextUtils;
|
|
|
|
import android.util.Log;
|
2010-11-15 05:16:49 +00:00
|
|
|
import android.view.View;
|
|
|
|
import android.view.View.OnClickListener;
|
|
|
|
import android.widget.Button;
|
2009-03-04 03:32:22 +00:00
|
|
|
|
|
|
|
/**
|
2010-09-10 22:50:55 +00:00
|
|
|
* Prompts the user for the email address and password. Also prompts for "Use this account as
|
|
|
|
* default" if this is the 2nd+ account being set up.
|
|
|
|
*
|
|
|
|
* If the domain is well-known, the account is configured fully and checked immediately
|
|
|
|
* using AccountCheckSettingsFragment. If this succeeds we proceed directly to AccountSetupOptions.
|
|
|
|
*
|
|
|
|
* If the domain is not known, or the user selects Manual setup, we invoke the
|
|
|
|
* AccountSetupAccountType activity where the user can begin to manually configure the account.
|
2010-12-05 06:53:59 +00:00
|
|
|
*
|
|
|
|
* === Support for automated testing ==
|
|
|
|
* This activity can also be launched directly via ACTION_CREATE_ACCOUNT. This is intended
|
|
|
|
* only for use by continuous test systems, and is currently only available when "ro.monkey"
|
|
|
|
* is set. To use this mode, you must construct an intent which contains all necessary information
|
|
|
|
* to create the account. No connection checking is done, so the account may or may not actually
|
|
|
|
* work. Here is a sample command, for a gmail account "test_account" with a password of
|
|
|
|
* "test_password".
|
|
|
|
*
|
|
|
|
* $ adb shell am start -a com.android.email.CREATE_ACCOUNT \
|
|
|
|
* -e EMAIL test_account@gmail.com \
|
|
|
|
* -e USER "Test Account Name" \
|
|
|
|
* -e INCOMING imap+ssl+://test_account:test_password@imap.gmail.com \
|
|
|
|
* -e OUTGOING smtp+ssl+://test_account:test_password@smtp.gmail.com
|
|
|
|
*
|
|
|
|
* Note: For accounts that require the full email address in the login, encode the @ as %40.
|
|
|
|
* Note: Exchange accounts that require device security policies cannot be created automatically.
|
2009-03-04 03:32:22 +00:00
|
|
|
*/
|
2010-07-08 17:08:47 +00:00
|
|
|
public class AccountSetupBasics extends AccountSetupActivity
|
2010-11-15 05:16:49 +00:00
|
|
|
implements AccountSetupBasicsFragment.Callback, AccountCheckSettingsFragment.Callbacks,
|
|
|
|
OnClickListener {
|
2009-03-04 03:32:22 +00:00
|
|
|
|
2010-12-05 06:53:59 +00:00
|
|
|
/**
|
|
|
|
* Direct access for forcing account creation
|
|
|
|
* For use by continuous automated test system (e.g. in conjunction with monkey tests)
|
|
|
|
*/
|
|
|
|
private final String ACTION_CREATE_ACCOUNT = "com.android.email.CREATE_ACCOUNT";
|
|
|
|
private final String EXTRA_CREATE_ACCOUNT_EMAIL = "EMAIL";
|
|
|
|
private final String EXTRA_CREATE_ACCOUNT_USER = "USER";
|
|
|
|
private final String EXTRA_CREATE_ACCOUNT_INCOMING = "INCOMING";
|
|
|
|
private final String EXTRA_CREATE_ACCOUNT_OUTGOING = "OUTGOING";
|
2010-12-09 00:43:23 +00:00
|
|
|
private final Boolean DEBUG_ALLOW_NON_MONKEY_CREATION = true; // STOPSHIP - must be FALSE
|
2010-12-05 06:53:59 +00:00
|
|
|
|
2010-08-10 05:44:41 +00:00
|
|
|
private AccountSetupBasicsFragment mFragment;
|
2010-09-09 06:27:05 +00:00
|
|
|
private boolean mManualButtonDisplayed;
|
|
|
|
private boolean mNextButtonEnabled;
|
2010-11-15 05:16:49 +00:00
|
|
|
private Button mManualButton;
|
|
|
|
private Button mNextButton;
|
2010-07-08 17:08:47 +00:00
|
|
|
|
2010-10-07 21:17:11 +00:00
|
|
|
// Used when this Activity is called as part of account authentification flow,
|
|
|
|
// which requires to do extra work before and after the account creation.
|
|
|
|
// See also AccountAuthenticatorActivity.
|
|
|
|
private AccountAuthenticatorResponse mAccountAuthenticatorResponse = null;
|
|
|
|
private Bundle mResultBundle = null;
|
|
|
|
|
2009-04-03 22:42:31 +00:00
|
|
|
public static void actionNewAccount(Activity fromActivity) {
|
2010-07-08 17:08:47 +00:00
|
|
|
SetupData.init(SetupData.FLOW_MODE_NORMAL);
|
|
|
|
fromActivity.startActivity(new Intent(fromActivity, AccountSetupBasics.class));
|
2009-03-04 03:32:22 +00:00
|
|
|
}
|
|
|
|
|
2009-08-20 22:51:36 +00:00
|
|
|
/**
|
2010-07-08 17:08:47 +00:00
|
|
|
* This generates setup data that can be used to start a self-contained account creation flow
|
2009-08-20 22:51:36 +00:00
|
|
|
* for exchange accounts.
|
|
|
|
*/
|
|
|
|
public static Intent actionSetupExchangeIntent(Context context) {
|
2010-07-08 17:08:47 +00:00
|
|
|
SetupData.init(SetupData.FLOW_MODE_ACCOUNT_MANAGER_EAS);
|
|
|
|
return new Intent(context, AccountSetupBasics.class);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This generates setup data that can be used to start a self-contained account creation flow
|
|
|
|
* for pop/imap accounts.
|
|
|
|
*/
|
|
|
|
public static Intent actionSetupPopImapIntent(Context context) {
|
2010-12-05 06:53:59 +00:00
|
|
|
SetupData.init(SetupData.FLOW_MODE_ACCOUNT_MANAGER_POP_IMAP);
|
2010-07-08 17:08:47 +00:00
|
|
|
return new Intent(context, AccountSetupBasics.class);
|
2009-08-20 22:51:36 +00:00
|
|
|
}
|
|
|
|
|
2010-07-08 17:08:47 +00:00
|
|
|
public static void actionAccountCreateFinishedAccountFlow(Activity fromActivity) {
|
2009-12-18 17:18:55 +00:00
|
|
|
Intent i= new Intent(fromActivity, AccountSetupBasics.class);
|
2010-07-08 17:08:47 +00:00
|
|
|
// If we're in the "account flow" (from AccountManager), we want to return to the caller
|
2009-12-18 17:18:55 +00:00
|
|
|
// (in the settings app)
|
2010-07-08 17:08:47 +00:00
|
|
|
SetupData.init(SetupData.FLOW_MODE_RETURN_TO_CALLER);
|
2009-12-18 17:18:55 +00:00
|
|
|
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
|
|
|
fromActivity.startActivity(i);
|
|
|
|
}
|
|
|
|
|
2010-07-08 17:08:47 +00:00
|
|
|
public static void actionAccountCreateFinished(final Activity fromActivity,
|
|
|
|
final long accountId) {
|
|
|
|
Utility.runAsync(new Runnable() {
|
|
|
|
public void run() {
|
|
|
|
Intent i = new Intent(fromActivity, AccountSetupBasics.class);
|
|
|
|
// If we're not in the "account flow" (from AccountManager), we want to show the
|
|
|
|
// message list for the new inbox
|
|
|
|
Account account = Account.restoreAccountWithId(fromActivity, accountId);
|
|
|
|
SetupData.init(SetupData.FLOW_MODE_RETURN_TO_MESSAGE_LIST, account);
|
|
|
|
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
|
|
|
fromActivity.startActivity(i);
|
|
|
|
}});
|
2009-12-18 17:18:55 +00:00
|
|
|
}
|
|
|
|
|
2009-03-04 03:32:22 +00:00
|
|
|
@Override
|
|
|
|
public void onCreate(Bundle savedInstanceState) {
|
|
|
|
super.onCreate(savedInstanceState);
|
2010-11-01 23:15:15 +00:00
|
|
|
ActivityHelper.debugSetWindowFlags(this);
|
2009-12-18 17:18:55 +00:00
|
|
|
|
2010-12-05 06:53:59 +00:00
|
|
|
// Check for forced account creation first, as it comes from an externally-generated
|
|
|
|
// intent and won't have any SetupData prepared.
|
|
|
|
String action = getIntent().getAction();
|
|
|
|
if (ACTION_CREATE_ACCOUNT.equals(action)) {
|
|
|
|
SetupData.init(SetupData.FLOW_MODE_FORCE_CREATE);
|
|
|
|
}
|
|
|
|
|
2010-07-08 17:08:47 +00:00
|
|
|
int flowMode = SetupData.getFlowMode();
|
|
|
|
if (flowMode == SetupData.FLOW_MODE_RETURN_TO_CALLER) {
|
2009-12-18 17:18:55 +00:00
|
|
|
// Return to the caller who initiated account creation
|
|
|
|
finish();
|
|
|
|
return;
|
2010-07-08 17:08:47 +00:00
|
|
|
} else if (flowMode == SetupData.FLOW_MODE_RETURN_TO_MESSAGE_LIST) {
|
|
|
|
Account account = SetupData.getAccount();
|
|
|
|
if (account != null && account.mId >= 0) {
|
2009-12-18 17:18:55 +00:00
|
|
|
// Show the message list for the new account
|
2010-08-09 23:17:53 +00:00
|
|
|
Welcome.actionOpenAccountInbox(this, account.mId);
|
2009-12-18 17:18:55 +00:00
|
|
|
finish();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-03-04 03:32:22 +00:00
|
|
|
setContentView(R.layout.account_setup_basics);
|
2009-12-18 17:18:55 +00:00
|
|
|
|
2010-09-09 06:27:05 +00:00
|
|
|
mFragment = (AccountSetupBasicsFragment)
|
|
|
|
getFragmentManager().findFragmentById(R.id.setup_basics_fragment);
|
|
|
|
mManualButtonDisplayed = true;
|
2010-08-10 05:44:41 +00:00
|
|
|
boolean alternateStrings = false;
|
2010-07-08 17:08:47 +00:00
|
|
|
if (flowMode == SetupData.FLOW_MODE_ACCOUNT_MANAGER_EAS) {
|
2009-09-20 23:54:38 +00:00
|
|
|
// No need for manual button -> next is appropriate
|
2010-09-09 06:27:05 +00:00
|
|
|
mManualButtonDisplayed = false;
|
2009-09-20 23:54:38 +00:00
|
|
|
// Swap welcome text for EAS-specific text
|
2010-08-10 05:44:41 +00:00
|
|
|
alternateStrings = VendorPolicyLoader.getInstance(this).useAlternateExchangeStrings();
|
2010-02-01 21:36:53 +00:00
|
|
|
setTitle(alternateStrings
|
|
|
|
? R.string.account_setup_basics_exchange_title_alternate
|
2010-07-08 17:08:47 +00:00
|
|
|
: R.string.account_setup_basics_exchange_title);
|
2009-08-20 22:51:36 +00:00
|
|
|
}
|
|
|
|
|
2010-08-10 05:44:41 +00:00
|
|
|
// Configure fragment
|
|
|
|
mFragment.setCallback(this, alternateStrings);
|
2010-10-07 21:17:11 +00:00
|
|
|
|
2010-11-15 05:16:49 +00:00
|
|
|
// Configure buttons
|
|
|
|
mManualButton = (Button) findViewById(R.id.manual_setup);
|
|
|
|
mNextButton = (Button) findViewById(R.id.next);
|
|
|
|
mManualButton.setVisibility(mManualButtonDisplayed ? View.VISIBLE : View.INVISIBLE);
|
|
|
|
mManualButton.setOnClickListener(this);
|
|
|
|
mNextButton.setOnClickListener(this);
|
|
|
|
// Force disabled until fragment notifies otherwise
|
|
|
|
mNextButtonEnabled = true;
|
|
|
|
this.onEnableProceedButtons(false);
|
|
|
|
|
2010-10-07 21:17:11 +00:00
|
|
|
mAccountAuthenticatorResponse =
|
|
|
|
getIntent().getParcelableExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE);
|
|
|
|
|
|
|
|
if (mAccountAuthenticatorResponse != null) {
|
|
|
|
mAccountAuthenticatorResponse.onRequestContinued();
|
|
|
|
}
|
2010-12-05 06:53:59 +00:00
|
|
|
|
|
|
|
// Handle force account creation immediately (now that fragment is set up)
|
|
|
|
// This is never allowed in a normal user build and will exit immediately.
|
|
|
|
if (SetupData.getFlowMode() == SetupData.FLOW_MODE_FORCE_CREATE) {
|
|
|
|
if (!DEBUG_ALLOW_NON_MONKEY_CREATION && !ActivityManager.isUserAMonkey()) {
|
|
|
|
Log.e(Email.LOG_TAG, "ERROR: Force account create only allowed for monkeys");
|
|
|
|
finish();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
Intent intent = getIntent();
|
|
|
|
String email = intent.getStringExtra(EXTRA_CREATE_ACCOUNT_EMAIL);
|
|
|
|
String user = intent.getStringExtra(EXTRA_CREATE_ACCOUNT_USER);
|
|
|
|
String incoming = intent.getStringExtra(EXTRA_CREATE_ACCOUNT_INCOMING);
|
|
|
|
String outgoing = intent.getStringExtra(EXTRA_CREATE_ACCOUNT_OUTGOING);
|
|
|
|
if (TextUtils.isEmpty(email) || TextUtils.isEmpty(user) ||
|
|
|
|
TextUtils.isEmpty(incoming) || TextUtils.isEmpty(outgoing)) {
|
|
|
|
Log.e(Email.LOG_TAG, "ERROR: Force account create requires extras EMAIL, USER, " +
|
|
|
|
"INCOMING, OUTGOING");
|
|
|
|
finish();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
mFragment.forceCreateAccount(email, user, incoming, outgoing);
|
|
|
|
onCheckSettingsComplete(AccountCheckSettingsFragment.CHECK_SETTINGS_OK); // calls finish
|
|
|
|
return;
|
|
|
|
}
|
2009-03-04 03:32:22 +00:00
|
|
|
}
|
|
|
|
|
2010-10-10 22:14:24 +00:00
|
|
|
@Override
|
|
|
|
public void finish() {
|
|
|
|
if (mAccountAuthenticatorResponse != null) {
|
|
|
|
// send the result bundle back if set, otherwise send an error.
|
|
|
|
if (mResultBundle != null) {
|
|
|
|
mAccountAuthenticatorResponse.onResult(mResultBundle);
|
|
|
|
} else {
|
|
|
|
mAccountAuthenticatorResponse.onError(AccountManager.ERROR_CODE_CANCELED,
|
|
|
|
"canceled");
|
|
|
|
}
|
|
|
|
mAccountAuthenticatorResponse = null;
|
|
|
|
}
|
|
|
|
super.finish();
|
|
|
|
}
|
|
|
|
|
2010-09-10 22:50:55 +00:00
|
|
|
/**
|
|
|
|
* Implements AccountCheckSettingsFragment.Callbacks
|
|
|
|
*
|
2010-12-05 06:53:59 +00:00
|
|
|
* This is used in automatic setup mode to jump directly down to the options screen.
|
2010-08-10 05:44:41 +00:00
|
|
|
*/
|
2009-03-04 03:32:22 +00:00
|
|
|
@Override
|
2010-09-13 21:04:45 +00:00
|
|
|
public void onCheckSettingsComplete(int result) {
|
|
|
|
if (result == AccountCheckSettingsFragment.CHECK_SETTINGS_OK) {
|
|
|
|
AccountSetupOptions.actionOptions(this);
|
|
|
|
finish();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Implements AccountCheckSettingsFragment.Callbacks
|
|
|
|
* This is overridden only by AccountSetupExchange
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
public void onAutoDiscoverComplete(int result, HostAuth hostAuth) {
|
|
|
|
throw new IllegalStateException();
|
2009-03-04 03:32:22 +00:00
|
|
|
}
|
|
|
|
|
2010-09-09 06:27:05 +00:00
|
|
|
/**
|
2010-11-15 05:16:49 +00:00
|
|
|
* Implements OnClickListener
|
2010-09-09 06:27:05 +00:00
|
|
|
*/
|
|
|
|
@Override
|
2010-11-15 05:16:49 +00:00
|
|
|
public void onClick(View v) {
|
|
|
|
switch (v.getId()) {
|
2010-08-10 05:44:41 +00:00
|
|
|
case R.id.next:
|
|
|
|
mFragment.onNext();
|
2010-11-15 05:16:49 +00:00
|
|
|
break;
|
2010-08-10 05:44:41 +00:00
|
|
|
case R.id.manual_setup:
|
|
|
|
// no AutoDiscover - user clicked "manual"
|
|
|
|
mFragment.onManualSetup(false);
|
2010-11-15 05:16:49 +00:00
|
|
|
break;
|
2010-08-10 05:44:41 +00:00
|
|
|
}
|
2009-03-04 03:32:22 +00:00
|
|
|
}
|
|
|
|
|
2010-08-10 05:44:41 +00:00
|
|
|
/**
|
|
|
|
* Implements AccountSetupBasicsFragment.Callback
|
|
|
|
*/
|
|
|
|
@Override
|
2010-09-09 06:27:05 +00:00
|
|
|
public void onEnableProceedButtons(boolean enabled) {
|
|
|
|
boolean wasEnabled = mNextButtonEnabled;
|
|
|
|
mNextButtonEnabled = enabled;
|
|
|
|
|
|
|
|
if (enabled != wasEnabled) {
|
2010-11-15 05:16:49 +00:00
|
|
|
mManualButton.setEnabled(enabled);
|
|
|
|
mNextButton.setEnabled(enabled);
|
2010-09-09 06:27:05 +00:00
|
|
|
}
|
2009-03-04 03:32:22 +00:00
|
|
|
}
|
|
|
|
|
2009-09-15 21:10:12 +00:00
|
|
|
/**
|
2010-08-10 05:44:41 +00:00
|
|
|
* Implements AccountSetupBasicsFragment.Callback
|
2010-09-10 22:50:55 +00:00
|
|
|
*
|
|
|
|
* This is called when auto-setup (from hardcoded server info) is attempted.
|
|
|
|
* Replace the name/password fragment with the account checker, which will begin to
|
|
|
|
* check incoming/outgoing.
|
2009-09-15 21:10:12 +00:00
|
|
|
*/
|
|
|
|
@Override
|
2010-08-10 05:44:41 +00:00
|
|
|
public void onProceedAutomatic() {
|
2010-09-10 22:50:55 +00:00
|
|
|
AccountCheckSettingsFragment checkerFragment =
|
|
|
|
AccountCheckSettingsFragment.newInstance(
|
|
|
|
SetupData.CHECK_INCOMING | SetupData.CHECK_OUTGOING, null);
|
|
|
|
FragmentTransaction transaction = getFragmentManager().openTransaction();
|
|
|
|
transaction.replace(R.id.setup_basics_fragment, checkerFragment);
|
|
|
|
transaction.addToBackStack("back");
|
|
|
|
transaction.commit();
|
2009-03-04 03:32:22 +00:00
|
|
|
}
|
|
|
|
|
2009-08-20 22:51:36 +00:00
|
|
|
/**
|
2010-08-10 05:44:41 +00:00
|
|
|
* Implements AccountSetupBasicsFragment.Callback
|
2009-08-20 22:51:36 +00:00
|
|
|
*/
|
2009-03-04 03:32:22 +00:00
|
|
|
@Override
|
2010-08-10 05:44:41 +00:00
|
|
|
public void onProceedDebugSettings() {
|
2010-08-26 07:00:48 +00:00
|
|
|
AccountSettingsXL.actionSettingsWithDebug(this);
|
2009-03-04 03:32:22 +00:00
|
|
|
}
|
|
|
|
|
2010-04-06 02:08:05 +00:00
|
|
|
/**
|
2010-08-10 05:44:41 +00:00
|
|
|
* Implements AccountSetupBasicsFragment.Callback
|
2010-04-06 02:08:05 +00:00
|
|
|
*/
|
2010-08-10 05:44:41 +00:00
|
|
|
@Override
|
2010-09-13 21:04:45 +00:00
|
|
|
public void onProceedManual(boolean allowAutoDiscover) {
|
|
|
|
SetupData.setAllowAutodiscover(allowAutoDiscover);
|
2010-07-08 17:08:47 +00:00
|
|
|
AccountSetupAccountType.actionSelectAccountType(this);
|
2009-03-04 03:32:22 +00:00
|
|
|
}
|
|
|
|
}
|