Merge "Show indefinite progress bar (circular type) while the VM is booting" into main
diff --git a/android/TerminalApp/generate_assets.sh b/android/TerminalApp/generate_assets.sh
index ff7444e..4001bfd 100755
--- a/android/TerminalApp/generate_assets.sh
+++ b/android/TerminalApp/generate_assets.sh
@@ -6,14 +6,15 @@
     echo "image.raw can be built with packages/modules/Virtualization/build/debian/build.sh"
     exit 1
 fi
+image_raw_path=$(realpath $1)
 pushd $(dirname $0) > /dev/null
 tempdir=$(mktemp -d)
 asset_dir=./assets/linux
 mkdir -p ${asset_dir}
 echo Copy files...
 pushd ${tempdir} > /dev/null
-cp "$1" ${tempdir}
-tar czvS -f images.tar.gz $(basename $1)
+cp "${image_raw_path}" ${tempdir}
+tar czvS -f images.tar.gz $(basename ${image_raw_path})
 popd > /dev/null
 cp vm_config.json ${asset_dir}
 mv ${tempdir}/images.tar.gz ${asset_dir}
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/SettingsDiskResizeActivity.kt b/android/TerminalApp/java/com/android/virtualization/terminal/SettingsDiskResizeActivity.kt
index 4be291f..1b14ef2 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/SettingsDiskResizeActivity.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/SettingsDiskResizeActivity.kt
@@ -16,27 +16,49 @@
 package com.android.virtualization.terminal
 
 import android.os.Bundle
+import android.os.FileUtils
 import android.widget.TextView
 import android.widget.Toast
+import android.text.style.RelativeSizeSpan
+import android.text.Spannable
+import android.text.SpannableString
+import android.text.Spanned
+import android.text.format.Formatter
+import android.text.TextUtils
 import androidx.appcompat.app.AppCompatActivity
 import androidx.core.view.isVisible
 import com.google.android.material.button.MaterialButton
 import com.google.android.material.slider.Slider
 
+import java.util.regex.Matcher
+import java.util.regex.Pattern
+
 class SettingsDiskResizeActivity : AppCompatActivity() {
+    private val maxDiskSize: Float = 256F
+    private val numberPattern: Pattern = Pattern.compile("[\\d]*[\\٫.,]?[\\d]+");
     private var diskSize: Float = 104F
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.settings_disk_resize)
-        val diskSizeText = findViewById<TextView>(R.id.settings_disk_resize_disk_size)
+        val diskSizeText = findViewById<TextView>(R.id.settings_disk_resize_resize_gb_assigned)
+        val diskMaxSizeText = findViewById<TextView>(R.id.settings_disk_resize_resize_gb_max)
+        diskMaxSizeText.text = getString(R.string.settings_disk_resize_resize_gb_max_format,
+            localizedFileSize(maxDiskSize));
+
         val diskSizeSlider = findViewById<Slider>(R.id.settings_disk_resize_disk_size_slider)
+        diskSizeSlider.setValueTo(maxDiskSize)
         val cancelButton = findViewById<MaterialButton>(R.id.settings_disk_resize_cancel_button)
         val resizeButton = findViewById<MaterialButton>(R.id.settings_disk_resize_resize_button)
-        diskSizeText.text = diskSize.toInt().toString()
         diskSizeSlider.value = diskSize
+        diskSizeText.text = enlargeFontOfNumber(
+            getString(R.string.settings_disk_resize_resize_gb_assigned_format,
+            localizedFileSize(diskSize)))
 
         diskSizeSlider.addOnChangeListener { _, value, _ ->
-            diskSizeText.text = value.toInt().toString()
+            diskSizeText.text = enlargeFontOfNumber(
+                getString(R.string.settings_disk_resize_resize_gb_assigned_format,
+                localizedFileSize(value)))
             cancelButton.isVisible = true
             resizeButton.isVisible = true
         }
@@ -54,4 +76,29 @@
                 .show()
         }
     }
+
+    fun localizedFileSize(sizeGb: Float): String {
+        // formatShortFileSize() uses SI unit (i.e. kB = 1000 bytes),
+        // so covert sizeGb with "GB" instead of "GIB".
+        val bytes = FileUtils.parseSize(sizeGb.toLong().toString() + "GB")
+        return Formatter.formatShortFileSize(this, bytes)
+    }
+
+    fun enlargeFontOfNumber(summary: CharSequence): CharSequence {
+        if (TextUtils.isEmpty(summary)) {
+            return ""
+        }
+
+        val matcher = numberPattern.matcher(summary);
+        if (matcher.find()) {
+            val spannableSummary = SpannableString(summary)
+            spannableSummary.setSpan(
+                    RelativeSizeSpan(2f),
+                    matcher.start(),
+                    matcher.end(),
+                    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
+            return spannableSummary
+        }
+        return summary
+    }
 }
