Skip to content

Commit 915846d

Browse files
SUPERCILEXsamtstern
authored andcommitted
Add new user information (#1355)
1 parent a346bf2 commit 915846d

File tree

12 files changed

+169
-37
lines changed

12 files changed

+169
-37
lines changed

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ public class SignedInActivity extends AppCompatActivity {
6464
@BindView(R.id.user_display_name) TextView mUserDisplayName;
6565
@BindView(R.id.user_phone_number) TextView mUserPhoneNumber;
6666
@BindView(R.id.user_enabled_providers) TextView mEnabledProviders;
67+
@BindView(R.id.user_is_new) TextView mIsNewUser;
6768

6869
public static Intent createIntent(Context context, IdpResponse idpResponse) {
6970
return new Intent().setClass(context, SignedInActivity.class)
@@ -85,7 +86,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) {
8586

8687
setContentView(R.layout.signed_in_layout);
8788
ButterKnife.bind(this);
88-
populateProfile();
89+
populateProfile(response);
8990
populateIdpToken(response);
9091
}
9192

@@ -137,7 +138,7 @@ public void onComplete(@NonNull Task<Void> task) {
137138
});
138139
}
139140

140-
private void populateProfile() {
141+
private void populateProfile(@Nullable IdpResponse response) {
141142
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
142143
if (user.getPhotoUrl() != null) {
143144
GlideApp.with(this)
@@ -153,6 +154,13 @@ private void populateProfile() {
153154
mUserDisplayName.setText(
154155
TextUtils.isEmpty(user.getDisplayName()) ? "No display name" : user.getDisplayName());
155156

157+
if (response == null) {
158+
mIsNewUser.setVisibility(View.GONE);
159+
} else {
160+
mIsNewUser.setVisibility(View.VISIBLE);
161+
mIsNewUser.setText(response.isNewUser() ? "New user" : "Existing user");
162+
}
163+
156164
List<String> providers = new ArrayList<>();
157165
if (user.getProviderData().isEmpty()) {
158166
providers.add("Anonymous");

app/src/main/res/layout/signed_in_layout.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,12 @@
103103
android:layout_height="wrap_content"
104104
android:textIsSelectable="true" />
105105

106+
<TextView
107+
android:id="@+id/user_is_new"
108+
android:layout_width="wrap_content"
109+
android:layout_height="wrap_content"
110+
android:textIsSelectable="false" />
111+
106112
</LinearLayout>
107113

108114
</LinearLayout>

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

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

2525
import com.firebase.ui.auth.data.model.User;
2626
import com.firebase.ui.auth.util.ExtraConstants;
27+
import com.google.firebase.auth.AuthResult;
2728
import com.google.firebase.auth.GoogleAuthProvider;
2829
import com.google.firebase.auth.TwitterAuthProvider;
2930

@@ -42,6 +43,7 @@ public IdpResponse createFromParcel(Parcel in) {
4243
in.<User>readParcelable(User.class.getClassLoader()),
4344
in.readString(),
4445
in.readString(),
46+
in.readInt() == 1,
4547
(FirebaseUiException) in.readSerializable()
4648
);
4749
}
@@ -56,28 +58,32 @@ public IdpResponse[] newArray(int size) {
5658

5759
private final String mToken;
5860
private final String mSecret;
61+
private final boolean mIsNewUser;
5962

6063
private final FirebaseUiException mException;
6164

6265
private IdpResponse(@NonNull FirebaseUiException e) {
63-
this(null, null, null, e);
66+
this(null, null, null, false, e);
6467
}
6568

6669
private IdpResponse(
6770
@NonNull User user,
6871
@Nullable String token,
69-
@Nullable String secret) {
70-
this(user, token, secret, null);
72+
@Nullable String secret,
73+
boolean isNewUser) {
74+
this(user, token, secret, isNewUser, null);
7175
}
7276

7377
private IdpResponse(
7478
User user,
7579
String token,
7680
String secret,
81+
boolean isNewUser,
7782
FirebaseUiException e) {
7883
mUser = user;
7984
mToken = token;
8085
mSecret = secret;
86+
mIsNewUser = isNewUser;
8187
mException = e;
8288
}
8389

@@ -96,6 +102,12 @@ public static IdpResponse fromResultIntent(@Nullable Intent resultIntent) {
96102
}
97103
}
98104

105+
@NonNull
106+
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
107+
public IdpResponse withResult(AuthResult result) {
108+
return mutate().setNewUser(result.getAdditionalUserInfo().isNewUser()).build();
109+
}
110+
99111
@NonNull
100112
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
101113
public static IdpResponse from(@NonNull Exception e) {
@@ -120,6 +132,15 @@ public Intent toIntent() {
120132
return new Intent().putExtra(ExtraConstants.IDP_RESPONSE, this);
121133
}
122134

135+
@NonNull
136+
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
137+
public Builder mutate() {
138+
if (!isSuccessful()) {
139+
throw new IllegalStateException("Cannot mutate an unsuccessful response.");
140+
}
141+
return new Builder(this);
142+
}
143+
123144
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
124145
public boolean isSuccessful() {
125146
return mException == null;
@@ -139,6 +160,13 @@ public String getProviderType() {
139160
return mUser.getProviderId();
140161
}
141162

163+
/**
164+
* Returns true if this user has just signed up, false otherwise.
165+
*/
166+
public boolean isNewUser() {
167+
return mIsNewUser;
168+
}
169+
142170
/**
143171
* Get the email used to sign in.
144172
*/
@@ -189,6 +217,7 @@ public void writeToParcel(Parcel dest, int flags) {
189217
dest.writeParcelable(mUser, flags);
190218
dest.writeString(mToken);
191219
dest.writeString(mSecret);
220+
dest.writeInt(mIsNewUser ? 1 : 0);
192221

193222
ObjectOutputStream oos = null;
194223
try {
@@ -224,6 +253,7 @@ public boolean equals(Object o) {
224253
return (mUser == null ? response.mUser == null : mUser.equals(response.mUser))
225254
&& (mToken == null ? response.mToken == null : mToken.equals(response.mToken))
226255
&& (mSecret == null ? response.mSecret == null : mSecret.equals(response.mSecret))
256+
&& (mIsNewUser == response.mIsNewUser)
227257
&& (mException == null ? response.mException == null : mException.equals(response.mException));
228258
}
229259

@@ -232,6 +262,7 @@ public int hashCode() {
232262
int result = mUser == null ? 0 : mUser.hashCode();
233263
result = 31 * result + (mToken == null ? 0 : mToken.hashCode());
234264
result = 31 * result + (mSecret == null ? 0 : mSecret.hashCode());
265+
result = 31 * result + (mIsNewUser ? 1 : 0);
235266
result = 31 * result + (mException == null ? 0 : mException.hashCode());
236267
return result;
237268
}
@@ -242,6 +273,7 @@ public String toString() {
242273
"mUser=" + mUser +
243274
", mToken='" + mToken + '\'' +
244275
", mSecret='" + mSecret + '\'' +
276+
", mIsNewUser='" + mIsNewUser + '\'' +
245277
", mException=" + mException +
246278
'}';
247279
}
@@ -252,11 +284,24 @@ public static class Builder {
252284

253285
private String mToken;
254286
private String mSecret;
287+
private boolean mIsNewUser;
255288

256289
public Builder(@NonNull User user) {
257290
mUser = user;
258291
}
259292

293+
public Builder(@NonNull IdpResponse response) {
294+
mUser = response.mUser;
295+
mToken = response.mToken;
296+
mSecret = response.mSecret;
297+
mIsNewUser = response.mIsNewUser;
298+
}
299+
300+
public Builder setNewUser(boolean newUser) {
301+
mIsNewUser = newUser;
302+
return this;
303+
}
304+
260305
public Builder setToken(String token) {
261306
mToken = token;
262307
return this;
@@ -282,7 +327,7 @@ public IdpResponse build() {
282327
"Secret cannot be null when using the Twitter provider.");
283328
}
284329

285-
return new IdpResponse(mUser, mToken, mSecret);
330+
return new IdpResponse(mUser, mToken, mSecret, mIsNewUser);
286331
}
287332
}
288333
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
import com.firebase.ui.auth.util.ExtraConstants;
2323
import com.firebase.ui.auth.util.GoogleApiUtils;
2424
import com.firebase.ui.auth.util.data.ProviderUtils;
25-
import com.firebase.ui.auth.viewmodel.AuthViewModelBase;
2625
import com.firebase.ui.auth.viewmodel.RequestCodes;
26+
import com.firebase.ui.auth.viewmodel.SignInViewModelBase;
2727
import com.google.android.gms.auth.api.credentials.Credential;
2828
import com.google.android.gms.auth.api.credentials.CredentialRequest;
2929
import com.google.android.gms.auth.api.credentials.CredentialRequestResponse;
@@ -46,7 +46,7 @@
4646
import java.util.ArrayList;
4747
import java.util.List;
4848

49-
public class SignInKickstarter extends AuthViewModelBase<IdpResponse> {
49+
public class SignInKickstarter extends SignInViewModelBase {
5050
public SignInKickstarter(Application application) {
5151
super(application);
5252
}
@@ -207,7 +207,7 @@ private void handleCredential(final Credential credential) {
207207
.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
208208
@Override
209209
public void onSuccess(AuthResult result) {
210-
setResult(Resource.forSuccess(response));
210+
handleSuccess(response, result);
211211
}
212212
})
213213
.addOnFailureListener(new OnFailureListener() {
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.firebase.ui.auth.viewmodel;
2+
3+
import android.app.Application;
4+
import android.support.annotation.NonNull;
5+
import android.support.annotation.RestrictTo;
6+
7+
import com.firebase.ui.auth.IdpResponse;
8+
import com.firebase.ui.auth.data.model.Resource;
9+
import com.google.firebase.auth.AuthResult;
10+
11+
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
12+
public abstract class SignInViewModelBase extends AuthViewModelBase<IdpResponse> {
13+
protected SignInViewModelBase(Application application) {
14+
super(application);
15+
}
16+
17+
@Override
18+
protected void setResult(Resource<IdpResponse> output) {
19+
super.setResult(output);
20+
}
21+
22+
protected void handleSuccess(@NonNull IdpResponse response, @NonNull AuthResult result) {
23+
setResult(Resource.forSuccess(response.withResult(result)));
24+
}
25+
}

auth/src/main/java/com/firebase/ui/auth/viewmodel/email/EmailProviderResponseHandler.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,16 @@
1313
import com.firebase.ui.auth.ui.idp.WelcomeBackIdpPrompt;
1414
import com.firebase.ui.auth.util.data.ProviderUtils;
1515
import com.firebase.ui.auth.util.data.TaskFailureLogger;
16-
import com.firebase.ui.auth.viewmodel.AuthViewModelBase;
1716
import com.firebase.ui.auth.viewmodel.RequestCodes;
17+
import com.firebase.ui.auth.viewmodel.SignInViewModelBase;
1818
import com.google.android.gms.tasks.OnFailureListener;
1919
import com.google.android.gms.tasks.OnSuccessListener;
2020
import com.google.firebase.auth.AuthResult;
2121
import com.google.firebase.auth.EmailAuthProvider;
2222
import com.google.firebase.auth.FirebaseAuthUserCollisionException;
2323

2424
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
25-
public class EmailProviderResponseHandler extends AuthViewModelBase<IdpResponse> {
25+
public class EmailProviderResponseHandler extends SignInViewModelBase {
2626
private static final String TAG = "EmailProviderResponseHa";
2727

2828
public EmailProviderResponseHandler(Application application) {
@@ -47,7 +47,7 @@ public void startSignIn(@NonNull final IdpResponse response, @NonNull String pas
4747
.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
4848
@Override
4949
public void onSuccess(AuthResult result) {
50-
setResult(Resource.forSuccess(response));
50+
handleSuccess(response, result);
5151
}
5252
})
5353
.addOnFailureListener(new OnFailureListener() {

auth/src/main/java/com/firebase/ui/auth/viewmodel/email/WelcomeBackPasswordHandler.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import com.firebase.ui.auth.data.model.User;
1111
import com.firebase.ui.auth.data.remote.ProfileMerger;
1212
import com.firebase.ui.auth.util.data.TaskFailureLogger;
13-
import com.firebase.ui.auth.viewmodel.AuthViewModelBase;
13+
import com.firebase.ui.auth.viewmodel.SignInViewModelBase;
1414
import com.google.android.gms.tasks.Continuation;
1515
import com.google.android.gms.tasks.OnCompleteListener;
1616
import com.google.android.gms.tasks.Task;
@@ -25,7 +25,7 @@
2525
* SmartLock.
2626
*/
2727
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
28-
public class WelcomeBackPasswordHandler extends AuthViewModelBase<IdpResponse> {
28+
public class WelcomeBackPasswordHandler extends SignInViewModelBase {
2929
private static final String TAG = "WBPasswordHandler";
3030

3131
private String mPendingPassword;
@@ -88,7 +88,7 @@ public void onComplete(@NonNull Task<AuthResult> task) {
8888
return;
8989
}
9090

91-
setResult(Resource.forSuccess(outputResponse));
91+
handleSuccess(outputResponse, task.getResult());
9292
}
9393
})
9494
.addOnFailureListener(

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

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import com.firebase.ui.auth.IdpResponse;
1010
import com.firebase.ui.auth.data.model.Resource;
1111
import com.firebase.ui.auth.util.data.ProviderUtils;
12-
import com.firebase.ui.auth.viewmodel.AuthViewModelBase;
12+
import com.firebase.ui.auth.viewmodel.SignInViewModelBase;
1313
import com.google.android.gms.tasks.Continuation;
1414
import com.google.android.gms.tasks.OnCompleteListener;
1515
import com.google.android.gms.tasks.Task;
@@ -19,7 +19,7 @@
1919
import com.google.firebase.auth.FirebaseUser;
2020

2121
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
22-
public class LinkingSocialProviderResponseHandler extends AuthViewModelBase<IdpResponse> {
22+
public class LinkingSocialProviderResponseHandler extends SignInViewModelBase {
2323
private AuthCredential mRequestedSignInCredential;
2424

2525
public LinkingSocialProviderResponseHandler(Application application) {
@@ -45,31 +45,35 @@ public void startSignIn(@NonNull final IdpResponse response) {
4545
FirebaseUser currentUser = getCurrentUser();
4646
if (currentUser == null) {
4747
getAuth().signInWithCredential(credential)
48-
.continueWithTask(new Continuation<AuthResult, Task<Void>>() {
48+
.continueWithTask(new Continuation<AuthResult, Task<AuthResult>>() {
4949
@Override
50-
public Task<Void> then(@NonNull Task<AuthResult> task) {
51-
AuthResult result = task.getResult();
50+
public Task<AuthResult> then(@NonNull Task<AuthResult> task) {
51+
final AuthResult result = task.getResult();
5252
if (mRequestedSignInCredential == null) {
53-
return Tasks.forResult(null);
53+
return Tasks.forResult(result);
5454
} else {
5555
return result.getUser()
5656
.linkWithCredential(mRequestedSignInCredential)
57-
.continueWith(new Continuation<AuthResult, Void>() {
57+
.continueWith(new Continuation<AuthResult, AuthResult>() {
5858
@Override
59-
public Void then(@NonNull Task<AuthResult> task) {
60-
// Since we've already signed in, it's too late to
61-
// backtrack so we just ignore any errors.
62-
return null;
59+
public AuthResult then(@NonNull Task<AuthResult> task) {
60+
if (task.isSuccessful()) {
61+
return task.getResult();
62+
} else {
63+
// Since we've already signed in, it's too late
64+
// to backtrack so we just ignore any errors.
65+
return result;
66+
}
6367
}
6468
});
6569
}
6670
}
6771
})
68-
.addOnCompleteListener(new OnCompleteListener<Void>() {
72+
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
6973
@Override
70-
public void onComplete(@NonNull Task<Void> task) {
74+
public void onComplete(@NonNull Task<AuthResult> task) {
7175
if (task.isSuccessful()) {
72-
setResult(Resource.forSuccess(response));
76+
handleSuccess(response, task.getResult());
7377
} else {
7478
setResult(Resource.<IdpResponse>forFailure(task.getException()));
7579
}
@@ -82,7 +86,7 @@ public void onComplete(@NonNull Task<Void> task) {
8286
public void onComplete(@NonNull Task<AuthResult> task) {
8387
// I'm not sure why we ignore failures here, but this mirrors previous
8488
// behavior.
85-
setResult(Resource.forSuccess(response));
89+
handleSuccess(response, task.getResult());
8690
}
8791
});
8892
}

0 commit comments

Comments
 (0)