[deep link] Call validatedomain rpc by batch = 500 (#7233)

* Update deep_links_services.dart

* Update deep_links_services.dart
diff --git a/packages/devtools_app/lib/src/screens/deep_link_validation/deep_links_services.dart b/packages/devtools_app/lib/src/screens/deep_link_validation/deep_links_services.dart
index 3edf4eb..02c6392 100644
--- a/packages/devtools_app/lib/src/screens/deep_link_validation/deep_links_services.dart
+++ b/packages/devtools_app/lib/src/screens/deep_link_validation/deep_links_services.dart
@@ -24,6 +24,7 @@
 const String _checkNameKey = 'checkName';
 const String _failedChecksKey = 'failedChecks';
 const String _generatedContentKey = 'generatedContent';
+const int _domainBatchSize = 500;
 
 const Map<String, DomainError> checkNameToDomainError = {
   'EXISTENCE': DomainError.existence,
@@ -47,36 +48,50 @@
     required List<String> domains,
     required String applicationId,
   }) async {
-    final response = await http.post(
-      Uri.parse(_androidDomainValidationURL),
-      headers: postHeader,
-      body: jsonEncode({
-        _packageNameKey: applicationId,
-        _appLinkDomainsKey: domains,
-      }),
-    );
-
-    final Map<String, dynamic> result =
-        json.decode(response.body) as Map<String, dynamic>;
-
     final domainErrors = <String, List<DomainError>>{
       for (var domain in domains) domain: <DomainError>[],
     };
 
-    final validationResult = result[_validationResultKey] as List;
-    for (final Map<String, dynamic> domainResult in validationResult) {
-      final String domainName = domainResult[_domainNameKey];
-      final List? failedChecks = domainResult[_failedChecksKey];
-      if (failedChecks != null) {
-        for (final Map<String, dynamic> failedCheck in failedChecks) {
-          final checkName = failedCheck[_checkNameKey];
-          final domainError = checkNameToDomainError[checkName];
-          if (domainError != null) {
-            domainErrors[domainName]!.add(domainError);
+    // The request can take 1000 domains at most, make a few calls in serial with a batch of _domainBatchSize.
+    final List<List<String>> domainsBybatch = List.generate(
+      (domains.length / _domainBatchSize).ceil(),
+      (index) => domains.sublist(
+        index * _domainBatchSize,
+        (index + 1) * _domainBatchSize > domains.length
+            ? domains.length
+            : (index + 1) * _domainBatchSize,
+      ),
+    );
+
+    for (final domainList in domainsBybatch) {
+      final response = await http.post(
+        Uri.parse(_androidDomainValidationURL),
+        headers: postHeader,
+        body: jsonEncode({
+          _packageNameKey: applicationId,
+          _appLinkDomainsKey: domainList,
+        }),
+      );
+
+      final Map<String, dynamic> result =
+          json.decode(response.body) as Map<String, dynamic>;
+
+      final validationResult = result[_validationResultKey] as List;
+      for (final Map<String, dynamic> domainResult in validationResult) {
+        final String domainName = domainResult[_domainNameKey];
+        final List? failedChecks = domainResult[_failedChecksKey];
+        if (failedChecks != null) {
+          for (final Map<String, dynamic> failedCheck in failedChecks) {
+            final checkName = failedCheck[_checkNameKey];
+            final domainError = checkNameToDomainError[checkName];
+            if (domainError != null) {
+              domainErrors[domainName]!.add(domainError);
+            }
           }
         }
       }
     }
+
     return domainErrors;
   }