\ No newline at end of file
diff --git a/android/TerminalApp/res/layout/settings_disk_resize.xml b/android/TerminalApp/res/layout/settings_disk_resize.xml
index 3c09f52..f868b28 100644
--- a/android/TerminalApp/res/layout/settings_disk_resize.xml
+++ b/android/TerminalApp/res/layout/settings_disk_resize.xml
@@ -21,27 +21,19 @@
         android:layout_height="match_parent">
 
         <TextView
-            android:id="@+id/settings_disk_resize_disk_size"
+            android:id="@+id/settings_disk_resize_resize_gb_assigned"
             android:layout_height="wrap_content"
             android:layout_width="wrap_content"
-            android:textSize="36sp"
-            app:layout_constraintLeft_toLeftOf="parent"
+            android:textSize="14sp"
+            app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintBottom_toTopOf="@+id/settings_disk_resize_disk_size_slider"/>
 
         <TextView
+            android:id="@+id/settings_disk_resize_resize_gb_max"
             android:layout_height="wrap_content"
             android:layout_width="wrap_content"
-            android:text="@string/settings_disk_resize_resize_gb_assigned"
             android:textSize="14sp"
-            app:layout_constraintLeft_toRightOf="@+id/settings_disk_resize_disk_size"
-            app:layout_constraintBottom_toTopOf="@+id/settings_disk_resize_disk_size_slider"/>
-
-        <TextView
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:text="@string/settings_disk_resize_resize_gb_total"
-            android:textSize="14sp"
-            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintBottom_toTopOf="@+id/settings_disk_resize_disk_size_slider"/>
 
         <com.google.android.material.slider.Slider
@@ -51,7 +43,6 @@
             android:layout_marginBottom="36dp"
             app:tickVisible="false"
             android:valueFrom="0"
-            android:valueTo="256"
             android:stepSize="4"
             app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintBottom_toBottomOf="parent" />
@@ -65,7 +56,7 @@
             android:layout_marginHorizontal="8dp"
             app:layout_constraintTop_toTopOf="@+id/settings_disk_resize_disk_size_slider"
             app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintRight_toLeftOf="@+id/settings_disk_resize_resize_button" />
+            app:layout_constraintEnd_toStartOf="@+id/settings_disk_resize_resize_button" />
 
         <com.google.android.material.button.MaterialButton
             android:id="@+id/settings_disk_resize_resize_button"
@@ -76,6 +67,6 @@
             android:layout_marginHorizontal="8dp"
             app:layout_constraintTop_toTopOf="@+id/settings_disk_resize_disk_size_slider"
             app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintRight_toRightOf="parent" />
+            app:layout_constraintEnd_toEndOf="parent" />
     </androidx.constraintlayout.widget.ConstraintLayout>
 </LinearLayout>
\ No newline at end of file
diff --git a/android/TerminalApp/res/values/strings.xml b/android/TerminalApp/res/values/strings.xml
index 6ae5b7b..d3670d2 100644
--- a/android/TerminalApp/res/values/strings.xml
+++ b/android/TerminalApp/res/values/strings.xml
@@ -33,10 +33,10 @@
     <string name="settings_disk_resize_sub_title">Resize / Rootfs</string>
     <!-- Toast message after new disk size is set. [CHAR LIMIT=none] -->
     <string name="settings_disk_resize_resize_message">Disk size set</string>
-    <!-- Settings menu option description for the current disk size, followed by a text box with the actual number [CHAR LIMIT=none] -->
-    <string name="settings_disk_resize_resize_gb_assigned">GB Assigned</string>
-    <!-- Settings menu option description for the maximum resizable disk size. [CHAR LIMIT=none] -->
-    <string name="settings_disk_resize_resize_gb_total">256 GB total</string>
+    <!-- Settings menu option description format of the current disk size. [CHAR LIMIT=none] -->
+    <string name="settings_disk_resize_resize_gb_assigned_format"><xliff:g id="assigned_size" example="10GB">%1$s</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">%1$s</xliff:g> max</string>
     <!-- Settings menu button to cancel disk resize. [CHAR LIMIT=32] -->
     <string name="settings_disk_resize_resize_cancel">Cancel</string>
     <!-- Settings menu button to apply change that requires to restart VM (abbrev of virtual machine). [CHAR LIMIT=64] -->