Do the resizing inside of the service

It's still done in the main thread. It shall be off-loaded to a worker
thread in a follow-up change.

Bug: N/A
Test: try resizing
Change-Id: Ifddf62e01d726bcd88f1a66a0383e9b49f9640c5
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/MainActivity.kt b/android/TerminalApp/java/com/android/virtualization/terminal/MainActivity.kt
index 80f403b..390ae00 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/MainActivity.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/MainActivity.kt
@@ -56,7 +56,6 @@
 import com.android.virtualization.terminal.VmLauncherService.VmLauncherServiceCallback
 import com.google.android.material.tabs.TabLayout
 import com.google.android.material.tabs.TabLayoutMediator
-import java.io.IOException
 import java.net.MalformedURLException
 import java.net.URL
 import java.util.concurrent.CompletableFuture
@@ -313,8 +312,6 @@
             return
         }
 
-        resizeDiskIfNecessary(image)
-
         val tapIntent = Intent(this, MainActivity::class.java)
         tapIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP)
         val tapPendingIntent =
@@ -361,7 +358,9 @@
                         .build()
                 )
                 .build()
-        run(this, this, notification, getDisplayInfo()).onFailure {
+
+        val diskSize = intent.getLongExtra(KEY_DISK_SIZE, image.getSize())
+        run(this, this, notification, getDisplayInfo(), diskSize).onFailure {
             Log.e(TAG, "Failed to start VM.", it)
             finish()
         }
@@ -372,16 +371,6 @@
         return bootCompleted.block(timeoutMillis)
     }
 
-    private fun resizeDiskIfNecessary(image: InstalledImage) {
-        try {
-            // TODO(b/382190982): Show snackbar message instead when it's recoverable.
-            image.resize(intent.getLongExtra(KEY_DISK_SIZE, image.getSize()))
-        } catch (e: IOException) {
-            start(this, Exception("Failed to resize disk", e))
-            return
-        }
-    }
-
     companion object {
         const val TAG: String = "VmTerminalApp"
         const val KEY_DISK_SIZE: String = "disk_size"
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.kt b/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.kt
index deccae5..198cf6b 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.kt
@@ -127,6 +127,11 @@
         val customImageConfigBuilder = json.toCustomImageConfigBuilder(this)
         val displaySize = intent.getParcelableExtra(EXTRA_DISPLAY_INFO, DisplayInfo::class.java)
 
+        // Note: this doesn't always do the resizing. If the current image size is the same as the
+        // requested size which is rounded up to the page alignment, resizing is not done.
+        val diskSize = intent.getLongExtra(EXTRA_DISK_SIZE, image.getSize())
+        image.resize(diskSize)
+
         customImageConfigBuilder.setAudioConfig(
             AudioConfig.Builder().setUseSpeaker(true).setUseMicrophone(true).build()
         )
@@ -396,6 +401,7 @@
         private const val ACTION_START_VM_LAUNCHER_SERVICE =
             "android.virtualization.START_VM_LAUNCHER_SERVICE"
         const val EXTRA_DISPLAY_INFO = "EXTRA_DISPLAY_INFO"
+        const val EXTRA_DISK_SIZE = "EXTRA_DISK_SIZE"
         const val ACTION_SHUTDOWN_VM: String = "android.virtualization.ACTION_SHUTDOWN_VM"
 
         private const val RESULT_START = 0
@@ -428,6 +434,7 @@
             callback: VmLauncherServiceCallback?,
             notification: Notification?,
             displayInfo: DisplayInfo,
+            diskSize: Long?,
         ): Result<Unit> {
             val i = getMyIntent(context)
             val resultReceiver: ResultReceiver =
@@ -451,6 +458,9 @@
             i.putExtra(Intent.EXTRA_RESULT_RECEIVER, getResultReceiverForIntent(resultReceiver))
             i.putExtra(EXTRA_NOTIFICATION, notification)
             i.putExtra(EXTRA_DISPLAY_INFO, displayInfo)
+            if (diskSize != null) {
+                i.putExtra(EXTRA_DISK_SIZE, diskSize)
+            }
             return try {
                 context.startForegroundService(i)
                 Result.success(Unit)