Let display activity occupy full screen

Bug: 389524419
Test: run display activity
Change-Id: I8d6451ee8cbd665949013006cc2e7c85fe2a7d04
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/MainActivity.kt b/android/TerminalApp/java/com/android/virtualization/terminal/MainActivity.kt
index 71f10f9..1daeadb 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/MainActivity.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/MainActivity.kt
@@ -35,12 +35,14 @@
 import android.os.SystemProperties
 import android.os.Trace
 import android.provider.Settings
+import android.util.DisplayMetrics
 import android.util.Log
 import android.view.KeyEvent
 import android.view.Menu
 import android.view.MenuItem
 import android.view.View
 import android.view.ViewGroup
+import android.view.WindowManager
 import android.view.accessibility.AccessibilityManager
 import android.webkit.ClientCertRequest
 import android.webkit.SslErrorHandler
@@ -457,7 +459,7 @@
                 .build()
 
         Trace.beginAsyncSection("executeTerminal", 0)
-        run(this, this, notification)
+        run(this, this, notification, getDisplayInfo())
         connectToTerminalService()
     }
 
@@ -511,4 +513,18 @@
                 R.id.btn_pgdn to KeyEvent.KEYCODE_PAGE_DOWN,
             )
     }
+
+    fun getDisplayInfo(): DisplayInfo {
+        val wm = getSystemService<WindowManager>(WindowManager::class.java)
+        val metrics = wm.currentWindowMetrics
+        val dispBounds = metrics.bounds
+
+        // For now, display activity runs as landscape mode
+        val height = Math.min(dispBounds.right, dispBounds.bottom)
+        val width = Math.max(dispBounds.right, dispBounds.bottom)
+        var dpi = (DisplayMetrics.DENSITY_DEFAULT * metrics.density).toInt()
+        var refreshRate = display.refreshRate.toInt()
+
+        return DisplayInfo(width, height, dpi, refreshRate)
+    }
 }
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.kt b/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.kt
index 346056a..ecb01c0 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.kt
@@ -29,6 +29,7 @@
 import android.os.IBinder
 import android.os.Looper
 import android.os.Parcel
+import android.os.Parcelable
 import android.os.ResultReceiver
 import android.os.Trace
 import android.system.virtualmachine.VirtualMachine
@@ -103,7 +104,8 @@
         val json = ConfigJson.from(this, image.configPath)
         val configBuilder = json.toConfigBuilder(this)
         val customImageConfigBuilder = json.toCustomImageConfigBuilder(this)
-        if (overrideConfigIfNecessary(customImageConfigBuilder)) {
+        val displaySize = intent.getParcelableExtra(EXTRA_DISPLAY_INFO, DisplayInfo::class.java)
+        if (overrideConfigIfNecessary(customImageConfigBuilder, displaySize)) {
             configBuilder.setCustomImageConfig(customImageConfigBuilder.build())
         }
         val config = configBuilder.build()
@@ -198,7 +200,8 @@
     }
 
     private fun overrideConfigIfNecessary(
-        builder: VirtualMachineCustomImageConfig.Builder
+        builder: VirtualMachineCustomImageConfig.Builder,
+        displayInfo: DisplayInfo?,
     ): Boolean {
         var changed = false
         // TODO: check if ANGLE is enabled for the app.
@@ -218,13 +221,17 @@
             changed = true
         }
 
-        // TODO(jeongik): let it configurable
-        if (terminalGuiSupport()) {
+        // Set the initial display size
+        // TODO(jeongik): set up the display size on demand
+        if (terminalGuiSupport() && displayInfo != null) {
             builder
                 .setDisplayConfig(
                     VirtualMachineCustomImageConfig.DisplayConfig.Builder()
-                        .setWidth(1920)
-                        .setHeight(1080)
+                        .setWidth(displayInfo.width)
+                        .setHeight(displayInfo.height)
+                        .setHorizontalDpi(displayInfo.dpi)
+                        .setVerticalDpi(displayInfo.dpi)
+                        .setRefreshRate(displayInfo.refreshRate)
                         .build()
                 )
                 .useKeyboard(true)
@@ -322,7 +329,7 @@
         private const val EXTRA_NOTIFICATION = "EXTRA_NOTIFICATION"
         private const val ACTION_START_VM_LAUNCHER_SERVICE =
             "android.virtualization.START_VM_LAUNCHER_SERVICE"
-
+        const val EXTRA_DISPLAY_INFO = "EXTRA_DISPLAY_INFO"
         const val ACTION_STOP_VM_LAUNCHER_SERVICE: String =
             "android.virtualization.STOP_VM_LAUNCHER_SERVICE"
 
@@ -338,6 +345,7 @@
             context: Context,
             callback: VmLauncherServiceCallback?,
             notification: Notification?,
+            displayInfo: DisplayInfo,
         ) {
             val i = getMyIntent(context)
             val resultReceiver: ResultReceiver =
@@ -355,6 +363,7 @@
                 }
             i.putExtra(Intent.EXTRA_RESULT_RECEIVER, getResultReceiverForIntent(resultReceiver))
             i.putExtra(EXTRA_NOTIFICATION, notification)
+            i.putExtra(EXTRA_DISPLAY_INFO, displayInfo)
             context.startForegroundService(i)
         }
 
@@ -372,3 +381,29 @@
         }
     }
 }
+
+data class DisplayInfo(val width: Int, val height: Int, val dpi: Int, val refreshRate: Int) :
+    Parcelable {
+    constructor(
+        source: Parcel
+    ) : this(source.readInt(), source.readInt(), source.readInt(), source.readInt())
+
+    override fun describeContents(): Int = 0
+
+    override fun writeToParcel(dest: Parcel, flags: Int) {
+        dest.writeInt(width)
+        dest.writeInt(height)
+        dest.writeInt(dpi)
+        dest.writeInt(refreshRate)
+    }
+
+    companion object {
+        @JvmField
+        val CREATOR =
+            object : Parcelable.Creator<DisplayInfo> {
+                override fun createFromParcel(source: Parcel): DisplayInfo = DisplayInfo(source)
+
+                override fun newArray(size: Int) = arrayOfNulls<DisplayInfo>(size)
+            }
+    }
+}
diff --git a/android/TerminalApp/res/layout/activity_display.xml b/android/TerminalApp/res/layout/activity_display.xml
index 48e49fe..2d7d847 100644
--- a/android/TerminalApp/res/layout/activity_display.xml
+++ b/android/TerminalApp/res/layout/activity_display.xml
@@ -27,8 +27,8 @@
     <!-- the size should be match_parent -->
     <SurfaceView
         android:id="@+id/surface_view"
-        android:layout_width="1920px"
-        android:layout_height="1080px"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
         android:focusable="true"
         android:focusableInTouchMode="true"
         android:focusedByDefault="true"