11package com .sap .gigya_flutter_plugin_example .gigya .providers ;
22
33import android .content .Context ;
4- import android .content .Intent ;
54import android .os .Bundle ;
5+ import android .os .CancellationSignal ;
66
7+ import androidx .annotation .NonNull ;
78import androidx .annotation .Nullable ;
89import androidx .appcompat .app .AppCompatActivity ;
10+ import androidx .core .content .ContextCompat ;
11+ import androidx .credentials .ClearCredentialStateRequest ;
12+ import androidx .credentials .Credential ;
13+ import androidx .credentials .CredentialManager ;
14+ import androidx .credentials .CredentialManagerCallback ;
15+ import androidx .credentials .GetCredentialRequest ;
16+ import androidx .credentials .GetCredentialResponse ;
17+ import androidx .credentials .exceptions .ClearCredentialException ;
18+ import androidx .credentials .exceptions .GetCredentialException ;
19+ import androidx .credentials .exceptions .NoCredentialException ;
920
1021import com .sap .gigya_flutter_plugin_example .R ;
1122import com .gigya .android .sdk .GigyaLogger ;
1223import com .gigya .android .sdk .providers .external .IProviderWrapper ;
1324import com .gigya .android .sdk .providers .external .IProviderWrapperCallback ;
1425import com .gigya .android .sdk .providers .external .ProviderWrapper ;
1526import com .gigya .android .sdk .ui .HostActivity ;
16- import com .google .android .gms .auth .api .signin .GoogleSignIn ;
17- import com .google .android .gms .auth .api .signin .GoogleSignInAccount ;
18- import com .google .android .gms .auth .api .signin .GoogleSignInClient ;
19- import com .google .android .gms .auth .api .signin .GoogleSignInOptions ;
20- import com .google .android .gms .auth .api .signin .GoogleSignInStatusCodes ;
21- import com .google .android .gms .common .api .ApiException ;
22- import com .google .android .gms .tasks .Task ;
23-
24- import java .util .HashMap ;
27+ import com .google .android .libraries .identity .googleid .GetGoogleIdOption ;
28+ import com .google .android .libraries .identity .googleid .GoogleIdTokenCredential ;
29+
2530import java .util .Map ;
31+ import java .util .concurrent .Executor ;
2632
2733/**
2834 * Google sign in wrapper class.
3238public class GoogleProviderWrapper extends ProviderWrapper implements IProviderWrapper {
3339
3440 private static final int RC_SIGN_IN = 0 ;
35- private GoogleSignInClient _googleClient ;
41+
42+ private final CredentialManager _credentialsManager ;
43+
44+ private final Executor _executor ;
45+
3646 final Context context ;
3747
3848 public GoogleProviderWrapper (Context context ) {
3949 super (context , R .string .google_client_id );
4050 this .context = context ;
51+ _credentialsManager = CredentialManager .create (context );
52+ _executor = ContextCompat .getMainExecutor (context );
4153 }
4254
4355 @ Override
@@ -46,80 +58,93 @@ public void login(Context context, final Map<String, Object> params, final IProv
4658 callback .onFailed ("Missing server client id. Check manifest implementation" );
4759 return ;
4860 }
49- GoogleSignInOptions gso = new GoogleSignInOptions .Builder (GoogleSignInOptions .DEFAULT_SIGN_IN )
50- .requestServerAuthCode (pId )
51- .requestEmail ()
52- .build ();
53- _googleClient = GoogleSignIn .getClient (context , gso );
54-
5561 // Not using cached account. Server auth code can be used only once.
56- authenticate (params , callback );
62+ authenticate (params , callback , true );
5763 }
5864
59- private void authenticate (final Map <String , Object > params , final IProviderWrapperCallback callback ) {
65+ private void handleSignIn (GetCredentialResponse getCredentialResponse , final Map <String , Object > params , final IProviderWrapperCallback callback ) {
66+ Credential credential = getCredentialResponse .getCredential ();
67+ if (credential .getType ().equals (GoogleIdTokenCredential .TYPE_GOOGLE_ID_TOKEN_CREDENTIAL )) {
68+ GoogleIdTokenCredential googleIdTokenCredential =
69+ GoogleIdTokenCredential .createFrom (credential .getData ());
70+ params .put ("idToken" , googleIdTokenCredential .getIdToken ());
71+ callback .onLogin (params );
72+ } else {
73+ GigyaLogger .error ("GoogleProviderWrapper" , "Unexpected type of credential" );
74+ // ERROR.
75+ callback .onFailed ("Unexpected type of credential" );
76+ }
77+ }
78+
79+ private void authenticate (final Map <String , Object > params ,
80+ final IProviderWrapperCallback callback ,
81+ boolean setFilterByAuthorizedAccounts ) {
6082 HostActivity .present (context , new HostActivity .HostActivityLifecycleCallbacks () {
6183
6284 @ Override
6385 public void onCreate (AppCompatActivity activity , @ Nullable Bundle savedInstanceState ) {
64- Intent signInIntent = _googleClient .getSignInIntent ();
65- activity .startActivityForResult (signInIntent , RC_SIGN_IN );
66- }
6786
68- @ Override
69- public void onActivityResult (AppCompatActivity activity , int requestCode , int resultCode , @ Nullable Intent data ) {
70- if (requestCode == RC_SIGN_IN ) {
71- Task <GoogleSignInAccount > task = GoogleSignIn .getSignedInAccountFromIntent (data );
72- handleSignInResult (params , activity , task , callback );
73- }
87+ GetGoogleIdOption googleIdOption = new GetGoogleIdOption .Builder ()
88+ .setFilterByAuthorizedAccounts (setFilterByAuthorizedAccounts )
89+ .setAutoSelectEnabled (true )
90+ .setServerClientId (pId )
91+ .build ();
92+
93+ GetCredentialRequest request = new GetCredentialRequest .Builder ()
94+ .addCredentialOption (googleIdOption )
95+ .build ();
96+
97+ credentialsSignIn (activity , params , request , setFilterByAuthorizedAccounts , callback );
7498 }
7599 });
76100 }
77101
78- private void handleSignInResult (final Map <String , Object > loginParams , AppCompatActivity activity , Task <GoogleSignInAccount > completedTask , final IProviderWrapperCallback callback ) {
79- try {
80- GoogleSignInAccount account = completedTask .getResult (ApiException .class );
81- if (account == null ) {
82- callback .onFailed ("Account unavailable" );
83- } else {
84- /* Fetch server auth code */
85- final String authCode = account .getServerAuthCode ();
86- if (authCode == null ) {
87- callback .onFailed ("Id token no available" );
88- } else {
89- final Map <String , Object > loginMap = new HashMap <>();
90- loginMap .put ("code" , authCode );
91- callback .onLogin (loginMap );
102+ private void credentialsSignIn (AppCompatActivity activity ,
103+ final Map <String , Object > params ,
104+ GetCredentialRequest request ,
105+ boolean setFilterByAuthorizedAccounts ,
106+ final IProviderWrapperCallback callback ) {
107+ _credentialsManager .getCredentialAsync (activity , request ,
108+ new CancellationSignal (),
109+ _executor ,
110+ new CredentialManagerCallback <GetCredentialResponse , GetCredentialException >() {
111+ @ Override
112+ public void onResult (GetCredentialResponse getCredentialResponse ) {
113+ handleSignIn (getCredentialResponse , params , callback );
114+ activity .finish ();
115+ }
116+
117+ @ Override
118+ public void onError (@ NonNull GetCredentialException e ) {
119+ GigyaLogger .debug ("GoogleProviderWrapper" , "login exception: " + e );
120+ if (e instanceof NoCredentialException && setFilterByAuthorizedAccounts ) {
121+ authenticate (params , callback , false );
122+ } else {
123+ callback .onFailed (e .getLocalizedMessage ());
124+ activity .finish ();
125+ }
126+ }
92127 }
93- }
94- activity .finish ();
95- } catch (ApiException e ) {
96- final int exceptionStatusCode = e .getStatusCode ();
97- switch (exceptionStatusCode ) {
98- case GoogleSignInStatusCodes .SIGN_IN_CANCELLED :
99- callback .onCanceled ();
100- break ;
101- case GoogleSignInStatusCodes .SIGN_IN_FAILED :
102- default :
103- callback .onFailed (GoogleSignInStatusCodes .getStatusCodeString (exceptionStatusCode ));
104- break ;
105- }
106- activity .finish ();
107- }
128+ );
108129 }
109130
110131 @ Override
111132 public void logout () {
112- if (_googleClient == null ) {
113- if (pId == null ) {
114- GigyaLogger .error ("GoogleLoginProvider" , "provider client id unavailable for logout" );
115- return ;
116- }
117- GoogleSignInOptions gso = new GoogleSignInOptions .Builder (GoogleSignInOptions .DEFAULT_SIGN_IN )
118- .requestServerAuthCode (pId )
119- .requestEmail ()
120- .build ();
121- _googleClient = GoogleSignIn .getClient (context , gso );
122- }
123- _googleClient .signOut ();
133+ ClearCredentialStateRequest request = new ClearCredentialStateRequest ();
134+ _credentialsManager .clearCredentialStateAsync (request , new CancellationSignal (),
135+ _executor ,
136+ new CredentialManagerCallback <Void , ClearCredentialException >() {
137+ @ Override
138+ public void onResult (Void unused ) {
139+ GigyaLogger .debug ("GoogleProviderWrapper" , "logout success" );
140+ }
141+
142+ @ Override
143+ public void onError (@ NonNull ClearCredentialException e ) {
144+ GigyaLogger .debug ("GoogleProviderWrapper" , "logout exception: " + e );
145+ }
146+ }
147+ );
124148 }
149+
125150}
0 commit comments