Send kill the session when tab is closed

Current workaround is sending ^C ^Z ^D ^D

Test: Manually
Bug: 405020534
(cherry picked from https://android-review.googlesource.com/q/commit:cb877a03d961c8e3201e8bfd8e4a9fb73a2199e7)
Merged-In: Id33d977f45c144dba91a194606a114491a86860c
Change-Id: Id33d977f45c144dba91a194606a114491a86860c
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()