Skip to content

Commit 10a50cb

Browse files
authored
Merge pull request #289 from samtstern/error-refactor
Refactor error handling
2 parents dbbc67f + 5486ec5 commit 10a50cb

File tree

12 files changed

+242
-169
lines changed

12 files changed

+242
-169
lines changed

auth/src/main/java/com/firebase/ui/auth/ui/AuthCredentialHelper.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
package com.firebase.ui.auth.ui;
1616

17+
import android.support.annotation.Nullable;
18+
1719
import com.firebase.ui.auth.provider.FacebookProvider;
1820
import com.firebase.ui.auth.provider.GoogleProvider;
1921
import com.firebase.ui.auth.provider.IDPResponse;
@@ -22,6 +24,8 @@
2224
import com.google.firebase.auth.GoogleAuthProvider;
2325

2426
public class AuthCredentialHelper {
27+
28+
@Nullable
2529
public static AuthCredential getAuthCredential(IDPResponse idpResponse) {
2630
switch (idpResponse.getProviderType()) {
2731
case GoogleAuthProvider.PROVIDER_ID:
@@ -32,4 +36,5 @@ public static AuthCredential getAuthCredential(IDPResponse idpResponse) {
3236
return null;
3337
}
3438
}
39+
3540
}

auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java

Lines changed: 62 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,14 @@
1717
import android.content.Context;
1818
import android.content.Intent;
1919
import android.graphics.Typeface;
20-
import android.net.Uri;
2120
import android.os.Bundle;
2221
import android.support.annotation.NonNull;
2322
import android.support.design.widget.TextInputLayout;
2423
import android.text.Spannable;
2524
import android.text.SpannableStringBuilder;
2625
import android.text.style.StyleSpan;
2726
import android.view.View;
28-
import android.widget.Button;
2927
import android.widget.EditText;
30-
import android.widget.ImageView;
3128
import android.widget.TextView;
3229

3330
import com.firebase.ui.auth.R;
@@ -41,18 +38,22 @@
4138
import com.firebase.ui.auth.ui.email.PasswordToggler;
4239
import com.firebase.ui.auth.ui.email.RecoverPasswordActivity;
4340
import com.firebase.ui.auth.util.SmartlockUtil;
44-
import com.google.android.gms.tasks.OnCompleteListener;
41+
import com.google.android.gms.tasks.OnFailureListener;
4542
import com.google.android.gms.tasks.OnSuccessListener;
46-
import com.google.android.gms.tasks.Task;
4743
import com.google.firebase.auth.AuthCredential;
4844
import com.google.firebase.auth.AuthResult;
4945
import com.google.firebase.auth.FirebaseAuth;
50-
import com.google.firebase.auth.FirebaseUser;
5146

47+
/**
48+
* Activity to link a pre-existing email/password account to a new IDP sign-in by confirming
49+
* the password before initiating a link.
50+
*/
5251
public class WelcomeBackPasswordPrompt extends AppCompatBase implements View.OnClickListener {
52+
5353
private static final int RC_CREDENTIAL_SAVE = 3;
5454
private static final String TAG = "WelcomeBackPassword";
55-
final StyleSpan bold = new StyleSpan(Typeface.BOLD);
55+
private static final StyleSpan BOLD = new StyleSpan(Typeface.BOLD);
56+
5657
private String mEmail;
5758
private TextInputLayout mPasswordLayout;
5859
private EditText mPasswordField;
@@ -62,29 +63,34 @@ public class WelcomeBackPasswordPrompt extends AppCompatBase implements View.OnC
6263
protected void onCreate(Bundle savedInstanceState) {
6364
super.onCreate(savedInstanceState);
6465
setContentView(R.layout.welcome_back_password_prompt_layout);
66+
6567
mPasswordLayout = (TextInputLayout) findViewById(R.id.password_layout);
68+
mPasswordField = (EditText) findViewById(R.id.password);
69+
6670
mIdpResponse = getIntent().getParcelableExtra(ExtraConstants.EXTRA_IDP_RESPONSE);
6771
mEmail = mIdpResponse.getEmail();
68-
TextView bodyTextView = (TextView) findViewById(R.id.welcome_back_password_body);
72+
73+
// Create welcome back text with email bolded
6974
String bodyText = getResources().getString(R.string.welcome_back_password_prompt_body);
7075
bodyText = String.format(bodyText, mEmail);
7176
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(bodyText);
7277
int emailStart = bodyText.indexOf(mEmail);
73-
spannableStringBuilder.setSpan(bold, emailStart, emailStart + mEmail.length(), Spannable
78+
spannableStringBuilder.setSpan(BOLD, emailStart, emailStart + mEmail.length(), Spannable
7479
.SPAN_INCLUSIVE_INCLUSIVE);
80+
81+
TextView bodyTextView = ((TextView) findViewById(R.id.welcome_back_password_body));
7582
bodyTextView.setText(spannableStringBuilder);
76-
Button signIn = (Button) findViewById(R.id.button_done);
77-
signIn.setOnClickListener(this);
78-
mPasswordField = (EditText) findViewById(R.id.password);
79-
ImageView toggleImage = (ImageView) findViewById(R.id.toggle_visibility);
80-
toggleImage.setOnClickListener(new PasswordToggler(mPasswordField));
81-
TextView troubleSigningIn = (TextView) findViewById(R.id.trouble_signing_in);
82-
troubleSigningIn.setOnClickListener(this);
83+
84+
// Click listeners
85+
findViewById(R.id.button_done).setOnClickListener(this);
86+
findViewById(R.id.toggle_visibility).setOnClickListener(
87+
new PasswordToggler(mPasswordField));
88+
findViewById(R.id.trouble_signing_in).setOnClickListener(this);
8389
}
8490

8591
@Override
8692
public void onClick(View view) {
87-
int id = view.getId();
93+
final int id = view.getId();
8894
if (id == R.id.button_done) {
8995
mActivityHelper.showLoadingDialog(R.string.progress_dialog_signing_in);
9096
next(mEmail, mPasswordField.getText().toString());
@@ -108,48 +114,48 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
108114

109115
private void next(String email, final String password) {
110116
final FirebaseAuth firebaseAuth = mActivityHelper.getFirebaseAuth();
117+
118+
// Sign in with known email and the password provided
111119
firebaseAuth.signInWithEmailAndPassword(email, password)
112120
.addOnFailureListener(
113121
new TaskFailureLogger(TAG, "Error signing in with email and password"))
114-
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
115-
@Override
116-
public void onComplete(@NonNull Task<AuthResult> task) {
117-
if (task.isSuccessful()) {
118-
AuthCredential authCredential =
119-
AuthCredentialHelper.getAuthCredential(mIdpResponse);
120-
task.getResult().getUser().linkWithCredential(authCredential);
121-
firebaseAuth.signOut();
122-
123-
firebaseAuth.signInWithCredential(authCredential)
124-
.addOnFailureListener(
125-
new TaskFailureLogger(TAG, "Error signing in with credential"))
126-
.addOnSuccessListener(
127-
new OnSuccessListener<AuthResult>() {
128-
@Override
129-
public void onSuccess(AuthResult authResult) {
130-
FirebaseUser firebaseUser = authResult.getUser();
131-
String photoUrl = null;
132-
Uri photoUri = firebaseUser.getPhotoUrl();
133-
if (photoUri != null) {
134-
photoUrl = photoUri.toString();
135-
}
136-
mActivityHelper.dismissDialog();
137-
138-
SmartlockUtil.saveCredentialOrFinish(
139-
WelcomeBackPasswordPrompt.this,
140-
RC_CREDENTIAL_SAVE,
141-
mActivityHelper.getFlowParams(),
142-
firebaseUser,
143-
password,
144-
null /* provider */);
145-
}
146-
});
147-
} else {
148-
String error = task.getException().getLocalizedMessage();
149-
mPasswordLayout.setError(error);
150-
}
151-
}
152-
});
122+
.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
123+
@Override
124+
public void onSuccess(AuthResult authResult) {
125+
// Get the social AuthCredential from the IDPResponse object, link
126+
// it to the email/password account.
127+
AuthCredential authCredential =
128+
AuthCredentialHelper.getAuthCredential(mIdpResponse);
129+
authResult.getUser().linkWithCredential(authCredential);
130+
firebaseAuth.signOut();
131+
132+
// Sign in with the credential
133+
firebaseAuth.signInWithCredential(authCredential)
134+
.addOnFailureListener(
135+
new TaskFailureLogger(TAG, "Error signing in with credential"))
136+
.addOnSuccessListener(
137+
new OnSuccessListener<AuthResult>() {
138+
@Override
139+
public void onSuccess(AuthResult authResult) {
140+
mActivityHelper.dismissDialog();
141+
SmartlockUtil.saveCredentialOrFinish(
142+
WelcomeBackPasswordPrompt.this,
143+
RC_CREDENTIAL_SAVE,
144+
mActivityHelper.getFlowParams(),
145+
authResult.getUser(),
146+
password,
147+
null /* provider */);
148+
}
149+
});
150+
}
151+
})
152+
.addOnFailureListener(new OnFailureListener() {
153+
@Override
154+
public void onFailure(@NonNull Exception e) {
155+
String error = e.getLocalizedMessage();
156+
mPasswordLayout.setError(error);
157+
}
158+
});
153159
}
154160

155161
public static Intent createIntent(

auth/src/main/java/com/firebase/ui/auth/ui/email/ConfirmRecoverPasswordActivity.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,21 @@
1717
import android.content.Context;
1818
import android.content.Intent;
1919
import android.os.Bundle;
20+
import android.support.v7.app.AppCompatActivity;
2021
import android.view.View;
2122
import android.widget.TextView;
2223

2324
import com.firebase.ui.auth.R;
2425
import com.firebase.ui.auth.ui.ActivityHelper;
25-
import com.firebase.ui.auth.ui.AppCompatBase;
2626
import com.firebase.ui.auth.ui.ExtraConstants;
2727
import com.firebase.ui.auth.ui.FlowParameters;
2828

29-
public class ConfirmRecoverPasswordActivity extends android.support.v7.app.AppCompatActivity
29+
/**
30+
* Dialog activity to confirm successful email sending in {@link RecoverPasswordActivity}.
31+
*/
32+
public class ConfirmRecoverPasswordActivity extends AppCompatActivity
3033
implements View.OnClickListener {
34+
3135
private ActivityHelper mActivityHelper;
3236

3337
@Override
@@ -38,17 +42,12 @@ protected void onCreate(Bundle savedInstanceState) {
3842

3943
setContentView(R.layout.confirm_recovery_layout);
4044
String email = getIntent().getStringExtra(ExtraConstants.EXTRA_EMAIL);
41-
boolean isSuccess = getIntent().getBooleanExtra(ExtraConstants.EXTRA_SUCCESS, true);
4245

43-
if (isSuccess) {
44-
String text = String.format(
45-
getResources().getString(R.string.confirm_recovery_body),
46-
email
47-
);
48-
((TextView) findViewById(R.id.body_text)).setText(text);
49-
} else {
50-
((TextView) findViewById(R.id.body_text)).setText(R.string.recovery_fail_body);
51-
}
46+
String text = String.format(
47+
getResources().getString(R.string.confirm_recovery_body),
48+
email);
49+
((TextView) findViewById(R.id.body_text)).setText(text);
50+
5251
findViewById(R.id.button_done).setOnClickListener(this);
5352
}
5453

@@ -62,11 +61,9 @@ public void onClick(View view) {
6261
public static Intent createIntent(
6362
Context context,
6463
FlowParameters flowParams,
65-
boolean success,
6664
String email) {
6765
return ActivityHelper.createBaseIntent(context, ConfirmRecoverPasswordActivity.class,
6866
flowParams)
69-
.putExtra(ExtraConstants.EXTRA_SUCCESS, success)
7067
.putExtra(ExtraConstants.EXTRA_EMAIL, email);
7168
}
7269

auth/src/main/java/com/firebase/ui/auth/ui/email/RecoverPasswordActivity.java

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import android.support.annotation.NonNull;
2121
import android.support.design.widget.TextInputLayout;
2222
import android.view.View;
23-
import android.widget.Button;
2423
import android.widget.EditText;
2524

2625
import com.firebase.ui.auth.R;
@@ -30,13 +29,18 @@
3029
import com.firebase.ui.auth.ui.FlowParameters;
3130
import com.firebase.ui.auth.ui.TaskFailureLogger;
3231
import com.firebase.ui.auth.ui.email.field_validators.EmailFieldValidator;
33-
import com.google.android.gms.tasks.OnCompleteListener;
34-
import com.google.android.gms.tasks.Task;
32+
import com.google.android.gms.tasks.OnFailureListener;
33+
import com.google.android.gms.tasks.OnSuccessListener;
3534
import com.google.firebase.auth.FirebaseAuth;
35+
import com.google.firebase.auth.FirebaseAuthInvalidUserException;
3636

37+
/**
38+
* Activity to initiate the "forgot password" flow by asking for the user's email.
39+
*/
3740
public class RecoverPasswordActivity extends AppCompatBase implements View.OnClickListener {
3841
private static final String TAG = "RecoverPasswordActivity";
3942
private static final int RC_CONFIRM = 3;
43+
4044
private EditText mEmailEditText;
4145
private EmailFieldValidator mEmailFieldValidator;
4246

@@ -46,34 +50,44 @@ protected void onCreate(Bundle savedInstanceState) {
4650
setContentView(R.layout.forgot_password_layout);
4751
String email = getIntent().getStringExtra(ExtraConstants.EXTRA_EMAIL);
4852

49-
mEmailFieldValidator = new EmailFieldValidator((TextInputLayout) findViewById(R.id
50-
.email_layout));
53+
mEmailFieldValidator = new EmailFieldValidator(
54+
(TextInputLayout) findViewById(R.id.email_layout));
5155

5256
mEmailEditText = (EditText) findViewById(R.id.email);
53-
Button nextButton = (Button) findViewById(R.id.button_done);
54-
5557
if (email != null) {
5658
mEmailEditText.setText(email);
5759
}
58-
nextButton.setOnClickListener(this);
60+
61+
findViewById(R.id.button_done).setOnClickListener(this);
5962
}
6063

6164
private void next(final String email) {
6265
FirebaseAuth firebaseAuth = mActivityHelper.getFirebaseAuth();
6366
firebaseAuth.sendPasswordResetEmail(email)
6467
.addOnFailureListener(
6568
new TaskFailureLogger(TAG, "Error sending password reset email"))
66-
.addOnCompleteListener(new OnCompleteListener<Void>() {
69+
.addOnSuccessListener(new OnSuccessListener<Void>() {
6770
@Override
68-
public void onComplete(@NonNull Task<Void> task) {
71+
public void onSuccess(Void aVoid) {
6972
mActivityHelper.dismissDialog();
73+
7074
Intent confirmIntent = ConfirmRecoverPasswordActivity.createIntent(
7175
RecoverPasswordActivity.this,
7276
mActivityHelper.getFlowParams(),
73-
task.isSuccessful(),
7477
email);
7578
startActivityForResult(confirmIntent, RC_CONFIRM);
7679
}
80+
})
81+
.addOnFailureListener(this, new OnFailureListener() {
82+
@Override
83+
public void onFailure(@NonNull Exception e) {
84+
mActivityHelper.dismissDialog();
85+
86+
if (e instanceof FirebaseAuthInvalidUserException) {
87+
// No FirebaseUser exists with this email address, show error.
88+
mEmailEditText.setError(getString(R.string.error_email_does_not_exist));
89+
}
90+
}
7791
});
7892
}
7993

0 commit comments

Comments
 (0)