Skip to content
This repository has been archived by the owner on Feb 22, 2023. It is now read-only.

[google_sign_in] Add forceCodeForRefreshToken parameter platform implementations #6130

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/google_sign_in/google_sign_in_android/AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,4 @@ Aleksandr Yurkovskiy <[email protected]>
Anton Borries <[email protected]>
Alex Li <[email protected]>
Rahul Raj <[email protected]>
Twin Sun, LLC <[email protected]>
4 changes: 4 additions & 0 deletions packages/google_sign_in/google_sign_in_android/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 6.1.0

* Adds override for `GoogleSignIn.initWithParams` to handle new `forceCodeForRefreshToken` parameter.

## 6.0.1

* Updates gradle version to 7.2.1 on Android.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,15 @@ public void onMethodCall(MethodCall call, Result result) {
String hostedDomain = call.argument("hostedDomain");
String clientId = call.argument("clientId");
String serverClientId = call.argument("serverClientId");
boolean forceCodeForRefreshToken = call.argument("forceCodeForRefreshToken");
delegate.init(
result, signInOption, requestedScopes, hostedDomain, clientId, serverClientId);
result,
signInOption,
requestedScopes,
hostedDomain,
clientId,
serverClientId,
forceCodeForRefreshToken);
break;

case METHOD_SIGN_IN_SILENTLY:
Expand Down Expand Up @@ -198,7 +205,8 @@ public void init(
List<String> requestedScopes,
String hostedDomain,
String clientId,
String serverClientId);
String serverClientId,
boolean forceCodeForRefreshToken);

