Make more options configurable via vm_config.json

Bug: N/A
Test: run ferrochrome
Change-Id: I6f281fc8108c16559e502ab34de8ade1a357d221
diff --git a/android/FerrochromeApp/vm_config.json.template b/android/FerrochromeApp/vm_config.json.template
index d1a7cfa..6e024ba 100644
--- a/android/FerrochromeApp/vm_config.json.template
+++ b/android/FerrochromeApp/vm_config.json.template
@@ -29,6 +29,22 @@
     "cpu_topology": "match_host",
     "platform_version": "~1.0",
     "memory_mib": 8096,
+    "debuggable": true,
+    "console_out": true,
+    "connect_console": true,
+    "console_input_device": "hvc0",
+    "network": true,
+    "input": {
+        "touchscreen": true,
+        "keyboard": true,
+        "mouse": true,
+        "trackpad": true,
+        "switches": true
+    },
+    "audio": {
+        "speaker": true,
+         "microphone": true
+    },
     "gpu": {
         "backend": "virglrenderer",
         "context_types": ["virgl2"]
@@ -36,6 +52,5 @@
     "display": {
         "scale": "0.77",
         "refresh_rate": "30"
-     },
-    "console_input_device": "hvc0"
+     }
 }
diff --git a/android/VmLauncherApp/java/com/android/virtualization/vmlauncher/VmConfigJson.java b/android/VmLauncherApp/java/com/android/virtualization/vmlauncher/VmConfigJson.java
index 332b9f5..8116743 100644
--- a/android/VmLauncherApp/java/com/android/virtualization/vmlauncher/VmConfigJson.java
+++ b/android/VmLauncherApp/java/com/android/virtualization/vmlauncher/VmConfigJson.java
@@ -53,6 +53,12 @@
     private String kernel;
     private String initrd;
     private String params;
+    private boolean debuggable;
+    private boolean console_out;
+    private boolean connect_console;
+    private boolean network;
+    private InputJson input;
+    private AudioJson audio;
     private DiskJson[] disks;
     private DisplayJson display;
     private GpuJson gpu;
@@ -77,23 +83,24 @@
         }
     }
 
+    private int getDebugLevel() {
+        return debuggable
+                ? VirtualMachineConfig.DEBUG_LEVEL_FULL
+                : VirtualMachineConfig.DEBUG_LEVEL_NONE;
+    }
+
     /** Converts this parsed JSON into VirtualMachieConfig */
     VirtualMachineConfig toConfig(Context context) {
-        VirtualMachineConfig.Builder builder = new VirtualMachineConfig.Builder(context);
-        builder.setProtectedVm(isProtected)
+        return new VirtualMachineConfig.Builder(context)
+                .setProtectedVm(isProtected)
                 .setMemoryBytes((long) memory_mib * 1024 * 1024)
                 .setConsoleInputDevice(console_input_device)
                 .setCpuTopology(getCpuTopology())
-                .setCustomImageConfig(toCustomImageConfig(context));
-
-        // TODO: make these configurable via json
-        if (DEBUG) {
-            builder.setDebugLevel(VirtualMachineConfig.DEBUG_LEVEL_FULL)
-                    .setVmOutputCaptured(true)
-                    .setConnectVmConsole(true);
-        }
-
-        return builder.build();
+                .setCustomImageConfig(toCustomImageConfig(context))
+                .setDebugLevel(getDebugLevel())
+                .setVmOutputCaptured(console_out)
+                .setConnectVmConsole(connect_console)
+                .build();
     }
 
     private VirtualMachineCustomImageConfig toCustomImageConfig(Context context) {
@@ -103,32 +110,64 @@
         builder.setName(name)
                 .setBootloaderPath(bootloader)
                 .setKernelPath(kernel)
-                .setInitrdPath(initrd);
+                .setInitrdPath(initrd)
+                .useNetwork(network);
+
+        if (input != null) {
+            builder.useTouch(input.touchscreen)
+                    .useKeyboard(input.keyboard)
+                    .useMouse(input.mouse)
+                    .useTrackpad(input.trackpad)
+                    .useSwitches(input.switches);
+        }
+
+        if (audio != null) {
+            builder.setAudioConfig(audio.toConfig());
+        }
+
+        if (display != null) {
+            builder.setDisplayConfig(display.toConfig(context));
+        }
+
+        if (gpu != null) {
+            builder.setGpuConfig(gpu.toConfig());
+        }
+
         if (params != null) {
             Arrays.stream(params.split(" ")).forEach(builder::addParam);
         }
 
-        // TODO: make these configurable via json
-        builder.useTouch(true)
-                .useKeyboard(true)
-                .useMouse(true)
-                .useSwitches(true)
-                .useTrackpad(true)
-                .useNetwork(true)
-                .setAudioConfig(
-                        new AudioConfig.Builder()
-                                .setUseMicrophone(true)
-                                .setUseSpeaker(true)
-                                .build());
-
-        for (DiskJson d : disks) {
-            builder.addDisk(d.toConfig());
+        if (disks != null) {
+            Arrays.stream(disks).map(d -> d.toConfig()).forEach(builder::addDisk);
         }
-        builder.setDisplayConfig(display.toConfig(context)).setGpuConfig(gpu.toConfig());
 
         return builder.build();
     }
 
+    private static class InputJson {
+        private InputJson() {}
+
+        private boolean touchscreen;
+        private boolean keyboard;
+        private boolean mouse;
+        private boolean switches;
+        private boolean trackpad;
+    }
+
+    private static class AudioJson {
+        private AudioJson() {}
+
+        private boolean microphone;
+        private boolean speaker;
+
+        private AudioConfig toConfig() {
+            return new AudioConfig.Builder()
+                    .setUseMicrophone(microphone)
+                    .setUseSpeaker(speaker)
+                    .build();
+        }
+    }
+
     private static class DiskJson {
         private DiskJson() {}
 
@@ -160,15 +199,16 @@
 
         private float scale;
         private int refresh_rate;
+        private int width_pixels;
+        private int height_pixels;
 
         private DisplayConfig toConfig(Context context) {
             WindowManager wm = context.getSystemService(WindowManager.class);
             WindowMetrics metrics = wm.getCurrentWindowMetrics();
             Rect dispBounds = metrics.getBounds();
 
-            // TODO: make this overridable by json
-            int width = dispBounds.right;
-            int height = dispBounds.bottom;
+            int width = width_pixels > 0 ? width_pixels : dispBounds.right;
+            int height = height_pixels > 0 ? height_pixels : dispBounds.bottom;
 
             int dpi = (int) (DisplayMetrics.DENSITY_DEFAULT * metrics.getDensity());
             if (scale > 0.0f) {