Skip to content

Commit

Permalink
[google_sign_in] Add forceCodeForRefreshToken parameter platform impl…
Browse files Browse the repository at this point in the history
…ementations (flutter#6130)
  • Loading branch information
fbcouch authored and Adam Harwood committed Nov 3, 2022
1 parent d272227 commit 35530f2
Show file tree
Hide file tree
Showing 12 changed files with 150 additions and 16 deletions.
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

0 comments on commit 35530f2

Please sign in to comment.