Show snackbar message for not enough space to resize disk
Bug: 382190982
Test: Run VmTerminalApp
Change-Id: I9832958fae8de1e91610dbf79d70a4350cf35ca9
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/SettingsDiskResizeActivity.kt b/android/TerminalApp/java/com/android/virtualization/terminal/SettingsDiskResizeActivity.kt
index 144db40..da07b19 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/SettingsDiskResizeActivity.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/SettingsDiskResizeActivity.kt
@@ -33,6 +33,7 @@
import androidx.core.view.isVisible
import com.android.virtualization.terminal.VmLauncherService.VmLauncherServiceCallback
import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.google.android.material.snackbar.Snackbar
import java.util.Locale
import java.util.regex.Pattern
@@ -46,6 +47,7 @@
private lateinit var cancelButton: View
private lateinit var resizeButton: View
private lateinit var diskSizeText: TextView
+ private lateinit var diskMaxSizeText: TextView
private lateinit var diskSizeSlider: SeekBar
private fun bytesToMb(bytes: Long): Long {
@@ -56,6 +58,13 @@
return bytes shl 20
}
+ private fun getAvailableSizeMb(): Long {
+ val usableSpaceMb =
+ bytesToMb(Environment.getDataDirectory().getUsableSpace()) and
+ (diskSizeStepMb - 1).inv()
+ return diskSizeMb + usableSpaceMb
+ }
+
private fun mbToProgress(bytes: Long): Int {
return (bytes / diskSizeStepMb).toInt()
}
@@ -73,13 +82,10 @@
val image = InstalledImage.getDefault(this)
diskSizeMb = bytesToMb(image.getApparentSize())
val minDiskSizeMb = bytesToMb(image.getSmallestSizePossible()).coerceAtMost(diskSizeMb)
- val usableSpaceMb =
- bytesToMb(Environment.getDataDirectory().getUsableSpace()) and
- (diskSizeStepMb - 1).inv()
- val maxDiskSizeMb = defaultMaxDiskSizeMb.coerceAtMost(diskSizeMb + usableSpaceMb)
+ val maxDiskSizeMb = defaultMaxDiskSizeMb.coerceAtMost(getAvailableSizeMb())
diskSizeText = findViewById<TextView>(R.id.settings_disk_resize_resize_gb_assigned)!!
- val diskMaxSizeText = findViewById<TextView>(R.id.settings_disk_resize_resize_gb_max)
+ diskMaxSizeText = findViewById<TextView>(R.id.settings_disk_resize_resize_gb_max)
diskMaxSizeText.text =
getString(
R.string.settings_disk_resize_resize_gb_max_format,
@@ -138,7 +144,22 @@
}
private fun resize() {
- diskSizeMb = progressToMb(diskSizeSlider.progress)
+ val desiredDiskSizeMb = progressToMb(diskSizeSlider.progress)
+ val availableSizeMb = getAvailableSizeMb()
+ if (availableSizeMb < desiredDiskSizeMb) {
+ Snackbar.make(
+ findViewById(android.R.id.content),
+ R.string.settings_disk_resize_not_enough_space_message,
+ Snackbar.LENGTH_SHORT,
+ )
+ .show()
+ diskSizeSlider.max = mbToProgress(availableSizeMb)
+ updateMaxSizeText(availableSizeMb)
+ cancel()
+ return
+ }
+
+ diskSizeMb = desiredDiskSizeMb
buttons.isVisible = false
// Note: we first stop the VM, and wait for it to fully stop. Then we (re) start the Main
@@ -186,6 +207,14 @@
)
}
+ fun updateMaxSizeText(sizeMb: Long) {
+ diskMaxSizeText.text =
+ getString(
+ R.string.settings_disk_resize_resize_gb_max_format,
+ localizedFileSize(sizeMb, /* isShort= */ true),
+ )
+ }
+
fun localizedFileSize(sizeMb: Long, isShort: Boolean): String {
val sizeGb = sizeMb / (1 shl 10).toFloat()
val measure = Measure(sizeGb, MeasureUnit.GIGABYTE)
diff --git a/android/TerminalApp/res/values/strings.xml b/android/TerminalApp/res/values/strings.xml
index a6d461e..273032e 100644
--- a/android/TerminalApp/res/values/strings.xml
+++ b/android/TerminalApp/res/values/strings.xml
@@ -75,6 +75,8 @@
<string name="settings_disk_resize_resize_gb_assigned_format"><xliff:g id="assigned_size" example="10GB">\u200E%1$s\u200E</xliff:g> assigned</string>
<!-- Settings menu option description format of the maximum resizable disk size. [CHAR LIMIT=none] -->
<string name="settings_disk_resize_resize_gb_max_format"><xliff:g id="max_size" example="256GB">\u200E%1$s\u200E</xliff:g> max</string>
+ <!-- Snackbar message for showing not enough space error. [CHAR LIMIT=none] -->
+ <string name="settings_disk_resize_not_enough_space_message">Not enough space on the device to resize disk</string>
<!-- Settings menu button to cancel disk resize. [CHAR LIMIT=16] -->
<string name="settings_disk_resize_resize_cancel">Cancel</string>
<!-- Settings menu button to apply change Terminal app. This will launch a confirmation dialog [CHAR LIMIT=16] -->