Don't configure input in crosvm when running without frontend

Test: run locally
Bug: 132114593
Change-Id: I87eae110a21ade507207ffbe383be729fa98de8c
diff --git a/host/commands/launch/launch.cc b/host/commands/launch/launch.cc
index e5f6d37..7d8892d 100644
--- a/host/commands/launch/launch.cc
+++ b/host/commands/launch/launch.cc
@@ -262,7 +262,7 @@
   return server;
 }
 
-void LaunchVNCServerIfEnabled(const vsoc::CuttlefishConfig& config,
+bool LaunchVNCServerIfEnabled(const vsoc::CuttlefishConfig& config,
                               cvd::ProcessMonitor* process_monitor,
                               std::function<bool(MonitorEntry*)> callback) {
   if (config.enable_vnc_server()) {
@@ -276,14 +276,14 @@
       // crosvm)
       auto touch_server = CreateVncInputServer(config.touch_socket_path());
       if (!touch_server->IsOpen()) {
-        return;
+        return false;
       }
       vnc_server.AddParameter("-touch_fd=", touch_server);
 
       auto keyboard_server =
           CreateVncInputServer(config.keyboard_socket_path());
       if (!keyboard_server->IsOpen()) {
-        return;
+        return false;
       }
       vnc_server.AddParameter("-keyboard_fd=", keyboard_server);
       // TODO(b/128852363): This should be handled through the wayland mock
@@ -293,12 +293,14 @@
       auto frames_server =
           cvd::SharedFD::VsockServer(config.frames_vsock_port(), SOCK_STREAM);
       if (!frames_server->IsOpen()) {
-        return;
+        return false;
       }
       vnc_server.AddParameter("-frame_server_fd=", frames_server);
     }
     process_monitor->StartSubprocess(std::move(vnc_server), callback);
+    return true;
   }
+  return false;
 }
 
 void LaunchStreamAudioIfEnabled(const vsoc::CuttlefishConfig& config,
diff --git a/host/commands/launch/launch.h b/host/commands/launch/launch.h
index 4b23958..ec95c24 100644
--- a/host/commands/launch/launch.h
+++ b/host/commands/launch/launch.h
@@ -21,7 +21,7 @@
                         cvd::ProcessMonitor* process_monitor);
 void LaunchUsbServerIfEnabled(const vsoc::CuttlefishConfig& config,
                               cvd::ProcessMonitor* process_monitor);
