Skip to content

Commit 1dacb40

Browse files
SUPERCILEXsamtstern
authored andcommitted
Fix credential saving bugs and crashes (#1111)
1 parent 8b85994 commit 1dacb40

File tree

13 files changed

+44
-107
lines changed

13 files changed

+44
-107
lines changed

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

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -84,19 +84,15 @@ public void finish(int resultCode, Intent intent) {
8484
finish();
8585
}
8686

87-
public void saveCredentialsOrFinish(
88-
@Nullable SaveSmartLock saveSmartLock,
89-
FirebaseUser firebaseUser,
90-
IdpResponse response) {
91-
saveCredentialsOrFinish(saveSmartLock, firebaseUser, null, response);
87+
public void saveCredentialsOrFinish(FirebaseUser firebaseUser, IdpResponse response) {
88+
saveCredentialsOrFinish(firebaseUser, null, response);
9289
}
9390

9491
public void saveCredentialsOrFinish(
95-
@Nullable SaveSmartLock saveSmartLock,
9692
FirebaseUser firebaseUser,
9793
@Nullable String password,
9894
IdpResponse response) {
99-
95+
SaveSmartLock saveSmartLock = SaveSmartLock.getInstance(this);
10096
if (saveSmartLock == null) {
10197
finish(Activity.RESULT_OK, response.toIntent());
10298
} else {

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,12 @@
2222
import com.firebase.ui.auth.data.model.User;
2323
import com.firebase.ui.auth.ui.FragmentBase;
2424
import com.firebase.ui.auth.util.ExtraConstants;
25+
import com.firebase.ui.auth.util.GoogleApiUtils;
2526
import com.firebase.ui.auth.util.data.ProviderUtils;
2627
import com.firebase.ui.auth.util.ui.ImeHelper;
2728
import com.firebase.ui.auth.util.ui.fieldvalidators.EmailFieldValidator;
2829
import com.google.android.gms.auth.api.credentials.Credential;
2930
import com.google.android.gms.auth.api.credentials.CredentialPickerConfig;
30-
import com.google.android.gms.auth.api.credentials.Credentials;
31-
import com.google.android.gms.auth.api.credentials.CredentialsClient;
3231
import com.google.android.gms.auth.api.credentials.HintRequest;
3332
import com.google.android.gms.tasks.OnCompleteListener;
3433
import com.google.android.gms.tasks.OnSuccessListener;
@@ -232,16 +231,14 @@ private void showEmailAutoCompleteHint() {
232231
}
233232

234233
private PendingIntent getEmailHintIntent() {
235-
CredentialsClient client = Credentials.getClient(getContext());
236-
237234
HintRequest hintRequest = new HintRequest.Builder()
238235
.setHintPickerConfig(new CredentialPickerConfig.Builder()
239236
.setShowCancelButton(true)
240237
.build())
241238
.setEmailAddressIdentifierSupported(true)
242239
.build();
243240

244-
return client.getHintPickerIntent(hintRequest);
241+
return GoogleApiUtils.getCredentialsClient(getContext()).getHintPickerIntent(hintRequest);
245242
}
246243

247244
@Override

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

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import com.firebase.ui.auth.ui.idp.WelcomeBackIdpPrompt;
2727
import com.firebase.ui.auth.util.ExtraConstants;
2828
import com.firebase.ui.auth.util.data.ProviderUtils;
29-
import com.firebase.ui.auth.util.signincontainer.SaveSmartLock;
3029
import com.firebase.ui.auth.util.ui.ImeHelper;
3130
import com.firebase.ui.auth.util.ui.PreambleHandler;
3231
import com.firebase.ui.auth.util.ui.fieldvalidators.BaseValidator;
@@ -67,7 +66,6 @@ public class RegisterEmailFragment extends FragmentBase implements
6766
private EmailFieldValidator mEmailFieldValidator;
6867
private PasswordFieldValidator mPasswordFieldValidator;
6968
private BaseValidator mNameValidator;
70-
private SaveSmartLock mSaveSmartLock;
7169

7270
private User mUser;
7371

@@ -244,14 +242,6 @@ private void validateAndRegisterUser() {
244242
}
245243
}
246244

247-
private SaveSmartLock getSaveSmartLock() {
248-
if (mSaveSmartLock == null) {
249-
mSaveSmartLock = SaveSmartLock.getInstance(mActivity);
250-
}
251-
252-
return mSaveSmartLock;
253-
}
254-
255245
private void registerUser(final String email, final String name, final String password) {
256246
final IdpResponse response = new IdpResponse.Builder(
257247
new User.Builder(EmailAuthProvider.PROVIDER_ID, email)
@@ -267,9 +257,7 @@ private void registerUser(final String email, final String name, final String pa
267257
.addOnSuccessListener(getActivity(), new OnSuccessListener<AuthResult>() {
268258
@Override
269259
public void onSuccess(AuthResult authResult) {
270-
SaveSmartLock saveSmartLock = getSaveSmartLock();
271260
mActivity.saveCredentialsOrFinish(
272-
saveSmartLock,
273261
authResult.getUser(),
274262
password,
275263
response);

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

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import android.content.Context;
1818
import android.content.Intent;
1919
import android.os.Bundle;
20-
import android.support.annotation.Nullable;
2120
import android.support.annotation.RestrictTo;
2221
import android.support.constraint.ConstraintLayout;
2322
import android.support.constraint.ConstraintSet;
@@ -45,7 +44,6 @@
4544
import com.firebase.ui.auth.ui.email.EmailActivity;
4645
import com.firebase.ui.auth.ui.phone.PhoneActivity;
4746
import com.firebase.ui.auth.util.data.ProviderUtils;
48-
import com.firebase.ui.auth.util.signincontainer.SaveSmartLock;
4947
import com.google.firebase.auth.AuthCredential;
5048
import com.google.firebase.auth.EmailAuthProvider;
5149
import com.google.firebase.auth.FacebookAuthProvider;
@@ -70,8 +68,6 @@ public class AuthMethodPickerActivity extends AppCompatBase implements IdpCallba
7068
private static final int RC_ACCOUNT_LINK = 3;
7169

7270
private List<Provider> mProviders;
73-
@Nullable
74-
private SaveSmartLock mSaveSmartLock;
7571

7672
public static Intent createIntent(Context context, FlowParameters flowParams) {
7773
return HelperActivityBase.createBaseIntent(
@@ -101,14 +97,6 @@ protected void onCreate(Bundle savedInstanceState) {
10197
}
10298
}
10399

104-
private SaveSmartLock getSaveSmartLock() {
105-
if (mSaveSmartLock == null) {
106-
mSaveSmartLock = SaveSmartLock.getInstance(this);
107-
}
108-
109-
return mSaveSmartLock;
110-
}
111-
112100
private void populateIdpList(List<IdpConfig> providers) {
113101
mProviders = new ArrayList<>();
114102
for (IdpConfig idpConfig : providers) {
@@ -175,7 +163,6 @@ public void onSuccess(IdpResponse response) {
175163
.signInWithCredential(credential)
176164
.addOnCompleteListener(new CredentialSignInHandler(
177165
this,
178-
getSaveSmartLock(),
179166
RC_ACCOUNT_LINK,
180167
response))
181168
.addOnFailureListener(

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

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import android.app.Activity;
1818
import android.content.Intent;
1919
import android.support.annotation.NonNull;
20-
import android.support.annotation.Nullable;
2120
import android.support.annotation.RestrictTo;
2221
import android.util.Log;
2322

@@ -27,7 +26,6 @@
2726
import com.firebase.ui.auth.ui.HelperActivityBase;
2827
import com.firebase.ui.auth.ui.email.WelcomeBackPasswordPrompt;
2928
import com.firebase.ui.auth.util.data.ProviderUtils;
30-
import com.firebase.ui.auth.util.signincontainer.SaveSmartLock;
3129
import com.google.android.gms.tasks.OnCompleteListener;
3230
import com.google.android.gms.tasks.OnFailureListener;
3331
import com.google.android.gms.tasks.OnSuccessListener;
@@ -43,18 +41,14 @@ public class CredentialSignInHandler implements OnCompleteListener<AuthResult> {
4341
private static final String TAG = "CredentialSignInHandler";
4442

4543
private HelperActivityBase mActivity;
46-
@Nullable
47-
private SaveSmartLock mSmartLock;
4844
private IdpResponse mResponse;
4945
private int mAccountLinkRequestCode;
5046

5147
public CredentialSignInHandler(
5248
HelperActivityBase activity,
53-
@Nullable SaveSmartLock smartLock,
5449
int accountLinkRequestCode,
5550
IdpResponse response) {
5651
mActivity = activity;
57-
mSmartLock = smartLock;
5852
mResponse = response;
5953
mAccountLinkRequestCode = accountLinkRequestCode;
6054
}
@@ -63,7 +57,7 @@ public CredentialSignInHandler(
6357
public void onComplete(@NonNull Task<AuthResult> task) {
6458
if (task.isSuccessful()) {
6559
FirebaseUser firebaseUser = task.getResult().getUser();
66-
mActivity.saveCredentialsOrFinish(mSmartLock, firebaseUser, mResponse);
60+
mActivity.saveCredentialsOrFinish(firebaseUser, mResponse);
6761
} else {
6862
if (task.getException() instanceof FirebaseAuthUserCollisionException) {
6963
String email = mResponse.getEmail();

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,11 @@
3838
import com.firebase.ui.auth.data.model.PhoneNumber;
3939
import com.firebase.ui.auth.ui.FragmentBase;
4040
import com.firebase.ui.auth.util.ExtraConstants;
41+
import com.firebase.ui.auth.util.GoogleApiUtils;
4142
import com.firebase.ui.auth.util.data.PhoneNumberUtils;
4243
import com.firebase.ui.auth.util.ui.ImeHelper;
4344
import com.google.android.gms.auth.api.credentials.Credential;
4445
import com.google.android.gms.auth.api.credentials.CredentialPickerConfig;
45-
import com.google.android.gms.auth.api.credentials.Credentials;
46-
import com.google.android.gms.auth.api.credentials.CredentialsClient;
4746
import com.google.android.gms.auth.api.credentials.HintRequest;
4847

4948
import java.util.Locale;
@@ -241,16 +240,14 @@ private void showPhoneAutoCompleteHint() {
241240
}
242241

243242
private PendingIntent getPhoneHintIntent() {
244-
CredentialsClient client = Credentials.getClient(getContext());
245-
246243
HintRequest hintRequest = new HintRequest.Builder()
247244
.setHintPickerConfig(
248245
new CredentialPickerConfig.Builder().setShowCancelButton(true).build())
249246
.setPhoneNumberIdentifierSupported(true)
250247
.setEmailAddressIdentifierSupported(false)
251248
.build();
252249

253-
return client.getHintPickerIntent(hintRequest);
250+
return GoogleApiUtils.getCredentialsClient(getContext()).getHintPickerIntent(hintRequest);
254251
}
255252

256253
private void setPhoneNumber(PhoneNumber phoneNumber) {

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import com.google.android.gms.auth.api.credentials.Credentials;
99
import com.google.android.gms.auth.api.credentials.CredentialsClient;
10+
import com.google.android.gms.auth.api.credentials.CredentialsOptions;
1011

1112
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
1213
public final class GoogleApiUtils {
@@ -16,12 +17,13 @@ private GoogleApiUtils() {
1617

1718
@NonNull
1819
public static CredentialsClient getCredentialsClient(@NonNull Context context) {
19-
CredentialsClient client;
20+
CredentialsOptions options = new CredentialsOptions.Builder()
21+
.forceEnableSaveDialog()
22+
.build();
2023
if (context instanceof Activity) {
21-
client = Credentials.getClient((Activity) context);
24+
return Credentials.getClient((Activity) context, options);
2225
} else {
23-
client = Credentials.getClient(context);
26+
return Credentials.getClient(context, options);
2427
}
25-
return client;
2628
}
2729
}

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

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@ public class IdpSignInContainer extends FragmentBase implements IdpCallback {
5353

5454
private HelperActivityBase mActivity;
5555
private IdpProvider mIdpProvider;
56-
@Nullable
57-
private SaveSmartLock mSaveSmartLock;
5856

5957
public static void signIn(FragmentActivity activity, FlowParameters parameters, User user) {
6058
FragmentManager fm = activity.getSupportFragmentManager();
@@ -132,7 +130,6 @@ public void onSuccess(IdpResponse response) {
132130
.signInWithCredential(credential)
133131
.addOnCompleteListener(new CredentialSignInHandler(
134132
mActivity,
135-
getSaveSmartLock(),
136133
RC_WELCOME_BACK_IDP,
137134
response))
138135
.addOnFailureListener(
@@ -154,12 +151,4 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
154151
mIdpProvider.onActivityResult(requestCode, resultCode, data);
155152
}
156153
}
157-
158-
private SaveSmartLock getSaveSmartLock() {
159-
if (mSaveSmartLock == null) {
160-
mSaveSmartLock = SaveSmartLock.getInstance(mActivity);
161-
}
162-
163-
return mSaveSmartLock;
164-
}
165154
}

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

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
package com.firebase.ui.auth.util.signincontainer;
1616

1717
import android.app.Activity;
18+
import android.arch.lifecycle.Lifecycle;
19+
import android.arch.lifecycle.LifecycleObserver;
20+
import android.arch.lifecycle.OnLifecycleEvent;
1821
import android.content.Intent;
1922
import android.content.IntentSender;
2023
import android.support.annotation.NonNull;
@@ -28,8 +31,8 @@
2831
import com.firebase.ui.auth.IdpResponse;
2932
import com.firebase.ui.auth.ui.HelperActivityBase;
3033
import com.firebase.ui.auth.util.CredentialsUtil;
34+
import com.firebase.ui.auth.util.GoogleApiUtils;
3135
import com.google.android.gms.auth.api.credentials.Credential;
32-
import com.google.android.gms.auth.api.credentials.Credentials;
3336
import com.google.android.gms.auth.api.credentials.CredentialsClient;
3437
import com.google.android.gms.common.api.ResolvableApiException;
3538
import com.google.android.gms.tasks.Task;
@@ -42,10 +45,6 @@ public class SaveSmartLock extends SmartLockBase<Void> {
4245

4346
private CredentialsClient mCredentialsClient;
4447

45-
private String mName;
46-
private String mEmail;
47-
private String mPassword;
48-
private String mProfilePictureUri;
4948
private IdpResponse mResponse;
5049

5150
@Nullable
@@ -54,7 +53,9 @@ public static SaveSmartLock getInstance(HelperActivityBase activity) {
5453

5554
FragmentManager fm = activity.getSupportFragmentManager();
5655
Fragment fragment = fm.findFragmentByTag(TAG);
57-
if (!(fragment instanceof SaveSmartLock)) {
56+
if (fragment instanceof SaveSmartLock) {
57+
result = (SaveSmartLock) fragment;
58+
} else {
5859
result = new SaveSmartLock();
5960
result.setArguments(activity.getFlowParams().toBundle());
6061
try {
@@ -63,8 +64,6 @@ public static SaveSmartLock getInstance(HelperActivityBase activity) {
6364
Log.e(TAG, "Cannot add fragment", e);
6465
return null;
6566
}
66-
} else {
67-
result = (SaveSmartLock) fragment;
6867
}
6968

7069
return result;
@@ -116,7 +115,7 @@ public void setCredentialsClient(CredentialsClient client) {
116115
@VisibleForTesting
117116
public CredentialsClient getCredentialsClient() {
118117
if (mCredentialsClient == null) {
119-
mCredentialsClient = Credentials.getClient(getActivity());
118+
mCredentialsClient = GoogleApiUtils.getCredentialsClient(getActivity());
120119
}
121120

122121
return mCredentialsClient;
@@ -143,29 +142,27 @@ public void saveCredentialsOrFinish(FirebaseUser firebaseUser,
143142
return;
144143
}
145144

146-
mName = firebaseUser.getDisplayName();
147-
mEmail = firebaseUser.getEmail();
148-
mPassword = password;
149-
mProfilePictureUri = firebaseUser.getPhotoUrl() != null
150-
? firebaseUser.getPhotoUrl().toString()
151-
: null;
152-
153-
if (getActivity() == null) {
154-
throw new IllegalStateException("Can't save credentials in null Activity");
155-
}
156-
157145
// Build credentials client and kick off the save
158-
Credential credential = CredentialsUtil.buildCredential(
159-
mEmail, mPassword, mName, mProfilePictureUri, mResponse);
146+
final Credential credential = CredentialsUtil.buildCredential(
147+
firebaseUser.getEmail(),
148+
password,
149+
firebaseUser.getDisplayName(),
150+
firebaseUser.getPhotoUrl() == null ? null : firebaseUser.getPhotoUrl().toString(),
151+
mResponse);
160152

161153
if (credential == null) {
162154
Log.e(TAG, "Unable to save null credential!");
163155
finish();
164156
return;
165157
}
166158

167-
getCredentialsClient().save(credential)
168-
.addOnCompleteListener(this);
159+
getLifecycle().addObserver(new LifecycleObserver() {
160+
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
161+
public void save() {
162+
getCredentialsClient().save(credential)
163+
.addOnCompleteListener(SaveSmartLock.this);
164+
}
165+
});
169166
}
170167

171168
}

0 commit comments

Comments
 (0)