Merge "Add the password failed warning text" into ub-mail-master

This commit is contained in:
Martin Hibdon 2014-03-12 22:21:26 +00:00 committed by Android (Google) Code Review
commit 351aa25ccb
6 changed files with 126 additions and 10 deletions

View File

@ -20,6 +20,42 @@
android:layout_weight="1" android:layout_weight="1"
android:orientation="vertical"> android:orientation="vertical">
<TextView
android:id="@+id/wrong_password_warning_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:paddingTop="16dip"
android:paddingBottom="16dip"
android:text="@string/password_warning_label"
android:textColor="@color/password_warning_color"/>
<TextView
android:id="@+id/email_confirmation_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:textStyle="bold"
android:text="@string/email_confirmation_label"
android:textColor="@color/email_confirmation_color"/>
<TextView
android:id="@+id/email_confirmation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:paddingBottom="24dip"
android:textColor="@color/email_confirmation_color"/>
<EditText
android:id="@+id/regular_password"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:hint="@string/account_setup_incoming_password_label"
android:inputType="textPassword"
android:imeOptions="actionDone"
android:visibility="gone"/>
<LinearLayout <LinearLayout
android:id="@+id/oauth_group" android:id="@+id/oauth_group"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -47,7 +83,7 @@
android:hint="@string/account_setup_incoming_password_label" android:hint="@string/account_setup_incoming_password_label"
android:layout_gravity="center" android:layout_gravity="center"
android:inputType="textPassword" android:inputType="textPassword"
android:imeOptions="actionNext"/> android:imeOptions="actionDone"/>
</LinearLayout> </LinearLayout>
<EditText <EditText

View File

@ -39,4 +39,8 @@
<color name="button_text_color">#777777</color> <color name="button_text_color">#777777</color>
<color name="button_text_disabled_color">#cccccc</color> <color name="button_text_disabled_color">#cccccc</color>
<color name="password_warning_color">#FFA500</color>
<color name="email_confirmation_color">#808080</color>
</resources> </resources>

View File

@ -194,6 +194,11 @@
<string name="oauth_authentication_title">Requesting authorization</string> <string name="oauth_authentication_title">Requesting authorization</string>
<!-- Title of screen to choose with authentication to use --> <!-- Title of screen to choose with authentication to use -->
<string name="sign_in_title">Sign in</string> <string name="sign_in_title">Sign in</string>
<!-- Warning label displayed when the email address or password are incorrect -->
<string name="password_warning_label">Email address or password are incorrect</string>
<!-- Label displayed to confirm what email address we are trying to validate -->
<string name="email_confirmation_label">Email address:</string>
<!-- Headline of screen when setting up new email account (large text over divider) <!-- Headline of screen when setting up new email account (large text over divider)
[CHAR LIMIT=none] --> [CHAR LIMIT=none] -->
<string name="account_setup_basics_headline">Email account</string> <string name="account_setup_basics_headline">Email account</string>
@ -207,7 +212,8 @@
<string name="or_label">OR</string> <string name="or_label">OR</string>
<!-- Label for signing in with Google using OAuth --> <!-- Label for signing in with Google using OAuth -->
<string name="sign_in_with_google">Sign in with Google</string> <string name="sign_in_with_google">Sign in with Google</string>
<!-- On "Set up email" screen, hint for account email password text field -->
<string name="account_setup_basics_password_label">Password</string>
<!-- hint for account email password text field --> <!-- hint for account email password text field -->
<string name="password_label">Password</string> <string name="password_label">Password</string>
<!-- On the "Setup up email" screen, label indicating what service we are signed in with [CHAR LIMIT=40] --> <!-- On the "Setup up email" screen, label indicating what service we are signed in with [CHAR LIMIT=40] -->

View File

