VmTerminalApp: Show confirmation dialog for resize
Previously resize confirm button had text 'Restart to apply'.
But the text may be increased up to 40 chars for i18n, and it takes more
than half of the device screen width.
For better UX, simplify the button text and show confirmation dialog
instead.
Bug: 380407944
Test: Manually
Change-Id: Id0a4fe93efd4e85b43fef18cda1efc7a5eac9329
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/SettingsDiskResizeActivity.kt b/android/TerminalApp/java/com/android/virtualization/terminal/SettingsDiskResizeActivity.kt
index 303a932..30475f5 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/SettingsDiskResizeActivity.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/SettingsDiskResizeActivity.kt
@@ -17,6 +17,7 @@
import android.content.Context
import android.content.Intent
+import android.content.SharedPreferences
import android.icu.text.MeasureFormat
import android.icu.text.NumberFormat
import android.icu.util.Measure
@@ -26,11 +27,12 @@
import android.text.Spanned
import android.text.TextUtils
import android.text.style.RelativeSizeSpan
+import android.view.View
import android.widget.SeekBar
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible
-import com.google.android.material.button.MaterialButton
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
import java.util.Locale
import java.util.regex.Pattern
@@ -40,6 +42,10 @@
private var diskSizeStepMb: Long = 0
private var diskSizeMb: Long = 0
+ private lateinit var sharedPref: SharedPreferences
+ private lateinit var buttons: View
+ private lateinit var cancelButton: View
+ private lateinit var resizeButton: View
private lateinit var diskSizeText: TextView
private lateinit var diskSizeSlider: SeekBar
@@ -65,7 +71,7 @@
diskSizeStepMb = 1L shl resources.getInteger(R.integer.disk_size_round_up_step_size_in_mb)
- val sharedPref =
+ sharedPref =
this.getSharedPreferences(getString(R.string.preference_file_key), Context.MODE_PRIVATE)
diskSizeMb =
bytesToMb(
@@ -82,9 +88,10 @@
localizedFileSize(maxDiskSizeMb, /* isShort= */ true),
)
+ buttons = findViewById<View>(R.id.buttons)
diskSizeSlider = findViewById<SeekBar>(R.id.settings_disk_resize_disk_size_slider)!!
- val cancelButton = findViewById<MaterialButton>(R.id.settings_disk_resize_cancel_button)
- val resizeButton = findViewById<MaterialButton>(R.id.settings_disk_resize_resize_button)
+ cancelButton = findViewById<View>(R.id.settings_disk_resize_cancel_button)
+ resizeButton = findViewById<View>(R.id.settings_disk_resize_resize_button)
diskSizeSlider.min = mbToProgress(minDiskSizeMb)
diskSizeSlider.max = mbToProgress(maxDiskSizeMb)
diskSizeSlider.progress = mbToProgress(diskSizeMb)
@@ -94,6 +101,7 @@
object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
updateSliderText(progressToMb(progress))
+ buttons.isVisible = true
cancelButton.isVisible = true
resizeButton.isVisible = true
}
@@ -108,27 +116,41 @@
}
)
- cancelButton.setOnClickListener {
- diskSizeSlider.progress = mbToProgress(diskSizeMb)
- cancelButton.isVisible = false
- resizeButton.isVisible = false
- }
+ cancelButton.setOnClickListener { cancel() }
- resizeButton.setOnClickListener {
- diskSizeMb = progressToMb(diskSizeSlider.progress)
- cancelButton.isVisible = false
- resizeButton.isVisible = false
- val editor = sharedPref.edit()
- editor.putLong(getString(R.string.preference_disk_size_key), mbToBytes(diskSizeMb))
- editor.apply()
+ resizeButton.setOnClickListener { showConfirmationDialog() }
+ }
- // Restart terminal
- val intent =
- baseContext.packageManager.getLaunchIntentForPackage(baseContext.packageName)
- intent?.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
- finish()
- startActivity(intent)
- }
+ fun cancel() {
+ diskSizeSlider.progress = mbToProgress(diskSizeMb)
+ buttons.isVisible = false
+ }
+
+ fun showConfirmationDialog() {
+ MaterialAlertDialogBuilder(this)
+ .setTitle(R.string.settings_disk_resize_title)
+ .setMessage(R.string.settings_disk_resize_resize_confirm_dialog_message)
+ .setPositiveButton(R.string.settings_disk_resize_resize_confirm_dialog_confirm) { _, _
+ ->
+ resize()
+ }
+ .setNegativeButton(R.string.settings_disk_resize_resize_cancel) { _, _ -> cancel() }
+ .create()
+ .show()
+ }
+
+ fun resize() {
+ diskSizeMb = progressToMb(diskSizeSlider.progress)
+ buttons.isVisible = false
+ val editor = sharedPref.edit()
+ editor.putLong(getString(R.string.preference_disk_size_key), mbToBytes(diskSizeMb))
+ editor.apply()
+
+ // Restart terminal
+ val intent = baseContext.packageManager.getLaunchIntentForPackage(baseContext.packageName)
+ intent?.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
+ finish()
+ startActivity(intent)
}
fun updateSliderText(sizeMb: Long) {
diff --git a/android/TerminalApp/res/layout/settings_disk_resize.xml b/android/TerminalApp/res/layout/settings_disk_resize.xml
index fb7f85b..55fb7af 100644
--- a/android/TerminalApp/res/layout/settings_disk_resize.xml
+++ b/android/TerminalApp/res/layout/settings_disk_resize.xml
@@ -65,14 +65,18 @@
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
+ <androidx.constraintlayout.widget.Group
+ android:id="@+id/buttons"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:visibility="invisible"
+ app:constraint_referenced_ids="settings_disk_resize_cancel_button,settings_disk_resize_resize_button" />
+
<com.google.android.material.button.MaterialButton
android:id="@+id/settings_disk_resize_cancel_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:maxWidth="150sp"
- android:hyphenationFrequency="full"
android:text="@string/settings_disk_resize_resize_cancel"
- android:visibility="invisible"
android:layout_marginTop="48dp"
android:layout_marginHorizontal="8dp"
app:layout_constraintTop_toTopOf="@+id/settings_disk_resize_disk_size_slider"
@@ -83,10 +87,7 @@
android:id="@+id/settings_disk_resize_resize_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:maxWidth="150sp"
- android:hyphenationFrequency="full"
android:text="@string/settings_disk_resize_resize_restart_vm_to_apply"
- android:visibility="invisible"
android:layout_marginTop="48dp"
app:layout_constraintTop_toTopOf="@+id/settings_disk_resize_disk_size_slider"
app:layout_constraintBottom_toBottomOf="parent"
diff --git a/android/TerminalApp/res/values/strings.xml b/android/TerminalApp/res/values/strings.xml
index 6fb256b..44d88a2 100644
--- a/android/TerminalApp/res/values/strings.xml
+++ b/android/TerminalApp/res/values/strings.xml
@@ -74,8 +74,12 @@
<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=16] -->
<string name="settings_disk_resize_resize_cancel">Cancel</string>
- <!-- Settings menu button to apply change that requires to restart Terminal app. [CHAR LIMIT=40] -->
- <string name="settings_disk_resize_resize_restart_vm_to_apply">Restart to apply</string>
+ <!-- Settings menu button to apply change Terminal app. This will launch a confirmation dialog [CHAR LIMIT=16] -->
+ <string name="settings_disk_resize_resize_restart_vm_to_apply">Apply</string>
+ <!-- Dialog description for applying disk resize Terminal app, which requires to restart the terminal [CHAR LIMIT=none] -->
+ <string name="settings_disk_resize_resize_confirm_dialog_message">Terminal will be restarted to resize disk</string>
+ <!-- Dialog confirmation button for restarting the terminal [CHAR LIMIT=16] -->
+ <string name="settings_disk_resize_resize_confirm_dialog_confirm">Confirm</string>
<!-- Settings menu title for 'port forwarding' [CHAR LIMIT=none] -->
<string name="settings_port_forwarding_title">Port forwarding</string>