16
16
17
17
import android .app .Activity ;
18
18
import android .content .Context ;
19
+ import android .content .DialogInterface ;
19
20
import android .content .Intent ;
20
21
import android .os .Bundle ;
21
22
import android .support .annotation .NonNull ;
27
28
import com .firebase .ui .auth .ui .idp .AuthMethodPickerActivity ;
28
29
import com .firebase .ui .auth .ui .idp .IDPSignInContainerActivity ;
29
30
import com .firebase .ui .auth .util .CredentialsAPI ;
31
+ import com .firebase .ui .auth .util .PlayServicesHelper ;
30
32
import com .google .android .gms .auth .api .credentials .Credential ;
31
33
import com .google .android .gms .auth .api .credentials .IdentityProviders ;
32
34
import com .google .android .gms .tasks .OnCompleteListener ;
33
- import com .google .android .gms .tasks .OnFailureListener ;
34
35
import com .google .android .gms .tasks .OnSuccessListener ;
35
36
import com .google .android .gms .tasks .Task ;
36
37
import com .google .firebase .auth .AuthResult ;
@@ -55,12 +56,30 @@ public class ChooseAccountActivity extends ActivityBase {
55
56
private static final int RC_IDP_SIGNIN = 3 ;
56
57
private static final int RC_AUTH_METHOD_PICKER = 4 ;
57
58
private static final int RC_EMAIL_FLOW = 5 ;
59
+ private static final int RC_PLAY_SERVICES = 6 ;
58
60
59
- protected CredentialsAPI mCredentialsApi ;
61
+ private CredentialsAPI mCredentialsApi ;
60
62
61
63
@ Override
62
64
protected void onCreate (Bundle savedInstance ) {
63
65
super .onCreate (savedInstance );
66
+
67
+ // Make Google Play Services available at the correct version, if possible
68
+ boolean madeAvailable = PlayServicesHelper .makePlayServicesAvailable (this , RC_PLAY_SERVICES ,
69
+ new DialogInterface .OnCancelListener () {
70
+ @ Override
71
+ public void onCancel (DialogInterface dialogInterface ) {
72
+ Log .w (TAG , "playServices:dialog.onCancel()" );
73
+ finish (RESULT_CANCELED , new Intent ());
74
+ }
75
+ });
76
+
77
+ if (!madeAvailable ) {
78
+ Log .w (TAG , "playServices: could not make available." );
79
+ finish (RESULT_CANCELED , new Intent ());
80
+ return ;
81
+ }
82
+
64
83
mCredentialsApi = new CredentialsAPI (this , new CredentialsAPI .CallbackInterface () {
65
84
@ Override
66
85
public void onAsyncTaskFinished () {
@@ -72,29 +91,33 @@ public void onAsyncTaskFinished() {
72
91
@ Override
73
92
protected void onStart () {
74
93
super .onStart ();
75
- if (mCredentialsApi . isGoogleApiClient () ) {
76
- mCredentialsApi .getGoogleApiClient (). connect ();
94
+ if (mCredentialsApi != null ) {
95
+ mCredentialsApi .onStart ();
77
96
}
78
97
}
79
98
80
99
@ Override
81
100
protected void onStop () {
82
- if (mCredentialsApi .isGoogleApiClient ()
83
- && mCredentialsApi .getGoogleApiClient ().isConnected ()) {
84
- mCredentialsApi .getGoogleApiClient ().disconnect ();
85
- }
86
101
super .onStop ();
102
+ if (mCredentialsApi != null ) {
103
+ mCredentialsApi .onStop ();
104
+ }
87
105
}
88
106
107
+ /**
108
+ * Called when the Credentials API connects.
109
+ */
89
110
public void onCredentialsApiConnected (
90
111
CredentialsAPI credentialsApi ,
91
112
ActivityHelper activityHelper ) {
92
- // called back when the CredentialsAPI connects
113
+
93
114
String email = credentialsApi .getEmailFromCredential ();
94
115
String password = credentialsApi .getPasswordFromCredential ();
95
116
String accountType = credentialsApi .getAccountTypeFromCredential ();
96
- if (credentialsApi .isPlayServicesAvailable ()
117
+
118
+ if (PlayServicesHelper .isPlayServicesAvailable (this )
97
119
&& credentialsApi .isCredentialsAvailable ()) {
120
+
98
121
if (credentialsApi .isAutoSignInAvailable ()) {
99
122
credentialsApi .googleSilentSignIn ();
100
123
// TODO: (serikb) authenticate Firebase user and continue to application
@@ -149,6 +172,7 @@ private void logInWithCredential(
149
172
final String email ,
150
173
final String password ,
151
174
final String accountType ) {
175
+
152
176
if (email != null
153
177
&& mCredentialsApi .isCredentialsAvailable ()
154
178
&& !mCredentialsApi .isSignInResolutionNeeded ()) {
@@ -187,29 +211,36 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
187
211
Log .d (TAG , "onActivityResult:" + requestCode + ":" + resultCode + ":" + data );
188
212
}
189
213
190
- if (requestCode == RC_CREDENTIALS_READ ) {
191
- if (resultCode == RESULT_OK ) {
192
- // credential selected from SmartLock, log in with that credential
193
- Credential credential = data .getParcelableExtra (Credential .EXTRA_KEY );
194
- mCredentialsApi .handleCredential (credential );
195
- mCredentialsApi .resolveSignIn ();
196
- logInWithCredential (
197
- mCredentialsApi .getEmailFromCredential (),
198
- mCredentialsApi .getPasswordFromCredential (),
199
- mCredentialsApi .getAccountTypeFromCredential ()
200
- );
201
- } else if (resultCode == RESULT_CANCELED ) {
202
- // Smart lock selector cancelled, go to the AuthMethodPicker screen
203
- startAuthMethodChoice (mActivityHelper );
204
- } else if (resultCode == RESULT_FIRST_USER ) {
205
- // TODO: (serikb) figure out flow
206
- }
207
- } else if (requestCode == RC_IDP_SIGNIN ) {
208
- finish (resultCode , new Intent ());
209
- } else if (requestCode == RC_AUTH_METHOD_PICKER ) {
210
- finish (resultCode , new Intent ());
211
- } else if (requestCode == RC_EMAIL_FLOW ) {
212
- finish (resultCode , new Intent ());
214
+ switch (requestCode ) {
215
+ case RC_CREDENTIALS_READ :
216
+ if (resultCode == RESULT_OK ) {
217
+ // credential selected from SmartLock, log in with that credential
218
+ Credential credential = data .getParcelableExtra (Credential .EXTRA_KEY );
219
+ mCredentialsApi .handleCredential (credential );
220
+ mCredentialsApi .resolveSignIn ();
221
+ logInWithCredential (
222
+ mCredentialsApi .getEmailFromCredential (),
223
+ mCredentialsApi .getPasswordFromCredential (),
224
+ mCredentialsApi .getAccountTypeFromCredential ()
225
+ );
226
+ } else if (resultCode == RESULT_CANCELED ) {
227
+ // Smart lock selector cancelled, go to the AuthMethodPicker screen
228
+ startAuthMethodChoice (mActivityHelper );
229
+ } else if (resultCode == RESULT_FIRST_USER ) {
230
+ // TODO: (serikb) figure out flow
231
+ }
232
+ break ;
233
+ case RC_IDP_SIGNIN :
234
+ case RC_AUTH_METHOD_PICKER :
235
+ case RC_EMAIL_FLOW :
236
+ finish (resultCode , new Intent ());
237
+ break ;
238
+ case RC_PLAY_SERVICES :
239
+ if (resultCode != RESULT_OK ) {
240
+ finish (resultCode , new Intent ());
241
+ }
242
+ break ;
243
+
213
244
}
214
245
}
215
246
0 commit comments