Skip to content

Commit 81dbbca

Browse files
SUPERCILEXsamtstern
authored andcommitted
Cleanup + make sure IdpResponse is never null if resultCode == ResultCodes.OK (#469)
1 parent e074fac commit 81dbbca

20 files changed

+155
-157
lines changed

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

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@
4848
import butterknife.OnClick;
4949

5050
public class SignedInActivity extends AppCompatActivity {
51-
private static final String EXTRA_IDP_RESPONSE = "extra_idp_response";
52-
5351
@BindView(android.R.id.content)
5452
View mRootView;
5553

@@ -78,7 +76,7 @@ public void onCreate(Bundle savedInstanceState) {
7876
return;
7977
}
8078

81-
mIdpResponse = getIntent().getParcelableExtra(EXTRA_IDP_RESPONSE);
79+
mIdpResponse = IdpResponse.fromResultIntent(getIntent());
8280

8381
setContentView(R.layout.signed_in_layout);
8482
ButterKnife.bind(this);
@@ -181,19 +179,21 @@ private void populateProfile() {
181179
}
182180

183181
private void populateIdpToken() {
182+
String token = null;
183+
String secret = null;
184184
if (mIdpResponse != null) {
185-
String token = mIdpResponse.getIdpToken();
186-
String secret = mIdpResponse.getIdpSecret();
187-
if (token == null) {
188-
findViewById(R.id.idp_token_layout).setVisibility(View.GONE);
189-
} else {
190-
((TextView) findViewById(R.id.idp_token)).setText(token);
191-
}
192-
if (secret == null) {
193-
findViewById(R.id.idp_secret_layout).setVisibility(View.GONE);
194-
} else {
195-
((TextView) findViewById(R.id.idp_secret)).setText(secret);
196-
}
185+
token = mIdpResponse.getIdpToken();
186+
secret = mIdpResponse.getIdpSecret();
187+
}
188+
if (token == null) {
189+
findViewById(R.id.idp_token_layout).setVisibility(View.GONE);
190+
} else {
191+
((TextView) findViewById(R.id.idp_token)).setText(token);
192+
}
193+
if (secret == null) {
194+
findViewById(R.id.idp_secret_layout).setVisibility(View.GONE);
195+
} else {
196+
((TextView) findViewById(R.id.idp_secret)).setText(secret);
197197
}
198198
}
199199

@@ -204,9 +204,8 @@ private void showSnackbar(@StringRes int errorMessageRes) {
204204
}
205205

206206
public static Intent createIntent(Context context, IdpResponse idpResponse) {
207-
Intent in = new Intent();
207+
Intent in = IdpResponse.getIntent(idpResponse);
208208
in.setClass(context, SignedInActivity.class);
209-
in.putExtra(EXTRA_IDP_RESPONSE, idpResponse);
210209
return in;
211210
}
212211
}

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

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,29 +80,32 @@
8080
android:text="@string/auth_providers_header"/>
8181

8282
<CheckBox
83-
android:id="@+id/email_provider"
83+
android:id="@+id/google_provider"
8484
android:layout_width="wrap_content"
8585
android:layout_height="wrap_content"
8686
android:checked="true"
87-
android:text="@string/email_label"/>
87+
android:text="@string/google_label"/>
8888

8989
<CheckBox
9090
android:id="@+id/facebook_provider"
9191
android:layout_width="wrap_content"
9292
android:layout_height="wrap_content"
93+
android:checked="true"
9394
android:text="@string/facebook_label"/>
9495

9596
<CheckBox
96-
android:id="@+id/google_provider"
97+
android:id="@+id/twitter_provider"
9798
android:layout_width="wrap_content"
9899
android:layout_height="wrap_content"
99-
android:text="@string/google_label"/>
100+
android:checked="true"
101+
android:text="@string/twitter_label"/>
100102

101103
<CheckBox
102-
android:id="@+id/twitter_provider"
104+
android:id="@+id/email_provider"
103105
android:layout_width="wrap_content"
104106
android:layout_height="wrap_content"
105-
android:text="@string/twitter_label"/>
107+
android:checked="true"
108+
android:text="@string/email_label"/>
106109

107110
<TextView
108111
style="@style/Base.TextAppearance.AppCompat.Subhead"

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,6 @@
44
* Error codes retrieved from {@link IdpResponse#getErrorCode()}.
55
*/
66
public final class ErrorCodes {
7-
private ErrorCodes() {
8-
// We don't want people to initialize this class
9-
}
10-
117
/**
128
* Sign in failed due to lack of network connection
139
**/
@@ -17,4 +13,8 @@ private ErrorCodes() {
1713
* An unknown error has occurred
1814
**/
1915
public static final int UNKNOWN_ERROR = 20;
16+
17+
private ErrorCodes() {
18+
// no instance
19+
}
2020
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,6 @@
77
* {@code startActivityForResult}.
88
*/
99
public final class ResultCodes {
10-
private ResultCodes() {
11-
// We don't want people to initialize this class
12-
}
13-
1410
/**
1511
* Sign in succeeded
1612
**/
@@ -20,4 +16,8 @@ private ResultCodes() {
2016
* Sign in canceled by user
2117
**/
2218
public static final int CANCELED = Activity.RESULT_CANCELED;
19+
20+
private ResultCodes() {
21+
// no instance
22+
}
2323
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public void saveCredentialsOrFinish(
109109
@Nullable String password,
110110
IdpResponse response) {
111111
if (saveSmartLock == null) {
112-
finishActivity(activity, ResultCodes.OK, new Intent());
112+
finishActivity(activity, ResultCodes.OK, IdpResponse.getIntent(response));
113113
} else {
114114
saveSmartLock.saveCredentialsOrFinish(
115115
firebaseUser,

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,9 @@
1818
* Constants used for passing Intent extra params between authentication flow activities.
1919
*/
2020
public class ExtraConstants {
21-
public static final String EXTRA_EMAIL = "extra_email";
22-
public static final String EXTRA_USER = "extra_user";
23-
public static final String EXTRA_ERROR_MESSAGE = "extra_error_msg";
2421
public static final String EXTRA_FLOW_PARAMS = "extra_flow_params";
2522
public static final String EXTRA_IDP_RESPONSE = "extra_idp_response";
26-
public static final String EXTRA_PROVIDER = "extra_provider";
23+
public static final String EXTRA_USER = "extra_user";
24+
public static final String EXTRA_EMAIL = "extra_email";
2725
public static final String HAS_EXISTING_INSTANCE = "has_existing_instance";
2826
}

auth/src/main/java/com/firebase/ui/auth/ui/email/User.java renamed to auth/src/main/java/com/firebase/ui/auth/ui/User.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
package com.firebase.ui.auth.ui.email;
1+
package com.firebase.ui.auth.ui;
22

3+
import android.content.Intent;
34
import android.net.Uri;
5+
import android.os.Bundle;
46
import android.os.Parcel;
57
import android.os.Parcelable;
68
import android.support.annotation.NonNull;
@@ -67,6 +69,14 @@ public void writeToParcel(@NonNull Parcel dest, int flags) {
6769
dest.writeParcelable(mPhotoUri, flags);
6870
}
6971

72+
public static User getUser(Intent intent) {
73+
return intent.getParcelableExtra(ExtraConstants.EXTRA_USER);
74+
}
75+
76+
public static User getUser(Bundle arguments) {
77+
return arguments.getParcelable(ExtraConstants.EXTRA_USER);
78+
}
79+
7080
public static final class Builder {
7181
private String mEmail;
7282
private String mName;

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

Lines changed: 61 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -40,38 +40,40 @@
4040
import com.firebase.ui.auth.ui.ExtraConstants;
4141
import com.firebase.ui.auth.ui.FlowParameters;
4242
import com.firebase.ui.auth.ui.TaskFailureLogger;
43+
import com.firebase.ui.auth.ui.User;
4344
import com.google.android.gms.tasks.OnCompleteListener;
45+
import com.google.android.gms.tasks.OnFailureListener;
46+
import com.google.android.gms.tasks.OnSuccessListener;
4447
import com.google.android.gms.tasks.Task;
4548
import com.google.firebase.auth.AuthCredential;
4649
import com.google.firebase.auth.AuthResult;
4750
import com.google.firebase.auth.FacebookAuthProvider;
48-
import com.google.firebase.auth.FirebaseAuth;
4951
import com.google.firebase.auth.FirebaseUser;
5052
import com.google.firebase.auth.GoogleAuthProvider;
5153
import com.google.firebase.auth.TwitterAuthProvider;
5254

53-
public class WelcomeBackIdpPrompt extends AppCompatBase
54-
implements View.OnClickListener, IdpCallback {
55+
public class WelcomeBackIdpPrompt extends AppCompatBase implements IdpCallback {
56+
private static final String TAG = "WelcomeBackIdpPrompt";
5557

56-
private static final String TAG = "WelcomeBackIDPPrompt";
5758
private IdpProvider mIdpProvider;
58-
private IdpResponse mPrevIdpResponse;
5959
private AuthCredential mPrevCredential;
6060

61-
6261
@Override
6362
protected void onCreate(Bundle savedInstanceState) {
6463
super.onCreate(savedInstanceState);
65-
String providerId = getProviderIdFromIntent();
66-
mPrevIdpResponse = IdpResponse.fromResultIntent(getIntent());
6764
setContentView(R.layout.welcome_back_idp_prompt_layout);
6865

69-
mIdpProvider = null;
66+
IdpResponse newUserIdpResponse = IdpResponse.fromResultIntent(getIntent());
67+
mPrevCredential = AuthCredentialHelper.getAuthCredential(newUserIdpResponse);
68+
69+
User oldUser = User.getUser(getIntent());
70+
71+
String providerId = oldUser.getProvider();
7072
for (IdpConfig idpConfig : mActivityHelper.getFlowParams().providerInfo) {
7173
if (providerId.equals(idpConfig.getProviderId())) {
7274
switch (providerId) {
7375
case GoogleAuthProvider.PROVIDER_ID:
74-
mIdpProvider = new GoogleProvider(this, idpConfig, getEmailFromIntent());
76+
mIdpProvider = new GoogleProvider(this, idpConfig, oldUser.getEmail());
7577
break;
7678
case FacebookAuthProvider.PROVIDER_ID:
7779
mIdpProvider = new FacebookProvider(
@@ -89,21 +91,16 @@ protected void onCreate(Bundle savedInstanceState) {
8991
}
9092
}
9193

92-
if (mPrevIdpResponse != null) {
93-
mPrevCredential = AuthCredentialHelper.getAuthCredential(mPrevIdpResponse);
94-
}
95-
9694
if (mIdpProvider == null) {
97-
getIntent().putExtra(
98-
ExtraConstants.EXTRA_ERROR_MESSAGE,
99-
"Firebase login successful." +
100-
" Account linking failed due to provider not enabled by application");
95+
Log.w(TAG, "Firebase login unsuccessful."
96+
+ " Account linking failed due to provider not enabled by application: "
97+
+ providerId);
10198
finish(ResultCodes.CANCELED, IdpResponse.getErrorCodeIntent(ErrorCodes.UNKNOWN_ERROR));
10299
return;
103100
}
104101

105102
((TextView) findViewById(R.id.welcome_back_idp_prompt))
106-
.setText(getIdpPromptString(getEmailFromIntent()));
103+
.setText(getIdpPromptString(oldUser.getEmail()));
107104

108105
mIdpProvider.setAuthenticationCallback(this);
109106
findViewById(R.id.welcome_back_idp_button).setOnClickListener(new OnClickListener() {
@@ -127,83 +124,71 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
127124
}
128125

129126
@Override
130-
public void onClick(View view) {
131-
next(mPrevIdpResponse);
132-
}
133-
134-
@Override
135-
public void onSuccess(IdpResponse idpResponse) {
136-
next(idpResponse);
137-
}
138-
139-
@Override
140-
public void onFailure(Bundle extra) {
141-
Toast.makeText(getApplicationContext(), "Error signing in", Toast.LENGTH_LONG).show();
142-
finish(ResultCodes.CANCELED, IdpResponse.getErrorCodeIntent(ErrorCodes.UNKNOWN_ERROR));
143-
}
144-
145-
private String getProviderIdFromIntent() {
146-
return getIntent().getStringExtra(ExtraConstants.EXTRA_PROVIDER);
147-
}
148-
149-
private String getEmailFromIntent() {
150-
return getIntent().getStringExtra(ExtraConstants.EXTRA_EMAIL);
151-
}
152-
153-
private void next(final IdpResponse newIdpResponse) {
154-
if (newIdpResponse == null) {
127+
public void onSuccess(final IdpResponse idpResponse) {
128+
if (idpResponse == null) {
155129
return; // do nothing
156130
}
157131

158-
AuthCredential newCredential = AuthCredentialHelper.getAuthCredential(newIdpResponse);
132+
AuthCredential newCredential = AuthCredentialHelper.getAuthCredential(idpResponse);
159133
if (newCredential == null) {
160134
Log.e(TAG, "No credential returned");
161135
finish(ResultCodes.CANCELED, IdpResponse.getErrorCodeIntent(ErrorCodes.UNKNOWN_ERROR));
162136
return;
163137
}
164138

165-
final FirebaseAuth firebaseAuth = mActivityHelper.getFirebaseAuth();
166-
FirebaseUser currentUser = firebaseAuth.getCurrentUser();
167-
139+
FirebaseUser currentUser = mActivityHelper.getCurrentUser();
168140
if (currentUser == null) {
169-
Task<AuthResult> authResultTask = firebaseAuth.signInWithCredential(newCredential);
170-
authResultTask.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
171-
@Override
172-
public void onComplete(@NonNull Task<AuthResult> task) {
173-
if (task.isSuccessful() && mPrevCredential != null) {
174-
FirebaseUser firebaseUser = task.getResult().getUser();
175-
firebaseUser.linkWithCredential(mPrevCredential);
176-
firebaseAuth.signOut();
177-
firebaseAuth
178-
.signInWithCredential(mPrevCredential)
179-
.addOnFailureListener(new TaskFailureLogger(
180-
TAG, "Error signing in with previous credential"))
181-
.addOnCompleteListener(new FinishListener(newIdpResponse));
182-
} else {
183-
finish(ResultCodes.OK, IdpResponse.getIntent(newIdpResponse));
184-
}
185-
}
186-
}).addOnFailureListener(
187-
new TaskFailureLogger(TAG, "Error signing in with new credential"));
141+
mActivityHelper.getFirebaseAuth()
142+
.signInWithCredential(newCredential)
143+
.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
144+
@Override
145+
public void onSuccess(AuthResult result) {
146+
if (mPrevCredential != null) {
147+
result.getUser()
148+
.linkWithCredential(mPrevCredential)
149+
.addOnFailureListener(new TaskFailureLogger(
150+
TAG, "Error signing in with previous credential"))
151+
.addOnCompleteListener(new FinishListener(idpResponse));
152+
} else {
153+
finish(ResultCodes.OK, IdpResponse.getIntent(idpResponse));
154+
}
155+
}
156+
})
157+
.addOnFailureListener(new OnFailureListener() {
158+
@Override
159+
public void onFailure(@NonNull Exception e) {
160+
finishWithError();
161+
}
162+
})
163+
.addOnFailureListener(
164+
new TaskFailureLogger(TAG, "Error signing in with new credential"));
188165
} else {
189-
Task<AuthResult> authResultTask = currentUser.linkWithCredential(newCredential);
190-
authResultTask
166+
currentUser
167+
.linkWithCredential(newCredential)
191168
.addOnFailureListener(
192169
new TaskFailureLogger(TAG, "Error linking with credential"))
193-
.addOnCompleteListener(new FinishListener(newIdpResponse));
170+
.addOnCompleteListener(new FinishListener(idpResponse));
194171
}
195172
}
196173

174+
@Override
175+
public void onFailure(Bundle extra) {
176+
finishWithError();
177+
}
178+
179+
private void finishWithError() {
180+
Toast.makeText(this, R.string.general_error, Toast.LENGTH_LONG).show();
181+
finish(ResultCodes.CANCELED, IdpResponse.getErrorCodeIntent(ErrorCodes.UNKNOWN_ERROR));
182+
}
183+
197184
public static Intent createIntent(
198185
Context context,
199186
FlowParameters flowParams,
200-
String providerId,
201-
IdpResponse idpResponse,
202-
String email) {
187+
User existingUser,
188+
IdpResponse newUserResponse) {
203189
return BaseHelper.createBaseIntent(context, WelcomeBackIdpPrompt.class, flowParams)
204-
.putExtra(ExtraConstants.EXTRA_PROVIDER, providerId)
205-
.putExtra(ExtraConstants.EXTRA_IDP_RESPONSE, idpResponse)
206-
.putExtra(ExtraConstants.EXTRA_EMAIL, email);
190+
.putExtra(ExtraConstants.EXTRA_USER, existingUser)
191+
.putExtra(ExtraConstants.EXTRA_IDP_RESPONSE, newUserResponse);
207192
}
208193

209194
private class FinishListener implements OnCompleteListener<AuthResult> {

0 commit comments

Comments
 (0)