Merge "Use spin::Once rather than wrapping a OnceCell in a SpinMutex." into main
diff --git a/ferrochrome_app/vm_config.json.template b/ferrochrome_app/vm_config.json.template
index 6e1992f..d1a7cfa 100644
--- a/ferrochrome_app/vm_config.json.template
+++ b/ferrochrome_app/vm_config.json.template
@@ -33,5 +33,9 @@
         "backend": "virglrenderer",
         "context_types": ["virgl2"]
     },
+    "display": {
+        "scale": "0.77",
+        "refresh_rate": "30"
+     },
     "console_input_device": "hvc0"
 }
diff --git a/vmlauncher_app/java/com/android/virtualization/vmlauncher/MainActivity.java b/vmlauncher_app/java/com/android/virtualization/vmlauncher/MainActivity.java
index 47a6fe3..105ae03 100644
--- a/vmlauncher_app/java/com/android/virtualization/vmlauncher/MainActivity.java
+++ b/vmlauncher_app/java/com/android/virtualization/vmlauncher/MainActivity.java
@@ -43,7 +43,6 @@
 import android.system.virtualmachine.VirtualMachineManager;
 import android.util.DisplayMetrics;
 import android.util.Log;
-import android.view.Display;
 import android.view.InputDevice;
 import android.view.KeyEvent;
 import android.view.SurfaceHolder;
@@ -200,20 +199,32 @@
                 customImageConfigBuilder.setGpuConfig(gpuConfigBuilder.build());
             }
 
-            configBuilder.setMemoryBytes(8L * 1024 * 1024 * 1024 /* 8 GB */);
+            long memoryMib = 1024; // 1GB by default
+            if (json.has("memory_mib")) {
+                memoryMib = json.getLong("memory_mib");
+            }
+            configBuilder.setMemoryBytes(memoryMib * 1024 * 1024);
+
             WindowMetrics windowMetrics = getWindowManager().getCurrentWindowMetrics();
-            Rect windowSize = windowMetrics.getBounds();
-            int dpi = (int) (DisplayMetrics.DENSITY_DEFAULT * windowMetrics.getDensity());
+            float dpi = DisplayMetrics.DENSITY_DEFAULT * windowMetrics.getDensity();
+            int refreshRate = (int) getDisplay().getRefreshRate();
+            if (json.has("display")) {
+                JSONObject display = json.getJSONObject("display");
+                if (display.has("scale")) {
+                    dpi *= (float) display.getDouble("scale");
+                }
+                if (display.has("refresh_rate")) {
+                    refreshRate = display.getInt("refresh_rate");
+                }
+            }
+            int dpiInt = (int) dpi;
             DisplayConfig.Builder displayConfigBuilder = new DisplayConfig.Builder();
+            Rect windowSize = windowMetrics.getBounds();
             displayConfigBuilder.setWidth(windowSize.right);
             displayConfigBuilder.setHeight(windowSize.bottom);
-            displayConfigBuilder.setHorizontalDpi(dpi);
-            displayConfigBuilder.setVerticalDpi(dpi);
-
-            Display display = getDisplay();
-            if (display != null) {
-                displayConfigBuilder.setRefreshRate((int) display.getRefreshRate());
-            }
+            displayConfigBuilder.setHorizontalDpi(dpiInt);
+            displayConfigBuilder.setVerticalDpi(dpiInt);
+            displayConfigBuilder.setRefreshRate(refreshRate);
 
             customImageConfigBuilder.setDisplayConfig(displayConfigBuilder.build());
             customImageConfigBuilder.useTouch(true);