@@ -47,28 +47,40 @@ public class WelcomeBackIDPPrompt extends AppCompatBase
47
47
implements View .OnClickListener , IDPProvider .IDPCallback {
48
48
49
49
private static final String TAG = "WelcomeBackIDPPrompt" ;
50
-
51
- private IDPProvider mIDPProvider ;
50
+ private IDPProvider mIdpProvider ;
52
51
private String mProviderId ;
53
- private IDPResponse mIdpResponse ;
52
+ private IDPResponse mPrevIdpResponse ;
53
+ private AuthCredential mPrevCredential ;
54
+
55
+ private static AuthCredential getAuthCredential (IDPResponse idpResponse ) {
56
+ switch (idpResponse .getProviderType ()) {
57
+ case GoogleAuthProvider .PROVIDER_ID :
58
+ return GoogleProvider .createAuthCredential (idpResponse );
59
+ case FacebookAuthProvider .PROVIDER_ID :
60
+ return FacebookProvider .createAuthCredential (idpResponse );
61
+ default :
62
+ return null ;
63
+ }
64
+ }
65
+
54
66
55
67
@ Override
56
68
protected void onCreate (Bundle savedInstanceState ) {
57
69
super .onCreate (savedInstanceState );
58
70
setTitle (getResources ().getString (R .string .sign_in ));
59
71
mProviderId = getProviderIdFromIntent ();
60
- mIdpResponse = getIntent ().getParcelableExtra (ExtraConstants .EXTRA_IDP_RESPONSE );
72
+ mPrevIdpResponse = getIntent ().getParcelableExtra (ExtraConstants .EXTRA_IDP_RESPONSE );
61
73
setContentView (R .layout .welcome_back_idp_prompt_layout );
62
74
63
- mIDPProvider = null ;
75
+ mIdpProvider = null ;
64
76
for (IDPProviderParcel providerParcel : mActivityHelper .flowParams .providerInfo ) {
65
77
if (mProviderId .equals (providerParcel .getProviderType ())) {
66
78
switch (mProviderId ) {
67
79
case GoogleAuthProvider .PROVIDER_ID :
68
- mIDPProvider = new GoogleProvider (this , providerParcel );
80
+ mIdpProvider = new GoogleProvider (this , providerParcel );
69
81
break ;
70
82
case FacebookAuthProvider .PROVIDER_ID :
71
- mIDPProvider = new FacebookProvider (this , providerParcel );
83
+ mIdpProvider = new FacebookProvider (this , providerParcel );
72
84
break ;
73
85
default :
74
86
Log .w (TAG , "Unknown provider: " + mProviderId );
@@ -78,7 +90,11 @@ protected void onCreate(Bundle savedInstanceState) {
78
90
}
79
91
}
80
92
81
- if (mIDPProvider == null ) {
93
+ if (mPrevIdpResponse != null ) {
94
+ mPrevCredential = getAuthCredential (mPrevIdpResponse );
95
+ }
96
+
97
+ if (mIdpProvider == null ) {
82
98
getIntent ().putExtra (
83
99
ExtraConstants .EXTRA_ERROR_MESSAGE ,
84
100
"Firebase login successful. Account linking failed due to provider not "
@@ -87,48 +103,42 @@ protected void onCreate(Bundle savedInstanceState) {
87
103
}
88
104
89
105
((TextView ) findViewById (R .id .welcome_back_idp_prompt ))
90
- .setText (getIdpPromptString (getEmailFromIntent (), getAppNameFromIntent () ));
106
+ .setText (getIdpPromptString (getEmailFromIntent ()));
91
107
92
- mIDPProvider .setAuthenticationCallback (this );
108
+ mIdpProvider .setAuthenticationCallback (this );
93
109
findViewById (R .id .welcome_back_idp_button ).setOnClickListener (new View .OnClickListener () {
94
110
@ Override
95
111
public void onClick (View view ) {
96
- mIDPProvider .startLogin (WelcomeBackIDPPrompt .this , getEmailFromIntent ());
112
+ mIdpProvider .startLogin (WelcomeBackIDPPrompt .this , getEmailFromIntent ());
97
113
}
98
114
});
99
115
}
100
116
101
- private String getIdpPromptString (String email , String appName ) {
117
+ private String getIdpPromptString (String email ) {
102
118
String promptStringTemplate = getResources ().getString (R .string .welcome_back_idp_prompt );
103
- return String .format (promptStringTemplate , email , appName , mIDPProvider .getName (this ));
119
+ return String .format (promptStringTemplate , email , mIdpProvider .getName (this ));
104
120
}
105
121
106
122
@ Override
107
123
public void onActivityResult (int requestCode , int resultCode , Intent data ) {
108
124
super .onActivityResult (requestCode , resultCode , data );
109
- mIDPProvider .onActivityResult (requestCode , resultCode , data );
125
+ mIdpProvider .onActivityResult (requestCode , resultCode , data );
110
126
}
111
127
112
128
@ Override
113
129
public void onClick (View view ) {
114
- next (mIdpResponse , mProviderId );
130
+ next (mPrevIdpResponse );
115
131
}
116
132
117
133
@ Override
118
134
public void onSuccess (IDPResponse idpResponse ) {
119
- Intent data = getIntent ();
120
- data .putExtra (ExtraConstants .EXTRA_PROVIDER , mProviderId );
121
- next (idpResponse , mProviderId );
135
+ next (idpResponse );
122
136
}
123
137
124
138
@ Override
125
139
public void onFailure (Bundle extra ) {
126
140
Toast .makeText (getApplicationContext (), "Error signing in" , Toast .LENGTH_LONG ).show ();
127
- next (mIdpResponse , mProviderId );
128
- }
129
-
130
- private String getAppNameFromIntent () {
131
- return getIntent ().getStringExtra (ExtraConstants .EXTRA_EMAIL );
141
+ finish (RESULT_CANCELED , new Intent ());
132
142
}
133
143
134
144
private String getProviderIdFromIntent () {
@@ -139,43 +149,47 @@ private String getEmailFromIntent() {
139
149
return getIntent ().getStringExtra (ExtraConstants .EXTRA_EMAIL );
140
150
}
141
151
142
- private void next (IDPResponse idpResponse , String provider ) {
143
- if (idpResponse == null ) {
152
+ private void next (IDPResponse newIdpResponse ) {
153
+ if (newIdpResponse == null ) {
144
154
return ; // do nothing
145
155
}
146
- AuthCredential credential ;
147
- switch (provider ) {
148
- case GoogleAuthProvider .PROVIDER_ID :
149
- credential = GoogleProvider .createAuthCredential (idpResponse );
150
- break ;
151
- case FacebookAuthProvider .PROVIDER_ID :
152
- credential = FacebookProvider .createAuthCredential (idpResponse );
153
- break ;
154
- default :
155
- Log .e (TAG , "Unknown provider: " + provider );
156
- finish (Activity .RESULT_FIRST_USER , new Intent ());
157
- return ;
158
- }
159
- if (credential == null ) {
156
+ AuthCredential newCredential ;
157
+ newCredential = getAuthCredential (newIdpResponse );
158
+ if (newCredential == null ) {
160
159
Log .e (TAG , "No credential returned" );
161
160
finish (Activity .RESULT_FIRST_USER , new Intent ());
162
161
return ;
163
162
}
164
163
165
- FirebaseAuth firebaseAuth = mActivityHelper .getFirebaseAuth ();
164
+ final FirebaseAuth firebaseAuth = mActivityHelper .getFirebaseAuth ();
166
165
FirebaseUser currentUser = firebaseAuth .getCurrentUser ();
167
166
168
167
if (currentUser == null ) {
169
- Task <AuthResult > authResultTask = firebaseAuth .signInWithCredential (credential );
168
+ Task <AuthResult > authResultTask = firebaseAuth .signInWithCredential (newCredential );
170
169
authResultTask .addOnCompleteListener (new OnCompleteListener <AuthResult >() {
171
170
@ Override
172
171
public void onComplete (@ NonNull Task <AuthResult > task ) {
173
- finish (Activity .RESULT_OK , new Intent ());
172
+ if (task .isSuccessful () && mPrevCredential != null ) {
173
+ FirebaseUser firebaseUser = task .getResult ().getUser ();
174
+ firebaseUser .linkWithCredential (mPrevCredential );
175
+ firebaseAuth .signOut ();
176
+ firebaseAuth .signInWithCredential (mPrevCredential ).addOnCompleteListener (
177
+ new OnCompleteListener <AuthResult >() {
178
+ @ Override
179
+ public void onComplete (@ NonNull Task <AuthResult > task ) {
180
+ finish (Activity .RESULT_OK , new Intent ());
181
+
182
+ }
183
+ }
184
+ );
185
+ } else {
186
+ finish (Activity .RESULT_OK , new Intent ());
187
+ }
174
188
}
175
189
});
176
190
177
191
} else {
178
- Task <AuthResult > authResultTask = currentUser .linkWithCredential (credential );
192
+ Task <AuthResult > authResultTask = currentUser .linkWithCredential (newCredential );
179
193
authResultTask .addOnCompleteListener (new OnCompleteListener <AuthResult >() {
180
194
@ Override
181
195
public void onComplete (@ NonNull Task <AuthResult > task ) {
@@ -189,9 +203,11 @@ public static Intent createIntent(
189
203
Context context ,
190
204
FlowParameters flowParams ,
191
205
String providerId ,
206
+ IDPResponse idpResponse ,
192
207
String email ) {
193
208
return ActivityHelper .createBaseIntent (context , WelcomeBackIDPPrompt .class , flowParams )
194
209
.putExtra (ExtraConstants .EXTRA_PROVIDER , providerId )
210
+ .putExtra (ExtraConstants .EXTRA_IDP_RESPONSE , idpResponse )
195
211
.putExtra (ExtraConstants .EXTRA_EMAIL , email );
196
212
}
197
213
}
0 commit comments