Merge changes I45fcbed9,I8796e1b9,I737c0c63 into main

* changes:
  VmTerminalApp: Show install error
  VmTerminalApp: Prevent snackbar from hiding UX
  VmTerminalApp: Use full hyphenation
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/InstallerActivity.java b/android/TerminalApp/java/com/android/virtualization/terminal/InstallerActivity.java
index a49403c..45da73c 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/InstallerActivity.java
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/InstallerActivity.java
@@ -40,14 +40,12 @@
 import com.google.android.material.snackbar.Snackbar;
 
 import java.lang.ref.WeakReference;
-import java.util.concurrent.ExecutorService;
 
 public class InstallerActivity extends BaseActivity {
     private static final String TAG = "LinuxInstaller";
 
     private static final long ESTIMATED_IMG_SIZE_BYTES = FileUtils.parseSize("550MB");
 
-    private ExecutorService mExecutorService;
     private CheckBox mWaitForWifiCheckbox;
     private TextView mInstallButton;
 
@@ -83,7 +81,7 @@
         Intent intent = new Intent(this, InstallerService.class);
         mInstallerServiceConnection = new InstallerServiceConnection(this);
         if (!bindService(intent, mInstallerServiceConnection, Context.BIND_AUTO_CREATE)) {
-            handleCriticalError(new Exception("Failed to connect to installer service"));
+            handleInternalError(new Exception("Failed to connect to installer service"));
         }
     }
 
@@ -92,11 +90,7 @@
         super.onResume();
 
         if (Build.isDebuggable() && InstallUtils.payloadFromExternalStorageExists()) {
-            Snackbar.make(
-                            findViewById(android.R.id.content),
-                            "Auto installing",
-                            Snackbar.LENGTH_LONG)
-                    .show();
+            showSnackbar("Auto installing", Snackbar.LENGTH_LONG);
             requestInstall();
         }
     }
@@ -125,13 +119,17 @@
         return mInstallCompleted.block(timeoutMillis);
     }
 
-    public void handleCriticalError(Exception e) {
+    private void showSnackbar(String message, int length) {
+        Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), message, length);
+        snackbar.setAnchorView(mWaitForWifiCheckbox);
+        snackbar.show();
+    }
+
+    public void handleInternalError(Exception e) {
         if (Build.isDebuggable()) {
-            Snackbar.make(
-                            findViewById(android.R.id.content),
-                            e.getMessage() + ". File a bugreport to go/ferrochrome-bug",
-                            Snackbar.LENGTH_INDEFINITE)
-                    .show();
+            showSnackbar(
+                    e.getMessage() + ". File a bugreport to go/ferrochrome-bug",
+                    Snackbar.LENGTH_INDEFINITE);
         }
         Log.e(TAG, "Internal error", e);
         finishWithResult(RESULT_CANCELED);
@@ -170,7 +168,7 @@
             try {
                 mService.requestInstall(mWaitForWifiCheckbox.isChecked());
             } catch (RemoteException e) {
-                handleCriticalError(e);
+                handleInternalError(e);
             }
         } else {
             Log.d(TAG, "requestInstall() is called, but not yet connected");
@@ -195,21 +193,18 @@
                 setInstallEnabled(false);
             }
         } catch (RemoteException e) {
-            handleCriticalError(e);
+            handleInternalError(e);
         }
     }
 
     @MainThread
     public void handleInstallerServiceDisconnected() {
-        handleCriticalError(new Exception("InstallerService is destroyed while in use"));
+        handleInternalError(new Exception("InstallerService is destroyed while in use"));
     }
 
     @MainThread
-    private void handleError(String displayText) {
-        if (Build.isDebuggable()) {
-            Snackbar.make(findViewById(android.R.id.content), displayText, Snackbar.LENGTH_LONG)
-                    .show();
-        }
+    private void handleInstallError(String displayText) {
+        showSnackbar(displayText, Snackbar.LENGTH_LONG);
         setInstallEnabled(true);
     }
 
@@ -249,7 +244,7 @@
                             return;
                         }
 
-                        activity.handleError(displayText);
+                        activity.handleInstallError(displayText);
                     });
         }
     }
@@ -270,7 +265,7 @@
                 return;
             }
             if (service == null) {
-                activity.handleCriticalError(new Exception("service shouldn't be null"));
+                activity.handleInternalError(new Exception("service shouldn't be null"));
             }
 
             activity.mService = IInstallerService.Stub.asInterface(service);
diff --git a/android/TerminalApp/res/layout/activity_error.xml b/android/TerminalApp/res/layout/activity_error.xml
index 1b5026e..054478f 100644
--- a/android/TerminalApp/res/layout/activity_error.xml
+++ b/android/TerminalApp/res/layout/activity_error.xml
@@ -29,7 +29,7 @@
         android:layout_marginVertical="24dp"
         android:layout_marginHorizontal="24dp"
         android:layout_alignParentTop="true"
-        android:hyphenationFrequency="normal"
+        android:hyphenationFrequency="full"
         android:textSize="48sp" />
 
     <TextView
diff --git a/android/TerminalApp/res/layout/settings_disk_resize.xml b/android/TerminalApp/res/layout/settings_disk_resize.xml
index 21ff070..7b8b9fc 100644
--- a/android/TerminalApp/res/layout/settings_disk_resize.xml
+++ b/android/TerminalApp/res/layout/settings_disk_resize.xml
@@ -29,7 +29,7 @@
         android:layout_width="wrap_content"
         android:text="@string/settings_disk_resize_title"
         android:textSize="48sp"
-        android:hyphenationFrequency="normal"
+        android:hyphenationFrequency="full"
         android:layout_marginBottom="24dp"/>
 
     <androidx.constraintlayout.widget.ConstraintLayout
@@ -71,7 +71,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:maxWidth="150sp"
-            android:hyphenationFrequency="normal"
+            android:hyphenationFrequency="full"
             android:text="@string/settings_disk_resize_resize_cancel"
             android:visibility="invisible"
             android:layout_marginTop="48dp"
@@ -85,7 +85,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:maxWidth="150sp"
-            android:hyphenationFrequency="normal"
+            android:hyphenationFrequency="full"
             android:text="@string/settings_disk_resize_resize_restart_vm_to_apply"
             android:visibility="invisible"
             android:layout_marginTop="48dp"
diff --git a/android/TerminalApp/res/layout/settings_port_forwarding.xml b/android/TerminalApp/res/layout/settings_port_forwarding.xml
index 98ba02c..2d21962 100644
--- a/android/TerminalApp/res/layout/settings_port_forwarding.xml
+++ b/android/TerminalApp/res/layout/settings_port_forwarding.xml
@@ -28,7 +28,7 @@
         android:layout_width="wrap_content"
         android:text="@string/settings_port_forwarding_title"
         android:textSize="48sp"
-        android:hyphenationFrequency="normal"
+        android:hyphenationFrequency="full"
         android:layout_marginBottom="24dp"/>
 
     <androidx.recyclerview.widget.RecyclerView
diff --git a/android/TerminalApp/res/layout/settings_recovery.xml b/android/TerminalApp/res/layout/settings_recovery.xml
index c72447f..d33f9a3 100644
--- a/android/TerminalApp/res/layout/settings_recovery.xml
+++ b/android/TerminalApp/res/layout/settings_recovery.xml
@@ -28,7 +28,7 @@
         android:layout_width="wrap_content"
         android:text="@string/settings_recovery_title"
         android:textSize="48sp"
-        android:hyphenationFrequency="normal"
+        android:hyphenationFrequency="full"
         android:layout_marginStart="24dp"
         android:layout_marginBottom="24dp"/>
     <FrameLayout