Timeout for VM start

This prevent the terminal from hanging forever when it somehow fails to
connect to the VM.

Bug: 400197809
Bug: 400906513
Test: relace the timeout value to a small number (2 sec), and observe
that the error activity pops up.
Change-Id: Iea871eaa766bcfa718ab22dcc7d7f2ce01069fac

Change-Id: Ibf26ea68dde43922dcc908f00d02d87ebc338897
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.kt b/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.kt
index 345e8dd..94b7011 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.kt
@@ -63,6 +63,7 @@
 import java.util.concurrent.CompletableFuture
 import java.util.concurrent.ExecutorService
 import java.util.concurrent.Executors
+import java.util.concurrent.TimeUnit
 
 class VmLauncherService : Service() {
     inner class VmLauncherServiceBinder : android.os.Binder() {
@@ -246,6 +247,15 @@
                 },
                 executorService,
             )
+            .exceptionallyAsync(
+                { e ->
+                    Log.e(TAG, "Failed to start VM", e)
+                    resultReceiver!!.send(RESULT_ERROR, null)
+                    stopSelf()
+                    null
+                },
+                executorService,
+            )
 
         return START_NOT_STICKY
     }
@@ -282,6 +292,8 @@
                 }
             },
         )
+
+        resolvedInfo.orTimeout(VM_BOOT_TIMEOUT_SECONDS.toLong(), TimeUnit.SECONDS)
         return resolvedInfo
     }
 
@@ -467,6 +479,8 @@
         private const val KEY_TERMINAL_IPADDRESS = "address"
         private const val KEY_TERMINAL_PORT = "port"
 
+        private const val VM_BOOT_TIMEOUT_SECONDS = 20
+
         private const val INITIAL_MEM_BALLOON_PERCENT = 10
         private const val MAX_MEM_BALLOON_PERCENT = 50
         private const val MEM_BALLOON_INFLATE_INTERVAL_MILLIS = 60000L