(experimental) Enable VirGL if the flag file exists

If `/sdcard/linux/virglrenderer` exists, it overrides GPU config with
VirGL

Bug: 380366206
Test: create /sdcard/linux/virglrenderer and check crosvm params
Change-Id: I3e4907d2b5f98b8f6309894509334a0d61562b0e
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/ImageArchive.java b/android/TerminalApp/java/com/android/virtualization/terminal/ImageArchive.java
index 12f485a..c4d11e8 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/ImageArchive.java
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/ImageArchive.java
@@ -58,10 +58,13 @@
         mPath = path;
     }
 
+    public static Path getSdcardPathForTesting() {
+        return Environment.getExternalStoragePublicDirectory(DIR_IN_SDCARD).toPath();
+    }
+
     /** Creates ImageArchive which is located in the sdcard. This archive is for testing only. */
     public static ImageArchive fromSdCard() {
-        Path dir = Environment.getExternalStoragePublicDirectory(DIR_IN_SDCARD).toPath();
-        Path file = dir.resolve(ARCHIVE_NAME);
+        Path file = getSdcardPathForTesting().resolve(ARCHIVE_NAME);
         return new ImageArchive(file);
     }
 
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.java b/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.java
index 879b5e5..b8a427c 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.java
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.java
@@ -35,6 +35,7 @@
 import android.system.virtualmachine.VirtualMachineCustomImageConfig.Disk;
 import android.system.virtualmachine.VirtualMachineException;
 import android.util.Log;
+import android.widget.Toast;
 
 import io.grpc.Grpc;
 import io.grpc.InsecureServerCredentials;
@@ -156,9 +157,7 @@
         VirtualMachineConfig.Builder configBuilder = json.toConfigBuilder(this);
         VirtualMachineCustomImageConfig.Builder customImageConfigBuilder =
                 json.toCustomImageConfigBuilder(this);
-        Path backupFile = InstallUtils.getBackupFile(this);
-        if (Files.exists(backupFile)) {
-            customImageConfigBuilder.addDisk(Disk.RWDisk(backupFile.toString()));
+        if (overrideConfigIfNecessary(customImageConfigBuilder)) {
             configBuilder.setCustomImageConfig(customImageConfigBuilder.build());
         }
         VirtualMachineConfig config = configBuilder.build();
@@ -202,6 +201,32 @@
         return START_NOT_STICKY;
     }
 
+    private boolean overrideConfigIfNecessary(VirtualMachineCustomImageConfig.Builder builder) {
+        boolean changed = false;
+        // TODO: check if ANGLE is enabled for the app.
+        if (Files.exists(ImageArchive.getSdcardPathForTesting().resolve("virglrenderer"))) {
+            builder.setGpuConfig(
+                    new VirtualMachineCustomImageConfig.GpuConfig.Builder()
+                            .setBackend("virglrenderer")
+                            .setRendererUseEgl(true)
+                            .setRendererUseGles(true)
+                            .setRendererUseGlx(false)
+                            .setRendererUseSurfaceless(true)
+                            .setRendererUseVulkan(false)
+                            .setContextTypes(new String[] {"virgl2"})
+                            .build());
+            Toast.makeText(this, R.string.virgl_enabled, Toast.LENGTH_SHORT).show();
+            changed = true;
+        }
+
+        Path backupFile = InstallUtils.getBackupFile(this);
+        if (Files.exists(backupFile)) {
+            builder.addDisk(Disk.RWDisk(backupFile.toString()));
+            changed = true;
+        }
+        return changed;
+    }
+
     private void startDebianServer() {
         ServerInterceptor interceptor =
                 new ServerInterceptor() {
diff --git a/android/TerminalApp/res/values/strings.xml b/android/TerminalApp/res/values/strings.xml
index 851eaab..da8ca84 100644
--- a/android/TerminalApp/res/values/strings.xml
+++ b/android/TerminalApp/res/values/strings.xml
@@ -132,4 +132,7 @@
     <string name="service_notification_content">Click to open the terminal</string>
     <!-- Notification action button for closing the virtual machine [CHAR LIMIT=20] -->
     <string name="service_notification_quit_action">Close</string>
+
+    <!-- VirGL is the name of hardware acceleration for VM, the name is supposed not to be translated. [CHAR LIMIT=20] -->
+    <string name="virgl_enabled">VirGL is enabled</string>
 </resources>
diff --git a/docs/custom_vm.md b/docs/custom_vm.md
index eaff2a4..7597131 100644
--- a/docs/custom_vm.md
+++ b/docs/custom_vm.md
@@ -42,4 +42,8 @@
 (or `localhost:6080` if port forwarding is enabled.)
 
 `weston` with VNC backend might be another option, but it isn't available in
-Debian package repository for bookworm.
\ No newline at end of file
+Debian package repository for bookworm.
+
+## Hardware accelration
+If the file `/sdcard/linux/virglrenderer` exists on the device, it enables VirGL for VM.
+This requires enabling ANGLE for the Terminal app. (https://chromium.googlesource.com/angle/angle.git/+/HEAD/doc/DevSetupAndroid.md)