diff --git a/packages/google_sign_in/google_sign_in_android/CHANGELOG.md b/packages/google_sign_in/google_sign_in_android/CHANGELOG.md index 0117c25f07d9..4b14e9087e03 100644 --- a/packages/google_sign_in/google_sign_in_android/CHANGELOG.md +++ b/packages/google_sign_in/google_sign_in_android/CHANGELOG.md @@ -1,3 +1,9 @@ +## 7.2.11 + +* Bumps AndroidX Credentials to v1.6.0 +* Bumps Play Services Auth to v21.5.1 +* Bumps Android Identity GoogleID to v1.2.0 + ## 7.2.10 * Updates build files from Groovy to Kotlin. diff --git a/packages/google_sign_in/google_sign_in_android/android/build.gradle.kts b/packages/google_sign_in/google_sign_in_android/android/build.gradle.kts index 4ee50f996d19..3e293f1a639e 100644 --- a/packages/google_sign_in/google_sign_in_android/android/build.gradle.kts +++ b/packages/google_sign_in/google_sign_in_android/android/build.gradle.kts @@ -71,10 +71,10 @@ android { } dependencies { - implementation("androidx.credentials:credentials:1.5.0") - implementation("androidx.credentials:credentials-play-services-auth:1.5.0") - implementation("com.google.android.libraries.identity.googleid:googleid:1.1.1") - implementation("com.google.android.gms:play-services-auth:21.4.0") + implementation("androidx.credentials:credentials:1.6.0") + implementation("androidx.credentials:credentials-play-services-auth:1.6.0") + implementation("com.google.android.libraries.identity.googleid:googleid:1.2.0") + implementation("com.google.android.gms:play-services-auth:21.5.1") testImplementation("junit:junit:4.13.2") testImplementation("org.mockito:mockito-core:5.23.0") } diff --git a/packages/google_sign_in/google_sign_in_android/android/src/main/java/io/flutter/plugins/googlesignin/GoogleSignInPlugin.java b/packages/google_sign_in/google_sign_in_android/android/src/main/java/io/flutter/plugins/googlesignin/GoogleSignInPlugin.java index 505eb38ff835..aa8b5d1b2172 100644 --- a/packages/google_sign_in/google_sign_in_android/android/src/main/java/io/flutter/plugins/googlesignin/GoogleSignInPlugin.java +++ b/packages/google_sign_in/google_sign_in_android/android/src/main/java/io/flutter/plugins/googlesignin/GoogleSignInPlugin.java @@ -287,7 +287,7 @@ public void onResult(GetCredentialResponse response) { googleIdTokenCredential.getDisplayName(), googleIdTokenCredential.getFamilyName(), googleIdTokenCredential.getGivenName(), - googleIdTokenCredential.getId(), + googleIdTokenCredential.getEmail(), googleIdTokenCredential.getIdToken(), profilePictureUri == null ? null : profilePictureUri.toString()))); } else { @@ -384,7 +384,9 @@ public void authorize( } if (params.getServerClientIdForForcedRefreshToken() != null) { authorizationRequestBuilder.requestOfflineAccess( - params.getServerClientIdForForcedRefreshToken(), true); + params.getServerClientIdForForcedRefreshToken()); + // This requests a new refresh token + authorizationRequestBuilder.setPrompt(AuthorizationRequest.Prompt.CONSENT); } if (params.getAccountEmail() != null) { authorizationRequestBuilder.setAccount( diff --git a/packages/google_sign_in/google_sign_in_android/android/src/main/kotlin/io/flutter/plugins/googlesignin/Messages.kt b/packages/google_sign_in/google_sign_in_android/android/src/main/kotlin/io/flutter/plugins/googlesignin/Messages.kt index b3c7275ccfed..3243c53002e2 100644 --- a/packages/google_sign_in/google_sign_in_android/android/src/main/kotlin/io/flutter/plugins/googlesignin/Messages.kt +++ b/packages/google_sign_in/google_sign_in_android/android/src/main/kotlin/io/flutter/plugins/googlesignin/Messages.kt @@ -331,7 +331,7 @@ data class PlatformGoogleIdTokenCredential( val displayName: String? = null, val familyName: String? = null, val givenName: String? = null, - val id: String, + val email: String, val idToken: String, val profilePictureUri: String? = null ) { @@ -340,11 +340,11 @@ data class PlatformGoogleIdTokenCredential( val displayName = pigeonVar_list[0] as String? val familyName = pigeonVar_list[1] as String? val givenName = pigeonVar_list[2] as String? - val id = pigeonVar_list[3] as String + val email = pigeonVar_list[3] as String val idToken = pigeonVar_list[4] as String val profilePictureUri = pigeonVar_list[5] as String? return PlatformGoogleIdTokenCredential( - displayName, familyName, givenName, id, idToken, profilePictureUri) + displayName, familyName, givenName, email, idToken, profilePictureUri) } } @@ -353,7 +353,7 @@ data class PlatformGoogleIdTokenCredential( displayName, familyName, givenName, - id, + email, idToken, profilePictureUri, ) diff --git a/packages/google_sign_in/google_sign_in_android/android/src/test/java/io/flutter/plugins/googlesignin/GoogleSignInTest.java b/packages/google_sign_in/google_sign_in_android/android/src/test/java/io/flutter/plugins/googlesignin/GoogleSignInTest.java index 047a9d525cea..975f6b92e6d6 100644 --- a/packages/google_sign_in/google_sign_in_android/android/src/test/java/io/flutter/plugins/googlesignin/GoogleSignInTest.java +++ b/packages/google_sign_in/google_sign_in_android/android/src/test/java/io/flutter/plugins/googlesignin/GoogleSignInTest.java @@ -187,12 +187,12 @@ public void getCredential_returnsAuthenticationInfo() { final String displayName = "Jane User"; final String givenName = "Jane"; final String familyName = "User"; - final String id = "someId"; + final String email = "someEmail"; final String idToken = "idToken"; when(mockGoogleCredential.getDisplayName()).thenReturn(displayName); when(mockGoogleCredential.getGivenName()).thenReturn(givenName); when(mockGoogleCredential.getFamilyName()).thenReturn(familyName); - when(mockGoogleCredential.getId()).thenReturn(id); + when(mockGoogleCredential.getEmail()).thenReturn(email); when(mockGoogleCredential.getIdToken()).thenReturn(idToken); final Boolean[] callbackCalled = new Boolean[1]; @@ -210,7 +210,7 @@ public void getCredential_returnsAuthenticationInfo() { assertEquals(displayName, credential.getDisplayName()); assertEquals(givenName, credential.getGivenName()); assertEquals(familyName, credential.getFamilyName()); - assertEquals(id, credential.getId()); + assertEquals(email, credential.getEmail()); assertEquals(idToken, credential.getIdToken()); return null; })); @@ -833,8 +833,7 @@ public void authorize_returnsImmediateResult() { callbackCaptor .getValue() - .onSuccess( - new AuthorizationResult(serverAuthCode, accessToken, "idToken", scopes, null, null)); + .onSuccess(mockSuccessAuthorizationResult(serverAuthCode, accessToken, scopes)); assertTrue(callbackCalled[0]); } @@ -894,10 +893,7 @@ public void authorize_reportsFailureIfUnauthorizedAndNoPromptAllowed() { ArgumentCaptor.forClass(OnSuccessListener.class); verify(mockAuthorizationTask).addOnSuccessListener(callbackCaptor.capture()); - callbackCaptor - .getValue() - .onSuccess( - new AuthorizationResult(null, null, null, scopes, null, mockAuthorizationIntent)); + callbackCaptor.getValue().onSuccess(mockResolutionAuthorizationResult(mockAuthorizationIntent)); assertTrue(callbackCalled[0]); } @@ -931,10 +927,7 @@ public void authorize_reportsFailureIfUnauthorizedAndNoActivity() { ArgumentCaptor.forClass(OnSuccessListener.class); verify(mockAuthorizationTask).addOnSuccessListener(callbackCaptor.capture()); - callbackCaptor - .getValue() - .onSuccess( - new AuthorizationResult(null, null, null, scopes, null, mockAuthorizationIntent)); + callbackCaptor.getValue().onSuccess(mockResolutionAuthorizationResult(mockAuthorizationIntent)); assertTrue(callbackCalled[0]); } @@ -947,10 +940,11 @@ public void authorize_returnsPostIntentResult() { final String accessToken = "accessToken"; final String serverAuthCode = "serverAuthCode"; when(mockAuthorizationClient.authorize(any())).thenReturn(mockAuthorizationTask); + AuthorizationResult successResult = + mockSuccessAuthorizationResult(serverAuthCode, accessToken, scopes); try { when(mockAuthorizationClient.getAuthorizationResultFromIntent(any())) - .thenReturn( - new AuthorizationResult(serverAuthCode, accessToken, "idToken", scopes, null, null)); + .thenReturn(successResult); } catch (ApiException e) { fail(); } @@ -977,10 +971,7 @@ public void authorize_returnsPostIntentResult() { ArgumentCaptor> callbackCaptor = ArgumentCaptor.forClass(OnSuccessListener.class); verify(mockAuthorizationTask).addOnSuccessListener(callbackCaptor.capture()); - callbackCaptor - .getValue() - .onSuccess( - new AuthorizationResult(null, null, null, scopes, null, mockAuthorizationIntent)); + callbackCaptor.getValue().onSuccess(mockResolutionAuthorizationResult(mockAuthorizationIntent)); try { verify(mockActivity) .startIntentSenderForResult( @@ -1044,10 +1035,7 @@ public void authorize_reportsPendingIntentException() { ArgumentCaptor> callbackCaptor = ArgumentCaptor.forClass(OnSuccessListener.class); verify(mockAuthorizationTask).addOnSuccessListener(callbackCaptor.capture()); - callbackCaptor - .getValue() - .onSuccess( - new AuthorizationResult(null, null, null, scopes, null, mockAuthorizationIntent)); + callbackCaptor.getValue().onSuccess(mockResolutionAuthorizationResult(mockAuthorizationIntent)); assertTrue(callbackCalled[0]); } @@ -1087,10 +1075,7 @@ public void authorize_reportsPostIntentException() { ArgumentCaptor> callbackCaptor = ArgumentCaptor.forClass(OnSuccessListener.class); verify(mockAuthorizationTask).addOnSuccessListener(callbackCaptor.capture()); - callbackCaptor - .getValue() - .onSuccess( - new AuthorizationResult(null, null, null, scopes, null, mockAuthorizationIntent)); + callbackCaptor.getValue().onSuccess(mockResolutionAuthorizationResult(mockAuthorizationIntent)); try { verify(mockActivity) .startIntentSenderForResult( @@ -1203,4 +1188,21 @@ public void clearAuthorizationToken_callsClient() { ClearTokenRequest request = authRequestCaptor.getValue(); assertEquals(testToken, request.getToken()); } + + private AuthorizationResult mockSuccessAuthorizationResult( + String serverAuthCode, String accessToken, List scopes) { + AuthorizationResult mockResult = mock(AuthorizationResult.class); + when(mockResult.hasResolution()).thenReturn(false); + when(mockResult.getAccessToken()).thenReturn(accessToken); + when(mockResult.getServerAuthCode()).thenReturn(serverAuthCode); + when(mockResult.getGrantedScopes()).thenReturn(scopes); + return mockResult; + } + + private AuthorizationResult mockResolutionAuthorizationResult(PendingIntent pendingIntent) { + AuthorizationResult mockResult = mock(AuthorizationResult.class); + when(mockResult.hasResolution()).thenReturn(true); + when(mockResult.getPendingIntent()).thenReturn(pendingIntent); + return mockResult; + } } diff --git a/packages/google_sign_in/google_sign_in_android/lib/google_sign_in_android.dart b/packages/google_sign_in/google_sign_in_android/lib/google_sign_in_android.dart index f233d4f2a7d1..bce2bb4b9922 100644 --- a/packages/google_sign_in/google_sign_in_android/lib/google_sign_in_android.dart +++ b/packages/google_sign_in/google_sign_in_android/lib/google_sign_in_android.dart @@ -237,7 +237,7 @@ class GoogleSignInAndroid extends GoogleSignInPlatform { // Store a preliminary entry using the 'openid' scope, which in practice // always seems to be granted at authentication time, so that an account // that is authenticated but never authorized can still be disconnected. - _cachedAccounts[authnResult.credential.id] = 'openid'; + _cachedAccounts[authnResult.credential.email] = 'openid'; return authnResult.credential; } } @@ -320,7 +320,7 @@ class GoogleSignInAndroid extends GoogleSignInPlatform { // The ID should always be availabe from the token, but if for some reason // it can't be extracted, use the email address instead as a reasonable // fallback method of identifying the account. - final String email = credential.id; + final String email = credential.email; final String userId = _idFromIdToken(credential.idToken) ?? email; return AuthenticationResults( diff --git a/packages/google_sign_in/google_sign_in_android/lib/src/messages.g.dart b/packages/google_sign_in/google_sign_in_android/lib/src/messages.g.dart index 343a3c3ab1fb..f12339ef9653 100644 --- a/packages/google_sign_in/google_sign_in_android/lib/src/messages.g.dart +++ b/packages/google_sign_in/google_sign_in_android/lib/src/messages.g.dart @@ -330,7 +330,7 @@ class PlatformGoogleIdTokenCredential { this.displayName, this.familyName, this.givenName, - required this.id, + required this.email, required this.idToken, this.profilePictureUri, }); @@ -341,7 +341,7 @@ class PlatformGoogleIdTokenCredential { String? givenName; - String id; + String email; String idToken; @@ -352,7 +352,7 @@ class PlatformGoogleIdTokenCredential { displayName, familyName, givenName, - id, + email, idToken, profilePictureUri, ]; @@ -368,7 +368,7 @@ class PlatformGoogleIdTokenCredential { displayName: result[0] as String?, familyName: result[1] as String?, givenName: result[2] as String?, - id: result[3]! as String, + email: result[3]! as String, idToken: result[4]! as String, profilePictureUri: result[5] as String?, ); diff --git a/packages/google_sign_in/google_sign_in_android/pigeons/messages.dart b/packages/google_sign_in/google_sign_in_android/pigeons/messages.dart index 9a490e4fbb9f..c62508357696 100644 --- a/packages/google_sign_in/google_sign_in_android/pigeons/messages.dart +++ b/packages/google_sign_in/google_sign_in_android/pigeons/messages.dart @@ -91,7 +91,7 @@ class PlatformGoogleIdTokenCredential { String? displayName; String? familyName; String? givenName; - late String id; + late String email; late String idToken; String? profilePictureUri; } diff --git a/packages/google_sign_in/google_sign_in_android/pubspec.yaml b/packages/google_sign_in/google_sign_in_android/pubspec.yaml index ead6b61afa4a..67825c83a646 100644 --- a/packages/google_sign_in/google_sign_in_android/pubspec.yaml +++ b/packages/google_sign_in/google_sign_in_android/pubspec.yaml @@ -2,7 +2,7 @@ name: google_sign_in_android description: Android implementation of the google_sign_in plugin. repository: https://github.com/flutter/packages/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: 7.2.10 +version: 7.2.11 environment: sdk: ^3.9.0 diff --git a/packages/google_sign_in/google_sign_in_android/test/google_sign_in_android_test.dart b/packages/google_sign_in/google_sign_in_android/test/google_sign_in_android_test.dart index e13e26c41396..e275159c7664 100644 --- a/packages/google_sign_in/google_sign_in_android/test/google_sign_in_android_test.dart +++ b/packages/google_sign_in/google_sign_in_android/test/google_sign_in_android_test.dart @@ -40,7 +40,7 @@ void main() { provideDummy( GetCredentialSuccess( - credential: PlatformGoogleIdTokenCredential(id: '', idToken: ''), + credential: PlatformGoogleIdTokenCredential(email: '', idToken: ''), ), ); provideDummy( @@ -126,7 +126,7 @@ void main() { credential: PlatformGoogleIdTokenCredential( displayName: _testUser.displayName, profilePictureUri: _testUser.photoUrl, - id: _testUser.email, + email: _testUser.email, idToken: _testAuthnToken.idToken!, ), ), @@ -284,7 +284,7 @@ void main() { credential: PlatformGoogleIdTokenCredential( displayName: _testUser.displayName, profilePictureUri: _testUser.photoUrl, - id: _testUser.email, + email: _testUser.email, idToken: _testAuthnToken.idToken!, ), ), @@ -992,7 +992,7 @@ void main() { credential: PlatformGoogleIdTokenCredential( displayName: _testUser.displayName, profilePictureUri: _testUser.photoUrl, - id: _testUser.email, + email: _testUser.email, idToken: _testAuthnToken.idToken!, ), ),