-void LaunchVNCServerIfEnabled(const vsoc::CuttlefishConfig& config,
+bool LaunchVNCServerIfEnabled(const vsoc::CuttlefishConfig& config,
                               cvd::ProcessMonitor* process_monitor,
                               std::function<bool(cvd::MonitorEntry*)> callback);
 void LaunchStreamAudioIfEnabled(const vsoc::CuttlefishConfig& config,
diff --git a/host/commands/launch/main.cc b/host/commands/launch/main.cc
index a9c8e3e..5b05102 100644
--- a/host/commands/launch/main.cc
+++ b/host/commands/launch/main.cc
@@ -433,15 +433,19 @@
   // Launch the e2e tests after the ivserver is ready
   LaunchE2eTestIfEnabled(&process_monitor, boot_state_machine, *config);
 
+  // The vnc server needs to be launched after the ivserver because it connects
+  // to it when using qemu. It needs to launch before the VMM because it serves
+  // on several sockets (input devices, vsock frame server) when using crosvm.
+  auto frontend_enabled = LaunchVNCServerIfEnabled(
+      *config, &process_monitor, GetOnSubprocessExitCallback(*config));
+
   // Start the guest VM
-  process_monitor.StartSubprocess(vm_manager->StartCommand(),
+  process_monitor.StartSubprocess(vm_manager->StartCommand(frontend_enabled),
                                   GetOnSubprocessExitCallback(*config));
 
   // Start other host processes
   LaunchSocketForwardProxyIfEnabled(&process_monitor, *config);
   LaunchSocketVsockProxyIfEnabled(&process_monitor, *config);
-  LaunchVNCServerIfEnabled(*config, &process_monitor,
-                           GetOnSubprocessExitCallback(*config));
   LaunchStreamAudioIfEnabled(*config, &process_monitor,
                              GetOnSubprocessExitCallback(*config));
   LaunchAdbConnectorIfEnabled(&process_monitor, *config, adbd_events_pipe);
diff --git a/host/libs/vm_manager/crosvm_manager.cpp b/host/libs/vm_manager/crosvm_manager.cpp
index 8ae3359..21f0518 100644
--- a/host/libs/vm_manager/crosvm_manager.cpp
+++ b/host/libs/vm_manager/crosvm_manager.cpp
@@ -85,7 +85,7 @@
 CrosvmManager::CrosvmManager(const vsoc::CuttlefishConfig* config)
     : VmManager(config) {}
 
-cvd::Command CrosvmManager::StartCommand() {
+cvd::Command CrosvmManager::StartCommand(bool with_frontend) {
   // TODO Add aarch64 support
   // TODO Add the tap interfaces (--tap-fd)
   // TODO Redirect logcat output
@@ -124,9 +124,12 @@
   if (!config_->gsi_fstab_path().empty()) {
     command.AddParameter("--android-fstab=", config_->gsi_fstab_path());
   }
-  command.AddParameter("--single-touch=", config_->touch_socket_path(), ":",
-                       config_->x_res(), ":", config_->y_res());
-  command.AddParameter("--keyboard=", config_->keyboard_socket_path());
+
+  if (with_frontend) {
+    command.AddParameter("--single-touch=", config_->touch_socket_path(), ":",
+                         config_->x_res(), ":", config_->y_res());
+    command.AddParameter("--keyboard=", config_->keyboard_socket_path());
+  }
 
   AddTapFdParameter(&command, config_->wifi_tap_name());
   AddTapFdParameter(&command, config_->mobile_tap_name());
diff --git a/host/libs/vm_manager/crosvm_manager.h b/host/libs/vm_manager/crosvm_manager.h
index ac26ee8..4640cfa 100644
--- a/host/libs/vm_manager/crosvm_manager.h
+++ b/host/libs/vm_manager/crosvm_manager.h
@@ -34,7 +34,7 @@
   CrosvmManager(const vsoc::CuttlefishConfig* config);
   virtual ~CrosvmManager() = default;
 
-  cvd::Command StartCommand() override;
+  cvd::Command StartCommand(bool with_frontend) override;
   bool Stop() override;
 };
 
diff --git a/host/libs/vm_manager/qemu_manager.cpp b/host/libs/vm_manager/qemu_manager.cpp
index ac83972..a9bb5cf 100644
--- a/host/libs/vm_manager/qemu_manager.cpp
+++ b/host/libs/vm_manager/qemu_manager.cpp
@@ -81,7 +81,7 @@
 QemuManager::QemuManager(const vsoc::CuttlefishConfig* config)
   : VmManager(config) {}
 
-cvd::Command QemuManager::StartCommand(){
+cvd::Command QemuManager::StartCommand(bool /*with_frontend*/){
   // Set the config values in the environment
   LogAndSetEnv("qemu_binary", config_->qemu_binary());
   LogAndSetEnv("instance_name", config_->instance_name());
diff --git a/host/libs/vm_manager/qemu_manager.h b/host/libs/vm_manager/qemu_manager.h
index ea24644..66ff8d6 100644
--- a/host/libs/vm_manager/qemu_manager.h
+++ b/host/libs/vm_manager/qemu_manager.h
@@ -32,7 +32,7 @@
   QemuManager(const vsoc::CuttlefishConfig* config);
   virtual ~QemuManager() = default;
 
-  cvd::Command StartCommand() override;
+  cvd::Command StartCommand(bool with_frontend) override;
   bool Stop() override;
 };
 
diff --git a/host/libs/vm_manager/vm_manager.h b/host/libs/vm_manager/vm_manager.h
index ac93e26..6b1661e 100644
--- a/host/libs/vm_manager/vm_manager.h
+++ b/host/libs/vm_manager/vm_manager.h
@@ -42,7 +42,7 @@
 
   virtual ~VmManager() = default;
 
-  virtual cvd::Command StartCommand() = 0;
+  virtual cvd::Command StartCommand(bool with_frontend = true) = 0;
   virtual bool Stop() = 0;
 
   virtual bool ValidateHostConfiguration(