diff --git a/auth/src/main/java/com/firebase/ui/auth/data/model/Resource.java b/auth/src/main/java/com/firebase/ui/auth/data/model/Resource.java index 13012555d..b5f0b3ef5 100644 --- a/auth/src/main/java/com/firebase/ui/auth/data/model/Resource.java +++ b/auth/src/main/java/com/firebase/ui/auth/data/model/Resource.java @@ -12,15 +12,14 @@ */ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) public final class Resource { - private State mState; - private final boolean mUsable; - + private final State mState; private final T mValue; private final Exception mException; - private Resource(State state, boolean usable, T value, Exception exception) { + private boolean mIsUsed; + + private Resource(State state, T value, Exception exception) { mState = state; - mUsable = usable; mValue = value; mException = exception; } @@ -30,7 +29,7 @@ private Resource(State state, boolean usable, T value, Exception exception) { */ @NonNull public static Resource forVoidSuccess() { - return new Resource<>(State.SUCCESS, false, null, null); + return new Resource<>(State.SUCCESS, null, null); } /** @@ -38,15 +37,7 @@ public static Resource forVoidSuccess() { */ @NonNull public static Resource forSuccess(@NonNull T value) { - return new Resource<>(State.SUCCESS, false, value, null); - } - - /** - * Similar to {@link #forSuccess(Object)}, but this resource can be used up. - */ - @NonNull - public static Resource forUsableSuccess(@NonNull T value) { - return new Resource<>(State.SUCCESS, true, value, null); + return new Resource<>(State.SUCCESS, value, null); } /** @@ -54,15 +45,7 @@ public static Resource forUsableSuccess(@NonNull T value) { */ @NonNull public static Resource forFailure(@NonNull Exception e) { - return new Resource<>(State.FAILURE, false, null, e); - } - - /** - * Similar to {@link #forFailure(Exception)}, but this resource can be used up. - */ - @NonNull - public static Resource forUsableFailure(@NonNull Exception e) { - return new Resource<>(State.FAILURE, true, null, e); + return new Resource<>(State.FAILURE, null, e); } /** @@ -70,7 +53,7 @@ public static Resource forUsableFailure(@NonNull Exception e) { */ @NonNull public static Resource forLoading() { - return new Resource<>(State.LOADING, false, null, null); + return new Resource<>(State.LOADING, null, null); } @NonNull @@ -80,16 +63,20 @@ public State getState() { @Nullable public final Exception getException() { - if (mUsable) { mState = State.USED; } + mIsUsed = true; return mException; } @Nullable public T getValue() { - if (mUsable) { mState = State.USED; } + mIsUsed = true; return mValue; } + public boolean isUsed() { + return mIsUsed; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/auth/src/main/java/com/firebase/ui/auth/data/model/State.java b/auth/src/main/java/com/firebase/ui/auth/data/model/State.java index 5ed4acb09..35cc5ad5c 100644 --- a/auth/src/main/java/com/firebase/ui/auth/data/model/State.java +++ b/auth/src/main/java/com/firebase/ui/auth/data/model/State.java @@ -4,5 +4,5 @@ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) public enum State { - SUCCESS, FAILURE, LOADING, USED + SUCCESS, FAILURE, LOADING } diff --git a/auth/src/main/java/com/firebase/ui/auth/data/remote/GoogleSignInHandler.java b/auth/src/main/java/com/firebase/ui/auth/data/remote/GoogleSignInHandler.java index 59544cd6b..8b11a39c3 100644 --- a/auth/src/main/java/com/firebase/ui/auth/data/remote/GoogleSignInHandler.java +++ b/auth/src/main/java/com/firebase/ui/auth/data/remote/GoogleSignInHandler.java @@ -61,7 +61,7 @@ public void startSignIn(@NonNull HelperActivityBase activity) { } private void start() { - setResult(Resource.forUsableFailure(new IntentRequiredException( + setResult(Resource.forFailure(new IntentRequiredException( GoogleSignIn.getClient(getApplication(), getSignInOptions()).getSignInIntent(), RequestCodes.GOOGLE_PROVIDER))); } diff --git a/auth/src/main/java/com/firebase/ui/auth/data/remote/SignInKickstarter.java b/auth/src/main/java/com/firebase/ui/auth/data/remote/SignInKickstarter.java index e35eece61..31191a155 100644 --- a/auth/src/main/java/com/firebase/ui/auth/data/remote/SignInKickstarter.java +++ b/auth/src/main/java/com/firebase/ui/auth/data/remote/SignInKickstarter.java @@ -74,7 +74,7 @@ public void onComplete(@NonNull Task task) { task.getResult(ApiException.class).getCredential()); } catch (ResolvableApiException e) { if (e.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIRED) { - setResult(Resource.forUsableFailure( + setResult(Resource.forFailure( new PendingIntentRequiredException( e.getResolution(), RequestCodes.CRED_HINT))); } else { @@ -99,12 +99,12 @@ private void startAuthMethodChoice() { String firstProvider = firstIdpConfig.getProviderId(); switch (firstProvider) { case EmailAuthProvider.PROVIDER_ID: - setResult(Resource.forUsableFailure(new IntentRequiredException( + setResult(Resource.forFailure(new IntentRequiredException( EmailActivity.createIntent(getApplication(), getArguments()), RequestCodes.EMAIL_FLOW))); break; case PhoneAuthProvider.PROVIDER_ID: - setResult(Resource.forUsableFailure(new IntentRequiredException( + setResult(Resource.forFailure(new IntentRequiredException( PhoneActivity.createIntent( getApplication(), getArguments(), firstIdpConfig.getParams()), RequestCodes.PHONE_FLOW))); @@ -114,7 +114,7 @@ private void startAuthMethodChoice() { break; } } else { - setResult(Resource.forUsableFailure(new IntentRequiredException( + setResult(Resource.forFailure(new IntentRequiredException( AuthMethodPickerActivity.createIntent(getApplication(), getArguments()), RequestCodes.AUTH_PICKER_FLOW))); } @@ -123,14 +123,14 @@ private void startAuthMethodChoice() { private void redirectSignIn(String provider, String email) { switch (provider) { case EmailAuthProvider.PROVIDER_ID: - setResult(Resource.forUsableFailure(new IntentRequiredException( + setResult(Resource.forFailure(new IntentRequiredException( EmailActivity.createIntent(getApplication(), getArguments(), email), RequestCodes.EMAIL_FLOW))); break; case GoogleAuthProvider.PROVIDER_ID: case FacebookAuthProvider.PROVIDER_ID: case TwitterAuthProvider.PROVIDER_ID: - setResult(Resource.forUsableFailure(new IntentRequiredException( + setResult(Resource.forFailure(new IntentRequiredException( SingleSignInActivity.createIntent( getApplication(), getArguments(), diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/credentials/CredentialSaveActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/credentials/CredentialSaveActivity.java index c1c395e03..cc5094748 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/credentials/CredentialSaveActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/credentials/CredentialSaveActivity.java @@ -1,6 +1,5 @@ package com.firebase.ui.auth.ui.credentials; -import android.arch.lifecycle.Observer; import android.arch.lifecycle.ViewModelProviders; import android.content.Context; import android.content.Intent; @@ -10,11 +9,12 @@ import android.util.Log; import com.firebase.ui.auth.IdpResponse; +import com.firebase.ui.auth.R; import com.firebase.ui.auth.data.model.FlowParameters; import com.firebase.ui.auth.data.model.Resource; import com.firebase.ui.auth.ui.HelperActivityBase; import com.firebase.ui.auth.util.ExtraConstants; -import com.firebase.ui.auth.util.ui.FlowUtils; +import com.firebase.ui.auth.viewmodel.VoidResourceObserver; import com.firebase.ui.auth.viewmodel.smartlock.SmartLockHandler; import com.google.android.gms.auth.api.credentials.Credential; @@ -47,15 +47,18 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { Credential credential = getIntent().getParcelableExtra(ExtraConstants.CREDENTIAL); mIdpResponse = getIntent().getParcelableExtra(ExtraConstants.IDP_RESPONSE); - mHandler.getOperation().observe(this, new Observer>() { + mHandler.getOperation().observe(this, new VoidResourceObserver( + this, R.string.fui_progress_dialog_loading) { @Override - public void onChanged(@Nullable Resource resource) { - if (resource == null) { - Log.w(TAG, "getSaveOperation:onChanged:null"); - return; - } + protected void onSuccess() { + finish(RESULT_OK, mIdpResponse.toIntent()); + } - onSaveOperation(resource); + @Override + protected void onFailure(@NonNull Exception e) { + // RESULT_OK since we don't want to halt sign-in just because of a credential save + // error. + finish(RESULT_OK, mIdpResponse.toIntent()); } }); @@ -74,18 +77,4 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); mHandler.onActivityResult(requestCode, resultCode); } - - private void onSaveOperation(@NonNull Resource resource) { - switch (resource.getState()) { - case LOADING: - // No-op? - break; - case SUCCESS: - case FAILURE: - if (FlowUtils.unhandled(this, resource.getException())) { - finish(RESULT_OK, mIdpResponse.toIntent()); - } - break; - } - } } diff --git a/auth/src/main/java/com/firebase/ui/auth/viewmodel/ResourceObserver.java b/auth/src/main/java/com/firebase/ui/auth/viewmodel/ResourceObserver.java index 1a33d958a..699c20db4 100644 --- a/auth/src/main/java/com/firebase/ui/auth/viewmodel/ResourceObserver.java +++ b/auth/src/main/java/com/firebase/ui/auth/viewmodel/ResourceObserver.java @@ -28,6 +28,8 @@ public final void onChanged(Resource resource) { } mActivity.getDialogHolder().dismissDialog(); + if (resource.isUsed()) { return; } + if (resource.getState() == State.SUCCESS) { onSuccess(resource.getValue()); } else if (resource.getState() == State.FAILURE) { diff --git a/auth/src/main/java/com/firebase/ui/auth/viewmodel/VoidResourceObserver.java b/auth/src/main/java/com/firebase/ui/auth/viewmodel/VoidResourceObserver.java new file mode 100644 index 000000000..3289fb244 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/viewmodel/VoidResourceObserver.java @@ -0,0 +1,21 @@ +package com.firebase.ui.auth.viewmodel; + +import android.support.annotation.NonNull; +import android.support.annotation.RestrictTo; +import android.support.annotation.StringRes; + +import com.firebase.ui.auth.ui.HelperActivityBase; + +@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) +public abstract class VoidResourceObserver extends ResourceObserver { + protected VoidResourceObserver(@NonNull HelperActivityBase activity, @StringRes int message) { + super(activity, message); + } + + @Override + protected final void onSuccess(@NonNull Void aVoid) { + onSuccess(); + } + + protected abstract void onSuccess(); +} diff --git a/auth/src/main/java/com/firebase/ui/auth/viewmodel/idp/SocialProviderResponseHandler.java b/auth/src/main/java/com/firebase/ui/auth/viewmodel/idp/SocialProviderResponseHandler.java index 7255ff0b9..0560baf76 100644 --- a/auth/src/main/java/com/firebase/ui/auth/viewmodel/idp/SocialProviderResponseHandler.java +++ b/auth/src/main/java/com/firebase/ui/auth/viewmodel/idp/SocialProviderResponseHandler.java @@ -67,10 +67,10 @@ public void onFailure(@NonNull Exception e) { setResult(Resource.forFailure(e)); } }); + return; } - } else { - setResult(Resource.forFailure(e)); } + setResult(Resource.forFailure(e)); } }); } @@ -109,7 +109,7 @@ public void onSuccess(String provider) { if (provider.equals(EmailAuthProvider.PROVIDER_ID)) { // Start email welcome back flow - setResult(Resource.forUsableFailure(new IntentRequiredException( + setResult(Resource.forFailure(new IntentRequiredException( WelcomeBackPasswordPrompt.createIntent( getApplication(), getArguments(), @@ -118,7 +118,7 @@ public void onSuccess(String provider) { ))); } else { // Start Idp welcome back flow - setResult(Resource.forUsableFailure(new IntentRequiredException( + setResult(Resource.forFailure(new IntentRequiredException( WelcomeBackIdpPrompt.createIntent( getApplication(), getArguments(), diff --git a/auth/src/main/java/com/firebase/ui/auth/viewmodel/smartlock/SmartLockHandler.java b/auth/src/main/java/com/firebase/ui/auth/viewmodel/smartlock/SmartLockHandler.java index bd6efe504..5f745670b 100644 --- a/auth/src/main/java/com/firebase/ui/auth/viewmodel/smartlock/SmartLockHandler.java +++ b/auth/src/main/java/com/firebase/ui/auth/viewmodel/smartlock/SmartLockHandler.java @@ -76,7 +76,7 @@ public void onComplete(@NonNull Task task) { setResult(Resource.forVoidSuccess()); } else if (task.getException() instanceof ResolvableApiException) { ResolvableApiException rae = (ResolvableApiException) task.getException(); - setResult(Resource.forUsableFailure( + setResult(Resource.forFailure( new PendingIntentRequiredException( rae.getResolution(), RequestCodes.CRED_SAVE))); } else { diff --git a/auth/src/test/java/com/firebase/ui/auth/testhelpers/ResourceMatchers.java b/auth/src/test/java/com/firebase/ui/auth/testhelpers/ResourceMatchers.java index 60f5399c6..c51216d2f 100644 --- a/auth/src/test/java/com/firebase/ui/auth/testhelpers/ResourceMatchers.java +++ b/auth/src/test/java/com/firebase/ui/auth/testhelpers/ResourceMatchers.java @@ -22,10 +22,6 @@ public static ArgumentMatcher> isFailure() { return isState(State.FAILURE); } - public static ArgumentMatcher> isUsed() { - return isState(State.USED); - } - public static ArgumentMatcher> isSuccessWith(final T result) { return new ArgumentMatcher>() { @Override