[google_sign_in] Adds support to send `clientId` as a parameter (#3640)

diff --git a/packages/google_sign_in/google_sign_in/CHANGELOG.md b/packages/google_sign_in/google_sign_in/CHANGELOG.md
index 57d1c9b..429b07b 100644
--- a/packages/google_sign_in/google_sign_in/CHANGELOG.md
+++ b/packages/google_sign_in/google_sign_in/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 5.0.1
+
+* Update platforms `init` function to prioritize `clientId` property when available;
+* Updates `google_sign_in_platform_interface` version.
+
 ## 5.0.0
 
 * Migrate to null safety.
diff --git a/packages/google_sign_in/google_sign_in/android/src/main/java/io/flutter/plugins/googlesignin/GoogleSignInPlugin.java b/packages/google_sign_in/google_sign_in/android/src/main/java/io/flutter/plugins/googlesignin/GoogleSignInPlugin.java
index f6673e5..eb3a3d0 100755
--- a/packages/google_sign_in/google_sign_in/android/src/main/java/io/flutter/plugins/googlesignin/GoogleSignInPlugin.java
+++ b/packages/google_sign_in/google_sign_in/android/src/main/java/io/flutter/plugins/googlesignin/GoogleSignInPlugin.java
@@ -136,7 +136,8 @@
         String signInOption = call.argument("signInOption");
         List<String> requestedScopes = call.argument("scopes");
         String hostedDomain = call.argument("hostedDomain");
-        delegate.init(result, signInOption, requestedScopes, hostedDomain);
+        String clientId = call.argument("clientId");
+        delegate.init(result, signInOption, requestedScopes, hostedDomain, clientId);
         break;
 
       case METHOD_SIGN_IN_SILENTLY:
@@ -188,7 +189,11 @@
   public interface IDelegate {
     /** Initializes this delegate so that it is ready to perform other operations. */
     public void init(
-        Result result, String signInOption, List<String> requestedScopes, String hostedDomain);
+        Result result,
+        String signInOption,
+        List<String> requestedScopes,
+        String hostedDomain,
+        String clientId);
 
     /**
      * Returns the account information for the user who is signed in to this app. If no user is
@@ -309,7 +314,11 @@
      */
     @Override
     public void init(
-        Result result, String signInOption, List<String> requestedScopes, String hostedDomain) {
+        Result result,
+        String signInOption,
+        List<String> requestedScopes,
+        String hostedDomain,
+        String clientId) {
       try {
         GoogleSignInOptions.Builder optionsBuilder;
 
@@ -334,7 +343,10 @@
             context
                 .getResources()
                 .getIdentifier("default_web_client_id", "string", context.getPackageName());
-        if (clientIdIdentifier != 0) {
+        if (!Strings.isNullOrEmpty(clientId)) {
+          optionsBuilder.requestIdToken(clientId);
+          optionsBuilder.requestServerAuthCode(clientId);
+        } else if (clientIdIdentifier != 0) {
           optionsBuilder.requestIdToken(context.getString(clientIdIdentifier));
           optionsBuilder.requestServerAuthCode(context.getString(clientIdIdentifier));
         }
diff --git a/packages/google_sign_in/google_sign_in/example/lib/main.dart b/packages/google_sign_in/google_sign_in/example/lib/main.dart
index e003225..c870632 100755
--- a/packages/google_sign_in/google_sign_in/example/lib/main.dart
+++ b/packages/google_sign_in/google_sign_in/example/lib/main.dart
@@ -12,6 +12,8 @@
 import 'package:google_sign_in/google_sign_in.dart';
 
 GoogleSignIn _googleSignIn = GoogleSignIn(
+  // Optional clientId
+  // clientId: '479882132969-9i9aqik3jfjd7qhci1nqf0bm2g71rm1u.apps.googleusercontent.com',
   scopes: <String>[
     'email',
     'https://www.googleapis.com/auth/contacts.readonly',
diff --git a/packages/google_sign_in/google_sign_in/ios/Classes/FLTGoogleSignInPlugin.m b/packages/google_sign_in/google_sign_in/ios/Classes/FLTGoogleSignInPlugin.m
index 660a322..fdc6e31 100644
--- a/packages/google_sign_in/google_sign_in/ios/Classes/FLTGoogleSignInPlugin.m
+++ b/packages/google_sign_in/google_sign_in/ios/Classes/FLTGoogleSignInPlugin.m
@@ -77,7 +77,15 @@
                                                        ofType:@"plist"];
       if (path) {
         NSMutableDictionary *plist = [[NSMutableDictionary alloc] initWithContentsOfFile:path];
-        [GIDSignIn sharedInstance].clientID = plist[kClientIdKey];
+        BOOL hasDynamicClientId =
+            [[call.arguments valueForKey:@"clientId"] isKindOfClass:[NSString class]];
+
+        if (hasDynamicClientId) {
+          [GIDSignIn sharedInstance].clientID = [call.arguments valueForKey:@"clientId"];
+        } else {
+          [GIDSignIn sharedInstance].clientID = plist[kClientIdKey];
+        }
+
         [GIDSignIn sharedInstance].serverClientID = plist[kServerClientIdKey];
         [GIDSignIn sharedInstance].scopes = call.arguments[@"scopes"];
         [GIDSignIn sharedInstance].hostedDomain = call.arguments[@"hostedDomain"];
diff --git a/packages/google_sign_in/google_sign_in/pubspec.yaml b/packages/google_sign_in/google_sign_in/pubspec.yaml
index 06fa12c..23f2588 100644
--- a/packages/google_sign_in/google_sign_in/pubspec.yaml
+++ b/packages/google_sign_in/google_sign_in/pubspec.yaml
@@ -2,7 +2,7 @@
 description: Flutter plugin for Google Sign-In, a secure authentication system
   for signing in with a Google account on Android and iOS.
 homepage: https://github.com/flutter/plugins/tree/master/packages/google_sign_in/google_sign_in
-version: 5.0.0
+version: 5.0.1
 
 flutter:
   plugin:
@@ -16,7 +16,7 @@
         default_package: google_sign_in_web
 
 dependencies:
-  google_sign_in_platform_interface: ^2.0.0
+  google_sign_in_platform_interface: ^2.0.1
   google_sign_in_web: ^0.10.0
   flutter:
     sdk: flutter
diff --git a/packages/google_sign_in/google_sign_in/test/google_sign_in_test.dart b/packages/google_sign_in/google_sign_in/test/google_sign_in_test.dart
index 79fa74a..4eb45a5 100755
--- a/packages/google_sign_in/google_sign_in/test/google_sign_in_test.dart
+++ b/packages/google_sign_in/google_sign_in/test/google_sign_in_test.dart
@@ -82,6 +82,25 @@
       );
     });
 
+    test('signIn prioritize clientId parameter when available', () async {
+      final fakeClientId = 'fakeClientId';
+      googleSignIn = GoogleSignIn(clientId: fakeClientId);
+      await googleSignIn.signIn();
+      expect(googleSignIn.currentUser, isNotNull);
+      expect(
+        log,
+        <Matcher>[
+          isMethodCall('init', arguments: <String, dynamic>{
+            'signInOption': 'SignInOption.standard',
+            'scopes': <String>[],
+            'hostedDomain': null,
+            'clientId': fakeClientId,
+          }),
+          isMethodCall('signIn', arguments: null),
+        ],
+      );
+    });
+
     test('signOut', () async {
       await googleSignIn.signOut();
       expect(googleSignIn.currentUser, isNull);