/**
* Returns the account information for the user who is signed in to this app. If no user is
Expand Down Expand Up @@ -326,7 +334,8 @@ public void init(
List<String> requestedScopes,
String hostedDomain,
String clientId,
String serverClientId) {
String serverClientId,
boolean forceCodeForRefreshToken) {
try {
GoogleSignInOptions.Builder optionsBuilder;

Expand Down Expand Up @@ -374,7 +383,7 @@ public void init(
}
if (!Strings.isNullOrEmpty(serverClientId)) {
optionsBuilder.requestIdToken(serverClientId);
optionsBuilder.requestServerAuthCode(serverClientId);
optionsBuilder.requestServerAuthCode(serverClientId, forceCodeForRefreshToken);
}
for (String scope : requestedScopes) {
optionsBuilder.requestScopes(new Scope(scope));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,48 @@ public void init_IgnoresClientIdIfServerClientIdIsProvided() {
initAndAssertServerClientId(methodCall, serverClientId);
}

@Test
public void init_PassesForceCodeForRefreshTokenFalseWithServerClientIdParameter() {
MethodCall methodCall = buildInitMethodCall("fakeClientId", "fakeServerClientId", false);

initAndAssertForceCodeForRefreshToken(methodCall, false);
}

@Test
public void init_PassesForceCodeForRefreshTokenTrueWithServerClientIdParameter() {
MethodCall methodCall = buildInitMethodCall("fakeClientId", "fakeServerClientId", true);

initAndAssertForceCodeForRefreshToken(methodCall, true);
}

@Test
public void init_PassesForceCodeForRefreshTokenFalseWithServerClientIdFromResources() {
final String packageName = "fakePackageName";
final String serverClientId = "fakeServerClientId";
final int resourceId = 1;
MethodCall methodCall = buildInitMethodCall(null, null, false);
when(mockContext.getPackageName()).thenReturn(packageName);
when(mockResources.getIdentifier("default_web_client_id", "string", packageName))
.thenReturn(resourceId);
when(mockContext.getString(resourceId)).thenReturn(serverClientId);

initAndAssertForceCodeForRefreshToken(methodCall, false);
}

@Test
public void init_PassesForceCodeForRefreshTokenTrueWithServerClientIdFromResources() {
final String packageName = "fakePackageName";
final String serverClientId = "fakeServerClientId";
final int resourceId = 1;
MethodCall methodCall = buildInitMethodCall(null, null, true);
when(mockContext.getPackageName()).thenReturn(packageName);
when(mockResources.getIdentifier("default_web_client_id", "string", packageName))
.thenReturn(resourceId);
when(mockContext.getString(resourceId)).thenReturn(serverClientId);

initAndAssertForceCodeForRefreshToken(methodCall, true);
}

public void initAndAssertServerClientId(MethodCall methodCall, String serverClientId) {
ArgumentCaptor<GoogleSignInOptions> optionsCaptor =
ArgumentCaptor.forClass(GoogleSignInOptions.class);
Expand All @@ -249,13 +291,39 @@ public void initAndAssertServerClientId(MethodCall methodCall, String serverClie
Assert.assertEquals(serverClientId, optionsCaptor.getValue().getServerClientId());
}

public void initAndAssertForceCodeForRefreshToken(
MethodCall methodCall, boolean forceCodeForRefreshToken) {
ArgumentCaptor<GoogleSignInOptions> optionsCaptor =
ArgumentCaptor.forClass(GoogleSignInOptions.class);
when(mockGoogleSignIn.getClient(any(Context.class), optionsCaptor.capture()))
.thenReturn(mockClient);
plugin.onMethodCall(methodCall, result);
verify(result).success(null);
Assert.assertEquals(
forceCodeForRefreshToken, optionsCaptor.getValue().isForceCodeForRefreshToken());
}

private static MethodCall buildInitMethodCall(String clientId, String serverClientId) {
return buildInitMethodCall(
"SignInOption.standard", Collections.<String>emptyList(), clientId, serverClientId);
"SignInOption.standard", Collections.<String>emptyList(), clientId, serverClientId, false);
}

private static MethodCall buildInitMethodCall(
String clientId, String serverClientId, boolean forceCodeForRefreshToken) {
return buildInitMethodCall(
"SignInOption.standard",
Collections.<String>emptyList(),
clientId,
serverClientId,
forceCodeForRefreshToken);
}

private static MethodCall buildInitMethodCall(
String signInOption, List<String> scopes, String clientId, String serverClientId) {
String signInOption,
List<String> scopes,
String clientId,
String serverClientId,
boolean forceCodeForRefreshToken) {
HashMap<String, Object> arguments = new HashMap<>();
arguments.put("signInOption", signInOption);
arguments.put("scopes", scopes);
Expand All @@ -265,6 +333,7 @@ private static MethodCall buildInitMethodCall(
if (serverClientId != null) {
arguments.put("serverClientId", serverClientId);
}
arguments.put("forceCodeForRefreshToken", forceCodeForRefreshToken);
return new MethodCall("init", arguments);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,22 @@ class GoogleSignInAndroid extends GoogleSignInPlatform {
String? hostedDomain,
String? clientId,
}) {
return initWithParams(SignInInitParameters(
signInOption: signInOption,
scopes: scopes,
hostedDomain: hostedDomain,
clientId: clientId,
));
}

@override
Future<void> initWithParams(SignInInitParameters params) {
return channel.invokeMethod<void>('init', <String, dynamic>{
'signInOption': signInOption.toString(),
'scopes': scopes,
'hostedDomain': hostedDomain,
'clientId': clientId,
'signInOption': params.signInOption.toString(),
'scopes': params.scopes,
'hostedDomain': params.hostedDomain,
'clientId': params.clientId,
'forceCodeForRefreshToken': params.forceCodeForRefreshToken,
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: google_sign_in_android
description: Android implementation of the google_sign_in plugin.
repository: https://github.com/flutter/plugins/tree/main/packages/google_sign_in/google_sign_in_android
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+google_sign_in%22
version: 6.0.1
version: 6.1.0

environment:
sdk: ">=2.14.0 <3.0.0"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,21 @@ void main() {
'scopes': <String>['two', 'scopes'],
'signInOption': 'SignInOption.games',
'clientId': 'fakeClientId',
'forceCodeForRefreshToken': false,
}),
() {
googleSignIn.initWithParams(const SignInInitParameters(
hostedDomain: 'example.com',
scopes: <String>['two', 'scopes'],
signInOption: SignInOption.games,
clientId: 'fakeClientId',
forceCodeForRefreshToken: true));
}: isMethodCall('init', arguments: <String, dynamic>{
'hostedDomain': 'example.com',
'scopes': <String>['two', 'scopes'],
'signInOption': 'SignInOption.games',
'clientId': 'fakeClientId',
'forceCodeForRefreshToken': true,
}),
() {
googleSignIn.getTokens(
Expand Down
1 change: 1 addition & 0 deletions packages/google_sign_in/google_sign_in_ios/AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,4 @@ Aleksandr Yurkovskiy <[email protected]>
Anton Borries <[email protected]>
Alex Li <[email protected]>
Rahul Raj <[email protected]>
Twin Sun, LLC <[email protected]>
4 changes: 4 additions & 0 deletions packages/google_sign_in/google_sign_in_ios/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 5.5.0

* Adds override for `GoogleSignInPlatform.initWithParams`.

## 5.4.0

* Adds support for `serverClientId` configuration option.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,25 @@ class GoogleSignInIOS extends GoogleSignInPlatform {
String? hostedDomain,
String? clientId,
}) {
if (signInOption == SignInOption.games) {
return initWithParams(SignInInitParameters(
signInOption: signInOption,
scopes: scopes,
hostedDomain: hostedDomain,
clientId: clientId,
));
}

@override
Future<void> initWithParams(SignInInitParameters params) {
if (params.signInOption == SignInOption.games) {
throw PlatformException(
code: 'unsupported-options',
message: 'Games sign in is not supported on iOS');
}
return channel.invokeMethod<void>('init', <String, dynamic>{
'scopes': scopes,
'hostedDomain': hostedDomain,
'clientId': clientId,
'scopes': params.scopes,
'hostedDomain': params.hostedDomain,
'clientId': params.clientId,
});
}

Expand Down
2 changes: 1 addition & 1 deletion packages/google_sign_in/google_sign_in_ios/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: google_sign_in_ios
description: iOS implementation of the google_sign_in plugin.
repository: https://github.com/flutter/plugins/tree/main/packages/google_sign_in/google_sign_in_ios
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+google_sign_in%22
version: 5.4.0
version: 5.5.0

environment:
sdk: ">=2.14.0 <3.0.0"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,16 @@ void main() {
'scopes': <String>['two', 'scopes'],
'clientId': 'fakeClientId',
}),
() {
googleSignIn.initWithParams(const SignInInitParameters(
hostedDomain: 'example.com',
scopes: <String>['two', 'scopes'],
clientId: 'fakeClientId'));
}: isMethodCall('init', arguments: <String, dynamic>{
'hostedDomain': 'example.com',
'scopes': <String>['two', 'scopes'],
'clientId': 'fakeClientId',
}),
() {
googleSignIn.getTokens(
email: '[email protected]', shouldRecoverAuth: false);
Expand Down