Skip to content

Commit b5a172c

Browse files
committed
Merge branch 'develop'
2 parents 6017a06 + 1c38a4a commit b5a172c

File tree

13 files changed

+181
-129
lines changed

13 files changed

+181
-129
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
# 1.0.7
2+
1.0.7
3+
4+
* Updated Android core 7.1.0 - https://github.com/SAP/gigya-android-sdk/releases/tag/core-v7.1.0
5+
* Updated Swift Core 1.7.0 - https://github.com/SAP/gigya-swift-sdk/releases/tag/core%2Fv1.7.0
6+
* Please read each platform requirement changes for supporting social sign in.
7+
18
# 1.0.6
29
1.0.6
310

android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ dependencies {
5858
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
5959

6060
// Gigya SDK core implementation.
61-
api 'com.sap.oss.gigya-android-sdk:sdk-core:7.0.+'
61+
api 'com.sap.oss.gigya-android-sdk:sdk-core:7.1.+'
6262
api 'com.github.SAP.gigya-android-sdk:sdk-auth:auth-v2.2.0'
6363
api 'com.github.SAP.gigya-android-sdk:sdk-biometric:bio-v2.1.2'
6464

example/android/app/build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ apply plugin: 'kotlin-android'
2626
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
2727

2828
android {
29-
compileSdkVersion 33
29+
compileSdkVersion 34
3030

3131
sourceSets {
3232
main.java.srcDirs += 'src/main/kotlin'
@@ -87,7 +87,7 @@ dependencies {
8787
implementation 'com.facebook.android:facebook-android-sdk:14.1.1'
8888

8989
// Google (Optional)
90-
implementation 'com.google.android.gms:play-services-auth:20.5.0'
91-
90+
implementation 'androidx.credentials:credentials-play-services-auth:1.2.2'
91+
implementation 'com.google.android.libraries.identity.googleid:googleid:1.1.0'
9292

9393
}
Lines changed: 94 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,34 @@
11
package com.sap.gigya_flutter_plugin_example.gigya.providers;
22

33
import android.content.Context;
4-
import android.content.Intent;
54
import android.os.Bundle;
5+
import android.os.CancellationSignal;
66

7+
import androidx.annotation.NonNull;
78
import androidx.annotation.Nullable;
89
import 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

1021
import com.sap.gigya_flutter_plugin_example.R;
1122
import com.gigya.android.sdk.GigyaLogger;
1223
import com.gigya.android.sdk.providers.external.IProviderWrapper;
1324
import com.gigya.android.sdk.providers.external.IProviderWrapperCallback;
1425
import com.gigya.android.sdk.providers.external.ProviderWrapper;
1526
import 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+
2530
import java.util.Map;
31+
import java.util.concurrent.Executor;
2632

2733
/**
2834
* Google sign in wrapper class.
@@ -32,12 +38,18 @@
3238
public 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
}

example/ios/Runner/GigyaProviders/FacebookWrapper.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@ import FBSDKCoreKit
1111
import FBSDKLoginKit
1212
import Gigya
1313

14+
// MARK: - for Gigya v1.7.0+
15+
1416
class FacebookWrapper: ProviderWrapperProtocol {
1517

1618
private var completionHandler: (_ jsonData: [String: Any]?, _ error: String?) -> Void = { _, _ in }
1719

1820
var clientID: String?
1921

20-
private let defaultReadPermissions = ["email"]
22+
private let defaultReadPermissions = ["email", "user_birthday", "user_gender", "user_hometown", "user_location"]
2123

2224
lazy var fbLogin: LoginManager = {
2325
return LoginManager()
@@ -33,16 +35,16 @@ class FacebookWrapper: ProviderWrapperProtocol {
3335

3436
fbLogin.logIn(permissions: defaultReadPermissions, from: viewController) { (result, error) in
3537
if result?.isCancelled != false {
36-
completion(nil, "cancelled")
38+
completion(nil, "canceled")
3739
return
3840
}
3941

4042
if let error = error {
4143
completion(nil, error.localizedDescription)
4244
}
4345

44-
let jsonData: [String: Any] = ["accessToken": result?.token?.tokenString ?? "", "tokenExpiration": result?.token?.expirationDate.timeIntervalSince1970 ?? 0]
45-
46+
let jsonData: [String: Any] = ["authToken": result?.token?.tokenString ?? "", "idToken": result?.authenticationToken?.tokenString ?? "", "tokenExpiration": Int32(result?.token?.expirationDate.timeIntervalSince1970 ?? 0)]
47+
4648
completion(jsonData, nil)
4749
}
4850
}

example/ios/Runner/GigyaProviders/GoogleWrapper.swift

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22
// GoogleWrapper.swift
33
// GigyaSwift
44
//
5-
// Created by Shmuel, Sagi on 15/04/2019.
5+
// Created by Shmuel, Sagi on 15/07/2023.
66
// Copyright © 2019 Gigya. All rights reserved.
77
//
88

99
import UIKit
1010
import GoogleSignIn
1111
import Gigya
1212

13-
14-
// MARK: - Google Sign In V6 wrapper
13+
// MARK: - for Gigya v1.7.0+
14+
// MARK: - Google Sign In V7 wrapper
1515

1616
class GoogleWrapper: ProviderWrapperProtocol {
1717
var clientID: String? = {
@@ -34,15 +34,17 @@ class GoogleWrapper: ProviderWrapperProtocol {
3434

3535
let signInConfig = GIDConfiguration.init(clientID: clientID, serverClientID: googleServerClientID)
3636

37-
GIDSignIn.sharedInstance.signIn(with: signInConfig, presenting: viewController) { user, error in
37+
GIDSignIn.sharedInstance.configuration = signInConfig
38+
39+
GIDSignIn.sharedInstance.signIn(withPresenting: viewController) { user, error in
3840
guard error == nil else {
3941
completion(nil, error?.localizedDescription)
4042
return
4143
}
44+
45+
let jsonData: [String: Any] = ["idToken": user?.user.idToken?.tokenString ?? ""]
4246

43-
let jsonData = ["accessToken": user?.serverAuthCode ?? ""]
4447
completion(jsonData, nil)
45-
4648
}
4749
}
4850

example/lib/routes/login_with_credentials_page.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ class _LoginWithCredentialsPageState extends State<LoginWithCredentialsPage> {
214214
return;
215215
}
216216

217-
scaffoldState.showBottomSheet<void>(
217+
scaffoldState.showBottomSheet(
218218
(BuildContext context) => Material(
219219
color: Colors.white,
220220
elevation: 4,
@@ -276,7 +276,7 @@ class _LoginWithCredentialsPageState extends State<LoginWithCredentialsPage> {
276276
return;
277277
}
278278

279-
scaffoldState.showBottomSheet<void>(
279+
scaffoldState.showBottomSheet(
280280
(BuildContext context) => Material(
281281
color: Colors.white,
282282
elevation: 4,

example/lib/routes/one_time_password_login_page.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class _OneTimePasswordLoginPageState extends State<OneTimePasswordLoginPage> {
6060
PendingOtpVerification verification,
6161
String phone,
6262
) {
63-
_scaffoldKey.currentState?.showBottomSheet<void>((BuildContext context) {
63+
_scaffoldKey.currentState?.showBottomSheet((BuildContext context) {
6464
return Material(
6565
color: Colors.white,
6666
elevation: 4,

0 commit comments

Comments
 (0)