Skip to content

Commit a5ed59c

Browse files
committed
Standardize error handling
Change-Id: Ib85147724ce25ef9e757e3d7a496cc3dea8f94c8
1 parent faf6d3c commit a5ed59c

File tree

7 files changed

+125
-53
lines changed

7 files changed

+125
-53
lines changed

app/src/main/java/com/firebase/uidemo/auth/AccountLinkActivity.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ public void signOut() {
124124
.addOnCompleteListener(new OnCompleteListener<Void>() {
125125
@Override
126126
public void onComplete(@NonNull Task<Void> task) {
127+
setStatus(null);
127128
updateUI();
128129
}
129130
});

auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import com.firebase.ui.auth.ui.email.EmailActivity;
4646
import com.firebase.ui.auth.ui.phone.PhoneActivity;
4747
import com.firebase.ui.auth.util.AnonymousUpgradeUtils;
48+
import com.firebase.ui.auth.util.UpgradeFailureListener;
4849
import com.firebase.ui.auth.util.data.ProviderUtils;
4950
import com.google.android.gms.tasks.OnFailureListener;
5051
import com.google.android.gms.tasks.OnSuccessListener;
@@ -167,27 +168,22 @@ public void onSuccess(@NonNull final IdpResponse response) {
167168
final AuthCredential credential = ProviderUtils.getAuthCredential(response);
168169

169170
AnonymousUpgradeUtils
170-
.signInOrLink(getFlowParams(), getFirebaseAuth(), credential)
171+
.signInOrLink(this, credential)
172+
.addOnFailureListener(this, new UpgradeFailureListener(this, credential) {
173+
@Override
174+
public void onNonUpgradeFailure(@NonNull Exception e) {
175+
new CredentialSignInHandler(AuthMethodPickerActivity.this,
176+
RC_ACCOUNT_LINK,
177+
response).onFailure(e);
178+
}
179+
})
171180
.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
172181
@Override
173182
public void onSuccess(AuthResult authResult) {
174183
FirebaseUser firebaseUser = authResult.getUser();
175184
startSaveCredentials(firebaseUser, null, response);
176185
}
177186
})
178-
.addOnFailureListener(new OnFailureListener() {
179-
@Override
180-
public void onFailure(@NonNull Exception e) {
181-
if (AnonymousUpgradeUtils.isUpgradeFailure(getFlowParams(), getFirebaseAuth(), e)) {
182-
IdpResponse res = new IdpResponse.Builder(credential).build();
183-
finish(RESULT_CANCELED, res.toIntent());
184-
} else {
185-
new CredentialSignInHandler(AuthMethodPickerActivity.this,
186-
RC_ACCOUNT_LINK,
187-
response).onFailure(e);
188-
}
189-
}
190-
})
191187
.addOnFailureListener(
192188
new TaskFailureLogger(TAG, "Firebase sign in with credential " +
193189
credential.getProvider() + " unsuccessful. " +

auth/src/main/java/com/firebase/ui/auth/ui/idp/WelcomeBackIdpPrompt.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@
4040
import com.firebase.ui.auth.ui.AppCompatBase;
4141
import com.firebase.ui.auth.ui.HelperActivityBase;
4242
import com.firebase.ui.auth.ui.TaskFailureLogger;
43+
import com.firebase.ui.auth.util.AnonymousUpgradeUtils;
4344
import com.firebase.ui.auth.util.ExtraConstants;
45+
import com.firebase.ui.auth.util.UpgradeFailureListener;
4446
import com.firebase.ui.auth.util.data.ProviderUtils;
4547
import com.google.android.gms.tasks.OnCompleteListener;
4648
import com.google.android.gms.tasks.OnFailureListener;
@@ -143,8 +145,13 @@ public void onSuccess(@NonNull final IdpResponse idpResponse) {
143145

144146
FirebaseUser currentUser = getAuthHelper().getCurrentUser();
145147
if (currentUser == null) {
146-
getAuthHelper().getFirebaseAuth()
147-
.signInWithCredential(newCredential)
148+
AnonymousUpgradeUtils.signInOrLink(this, newCredential)
149+
.addOnFailureListener(this, new UpgradeFailureListener(this, newCredential) {
150+
@Override
151+
public void onNonUpgradeFailure(@NonNull Exception e) {
152+
finishWithError(e);
153+
}
154+
})
148155
.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
149156
@Override
150157
public void onSuccess(AuthResult result) {
@@ -160,12 +167,6 @@ public void onSuccess(AuthResult result) {
160167
}
161168
}
162169
})
163-
.addOnFailureListener(new OnFailureListener() {
164-
@Override
165-
public void onFailure(@NonNull Exception e) {
166-
finishWithError(e);
167-
}
168-
})
169170
.addOnFailureListener(
170171
new TaskFailureLogger(TAG, "Error signing in with new credential " +
171172
idpResponse.getProviderType()));

auth/src/main/java/com/firebase/ui/auth/ui/phone/PhoneActivity.java

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import com.firebase.ui.auth.util.AnonymousUpgradeUtils;
3838
import com.firebase.ui.auth.util.ExtraConstants;
3939
import com.firebase.ui.auth.util.FirebaseAuthError;
40+
import com.firebase.ui.auth.util.UpgradeFailureListener;
4041
import com.google.android.gms.tasks.OnFailureListener;
4142
import com.google.android.gms.tasks.OnSuccessListener;
4243
import com.google.firebase.FirebaseException;
@@ -319,36 +320,11 @@ private void showAlertDialog(@StringRes int messageId,
319320

320321
private void signIn(@NonNull final PhoneAuthCredential credential) {
321322
AnonymousUpgradeUtils
322-
.signInOrLink(getFlowParams(), getFirebaseAuth(), credential)
323-
.addOnSuccessListener(this, new OnSuccessListener<AuthResult>() {
323+
.signInOrLink(this, credential)
324+
.addOnFailureListener(this, new UpgradeFailureListener(this, credential) {
324325
@Override
325-
public void onSuccess(final AuthResult authResult) {
326-
mVerificationState = VerificationState.VERIFIED;
327-
completeLoadingDialog(getString(R.string.fui_verified));
328-
329-
// Activity can be recreated before this message is handled
330-
mHandler.postDelayed(new Runnable() {
331-
@Override
332-
public void run() {
333-
if (!mIsDestroyed) {
334-
dismissLoadingDialog();
335-
finish(authResult.getUser());
336-
}
337-
}
338-
}, SHORT_DELAY_MILLIS);
339-
}
340-
})
341-
.addOnFailureListener(this, new OnFailureListener() {
342-
@Override
343-
public void onFailure(@NonNull Exception e) {
344-
dismissLoadingDialog();
345-
346-
if (AnonymousUpgradeUtils.isUpgradeFailure(getFlowParams(), getFirebaseAuth(), e)) {
347-
// Anonymous upgrade failed
348-
// TODO: Do we need to create a new PhoneAuthCredential after failure?
349-
IdpResponse response = new IdpResponse.Builder(credential).build();
350-
finish(RESULT_CANCELED, response.toIntent());
351-
} else if (e instanceof FirebaseAuthInvalidCredentialsException) {
326+
public void onNonUpgradeFailure(@NonNull Exception e) {
327+
if (e instanceof FirebaseAuthInvalidCredentialsException) {
352328
// Invalid phone verification code
353329
FirebaseAuthError error = FirebaseAuthError.fromException(
354330
(FirebaseAuthInvalidCredentialsException) e);
@@ -384,6 +360,31 @@ public void onClick(DialogInterface dialog, int which) {
384360
showAlertDialog(R.string.fui_error_unknown, null);
385361
}
386362
}
363+
})
364+
.addOnSuccessListener(this, new OnSuccessListener<AuthResult>() {
365+
@Override
366+
public void onSuccess(final AuthResult authResult) {
367+
mVerificationState = VerificationState.VERIFIED;
368+
completeLoadingDialog(getString(R.string.fui_verified));
369+
370+
// Activity can be recreated before this message is handled
371+
mHandler.postDelayed(new Runnable() {
372+
@Override
373+
public void run() {
374+
if (!mIsDestroyed) {
375+
dismissLoadingDialog();
376+
finish(authResult.getUser());
377+
}
378+
}
379+
}, SHORT_DELAY_MILLIS);
380+
}
381+
})
382+
.addOnFailureListener(this, new OnFailureListener() {
383+
@Override
384+
public void onFailure(@NonNull Exception e) {
385+
// Dismiss loading dialog for any failure
386+
dismissLoadingDialog();
387+
}
387388
});
388389
}
389390

auth/src/main/java/com/firebase/ui/auth/util/AnonymousUpgradeUtils.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.firebase.ui.auth.util;
22

3+
import android.app.Activity;
34
import android.support.annotation.NonNull;
45
import android.support.annotation.RestrictTo;
56

67
import com.firebase.ui.auth.data.model.FlowParameters;
8+
import com.firebase.ui.auth.ui.HelperActivityBase;
79
import com.google.android.gms.tasks.Task;
810
import com.google.firebase.auth.AuthCredential;
911
import com.google.firebase.auth.AuthResult;
@@ -17,6 +19,23 @@
1719
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
1820
public class AnonymousUpgradeUtils {
1921

22+
/**
23+
* Uses type system to enforce the proper failure listener.
24+
*/
25+
public static class UpgradeTaskWrapper<T> {
26+
27+
private final Task<T> mWrapped;
28+
29+
public UpgradeTaskWrapper(Task<T> wrapped) {
30+
mWrapped = wrapped;
31+
}
32+
33+
public Task<T> addOnFailureListener(Activity activity, UpgradeFailureListener listener) {
34+
return mWrapped.addOnFailureListener(activity, listener);
35+
}
36+
37+
}
38+
2039
@NonNull
2140
public static Task<AuthResult> signUpOrLink(FlowParameters flowParameters,
2241
FirebaseAuth auth,
@@ -31,7 +50,14 @@ public static Task<AuthResult> signUpOrLink(FlowParameters flowParameters,
3150
}
3251

3352
@NonNull
34-
public static Task<AuthResult> signInOrLink(FlowParameters flowParameters,
53+
public static UpgradeTaskWrapper<AuthResult> signInOrLink(HelperActivityBase activity,
54+
AuthCredential credential) {
55+
return new UpgradeTaskWrapper<>(
56+
signInOrLink(activity.getFlowParams(), activity.getFirebaseAuth(), credential));
57+
}
58+
59+
@NonNull
60+
private static Task<AuthResult> signInOrLink(FlowParameters flowParameters,
3561
FirebaseAuth auth,
3662
AuthCredential credential) {
3763
if (canUpgradeAnonymous(flowParameters, auth)) {
@@ -53,5 +79,4 @@ private static boolean canUpgradeAnonymous(FlowParameters parameters, FirebaseAu
5379
&& auth.getCurrentUser() != null
5480
&& auth.getCurrentUser().isAnonymous();
5581
}
56-
5782
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.firebase.ui.auth.util;
2+
3+
import android.app.Activity;
4+
import android.support.annotation.NonNull;
5+
6+
import com.firebase.ui.auth.IdpResponse;
7+
import com.firebase.ui.auth.data.model.FlowParameters;
8+
import com.firebase.ui.auth.ui.HelperActivityBase;
9+
import com.google.android.gms.tasks.OnFailureListener;
10+
import com.google.firebase.auth.AuthCredential;
11+
import com.google.firebase.auth.FirebaseAuth;
12+
13+
import java.lang.ref.WeakReference;
14+
15+
/**
16+
* Failure listener for use with AnonymousUpgradeUtils.
17+
*/
18+
public abstract class UpgradeFailureListener implements OnFailureListener {
19+
20+
private final WeakReference<HelperActivityBase> mActivity;
21+
private final FlowParameters mParameters;
22+
private final FirebaseAuth mAuth;
23+
private final AuthCredential mCredential;
24+
25+
public UpgradeFailureListener(HelperActivityBase activity,
26+
AuthCredential credential) {
27+
mActivity = new WeakReference<>(activity);
28+
29+
mParameters = activity.getFlowParams();
30+
mAuth = activity.getFirebaseAuth();
31+
mCredential = credential;
32+
}
33+
34+
@Override
35+
public void onFailure(@NonNull Exception e) {
36+
if (AnonymousUpgradeUtils.isUpgradeFailure(mParameters, mAuth, e)) {
37+
IdpResponse response = new IdpResponse.Builder(mCredential).build();
38+
if (mActivity.get() != null) {
39+
mActivity.get().finish(Activity.RESULT_CANCELED, response.toIntent());
40+
}
41+
} else {
42+
onNonUpgradeFailure(e);
43+
}
44+
}
45+
46+
public abstract void onNonUpgradeFailure(@NonNull Exception e);
47+
}

auth/src/main/java/com/firebase/ui/auth/util/signincontainer/IdpSignInContainer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ public void onSaveInstanceState(Bundle outState) {
129129
@Override
130130
public void onSuccess(@NonNull final IdpResponse response) {
131131
AuthCredential credential = ProviderUtils.getAuthCredential(response);
132+
// TODO: Probably need to allow linking here
132133
getAuthHelper().getFirebaseAuth()
133134
.signInWithCredential(credential)
134135
.addOnSuccessListener(new OnSuccessListener<AuthResult>() {

0 commit comments

Comments
 (0)