Skip to content

Commit 3ee1155

Browse files
authored
Fix rotation bugs (#1208)
2 parents 2f8112f + 028831e commit 3ee1155

File tree

10 files changed

+62
-67
lines changed

10 files changed

+62
-67
lines changed

auth/src/main/java/com/firebase/ui/auth/data/model/Resource.java

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,14 @@
1212
*/
1313
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
1414
public final class Resource<T> {
15-
private State mState;
16-
private final boolean mUsable;
17-
15+
private final State mState;
1816
private final T mValue;
1917
private final Exception mException;
2018

21-
private Resource(State state, boolean usable, T value, Exception exception) {
19+
private boolean mIsUsed;
20+
21+
private Resource(State state, T value, Exception exception) {
2222
mState = state;
23-
mUsable = usable;
2423
mValue = value;
2524
mException = exception;
2625
}
@@ -30,47 +29,31 @@ private Resource(State state, boolean usable, T value, Exception exception) {
3029
*/
3130
@NonNull
3231
public static Resource<Void> forVoidSuccess() {
33-
return new Resource<>(State.SUCCESS, false, null, null);
32+
return new Resource<>(State.SUCCESS, null, null);
3433
}
3534

3635
/**
3736
* Creates a successful resource containing a value.
3837
*/
3938
@NonNull
4039
public static <T> Resource<T> forSuccess(@NonNull T value) {
41-
return new Resource<>(State.SUCCESS, false, value, null);
42-
}
43-
44-
/**
45-
* Similar to {@link #forSuccess(Object)}, but this resource can be used up.
46-
*/
47-
@NonNull
48-
public static <T> Resource<T> forUsableSuccess(@NonNull T value) {
49-
return new Resource<>(State.SUCCESS, true, value, null);
40+
return new Resource<>(State.SUCCESS, value, null);
5041
}
5142

5243
/**
5344
* Creates a failed resource with an exception.
5445
*/
5546
@NonNull
5647
public static <T> Resource<T> forFailure(@NonNull Exception e) {
57-
return new Resource<>(State.FAILURE, false, null, e);
58-
}
59-
60-
/**
61-
* Similar to {@link #forFailure(Exception)}, but this resource can be used up.
62-
*/
63-
@NonNull
64-
public static <T> Resource<T> forUsableFailure(@NonNull Exception e) {
65-
return new Resource<>(State.FAILURE, true, null, e);
48+
return new Resource<>(State.FAILURE, null, e);
6649
}
6750

6851
/**
6952
* Creates a resource in the loading state, without a value or an exception.
7053
*/
7154
@NonNull
7255
public static <T> Resource<T> forLoading() {
73-
return new Resource<>(State.LOADING, false, null, null);
56+
return new Resource<>(State.LOADING, null, null);
7457
}
7558

7659
@NonNull
@@ -80,16 +63,20 @@ public State getState() {
8063

8164
@Nullable
8265
public final Exception getException() {
83-
if (mUsable) { mState = State.USED; }
66+
mIsUsed = true;
8467
return mException;
8568
}
8669

8770
@Nullable
8871
public T getValue() {
89-
if (mUsable) { mState = State.USED; }
72+
mIsUsed = true;
9073
return mValue;
9174
}
9275

76+
public boolean isUsed() {
77+
return mIsUsed;
78+
}
79+
9380
@Override
9481
public boolean equals(Object o) {
9582
if (this == o) return true;

auth/src/main/java/com/firebase/ui/auth/data/model/State.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@
44

55
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
66
public enum State {
7-
SUCCESS, FAILURE, LOADING, USED
7+
SUCCESS, FAILURE, LOADING
88
}

auth/src/main/java/com/firebase/ui/auth/data/remote/GoogleSignInHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public void startSignIn(@NonNull HelperActivityBase activity) {
6161
}
6262

6363
private void start() {
64-
setResult(Resource.<IdpResponse>forUsableFailure(new IntentRequiredException(
64+
setResult(Resource.<IdpResponse>forFailure(new IntentRequiredException(
6565
GoogleSignIn.getClient(getApplication(), getSignInOptions()).getSignInIntent(),
6666
RequestCodes.GOOGLE_PROVIDER)));
6767
}

auth/src/main/java/com/firebase/ui/auth/data/remote/SignInKickstarter.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public void onComplete(@NonNull Task<CredentialRequestResponse> task) {
7474
task.getResult(ApiException.class).getCredential());
7575
} catch (ResolvableApiException e) {
7676
if (e.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIRED) {
77-
setResult(Resource.<IdpResponse>forUsableFailure(
77+
setResult(Resource.<IdpResponse>forFailure(
7878
new PendingIntentRequiredException(
7979
e.getResolution(), RequestCodes.CRED_HINT)));
8080
} else {
@@ -99,12 +99,12 @@ private void startAuthMethodChoice() {
9999
String firstProvider = firstIdpConfig.getProviderId();
100100
switch (firstProvider) {
101101
case EmailAuthProvider.PROVIDER_ID:
102-
setResult(Resource.<IdpResponse>forUsableFailure(new IntentRequiredException(
102+
setResult(Resource.<IdpResponse>forFailure(new IntentRequiredException(
103103
EmailActivity.createIntent(getApplication(), getArguments()),
104104
RequestCodes.EMAIL_FLOW)));
105105
break;
106106
case PhoneAuthProvider.PROVIDER_ID:
107-
setResult(Resource.<IdpResponse>forUsableFailure(new IntentRequiredException(
107+
setResult(Resource.<IdpResponse>forFailure(new IntentRequiredException(
108108
PhoneActivity.createIntent(
109109
getApplication(), getArguments(), firstIdpConfig.getParams()),
110110
RequestCodes.PHONE_FLOW)));
@@ -114,7 +114,7 @@ private void startAuthMethodChoice() {
114114
break;
115115
}
116116
} else {
117-
setResult(Resource.<IdpResponse>forUsableFailure(new IntentRequiredException(
117+
setResult(Resource.<IdpResponse>forFailure(new IntentRequiredException(
118118
AuthMethodPickerActivity.createIntent(getApplication(), getArguments()),
119119
RequestCodes.AUTH_PICKER_FLOW)));
120120
}
@@ -123,14 +123,14 @@ private void startAuthMethodChoice() {
123123
private void redirectSignIn(String provider, String email) {
124124
switch (provider) {
125125
case EmailAuthProvider.PROVIDER_ID:
126-
setResult(Resource.<IdpResponse>forUsableFailure(new IntentRequiredException(
126+
setResult(Resource.<IdpResponse>forFailure(new IntentRequiredException(
127127
EmailActivity.createIntent(getApplication(), getArguments(), email),
128128
RequestCodes.EMAIL_FLOW)));
129129
break;
130130
case GoogleAuthProvider.PROVIDER_ID:
131131
case FacebookAuthProvider.PROVIDER_ID:
132132
case TwitterAuthProvider.PROVIDER_ID:
133-
setResult(Resource.<IdpResponse>forUsableFailure(new IntentRequiredException(
133+
setResult(Resource.<IdpResponse>forFailure(new IntentRequiredException(
134134
SingleSignInActivity.createIntent(
135135
getApplication(),
136136
getArguments(),

auth/src/main/java/com/firebase/ui/auth/ui/credentials/CredentialSaveActivity.java

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.firebase.ui.auth.ui.credentials;
22

3-
import android.arch.lifecycle.Observer;
43
import android.arch.lifecycle.ViewModelProviders;
54
import android.content.Context;
65
import android.content.Intent;
@@ -10,11 +9,12 @@
109
import android.util.Log;
1110

1211
import com.firebase.ui.auth.IdpResponse;
12+
import com.firebase.ui.auth.R;
1313
import com.firebase.ui.auth.data.model.FlowParameters;
1414
import com.firebase.ui.auth.data.model.Resource;
1515
import com.firebase.ui.auth.ui.HelperActivityBase;
1616
import com.firebase.ui.auth.util.ExtraConstants;
17-
import com.firebase.ui.auth.util.ui.FlowUtils;
17+
import com.firebase.ui.auth.viewmodel.VoidResourceObserver;
1818
import com.firebase.ui.auth.viewmodel.smartlock.SmartLockHandler;
1919
import com.google.android.gms.auth.api.credentials.Credential;
2020

@@ -47,15 +47,18 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
4747
Credential credential = getIntent().getParcelableExtra(ExtraConstants.CREDENTIAL);
4848
mIdpResponse = getIntent().getParcelableExtra(ExtraConstants.IDP_RESPONSE);
4949

50-
mHandler.getOperation().observe(this, new Observer<Resource<Void>>() {
50+
mHandler.getOperation().observe(this, new VoidResourceObserver(
51+
this, R.string.fui_progress_dialog_loading) {
5152
@Override
52-
public void onChanged(@Nullable Resource<Void> resource) {
53-
if (resource == null) {
54-
Log.w(TAG, "getSaveOperation:onChanged:null");
55-
return;
56-
}
53+
protected void onSuccess() {
54+
finish(RESULT_OK, mIdpResponse.toIntent());
55+
}
5756

58-
onSaveOperation(resource);
57+
@Override
58+
protected void onFailure(@NonNull Exception e) {
59+
// RESULT_OK since we don't want to halt sign-in just because of a credential save
60+
// error.
61+
finish(RESULT_OK, mIdpResponse.toIntent());
5962
}
6063
});
6164

@@ -74,18 +77,4 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
7477
super.onActivityResult(requestCode, resultCode, data);
7578
mHandler.onActivityResult(requestCode, resultCode);
7679
}
77-
78-
private void onSaveOperation(@NonNull Resource<Void> resource) {
79-
switch (resource.getState()) {
80-
case LOADING:
81-
// No-op?
82-
break;
83-
case SUCCESS:
84-
case FAILURE:
85-
if (FlowUtils.unhandled(this, resource.getException())) {
86-
finish(RESULT_OK, mIdpResponse.toIntent());
87-
}
88-
break;
89-
}
90-
}
9180
}

auth/src/main/java/com/firebase/ui/auth/viewmodel/ResourceObserver.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ public final void onChanged(Resource<T> resource) {
2828
}
2929
mActivity.getDialogHolder().dismissDialog();
3030

31+
if (resource.isUsed()) { return; }
32+
3133
if (resource.getState() == State.SUCCESS) {
3234
onSuccess(resource.getValue());
3335
} else if (resource.getState() == State.FAILURE) {
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.firebase.ui.auth.viewmodel;
2+
3+
import android.support.annotation.NonNull;
4+
import android.support.annotation.RestrictTo;
5+
import android.support.annotation.StringRes;
6+
7+
import com.firebase.ui.auth.ui.HelperActivityBase;
8+
9+
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
10+
public abstract class VoidResourceObserver extends ResourceObserver<Void> {
11+
protected VoidResourceObserver(@NonNull HelperActivityBase activity, @StringRes int message) {
12+
super(activity, message);
13+
}
14+
15+
@Override
16+
protected final void onSuccess(@NonNull Void aVoid) {
17+
onSuccess();
18+
}
19+
20+
protected abstract void onSuccess();
21+
}

auth/src/main/java/com/firebase/ui/auth/viewmodel/idp/SocialProviderResponseHandler.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,10 @@ public void onFailure(@NonNull Exception e) {
6767
setResult(Resource.<IdpResponse>forFailure(e));
6868
}
6969
});
70+
return;
7071
}
71-
} else {
72-
setResult(Resource.<IdpResponse>forFailure(e));
7372
}
73+
setResult(Resource.<IdpResponse>forFailure(e));
7474
}
7575
});
7676
}
@@ -109,7 +109,7 @@ public void onSuccess(String provider) {
109109

110110
if (provider.equals(EmailAuthProvider.PROVIDER_ID)) {
111111
// Start email welcome back flow
112-
setResult(Resource.<IdpResponse>forUsableFailure(new IntentRequiredException(
112+
setResult(Resource.<IdpResponse>forFailure(new IntentRequiredException(
113113
WelcomeBackPasswordPrompt.createIntent(
114114
getApplication(),
115115
getArguments(),
@@ -118,7 +118,7 @@ public void onSuccess(String provider) {
118118
)));
119119
} else {
120120
// Start Idp welcome back flow
121-
setResult(Resource.<IdpResponse>forUsableFailure(new IntentRequiredException(
121+
setResult(Resource.<IdpResponse>forFailure(new IntentRequiredException(
122122
WelcomeBackIdpPrompt.createIntent(
123123
getApplication(),
124124
getArguments(),

auth/src/main/java/com/firebase/ui/auth/viewmodel/smartlock/SmartLockHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public void onComplete(@NonNull Task<Void> task) {
7676
setResult(Resource.forVoidSuccess());
7777
} else if (task.getException() instanceof ResolvableApiException) {
7878
ResolvableApiException rae = (ResolvableApiException) task.getException();
79-
setResult(Resource.<Void>forUsableFailure(
79+
setResult(Resource.<Void>forFailure(
8080
new PendingIntentRequiredException(
8181
rae.getResolution(), RequestCodes.CRED_SAVE)));
8282
} else {

auth/src/test/java/com/firebase/ui/auth/testhelpers/ResourceMatchers.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,6 @@ public static <T> ArgumentMatcher<Resource<T>> isFailure() {
2222
return isState(State.FAILURE);
2323
}
2424

25-
public static <T> ArgumentMatcher<Resource<T>> isUsed() {
26-
return isState(State.USED);
27-
}
28-
2925
public static <T> ArgumentMatcher<Resource<T>> isSuccessWith(final T result) {
3026
return new ArgumentMatcher<Resource<T>>() {
3127
@Override

0 commit comments

Comments
 (0)