@ -36,7 +36,7 @@ public class AccountCredentials extends Activity
final String protocol = getIntent().getStringExtra(EXTRA_PROTOCOL); final String protocol = getIntent().getStringExtra(EXTRA_PROTOCOL);
final AccountSetupCredentialsFragment f = final AccountSetupCredentialsFragment f =
AccountSetupCredentialsFragment.newInstance(emailAddress, protocol); AccountSetupCredentialsFragment.newInstance(emailAddress, protocol, false);
getFragmentManager().beginTransaction() getFragmentManager().beginTransaction()
.add(R.id.account_credentials_fragment_container, f, CREDENTIALS_FRAGMENT_TAG) .add(R.id.account_credentials_fragment_container, f, CREDENTIALS_FRAGMENT_TAG)
.commit(); .commit();

View File

@ -24,10 +24,12 @@ import android.text.Editable;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.text.format.DateUtils; import android.text.format.DateUtils;
import android.view.KeyEvent;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText; import android.widget.EditText;
import android.widget.TextView; import android.widget.TextView;
@ -54,6 +56,7 @@ public class AccountSetupCredentialsFragment extends AccountSetupFragment
private static final String EXTRA_EMAIL = "email"; private static final String EXTRA_EMAIL = "email";
private static final String EXTRA_PROTOCOL = "protocol"; private static final String EXTRA_PROTOCOL = "protocol";
private static final String EXTRA_PASSWORD_FAILED = "password_failed";
public static final String EXTRA_PASSWORD = "password"; public static final String EXTRA_PASSWORD = "password";
public static final String EXTRA_OAUTH_PROVIDER = "provider"; public static final String EXTRA_OAUTH_PROVIDER = "provider";
@ -66,6 +69,10 @@ public class AccountSetupCredentialsFragment extends AccountSetupFragment
private EditText mImapPasswordText; private EditText mImapPasswordText;
private EditText mRegularPasswordText; private EditText mRegularPasswordText;
private TextWatcher mValidationTextWatcher; private TextWatcher mValidationTextWatcher;
private TextView mPasswordWarningLabel;
private TextView mEmailConfirmationLabel;
private TextView mEmailConfirmation;
private TextView.OnEditorActionListener mEditorActionListener;
private String mEmailAddress; private String mEmailAddress;
private boolean mOfferOAuth; private boolean mOfferOAuth;
private boolean mOfferCerts; private boolean mOfferCerts;
@ -87,11 +94,12 @@ public class AccountSetupCredentialsFragment extends AccountSetupFragment
* @return new fragment instance * @return new fragment instance
*/ */
public static AccountSetupCredentialsFragment newInstance(final String email, public static AccountSetupCredentialsFragment newInstance(final String email,
final String protocol) { final String protocol, final boolean passwordFailed) {
final AccountSetupCredentialsFragment f = new AccountSetupCredentialsFragment(); final AccountSetupCredentialsFragment f = new AccountSetupCredentialsFragment();
final Bundle b = new Bundle(2); final Bundle b = new Bundle(2);
b.putString(EXTRA_EMAIL, email); b.putString(EXTRA_EMAIL, email);
b.putString(EXTRA_PROTOCOL, protocol); b.putString(EXTRA_PROTOCOL, protocol);
b.putBoolean(EXTRA_PASSWORD_FAILED, passwordFailed);
f.setArguments(b); f.setArguments(b);
return f; return f;
} }
@ -111,6 +119,29 @@ public class AccountSetupCredentialsFragment extends AccountSetupFragment
mDeviceIdSection = UiUtilities.getView(view, R.id.device_id_section); mDeviceIdSection = UiUtilities.getView(view, R.id.device_id_section);
mDeviceId = UiUtilities.getView(view, R.id.device_id); mDeviceId = UiUtilities.getView(view, R.id.device_id);
mClientCertificateSelector.setHostCallback(this); mClientCertificateSelector.setHostCallback(this);
mPasswordWarningLabel = UiUtilities.getView(view, R.id.wrong_password_warning_label);
mEmailConfirmationLabel = UiUtilities.getView(view, R.id.email_confirmation_label);
mEmailConfirmation = UiUtilities.getView(view, R.id.email_confirmation);
mEditorActionListener = new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
final Callback callback = (Callback) getActivity();
if (callback != null) {
final Bundle results = new Bundle(1);
results.putString(EXTRA_PASSWORD, getPassword());
mResults = results;
callback.onCredentialsComplete(results);
}
return true;
} else {
return false;
}
}
};
mImapPasswordText.setOnEditorActionListener(mEditorActionListener);
mRegularPasswordText.setOnEditorActionListener(mEditorActionListener);
// After any text edits, call validateFields() which enables or disables the Next button // After any text edits, call validateFields() which enables or disables the Next button
mValidationTextWatcher = new TextWatcher() { mValidationTextWatcher = new TextWatcher() {
@ -166,6 +197,8 @@ public class AccountSetupCredentialsFragment extends AccountSetupFragment
} }
mDeviceId.setText(deviceId); mDeviceId.setText(deviceId);
} }
final boolean passwordFailed = getArguments().getBoolean(EXTRA_PASSWORD_FAILED, false);
setPasswordFailed(passwordFailed);
validatePassword(); validatePassword();
} }
@ -174,14 +207,29 @@ public class AccountSetupCredentialsFragment extends AccountSetupFragment
super.onDestroy(); super.onDestroy();
if (mImapPasswordText != null) { if (mImapPasswordText != null) {
mImapPasswordText.removeTextChangedListener(mValidationTextWatcher); mImapPasswordText.removeTextChangedListener(mValidationTextWatcher);
mImapPasswordText.setOnEditorActionListener(null);
mImapPasswordText = null; mImapPasswordText = null;
} }
if (mRegularPasswordText != null) { if (mRegularPasswordText != null) {
mRegularPasswordText.removeTextChangedListener(mValidationTextWatcher); mRegularPasswordText.removeTextChangedListener(mValidationTextWatcher);
mRegularPasswordText.setOnEditorActionListener(null);
mRegularPasswordText = null; mRegularPasswordText = null;
} }
} }
public void setPasswordFailed(final boolean failed) {
if (failed) {
mPasswordWarningLabel.setVisibility(View.VISIBLE);
mEmailConfirmationLabel.setVisibility(View.VISIBLE);
mEmailConfirmation.setVisibility(View.VISIBLE);
mEmailConfirmation.setText(mEmailAddress);
} else {
mPasswordWarningLabel.setVisibility(View.GONE);
mEmailConfirmationLabel.setVisibility(View.GONE);
mEmailConfirmation.setVisibility(View.GONE);
}
}
public void validatePassword() { public void validatePassword() {
final Callback callback = (Callback) getActivity(); final Callback callback = (Callback) getActivity();
if (callback != null) { if (callback != null) {

View File

@ -23,6 +23,7 @@ import android.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import android.app.DialogFragment; import android.app.DialogFragment;
import android.app.Fragment; import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction; import android.app.FragmentTransaction;
import android.app.LoaderManager; import android.app.LoaderManager;
import android.app.ProgressDialog; import android.app.ProgressDialog;
@ -108,8 +109,10 @@ public class AccountSetupFinal extends AccountSetupActivity
"AccountSetupFinal.authErr"; "AccountSetupFinal.authErr";
private static final String SAVESTATE_KEY_IS_PRE_CONFIGURED = "AccountSetupFinal.preconfig"; private static final String SAVESTATE_KEY_IS_PRE_CONFIGURED = "AccountSetupFinal.preconfig";
private static final String SAVESTATE_KEY_SKIP_AUTO_DISCOVER = "AccountSetupFinal.noAuto"; private static final String SAVESTATE_KEY_SKIP_AUTO_DISCOVER = "AccountSetupFinal.noAuto";
private static final String SAVESTATE_KEY_PASSWORD_FAILED = "AccountSetupFinal.passwordFailed";
private static final String CONTENT_FRAGMENT_TAG = "AccountSetupContentFragment"; private static final String CONTENT_FRAGMENT_TAG = "AccountSetupContentFragment";
private static final String CREDENTIALS_BACKSTACK_TAG = "AccountSetupCredentialsFragment";
// Collecting initial email and password // Collecting initial email and password
private static final int STATE_BASICS = 0; private static final int STATE_BASICS = 0;
@ -154,6 +157,7 @@ public class AccountSetupFinal extends AccountSetupActivity
private boolean mPreConfiguredFailed = false; private boolean mPreConfiguredFailed = false;
private VendorPolicyLoader.Provider mProvider; private VendorPolicyLoader.Provider mProvider;
private boolean mPasswordFailed;
// UI elements // UI elements
@VisibleForTesting @VisibleForTesting
@ -210,6 +214,7 @@ public class AccountSetupFinal extends AccountSetupActivity
mIsPreConfiguredProvider = mIsPreConfiguredProvider =
savedInstanceState.getBoolean(SAVESTATE_KEY_IS_PRE_CONFIGURED); savedInstanceState.getBoolean(SAVESTATE_KEY_IS_PRE_CONFIGURED);
mSkipAutoDiscover = savedInstanceState.getBoolean(SAVESTATE_KEY_SKIP_AUTO_DISCOVER); mSkipAutoDiscover = savedInstanceState.getBoolean(SAVESTATE_KEY_SKIP_AUTO_DISCOVER);
mPasswordFailed = savedInstanceState.getBoolean(SAVESTATE_KEY_PASSWORD_FAILED);
// I don't know why this view state doesn't get restored // I don't know why this view state doesn't get restored
updateHeadline(); updateHeadline();
} else { } else {
@ -249,6 +254,7 @@ public class AccountSetupFinal extends AccountSetupActivity
} }
updateHeadline(); updateHeadline();
updateContentFragment(false /* addToBackstack */); updateContentFragment(false /* addToBackstack */);
mPasswordFailed = false;
} }
UiUtilities.getView(this, R.id.previous).setOnClickListener(this); UiUtilities.getView(this, R.id.previous).setOnClickListener(this);
@ -398,6 +404,7 @@ public class AccountSetupFinal extends AccountSetupActivity
outState.putBoolean(SAVESTATE_KEY_REPORT_AUTHENTICATOR_ERROR, outState.putBoolean(SAVESTATE_KEY_REPORT_AUTHENTICATOR_ERROR,
mReportAccountAuthenticatorError); mReportAccountAuthenticatorError);
outState.putBoolean(SAVESTATE_KEY_IS_PRE_CONFIGURED, mIsPreConfiguredProvider); outState.putBoolean(SAVESTATE_KEY_IS_PRE_CONFIGURED, mIsPreConfiguredProvider);
outState.putBoolean(SAVESTATE_KEY_PASSWORD_FAILED, mPasswordFailed);
} }
/** /**
@ -439,13 +446,17 @@ public class AccountSetupFinal extends AccountSetupActivity
*/ */
private void updateContentFragment(boolean addToBackstack) { private void updateContentFragment(boolean addToBackstack) {
final AccountSetupFragment f; final AccountSetupFragment f;
String backstackTag = null;
switch (mState) { switch (mState) {
case STATE_BASICS: case STATE_BASICS:
f = AccountSetupBasicsFragment.newInstance(); f = AccountSetupBasicsFragment.newInstance();
break; break;
case STATE_CREDENTIALS: case STATE_CREDENTIALS:
f = AccountSetupCredentialsFragment.newInstance(mSetupData.getEmail(), f = AccountSetupCredentialsFragment.newInstance(mSetupData.getEmail(),
mSetupData.getAccount().getOrCreateHostAuthRecv(this).mProtocol); mSetupData.getAccount().getOrCreateHostAuthRecv(this).mProtocol,
mPasswordFailed);
backstackTag = CREDENTIALS_BACKSTACK_TAG;
break; break;
case STATE_TYPE: case STATE_TYPE:
f = AccountSetupTypeFragment.newInstance(); f = AccountSetupTypeFragment.newInstance();
@ -469,7 +480,7 @@ public class AccountSetupFinal extends AccountSetupActivity
final FragmentTransaction ft = getFragmentManager().beginTransaction(); final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.setup_fragment_container, f, CONTENT_FRAGMENT_TAG); ft.replace(R.id.setup_fragment_container, f, CONTENT_FRAGMENT_TAG);
if (addToBackstack) { if (addToBackstack) {
ft.addToBackStack(null); ft.addToBackStack(backstackTag);
} }
ft.commit(); ft.commit();
} }
@ -488,6 +499,9 @@ public class AccountSetupFinal extends AccountSetupActivity
*/ */
private void resetStateFromCurrentFragment() { private void resetStateFromCurrentFragment() {
AccountSetupFragment f = getContentFragment(); AccountSetupFragment f = getContentFragment();
if (mState == STATE_CREDENTIALS) {
mPasswordFailed = false;
}
mState = f.getState(); mState = f.getState();
updateHeadline(); updateHeadline();
} }
@ -505,6 +519,7 @@ public class AccountSetupFinal extends AccountSetupActivity
switch (mState) { switch (mState) {
case STATE_BASICS: case STATE_BASICS:
onBasicsComplete(); onBasicsComplete();
// TODO: Move protocol choice before password entry
if (shouldDivertToManual()) { if (shouldDivertToManual()) {
// Alternate entry to the debug options screen (for devices without a physical // Alternate entry to the debug options screen (for devices without a physical
// keyboard): // keyboard):
@ -544,9 +559,13 @@ public class AccountSetupFinal extends AccountSetupActivity
break; break;
case STATE_CHECKING_PRECONFIGURED: case STATE_CHECKING_PRECONFIGURED:
if (mPreConfiguredFailed) { if (mPreConfiguredFailed) {
mState = STATE_MANUAL_INCOMING; // Get rid of the previous instance of the AccountSetupCredentialsFragment.
updateHeadline(); FragmentManager fm = getFragmentManager();
updateContentFragment(true /* addToBackstack */); fm.popBackStackImmediate(CREDENTIALS_BACKSTACK_TAG, 0);
final AccountSetupCredentialsFragment f = (AccountSetupCredentialsFragment)
getContentFragment();
f.setPasswordFailed(mPasswordFailed);
resetStateFromCurrentFragment();
} else { } else {
mState = STATE_OPTIONS; mState = STATE_OPTIONS;
updateHeadline(); updateHeadline();
@ -896,6 +915,7 @@ public class AccountSetupFinal extends AccountSetupActivity
@Override @Override
public void onCheckSettingsError(int reason, String message) { public void onCheckSettingsError(int reason, String message) {
mPasswordFailed = true;
dismissCheckSettingsFragment(); dismissCheckSettingsFragment();
final DialogFragment f = final DialogFragment f =
CheckSettingsErrorDialogFragment.newInstance(reason, message); CheckSettingsErrorDialogFragment.newInstance(reason, message);
@ -916,7 +936,7 @@ public class AccountSetupFinal extends AccountSetupActivity
@Override @Override
public void onCheckSettingsErrorDialogEditSettings() { public void onCheckSettingsErrorDialogEditSettings() {
// If we're checking pre-configured, set a flag that we failed and navigate fowards to // If we're checking pre-configured, set a flag that we failed and navigate forwards to
// incoming settings // incoming settings
if (mState == STATE_CHECKING_PRECONFIGURED || mState == STATE_AUTO_DISCOVER) { if (mState == STATE_CHECKING_PRECONFIGURED || mState == STATE_AUTO_DISCOVER) {
mPreConfiguredFailed = true; mPreConfiguredFailed = true;
@ -928,6 +948,8 @@ public class AccountSetupFinal extends AccountSetupActivity
@Override @Override
public void onCheckSettingsComplete() { public void onCheckSettingsComplete() {
mPreConfiguredFailed = false;
mPasswordFailed = false;
dismissCheckSettingsFragment(); dismissCheckSettingsFragment();
proceed(); proceed();
} }