Merge cherrypicks of ['android-review.googlesource.com/3556324', 'googleplex-android-review.googlesource.com/32641702'] into 25Q2-release.

Change-Id: Iccc26973f60ffdd1eb4b997957a9379866121fd0
diff --git a/android/TerminalApp/assets/js/terminal_close.js b/android/TerminalApp/assets/js/terminal_close.js
new file mode 100644
index 0000000..2ac6fc7
--- /dev/null
+++ b/android/TerminalApp/assets/js/terminal_close.js
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+(function() {
+term.input('\x03')
+setTimeout(() => {
+    term.input('\x1a');
+    setTimeout(() => {
+        term.input('\x04');
+        term.input('\x04');
+    }, 100)
+}, 100)
+})();
\ No newline at end of file
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/TerminalTabAdapter.kt b/android/TerminalApp/java/com/android/virtualization/terminal/TerminalTabAdapter.kt
index 9c3cd12..b7de7a6 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/TerminalTabAdapter.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/TerminalTabAdapter.kt
@@ -55,6 +55,7 @@
     fun deleteTab(position: Int) {
         if (position in 0 until tabs.size) {
             tabs.removeAt(position)
+            notifyItemRemoved(position)
         }
     }
 }
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/TerminalTabFragment.kt b/android/TerminalApp/java/com/android/virtualization/terminal/TerminalTabFragment.kt
index 8106f6e..7719076 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/TerminalTabFragment.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/TerminalTabFragment.kt
@@ -124,10 +124,12 @@
     inner class TerminalViewInterface(private val mContext: android.content.Context) {
         @JavascriptInterface
         fun closeTab() {
-            if (activity != null) {
-                activity?.runOnUiThread {
-                    val mainActivity = (activity as MainActivity)
-                    mainActivity.closeTab(terminalViewModel.terminalTabs[id]!!)
+            if (terminalViewModel.terminalTabs.containsKey(id)) {
+                if (activity != null) {
+                    activity?.runOnUiThread {
+                        val mainActivity = (activity as MainActivity)
+                        mainActivity.closeTab(terminalViewModel.terminalTabs[id]!!)
+                    }
                 }
             }
         }
@@ -243,6 +245,7 @@
     }
 
     override fun onDestroy() {
+        terminalView.terminalClose()
         terminalViewModel.terminalViews.remove(terminalView)
         super.onDestroy()
     }
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/TerminalView.kt b/android/TerminalApp/java/com/android/virtualization/terminal/TerminalView.kt
index 9c83d8b..6917827 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/TerminalView.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/TerminalView.kt
@@ -43,6 +43,7 @@
     private val disableCtrlKey: String = readAssetAsString(context, "js/disable_ctrl_key.js")
     private val terminalDisconnectCallback: String =
         readAssetAsString(context, "js/terminal_disconnect.js")
+    private val terminalClose: String = readAssetAsString(context, "js/terminal_close.js")
     private val touchToMouseHandler: String =
         readAssetAsString(context, "js/touch_to_mouse_handler.js")
     private val a11yManager =
@@ -76,6 +77,10 @@
         this.evaluateJavascript(terminalDisconnectCallback, null)
     }
 
+    fun terminalClose() {
+        this.evaluateJavascript(terminalClose, null)
+    }
+
     override fun onAccessibilityStateChanged(enabled: Boolean) {
         Log.d(TAG, "accessibility $enabled")
         adjustToA11yStateChange()
diff --git a/tests/vts/src/vts_libavf_test.rs b/tests/vts/src/vts_libavf_test.rs
index c13b510..e15228d 100644
--- a/tests/vts/src/vts_libavf_test.rs
+++ b/tests/vts/src/vts_libavf_test.rs
@@ -84,12 +84,17 @@
 
     info!("raw config created");
 
+    // The first 4 bytes of an instance ID for a vendor VM must be 0xFFFFFFFF
+    let mut instance_id: [u8; 64] = [0; 64];
+    instance_id[0..4].copy_from_slice(&[0xFF, 0xFF, 0xFF, 0xFF]);
+
     // SAFETY: config is the only reference to a valid object
     unsafe {
         AVirtualMachineRawConfig_setName(config, c"vts_libavf_test_rialto".as_ptr());
         AVirtualMachineRawConfig_setKernel(config, kernel_fd);
         AVirtualMachineRawConfig_setProtectedVm(config, protected_vm);
         AVirtualMachineRawConfig_setMemoryMiB(config, VM_MEMORY_MB);
+        AVirtualMachineRawConfig_setInstanceId(config, instance_id.as_ptr(), instance_id.len());
     }
 
     let mut vm = std::ptr::null_mut();