1616
1717import android .app .Activity ;
1818import android .content .Context ;
19+ import android .content .DialogInterface ;
1920import android .content .Intent ;
2021import android .os .Bundle ;
2122import android .support .annotation .NonNull ;
2728import com .firebase .ui .auth .ui .idp .AuthMethodPickerActivity ;
2829import com .firebase .ui .auth .ui .idp .IDPSignInContainerActivity ;
2930import com .firebase .ui .auth .util .CredentialsAPI ;
31+ import com .firebase .ui .auth .util .PlayServicesHelper ;
3032import com .google .android .gms .auth .api .credentials .Credential ;
3133import com .google .android .gms .auth .api .credentials .IdentityProviders ;
3234import com .google .android .gms .tasks .OnCompleteListener ;
33- import com .google .android .gms .tasks .OnFailureListener ;
3435import com .google .android .gms .tasks .OnSuccessListener ;
3536import com .google .android .gms .tasks .Task ;
3637import com .google .firebase .auth .AuthResult ;
@@ -55,12 +56,30 @@ public class ChooseAccountActivity extends ActivityBase {
5556 private static final int RC_IDP_SIGNIN = 3 ;
5657 private static final int RC_AUTH_METHOD_PICKER = 4 ;
5758 private static final int RC_EMAIL_FLOW = 5 ;
59+ private static final int RC_PLAY_SERVICES = 6 ;
5860
59- protected CredentialsAPI mCredentialsApi ;
61+ private CredentialsAPI mCredentialsApi ;
6062
6163 @ Override
6264 protected void onCreate (Bundle savedInstance ) {
6365 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+
6483 mCredentialsApi = new CredentialsAPI (this , new CredentialsAPI .CallbackInterface () {
6584 @ Override
6685 public void onAsyncTaskFinished () {
@@ -72,29 +91,33 @@ public void onAsyncTaskFinished() {
7291 @ Override
7392 protected void onStart () {
7493 super .onStart ();
75- if (mCredentialsApi . isGoogleApiClient () ) {
76- mCredentialsApi .getGoogleApiClient (). connect ();
94+ if (mCredentialsApi != null ) {
95+ mCredentialsApi .onStart ();
7796 }
7897 }
7998
8099 @ Override
81100 protected void onStop () {
82- if (mCredentialsApi .isGoogleApiClient ()
83- && mCredentialsApi .getGoogleApiClient ().isConnected ()) {
84- mCredentialsApi .getGoogleApiClient ().disconnect ();
85- }
86101 super .onStop ();
102+ if (mCredentialsApi != null ) {
103+ mCredentialsApi .onStop ();
104+ }
87105 }
88106
107+ /**
108+ * Called when the Credentials API connects.
109+ */
89110 public void onCredentialsApiConnected (
90111 CredentialsAPI credentialsApi ,
91112 ActivityHelper activityHelper ) {
92- // called back when the CredentialsAPI connects
113+
93114 String email = credentialsApi .getEmailFromCredential ();
94115 String password = credentialsApi .getPasswordFromCredential ();
95116 String accountType = credentialsApi .getAccountTypeFromCredential ();
96- if (credentialsApi .isPlayServicesAvailable ()
117+
118+ if (PlayServicesHelper .isPlayServicesAvailable (this )
97119 && credentialsApi .isCredentialsAvailable ()) {
120+
98121 if (credentialsApi .isAutoSignInAvailable ()) {
99122 credentialsApi .googleSilentSignIn ();
100123 // TODO: (serikb) authenticate Firebase user and continue to application
@@ -149,6 +172,7 @@ private void logInWithCredential(
149172 final String email ,
150173 final String password ,
151174 final String accountType ) {
175+
152176 if (email != null
153177 && mCredentialsApi .isCredentialsAvailable ()
154178 && !mCredentialsApi .isSignInResolutionNeeded ()) {
@@ -187,29 +211,36 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
187211 Log .d (TAG , "onActivityResult:" + requestCode + ":" + resultCode + ":" + data );
188212 }
189213
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+
213244 }
214245 }
215246
0 commit comments