[cronet_http] Enables CI for `cronet_http_embedded` (#1070)

diff --git a/.github/workflows/cronet.yml b/.github/workflows/cronet.yml
index 7bc1a4f..37e38d5 100644
--- a/.github/workflows/cronet.yml
+++ b/.github/workflows/cronet.yml
@@ -6,10 +6,12 @@
       - main
       - master
     paths:
+      - '.github/workflows/**'
       - 'pkgs/cronet_http/**'
       - 'pkgs/http_client_conformance_tests/**'
   pull_request:
     paths:
+      - '.github/workflows/**'
       - 'pkgs/cronet_http/**'
       - 'pkgs/http_client_conformance_tests/**'
   schedule:
@@ -19,34 +21,12 @@
   PUB_ENVIRONMENT: bot.github
 
 jobs:
-  analyze:
-    name: Lint and static analysis
-    runs-on: ubuntu-latest
-    defaults:
-      run:
-        working-directory: pkgs/cronet_http
-    steps:
-      - uses: actions/checkout@v4
-      - uses: subosito/flutter-action@v2
-        with:
-          # TODO: Change to 'stable' when a release version of flutter
-          # pins version 1.21.1 or later of 'package:test'
-          channel: 'master'
-      - id: install
-        name: Install dependencies
-        run: flutter pub get
-      - name: Check formatting
-        run: dart format --output=none --set-exit-if-changed .
-        if: always() && steps.install.outcome == 'success'
-      - name: Analyze code
-        run: flutter analyze --fatal-infos
-        if: always() && steps.install.outcome == 'success'
-
-  test:
-    # Test package:cupertino_http use flutter integration tests.
-    needs: analyze
-    name: "Build and test"
+  verify:
+    name: Format & Analyze & Test
     runs-on: macos-latest
+    strategy:
+      matrix:
+        package: ['cronet_http', 'cronet_http_embedded']
     steps:
       - uses: actions/checkout@v4
       - uses: actions/setup-java@v4
@@ -56,11 +36,30 @@
       - uses: subosito/flutter-action@v2
         with:
           channel: 'stable'
+      - name: Make cronet_http_embedded copy
+        if: ${{ matrix.package == 'cronet_http_embedded' }}
+        run: |
+          cp -r pkgs/cronet_http pkgs/cronet_http_embedded
+          cd pkgs/cronet_http_embedded
+          flutter pub get && dart tool/prepare_for_embedded.dart
+      - id: install
+        name: Install dependencies
+        working-directory: 'pkgs/${{ matrix.package }}'
+        run: flutter pub get
+      - name: Check formatting
+        working-directory: 'pkgs/${{ matrix.package }}'
+        run: dart format --output=none --set-exit-if-changed .
+        if: always() && steps.install.outcome == 'success'
+      - name: Analyze code
+        working-directory: 'pkgs/${{ matrix.package }}'
+        run: flutter analyze --fatal-infos
+        if: always() && steps.install.outcome == 'success'
       - name: Run tests
         uses: reactivecircus/android-emulator-runner@v2
+        if: always() && steps.install.outcome == 'success'
         with:
           api-level: 28
-          target: playstore
+          target: ${{ matrix.package == 'cronet_http_embedded' && 'default' || 'playstore' }}
           arch: x86_64
           profile: pixel
-          script: cd ./pkgs/cronet_http/example && flutter test --timeout=1200s integration_test/
+          script: cd 'pkgs/${{ matrix.package }}/example' && flutter test --timeout=1200s integration_test/
diff --git a/pkgs/cronet_http/android/build.gradle b/pkgs/cronet_http/android/build.gradle
index 3a91d8a..164d96e 100644
--- a/pkgs/cronet_http/android/build.gradle
+++ b/pkgs/cronet_http/android/build.gradle
@@ -2,14 +2,14 @@
 version '1.0-SNAPSHOT'
 
 buildscript {
-    ext.kotlin_version = '1.6.10'
+    ext.kotlin_version = '1.7.21'
     repositories {
         google()
         mavenCentral()
     }
 
     dependencies {
-        classpath 'com.android.tools.build:gradle:7.1.2'
+        classpath 'com.android.tools.build:gradle:7.4.2'
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
     }
 }
@@ -25,6 +25,11 @@
 apply plugin: 'kotlin-android'
 
 android {
+    // Conditional for compatibility with AGP <4.2.
+    if (project.android.hasProperty("namespace")) {
+        namespace 'io.flutter.plugins.cronet_http'
+    }
+
     compileSdkVersion 31
 
     compileOptions {
@@ -41,7 +46,7 @@
     }
 
     defaultConfig {
-        minSdkVersion 16
+        minSdkVersion 19
     }
 
     defaultConfig {
diff --git a/pkgs/cronet_http/example/android/app/build.gradle b/pkgs/cronet_http/example/android/app/build.gradle
index 88b3356..02e4b75 100644
--- a/pkgs/cronet_http/example/android/app/build.gradle
+++ b/pkgs/cronet_http/example/android/app/build.gradle
@@ -46,7 +46,7 @@
         applicationId "io.flutter.cronet_http_example"
         // You can update the following values to match your application needs.
         // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
-        minSdkVersion flutter.minSdkVersion
+        minSdkVersion 21
         targetSdkVersion flutter.targetSdkVersion
         versionCode flutterVersionCode.toInteger()
         versionName flutterVersionName
diff --git a/pkgs/cronet_http/example/android/app/src/debug/AndroidManifest.xml b/pkgs/cronet_http/example/android/app/src/debug/AndroidManifest.xml
index b17be9f..6170951 100644
--- a/pkgs/cronet_http/example/android/app/src/debug/AndroidManifest.xml
+++ b/pkgs/cronet_http/example/android/app/src/debug/AndroidManifest.xml
@@ -1,4 +1,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.example.cronet_http_example">
+    package="io.flutter.cronet_http_example">
     <uses-permission android:name="android.permission.INTERNET"/>
 </manifest>
diff --git a/pkgs/cronet_http/example/android/app/src/main/AndroidManifest.xml b/pkgs/cronet_http/example/android/app/src/main/AndroidManifest.xml
index e8d5f3f..254760d 100644
--- a/pkgs/cronet_http/example/android/app/src/main/AndroidManifest.xml
+++ b/pkgs/cronet_http/example/android/app/src/main/AndroidManifest.xml
@@ -1,5 +1,5 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.example.cronet_http_example">
+    package="io.flutter.cronet_http_example">
     <uses-permission android:name="android.permission.INTERNET"/>
    <application
         android:label="cronet_http_example"
diff --git a/pkgs/cronet_http/example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/pkgs/cronet_http/example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java
index 90015fd..3772f02 100644
--- a/pkgs/cronet_http/example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java
+++ b/pkgs/cronet_http/example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java
@@ -16,14 +16,24 @@
   private static final String TAG = "GeneratedPluginRegistrant";
   public static void registerWith(@NonNull FlutterEngine flutterEngine) {
     try {
-      flutterEngine.getPlugins().add(new io.flutter.plugins.cronet_http.CronetHttpPlugin());
-    } catch(Exception e) {
-      Log.e(TAG, "Error registering plugin cronet_http, io.flutter.plugins.cronet_http.CronetHttpPlugin", e);
+      flutterEngine.getPlugins().add(new dev.flutter.plugins.integration_test.IntegrationTestPlugin());
+    } catch (Exception e) {
+      Log.e(TAG, "Error registering plugin integration_test, dev.flutter.plugins.integration_test.IntegrationTestPlugin", e);
     }
     try {
-      flutterEngine.getPlugins().add(new dev.flutter.plugins.integration_test.IntegrationTestPlugin());
-    } catch(Exception e) {
-      Log.e(TAG, "Error registering plugin integration_test, dev.flutter.plugins.integration_test.IntegrationTestPlugin", e);
+      flutterEngine.getPlugins().add(new com.github.dart_lang.jni.JniPlugin());
+    } catch (Exception e) {
+      Log.e(TAG, "Error registering plugin jni, com.github.dart_lang.jni.JniPlugin", e);
+    }
+    try {
+      flutterEngine.getPlugins().add(new io.flutter.plugins.pathprovider.PathProviderPlugin());
+    } catch (Exception e) {
+      Log.e(TAG, "Error registering plugin path_provider_android, io.flutter.plugins.pathprovider.PathProviderPlugin", e);
+    }
+    try {
+      flutterEngine.getPlugins().add(new com.tekartik.sqflite.SqflitePlugin());
+    } catch (Exception e) {
+      Log.e(TAG, "Error registering plugin sqflite, com.tekartik.sqflite.SqflitePlugin", e);
     }
   }
 }
diff --git a/pkgs/cronet_http/example/android/app/src/main/kotlin/com/example/cronet_http_example/MainActivity.kt b/pkgs/cronet_http/example/android/app/src/main/kotlin/io/flutter/cronet_http_example/MainActivity.kt
similarity index 70%
rename from pkgs/cronet_http/example/android/app/src/main/kotlin/com/example/cronet_http_example/MainActivity.kt
rename to pkgs/cronet_http/example/android/app/src/main/kotlin/io/flutter/cronet_http_example/MainActivity.kt
index 2688c93..97b07c8 100644
--- a/pkgs/cronet_http/example/android/app/src/main/kotlin/com/example/cronet_http_example/MainActivity.kt
+++ b/pkgs/cronet_http/example/android/app/src/main/kotlin/io/flutter/cronet_http_example/MainActivity.kt
@@ -1,4 +1,4 @@
-package com.example.cronet_http_example
+package io.flutter.cronet_http_example
 
 import io.flutter.embedding.android.FlutterActivity
 
diff --git a/pkgs/cronet_http/example/android/app/src/profile/AndroidManifest.xml b/pkgs/cronet_http/example/android/app/src/profile/AndroidManifest.xml
index b17be9f..6170951 100644
--- a/pkgs/cronet_http/example/android/app/src/profile/AndroidManifest.xml
+++ b/pkgs/cronet_http/example/android/app/src/profile/AndroidManifest.xml
@@ -1,4 +1,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.example.cronet_http_example">
+    package="io.flutter.cronet_http_example">
     <uses-permission android:name="android.permission.INTERNET"/>
 </manifest>
diff --git a/pkgs/cronet_http/example/android/build.gradle b/pkgs/cronet_http/example/android/build.gradle
index 83ae220..954fa1c 100644
--- a/pkgs/cronet_http/example/android/build.gradle
+++ b/pkgs/cronet_http/example/android/build.gradle
@@ -1,12 +1,12 @@
 buildscript {
-    ext.kotlin_version = '1.6.10'
+    ext.kotlin_version = '1.7.21'
     repositories {
         google()
         mavenCentral()
     }
 
     dependencies {
-        classpath 'com.android.tools.build:gradle:7.1.2'
+        classpath 'com.android.tools.build:gradle:7.4.2'
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
     }
 }
@@ -26,6 +26,6 @@
     project.evaluationDependsOn(':app')
 }
 
-task clean(type: Delete) {
+tasks.register("clean", Delete) {
     delete rootProject.buildDir
 }
diff --git a/pkgs/cronet_http/example/android/gradle/wrapper/gradle-wrapper.properties b/pkgs/cronet_http/example/android/gradle/wrapper/gradle-wrapper.properties
index cc5527d..cfe88f6 100644
--- a/pkgs/cronet_http/example/android/gradle/wrapper/gradle-wrapper.properties
+++ b/pkgs/cronet_http/example/android/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip
diff --git a/pkgs/cronet_http/tool/prepare_for_embedded.dart b/pkgs/cronet_http/tool/prepare_for_embedded.dart
index e0f99d7..2093c67 100644
--- a/pkgs/cronet_http/tool/prepare_for_embedded.dart
+++ b/pkgs/cronet_http/tool/prepare_for_embedded.dart
@@ -40,7 +40,9 @@
   'android/maven2/org/chromium/net/group-index.xml',
 );
 
-void main() async {
+/// Runs `prepare_for_embedded.dart publish` for publishing,
+/// or only the Android dependency will be modified.
+void main(List<String> args) async {
   if (Directory.current.path.endsWith('tool')) {
     _packageDirectory = Directory.current.parent;
   } else {
@@ -51,6 +53,8 @@
   updateCronetDependency(latestVersion);
   updatePubSpec();
   updateReadme();
+  updateImports();
+  updateEntryPoint();
 }
 
 Future<String> _getLatestCronetVersion() async {
@@ -69,7 +73,7 @@
   return versions.last;
 }
 
-/// Update android/build.gradle
+/// Update android/build.gradle.
 void updateCronetDependency(String latestVersion) {
   final fBuildGradle = File('${_packageDirectory.path}/android/build.gradle');
   final gradleContent = fBuildGradle.readAsStringSync();
@@ -88,18 +92,48 @@
   fBuildGradle.writeAsStringSync(newGradleContent);
 }
 
-/// Update pubspec.yaml
+/// Update pubspec.yaml and example/pubspec.yaml.
 void updatePubSpec() {
+  print('Updating pubspec.yaml');
   final fPubspec = File('${_packageDirectory.path}/pubspec.yaml');
   final yamlEditor = YamlEditor(fPubspec.readAsStringSync())
     ..update(['name'], _packageName)
     ..update(['description'], _packageDescription);
   fPubspec.writeAsStringSync(yamlEditor.toString());
+  print('Updating example/pubspec.yaml');
+  final examplePubspec = File('${_packageDirectory.path}/example/pubspec.yaml');
+  final replaced = examplePubspec
+      .readAsStringSync()
+      .replaceAll('cronet_http:', 'cronet_http_embedded:');
+  examplePubspec.writeAsStringSync(replaced);
 }
 
-/// Move README_EMBEDDED.md to replace README.md
+/// Move README_EMBEDDED.md to replace README.md.
 void updateReadme() {
+  print('Updating README.md from README_EMBEDDED.md');
   File('${_packageDirectory.path}/README.md').deleteSync();
   File('${_packageDirectory.path}/README_EMBEDDED.md')
       .renameSync('${_packageDirectory.path}/README.md');
 }
+
+void updateImports() {
+  print('Updating imports in Dart files');
+  for (final file in _packageDirectory.listSync(recursive: true)) {
+    if (file is File && file.path.endsWith('.dart')) {
+      final updatedSource = file.readAsStringSync().replaceAll(
+            'package:cronet_http/cronet_http.dart',
+            'package:cronet_http_embedded/cronet_http_embedded.dart',
+          );
+      file.writeAsStringSync(updatedSource);
+    }
+  }
+}
+
+void updateEntryPoint() {
+  print('Renaming cronet_http.dart to cronet_http_embedded.dart');
+  File(
+    '${_packageDirectory.path}/lib/cronet_http.dart',
+  ).renameSync(
+    '${_packageDirectory.path}/lib/cronet_http_embedded.dart',
+  );
+}