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) {