Merge "TerminalApp: Fixes for RTL" into main
diff --git a/android/TerminalApp/AndroidManifest.xml b/android/TerminalApp/AndroidManifest.xml
index 8ed2f79..aa702a3 100644
--- a/android/TerminalApp/AndroidManifest.xml
+++ b/android/TerminalApp/AndroidManifest.xml
@@ -26,6 +26,7 @@
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
+ <uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-feature android:name="android.software.virtualization_framework" android:required="true" />
diff --git a/android/TerminalApp/assets/js/disable_ctrl_key.js b/android/TerminalApp/assets/js/disable_ctrl_key.js
new file mode 100644
index 0000000..df261f0
--- /dev/null
+++ b/android/TerminalApp/assets/js/disable_ctrl_key.js
@@ -0,0 +1,19 @@
+/*
+ * 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() {
+window.ctrl = false;
+})();
\ No newline at end of file
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/MainActivity.kt b/android/TerminalApp/java/com/android/virtualization/terminal/MainActivity.kt
index 0f18261..f6eeff9 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/MainActivity.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/MainActivity.kt
@@ -21,11 +21,9 @@
import android.content.Intent
import android.content.pm.ActivityInfo
import android.content.res.Configuration
-import android.graphics.Bitmap
import android.graphics.drawable.Icon
import android.graphics.fonts.FontStyle
import android.net.Uri
-import android.net.http.SslError
import android.net.nsd.NsdManager
import android.net.nsd.NsdServiceInfo
import android.os.Build
@@ -38,41 +36,32 @@
import android.util.DisplayMetrics
import android.util.Log
import android.view.KeyEvent
-import android.view.Menu
-import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.view.accessibility.AccessibilityManager
-import android.webkit.ClientCertRequest
-import android.webkit.SslErrorHandler
-import android.webkit.WebChromeClient
-import android.webkit.WebResourceError
-import android.webkit.WebResourceRequest
-import android.webkit.WebSettings
-import android.webkit.WebView
-import android.webkit.WebViewClient
+import android.widget.Button
+import android.widget.HorizontalScrollView
+import android.widget.RelativeLayout
import androidx.activity.result.ActivityResult
import androidx.activity.result.ActivityResultCallback
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult
+import androidx.lifecycle.ViewModelProvider
+import androidx.viewpager2.widget.ViewPager2
import com.android.internal.annotations.VisibleForTesting
import com.android.microdroid.test.common.DeviceProperties
import com.android.system.virtualmachine.flags.Flags.terminalGuiSupport
-import com.android.virtualization.terminal.CertificateUtils.createOrGetKey
-import com.android.virtualization.terminal.CertificateUtils.writeCertificateToFile
import com.android.virtualization.terminal.ErrorActivity.Companion.start
import com.android.virtualization.terminal.InstalledImage.Companion.getDefault
import com.android.virtualization.terminal.VmLauncherService.Companion.run
import com.android.virtualization.terminal.VmLauncherService.Companion.stop
import com.android.virtualization.terminal.VmLauncherService.VmLauncherServiceCallback
-import com.google.android.material.appbar.MaterialToolbar
+import com.google.android.material.tabs.TabLayout
+import com.google.android.material.tabs.TabLayoutMediator
import java.io.IOException
-import java.lang.Exception
import java.net.MalformedURLException
import java.net.URL
-import java.security.PrivateKey
-import java.security.cert.X509Certificate
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
@@ -80,17 +69,21 @@
BaseActivity(),
VmLauncherServiceCallback,
AccessibilityManager.AccessibilityStateChangeListener {
+ var displayMenu: Button? = null
+ var tabAddButton: Button? = null
+ val bootCompleted = ConditionVariable()
+ lateinit var modifierKeysController: ModifierKeysController
+ private lateinit var tabScrollView: HorizontalScrollView
private lateinit var executorService: ExecutorService
private lateinit var image: InstalledImage
- private var certificates: Array<X509Certificate>? = null
- private var privateKey: PrivateKey? = null
- private lateinit var terminalContainer: ViewGroup
- private lateinit var terminalView: TerminalView
private lateinit var accessibilityManager: AccessibilityManager
- private val bootCompleted = ConditionVariable()
private lateinit var manageExternalStorageActivityResultLauncher: ActivityResultLauncher<Intent>
- private lateinit var modifierKeysController: ModifierKeysController
- private var displayMenu: MenuItem? = null
+ private var ipAddress: String? = null
+ private var port: Int? = null
+ private lateinit var terminalViewModel: TerminalViewModel
+ private lateinit var viewPager: ViewPager2
+ private lateinit var tabLayout: TabLayout
+ private lateinit var terminalTabAdapter: TerminalTabAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -100,26 +93,12 @@
val launchInstaller = installIfNecessary()
- setContentView(R.layout.activity_headless)
-
- val toolbar = findViewById<MaterialToolbar>(R.id.toolbar)
- setSupportActionBar(toolbar)
- terminalView = findViewById<TerminalView>(R.id.webview)
- terminalView.getSettings().setDomStorageEnabled(true)
- terminalView.getSettings().setJavaScriptEnabled(true)
- terminalView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE)
- terminalView.setWebChromeClient(WebChromeClient())
-
- terminalContainer = terminalView.parent as ViewGroup
-
- modifierKeysController = ModifierKeysController(this, terminalView, terminalContainer)
+ initializeUi()
accessibilityManager =
getSystemService<AccessibilityManager>(AccessibilityManager::class.java)
accessibilityManager.addAccessibilityStateChangeListener(this)
- readClientCertificate()
-
manageExternalStorageActivityResultLauncher =
registerForActivityResult<Intent, ActivityResult>(
StartActivityForResult(),
@@ -138,6 +117,73 @@
}
}
+ private fun initializeUi() {
+ terminalViewModel = ViewModelProvider(this)[TerminalViewModel::class.java]
+ setContentView(R.layout.activity_headless)
+ tabLayout = findViewById<TabLayout>(R.id.tab_layout)
+ displayMenu = findViewById<Button>(R.id.display_button)
+ tabAddButton = findViewById<Button>(R.id.tab_add_button)
+ tabScrollView = findViewById<HorizontalScrollView>(R.id.tab_scrollview)
+ val modifierKeysContainerView =
+ findViewById<RelativeLayout>(R.id.modifier_keys_container) as ViewGroup
+
+ findViewById<Button>(R.id.settings_button).setOnClickListener {
+ val intent = Intent(this, SettingsActivity::class.java)
+ this.startActivity(intent)
+ }
+
+ displayMenu?.also {
+ it.visibility = if (terminalGuiSupport()) View.VISIBLE else View.GONE
+ it.setEnabled(false)
+ if (terminalGuiSupport()) {
+ it.setOnClickListener {
+ val intent = Intent(this, DisplayActivity::class.java)
+ intent.flags =
+ intent.flags or
+ Intent.FLAG_ACTIVITY_NEW_TASK or
+ Intent.FLAG_ACTIVITY_CLEAR_TASK
+ this.startActivity(intent)
+ }
+ }
+ }
+
+ modifierKeysController = ModifierKeysController(this, modifierKeysContainerView)
+
+ terminalTabAdapter = TerminalTabAdapter(this)
+ viewPager = findViewById(R.id.pager)
+ viewPager.adapter = terminalTabAdapter
+ viewPager.isUserInputEnabled = false
+ viewPager.offscreenPageLimit = 2
+
+ TabLayoutMediator(tabLayout, viewPager, false, false) { _: TabLayout.Tab?, _: Int -> }
+ .attach()
+
+ addTerminalTab()
+
+ tabAddButton?.setOnClickListener { addTerminalTab() }
+ }
+
+ private fun addTerminalTab() {
+ val tab = tabLayout.newTab()
+ tab.setCustomView(R.layout.tabitem_terminal)
+ viewPager.offscreenPageLimit += 1
+ terminalTabAdapter.addTab()
+ tab.customView!!
+ .findViewById<Button>(R.id.tab_close_button)
+ .setOnClickListener(
+ View.OnClickListener { _: View? ->
+ if (terminalTabAdapter.tabs.size == 1) {
+ finishAndRemoveTask()
+ }
+ viewPager.offscreenPageLimit -= 1
+ terminalTabAdapter.deleteTab(tab.position)
+ tabLayout.removeTab(tab)
+ }
+ )
+ // Add and select the tab
+ tabLayout.addTab(tab, true)
+ }
+
private fun lockOrientationIfNecessary() {
val hasHwQwertyKeyboard = resources.configuration.keyboard == Configuration.KEYBOARD_QWERTY
if (hasHwQwertyKeyboard) {
@@ -175,7 +221,7 @@
private fun getTerminalServiceUrl(ipAddress: String?, port: Int): URL? {
val config = resources.configuration
-
+ // TODO: Always enable screenReaderMode (b/395845063)
val query =
("?fontSize=" +
(config.fontScale * FONT_SIZE_DEFAULT).toInt() +
@@ -196,105 +242,12 @@
}
}
- private fun readClientCertificate() {
- val pke = createOrGetKey()
- writeCertificateToFile(this, pke.certificate)
- privateKey = pke.privateKey
- certificates = arrayOf<X509Certificate>(pke.certificate as X509Certificate)
- }
-
- private fun connectToTerminalService() {
- terminalView.setWebViewClient(
- object : WebViewClient() {
- private var loadFailed = false
- private var requestId: Long = 0
-
- override fun shouldOverrideUrlLoading(
- view: WebView?,
- request: WebResourceRequest?,
- ): Boolean {
- val intent = Intent(Intent.ACTION_VIEW, request?.url)
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
- startActivity(intent)
- return true
- }
-
- override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
- loadFailed = false
- }
-
- override fun onReceivedError(
- view: WebView,
- request: WebResourceRequest,
- error: WebResourceError,
- ) {
- loadFailed = true
- when (error.getErrorCode()) {
- ERROR_CONNECT,
- ERROR_HOST_LOOKUP,
- ERROR_FAILED_SSL_HANDSHAKE,
- ERROR_TIMEOUT -> {
- view.reload()
- return
- }
-
- else -> {
- val url: String? = request.getUrl().toString()
- val msg = error.getDescription()
- Log.e(TAG, "Failed to load $url: $msg")
- }
- }
- }
-
- override fun onPageFinished(view: WebView, url: String?) {
- if (loadFailed) {
- return
- }
-
- requestId++
- view.postVisualStateCallback(
- requestId,
- object : WebView.VisualStateCallback() {
- override fun onComplete(completedRequestId: Long) {
- if (completedRequestId == requestId) {
- Trace.endAsyncSection("executeTerminal", 0)
- findViewById<View?>(R.id.boot_progress).visibility = View.GONE
- terminalContainer.visibility = View.VISIBLE
- if (terminalGuiSupport()) {
- displayMenu?.setVisible(true)
- displayMenu?.setEnabled(true)
- }
- bootCompleted.open()
- modifierKeysController.update()
- terminalView.mapTouchToMouseEvent()
- }
- }
- },
- )
- }
-
- override fun onReceivedClientCertRequest(
- view: WebView?,
- request: ClientCertRequest,
- ) {
- if (privateKey != null && certificates != null) {
- request.proceed(privateKey, certificates)
- return
- }
- super.onReceivedClientCertRequest(view, request)
- }
-
- override fun onReceivedSslError(
- view: WebView?,
- handler: SslErrorHandler,
- error: SslError?,
- ) {
- // ttyd uses self-signed certificate
- handler.proceed()
- }
- }
- )
-
+ fun connectToTerminalService(terminalView: TerminalView) {
+ if (ipAddress != null && port != null) {
+ val url = getTerminalServiceUrl(ipAddress, port!!)
+ terminalView.loadUrl(url.toString())
+ return
+ }
// TODO: refactor this block as a method
val nsdManager = getSystemService<NsdManager>(NsdManager::class.java)
val info = NsdServiceInfo()
@@ -314,10 +267,10 @@
override fun onServiceUpdated(info: NsdServiceInfo) {
Log.i(TAG, "Service found: $info")
- val ipAddress = info.hostAddresses[0].hostAddress
- val port = info.port
- val url = getTerminalServiceUrl(ipAddress, port)
if (!loaded) {
+ ipAddress = info.hostAddresses[0].hostAddress
+ port = info.port
+ val url = getTerminalServiceUrl(ipAddress, port!!)
loaded = true
nsdManager.unregisterServiceInfoCallback(this)
runOnUiThread(Runnable { terminalView.loadUrl(url.toString()) })
@@ -350,34 +303,10 @@
start(this, Exception("onVmError"))
}
- override fun onCreateOptionsMenu(menu: Menu?): Boolean {
- menuInflater.inflate(R.menu.main_menu, menu)
- displayMenu =
- menu?.findItem(R.id.menu_item_display).also {
- it?.setVisible(terminalGuiSupport())
- it?.setEnabled(false)
- }
- return true
- }
-
- override fun onOptionsItemSelected(item: MenuItem): Boolean {
- val id = item.getItemId()
- if (id == R.id.menu_item_settings) {
- val intent = Intent(this, SettingsActivity::class.java)
- this.startActivity(intent)
- return true
- } else if (id == R.id.menu_item_display) {
- val intent = Intent(this, DisplayActivity::class.java)
- intent.flags =
- intent.flags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
- this.startActivity(intent)
- return true
- }
- return super.onOptionsItemSelected(item)
- }
-
override fun onAccessibilityStateChanged(enabled: Boolean) {
- connectToTerminalService()
+ terminalViewModel.terminalViews.forEach { terminalView ->
+ connectToTerminalService(terminalView)
+ }
}
private val installerLauncher =
@@ -462,7 +391,6 @@
Trace.beginAsyncSection("executeTerminal", 0)
run(this, this, notification, getDisplayInfo())
- connectToTerminalService()
}
@VisibleForTesting
@@ -499,21 +427,6 @@
20000 // 20 sec
}
}
-
- private val BTN_KEY_CODE_MAP =
- mapOf(
- R.id.btn_tab to KeyEvent.KEYCODE_TAB, // Alt key sends ESC keycode
- R.id.btn_alt to KeyEvent.KEYCODE_ESCAPE,
- R.id.btn_esc to KeyEvent.KEYCODE_ESCAPE,
- R.id.btn_left to KeyEvent.KEYCODE_DPAD_LEFT,
- R.id.btn_right to KeyEvent.KEYCODE_DPAD_RIGHT,
- R.id.btn_up to KeyEvent.KEYCODE_DPAD_UP,
- R.id.btn_down to KeyEvent.KEYCODE_DPAD_DOWN,
- R.id.btn_home to KeyEvent.KEYCODE_MOVE_HOME,
- R.id.btn_end to KeyEvent.KEYCODE_MOVE_END,
- R.id.btn_pgup to KeyEvent.KEYCODE_PAGE_UP,
- R.id.btn_pgdn to KeyEvent.KEYCODE_PAGE_DOWN,
- )
}
fun getDisplayInfo(): DisplayInfo {
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/ModifierKeysController.kt b/android/TerminalApp/java/com/android/virtualization/terminal/ModifierKeysController.kt
index f8f30f9..ed340d2 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/ModifierKeysController.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/ModifierKeysController.kt
@@ -15,7 +15,6 @@
*/
package com.android.virtualization.terminal
-import android.app.Activity
import android.content.res.Configuration
import android.view.KeyEvent
import android.view.LayoutInflater
@@ -23,20 +22,16 @@
import android.view.ViewGroup
import android.view.WindowInsets
-class ModifierKeysController(
- val activity: Activity,
- val terminalView: TerminalView,
- val parent: ViewGroup,
-) {
+class ModifierKeysController(val activity: MainActivity, val parent: ViewGroup) {
private val window = activity.window
private val keysSingleLine: View
private val keysDoubleLine: View
-
+ private var activeTerminalView: TerminalView? = null
private var keysInSingleLine: Boolean = false
init {
- // Prepare the two modifier keys layout, but don't add them yet because we don't know which
- // layout will be needed.
+ // Prepare the two modifier keys layout, but only attach the double line one since the
+ // keysInSingleLine is set to true by default
val layout = LayoutInflater.from(activity)
keysSingleLine = layout.inflate(R.layout.modifier_keys_singleline, parent, false)
keysDoubleLine = layout.inflate(R.layout.modifier_keys_doubleline, parent, false)
@@ -46,14 +41,25 @@
keysSingleLine.visibility = View.GONE
keysDoubleLine.visibility = View.GONE
+ parent.addView(keysDoubleLine)
// Setup for the update to be called when needed
window.decorView.rootView.setOnApplyWindowInsetsListener { _: View?, insets: WindowInsets ->
update()
insets
}
+ }
- terminalView.setOnFocusChangeListener { _: View, _: Boolean -> update() }
+ fun addTerminalView(terminalView: TerminalView) {
+ terminalView.setOnFocusChangeListener { _: View, onFocus: Boolean ->
+ if (onFocus) {
+ activeTerminalView = terminalView
+ } else {
+ activeTerminalView = null
+ terminalView.disableCtrlKey()
+ }
+ update()
+ }
}
private fun addClickListeners(keys: View) {
@@ -61,15 +67,15 @@
keys
.findViewById<View>(R.id.btn_ctrl)
.setOnClickListener({
- terminalView.mapCtrlKey()
- terminalView.enableCtrlKey()
+ activeTerminalView!!.mapCtrlKey()
+ activeTerminalView!!.enableCtrlKey()
})
val listener =
View.OnClickListener { v: View ->
BTN_KEY_CODE_MAP[v.id]?.also { keyCode ->
- terminalView.dispatchKeyEvent(KeyEvent(KeyEvent.ACTION_DOWN, keyCode))
- terminalView.dispatchKeyEvent(KeyEvent(KeyEvent.ACTION_UP, keyCode))
+ activeTerminalView!!.dispatchKeyEvent(KeyEvent(KeyEvent.ACTION_DOWN, keyCode))
+ activeTerminalView!!.dispatchKeyEvent(KeyEvent(KeyEvent.ACTION_UP, keyCode))
}
}
@@ -79,38 +85,40 @@
}
fun update() {
- // select single line or double line
- val needSingleLine = needsKeysInSingleLine()
- if (keysInSingleLine != needSingleLine) {
- if (needSingleLine) {
- parent.removeView(keysDoubleLine)
- parent.addView(keysSingleLine)
- } else {
- parent.removeView(keysSingleLine)
- parent.addView(keysDoubleLine)
+ // Pass if no TerminalView focused.
+ if (activeTerminalView == null) {
+ val keys = if (keysInSingleLine) keysSingleLine else keysDoubleLine
+ keys.visibility = View.GONE
+ } else {
+ // select single line or double line
+ val needSingleLine = needsKeysInSingleLine()
+ if (keysInSingleLine != needSingleLine) {
+ if (needSingleLine) {
+ parent.removeView(keysDoubleLine)
+ parent.addView(keysSingleLine)
+ } else {
+ parent.removeView(keysSingleLine)
+ parent.addView(keysDoubleLine)
+ }
+ keysInSingleLine = needSingleLine
}
- keysInSingleLine = needSingleLine
+ // set visibility
+ val needShow = needToShowKeys()
+ val keys = if (keysInSingleLine) keysSingleLine else keysDoubleLine
+ keys.visibility = if (needShow) View.VISIBLE else View.GONE
}
-
- // set visibility
- val needShow = needToShowKeys()
- val keys = if (keysInSingleLine) keysSingleLine else keysDoubleLine
- keys.visibility = if (needShow) View.VISIBLE else View.GONE
}
// Modifier keys are required only when IME is shown and the HW qwerty keyboard is not present
- private fun needToShowKeys(): Boolean {
- val imeShown = activity.window.decorView.rootWindowInsets.isVisible(WindowInsets.Type.ime())
- val hasFocus = terminalView.hasFocus()
- val hasHwQwertyKeyboard =
- activity.resources.configuration.keyboard == Configuration.KEYBOARD_QWERTY
- return imeShown && hasFocus && !hasHwQwertyKeyboard
- }
+ private fun needToShowKeys(): Boolean =
+ activity.window.decorView.rootWindowInsets.isVisible(WindowInsets.Type.ime()) &&
+ activeTerminalView!!.hasFocus() &&
+ !(activity.resources.configuration.keyboard == Configuration.KEYBOARD_QWERTY)
// If terminal's height is less than 30% of the screen height, we need to show modifier keys in
// a single line to save the vertical space
private fun needsKeysInSingleLine(): Boolean =
- (terminalView.height / activity.window.decorView.height.toFloat()) < 0.3f
+ activeTerminalView!!.height.div(activity.window.decorView.height.toFloat()) < 0.3f
companion object {
private val BTN_KEY_CODE_MAP =
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/TerminalTabAdapter.kt b/android/TerminalApp/java/com/android/virtualization/terminal/TerminalTabAdapter.kt
new file mode 100644
index 0000000..9c3cd12
--- /dev/null
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/TerminalTabAdapter.kt
@@ -0,0 +1,60 @@
+/*
+ * 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.
+ */
+package com.android.virtualization.terminal
+
+import androidx.core.os.bundleOf
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentActivity
+import androidx.viewpager2.adapter.FragmentStateAdapter
+import java.util.UUID
+
+class TabMetadata(val id: String)
+
+class TerminalTabAdapter(fragmentActivity: FragmentActivity) :
+ FragmentStateAdapter(fragmentActivity) {
+ val tabs = ArrayList<TabMetadata>()
+
+ override fun createFragment(position: Int): Fragment {
+ val terminalTabFragment = TerminalTabFragment()
+
+ terminalTabFragment.arguments = bundleOf("id" to tabs[position].id)
+ return terminalTabFragment
+ }
+
+ override fun getItemCount(): Int {
+ return tabs.size
+ }
+
+ override fun getItemId(position: Int): Long {
+ return tabs[position].id.hashCode().toLong()
+ }
+
+ override fun containsItem(itemId: Long): Boolean {
+ return tabs.any { it.id.hashCode().toLong() == itemId }
+ }
+
+ fun addTab(): String {
+ val id = UUID.randomUUID().toString()
+ tabs.add(TabMetadata(id))
+ return id
+ }
+
+ fun deleteTab(position: Int) {
+ if (position in 0 until tabs.size) {
+ tabs.removeAt(position)
+ }
+ }
+}
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/TerminalTabFragment.kt b/android/TerminalApp/java/com/android/virtualization/terminal/TerminalTabFragment.kt
new file mode 100644
index 0000000..5c01ead
--- /dev/null
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/TerminalTabFragment.kt
@@ -0,0 +1,202 @@
+/*
+ * 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.
+ */
+package com.android.virtualization.terminal
+
+import android.content.Intent
+import android.graphics.Bitmap
+import android.net.http.SslError
+import android.os.Bundle
+import android.os.Trace
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.webkit.ClientCertRequest
+import android.webkit.SslErrorHandler
+import android.webkit.WebChromeClient
+import android.webkit.WebResourceError
+import android.webkit.WebResourceRequest
+import android.webkit.WebSettings
+import android.webkit.WebView
+import android.webkit.WebViewClient
+import androidx.fragment.app.Fragment
+import androidx.lifecycle.ViewModelProvider
+import com.android.system.virtualmachine.flags.Flags.terminalGuiSupport
+import com.android.virtualization.terminal.CertificateUtils.createOrGetKey
+import com.android.virtualization.terminal.CertificateUtils.writeCertificateToFile
+import java.security.PrivateKey
+import java.security.cert.X509Certificate
+
+class TerminalTabFragment() : Fragment() {
+ private lateinit var terminalView: TerminalView
+ private lateinit var bootProgressView: View
+ private lateinit var id: String
+ private var certificates: Array<X509Certificate>? = null
+ private var privateKey: PrivateKey? = null
+ private lateinit var terminalViewModel: TerminalViewModel
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?,
+ ): View {
+ val view = inflater.inflate(R.layout.fragment_terminal_tab, container, false)
+ arguments?.let { id = it.getString("id")!! }
+ return view
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ terminalViewModel = ViewModelProvider(this)[TerminalViewModel::class.java]
+ terminalView = view.findViewById(R.id.webview)
+ bootProgressView = view.findViewById(R.id.boot_progress)
+ initializeWebView()
+ readClientCertificate()
+
+ terminalView.webViewClient = TerminalWebViewClient()
+
+ if (savedInstanceState != null) {
+ terminalView.restoreState(savedInstanceState)
+ } else {
+ (activity as MainActivity).connectToTerminalService(terminalView)
+ }
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ terminalView.saveState(outState)
+ }
+
+ private fun initializeWebView() {
+ terminalView.settings.databaseEnabled = true
+ terminalView.settings.domStorageEnabled = true
+ terminalView.settings.javaScriptEnabled = true
+ terminalView.settings.cacheMode = WebSettings.LOAD_DEFAULT
+
+ terminalView.webChromeClient = WebChromeClient()
+ terminalView.webViewClient = TerminalWebViewClient()
+
+ (activity as MainActivity).modifierKeysController.addTerminalView(terminalView)
+ terminalViewModel.terminalViews.add(terminalView)
+ }
+
+ private inner class TerminalWebViewClient : WebViewClient() {
+ private var loadFailed = false
+ private var requestId: Long = 0
+
+ override fun shouldOverrideUrlLoading(
+ view: WebView?,
+ request: WebResourceRequest?,
+ ): Boolean {
+ val intent = Intent(Intent.ACTION_VIEW, request?.url)
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ startActivity(intent)
+ return true
+ }
+
+ override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
+ loadFailed = false
+ }
+
+ override fun onReceivedError(
+ view: WebView,
+ request: WebResourceRequest,
+ error: WebResourceError,
+ ) {
+ loadFailed = true
+ when (error.getErrorCode()) {
+ ERROR_CONNECT,
+ ERROR_HOST_LOOKUP,
+ ERROR_FAILED_SSL_HANDSHAKE,
+ ERROR_TIMEOUT -> {
+ view.reload()
+ return
+ }
+
+ else -> {
+ val url: String? = request.getUrl().toString()
+ val msg = error.getDescription()
+ Log.e(MainActivity.TAG, "Failed to load $url: $msg")
+ }
+ }
+ }
+
+ override fun onPageFinished(view: WebView, url: String?) {
+ if (loadFailed) {
+ return
+ }
+
+ requestId++
+ view.postVisualStateCallback(
+ requestId,
+ object : WebView.VisualStateCallback() {
+ override fun onComplete(completedRequestId: Long) {
+ if (completedRequestId == requestId) {
+ Trace.endAsyncSection("executeTerminal", 0)
+ bootProgressView.visibility = View.GONE
+ terminalView.visibility = View.VISIBLE
+ terminalView.mapTouchToMouseEvent()
+ updateMainActivity()
+ }
+ }
+ },
+ )
+ }
+
+ override fun onReceivedClientCertRequest(view: WebView?, request: ClientCertRequest) {
+ if (privateKey != null && certificates != null) {
+ request.proceed(privateKey, certificates)
+ return
+ }
+ super.onReceivedClientCertRequest(view, request)
+ }
+
+ override fun onReceivedSslError(
+ view: WebView?,
+ handler: SslErrorHandler,
+ error: SslError?,
+ ) {
+ // ttyd uses self-signed certificate
+ handler.proceed()
+ }
+ }
+
+ private fun updateMainActivity() {
+ val mainActivity = (activity as MainActivity)
+ if (terminalGuiSupport()) {
+ mainActivity.displayMenu!!.visibility = View.VISIBLE
+ mainActivity.displayMenu!!.isEnabled = true
+ }
+ mainActivity.tabAddButton!!.isEnabled = true
+ mainActivity.bootCompleted.open()
+ }
+
+ private fun readClientCertificate() {
+ val pke = createOrGetKey()
+ writeCertificateToFile(activity!!, pke.certificate)
+ privateKey = pke.privateKey
+ certificates = arrayOf<X509Certificate>(pke.certificate as X509Certificate)
+ }
+
+ companion object {
+ const val TAG: String = "VmTerminalApp"
+ }
+
+ override fun onDestroy() {
+ 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 4d9a89d..4b11c1d 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/TerminalView.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/TerminalView.kt
@@ -40,6 +40,7 @@
AccessibilityManager.TouchExplorationStateChangeListener {
private val ctrlKeyHandler: String = readAssetAsString(context, "js/ctrl_key_handler.js")
private val enableCtrlKey: String = readAssetAsString(context, "js/enable_ctrl_key.js")
+ private val disableCtrlKey: String = readAssetAsString(context, "js/disable_ctrl_key.js")
private val touchToMouseHandler: String =
readAssetAsString(context, "js/touch_to_mouse_handler.js")
private val a11yManager =
@@ -65,6 +66,10 @@
this.evaluateJavascript(enableCtrlKey, null)
}
+ fun disableCtrlKey() {
+ this.evaluateJavascript(disableCtrlKey, null)
+ }
+
override fun onAccessibilityStateChanged(enabled: Boolean) {
Log.d(TAG, "accessibility $enabled")
adjustToA11yStateChange()
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/TerminalViewModel.kt b/android/TerminalApp/java/com/android/virtualization/terminal/TerminalViewModel.kt
new file mode 100644
index 0000000..4a69f75
--- /dev/null
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/TerminalViewModel.kt
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+package com.android.virtualization.terminal
+
+import androidx.lifecycle.ViewModel
+
+class TerminalViewModel : ViewModel() {
+ val terminalViews: MutableSet<TerminalView> = mutableSetOf()
+}
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.kt b/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.kt
index ecb01c0..6301da4 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.kt
@@ -34,6 +34,7 @@
import android.os.Trace
import android.system.virtualmachine.VirtualMachine
import android.system.virtualmachine.VirtualMachineCustomImageConfig
+import android.system.virtualmachine.VirtualMachineCustomImageConfig.AudioConfig
import android.system.virtualmachine.VirtualMachineException
import android.util.Log
import android.widget.Toast
@@ -105,6 +106,13 @@
val configBuilder = json.toConfigBuilder(this)
val customImageConfigBuilder = json.toCustomImageConfigBuilder(this)
val displaySize = intent.getParcelableExtra(EXTRA_DISPLAY_INFO, DisplayInfo::class.java)
+
+ customImageConfigBuilder.setAudioConfig(
+ AudioConfig.Builder()
+ .setUseSpeaker(true)
+ .setUseMicrophone(true)
+ .build()
+ )
if (overrideConfigIfNecessary(customImageConfigBuilder, displaySize)) {
configBuilder.setCustomImageConfig(customImageConfigBuilder.build())
}
diff --git a/android/TerminalApp/res/drawable/background_tabitem_selected.xml b/android/TerminalApp/res/drawable/background_tabitem_selected.xml
new file mode 100644
index 0000000..8784304
--- /dev/null
+++ b/android/TerminalApp/res/drawable/background_tabitem_selected.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 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.
+ -->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <corners
+ android:topLeftRadius="10dp"
+ android:topRightRadius="10dp" />
+</shape>
diff --git a/android/TerminalApp/res/layout/activity_headless.xml b/android/TerminalApp/res/layout/activity_headless.xml
index e18aa5c..b4c013f 100644
--- a/android/TerminalApp/res/layout/activity_headless.xml
+++ b/android/TerminalApp/res/layout/activity_headless.xml
@@ -14,51 +14,87 @@
limitations under the License.
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/terminal_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="vertical"
android:fitsSystemWindows="true"
tools:context=".MainActivity">
- <com.google.android.material.appbar.MaterialToolbar
- android:id="@+id/toolbar"
+
+ <HorizontalScrollView
+ android:id="@+id/tab_scrollview"
android:layout_width="match_parent"
- android:layout_height="?attr/actionBarSize"
- app:layout_constraintTop_toTopOf="parent"/>
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_height="wrap_content"
+ android:layout_alignParentStart="true"
+ android:layout_alignParentTop="true"
+ android:layout_toStartOf="@id/menu_container"
+ android:scrollbars="none">
+
<LinearLayout
- android:id="@+id/boot_progress"
- android:orientation="vertical"
- android:gravity="center"
- android:layout_gravity="center"
android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- <com.google.android.material.textview.MaterialTextView
- android:text="@string/vm_creation_message"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+ <com.google.android.material.tabs.TabLayout
+ android:id="@+id/tab_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginBottom="5dp"/>
- <com.google.android.material.progressindicator.CircularProgressIndicator
- android:indeterminate="true"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- </LinearLayout>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginBottom="5dp"
- android:orientation="vertical"
- android:visibility="gone" >
- <com.android.virtualization.terminal.TerminalView
- android:id="@+id/webview"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1" />
- </LinearLayout>
- </FrameLayout>
+ android:elevation="0dp"
+ app:tabIndicator="@drawable/background_tabitem_selected"
+ app:tabIndicatorColor="@color/material_on_surface_stroke"
+ app:tabRippleColor="@null"
+ app:tabIndicatorHeight="48dp"
+ app:tabPaddingStart="0dp"
+ app:tabPaddingEnd="0dp"/>
-</LinearLayout>
+ <Button
+ android:id="@+id/tab_add_button"
+ style="?attr/materialIconButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:enabled="false"
+ app:icon="@drawable/ic_add" />
+ </LinearLayout>
+ </HorizontalScrollView>
+
+ <LinearLayout
+ android:id="@+id/menu_container"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentEnd="true"
+ android:orientation="horizontal">
+ <Button
+ android:id="@+id/settings_button"
+ style="?attr/materialIconButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ app:icon="@drawable/ic_settings" />
+ <Button
+ android:id="@+id/display_button"
+ style="?attr/materialIconButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ app:icon="@drawable/ic_display" />
+ </LinearLayout>
+
+
+ <androidx.viewpager2.widget.ViewPager2
+ android:id="@+id/pager"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_alignParentStart="true"
+ android:layout_above="@+id/modifier_keys_container"
+ android:layout_below="@id/menu_container"/>
+
+ <LinearLayout
+ android:id="@+id/modifier_keys_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentStart="true"
+ android:orientation="vertical"/>
+</RelativeLayout>
diff --git a/android/TerminalApp/res/layout/fragment_terminal_tab.xml b/android/TerminalApp/res/layout/fragment_terminal_tab.xml
new file mode 100644
index 0000000..bdf3d83
--- /dev/null
+++ b/android/TerminalApp/res/layout/fragment_terminal_tab.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 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.
+ -->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <LinearLayout
+ android:id="@+id/boot_progress"
+ android:orientation="vertical"
+ android:gravity="center"
+ android:layout_gravity="center"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ <com.google.android.material.textview.MaterialTextView
+ android:text="@string/vm_creation_message"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="5dp"/>
+ <com.google.android.material.progressindicator.CircularProgressIndicator
+ android:indeterminate="true"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+ </LinearLayout>
+ <com.android.virtualization.terminal.TerminalView
+ android:id="@+id/webview"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:visibility="gone"
+ android:layout_marginBottom="5dp"/>
+</FrameLayout>
\ No newline at end of file
diff --git a/android/TerminalApp/res/layout/tabitem_terminal.xml b/android/TerminalApp/res/layout/tabitem_terminal.xml
new file mode 100644
index 0000000..92e3802
--- /dev/null
+++ b/android/TerminalApp/res/layout/tabitem_terminal.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 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.
+ -->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="200dp"
+ android:layout_height="48dp">
+
+ <TextView
+ android:id="@+id/tab_title"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_alignParentStart="true"
+ android:layout_alignParentTop="true"
+ android:layout_toStartOf="@id/tab_close_button"
+ android:gravity="center"
+ android:padding="8dp"
+ android:text="@string/tab_default_title"/>
+
+ <Button
+ style="?attr/materialIconButtonStyle"
+ android:id="@+id/tab_close_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentEnd="true"
+ app:icon="@drawable/ic_close"
+ android:clickable="true"
+ android:focusable="true"/>
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/android/TerminalApp/res/menu/main_menu.xml b/android/TerminalApp/res/menu/main_menu.xml
deleted file mode 100644
index dbb788c..0000000
--- a/android/TerminalApp/res/menu/main_menu.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2024 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.
- -->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto">
- <item android:id="@+id/menu_item_settings"
- android:icon="@drawable/ic_settings"
- android:title="@string/action_settings"
- app:showAsAction="always"/>
- <item android:id="@+id/menu_item_display"
- android:icon="@drawable/ic_display"
- android:enabled="false"
- android:title="@string/action_display"
- app:showAsAction="always"/>
-</menu>
diff --git a/android/TerminalApp/res/values-af/strings.xml b/android/TerminalApp/res/values-af/strings.xml
index b395cf2..143d957 100644
--- a/android/TerminalApp/res/values-af/strings.xml
+++ b/android/TerminalApp/res/values-af/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> is geaktiveer"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Take wat lank neem"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Stelselgebeurtenisse"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-am/strings.xml b/android/TerminalApp/res/values-am/strings.xml
index 6b2610d..f6cec87 100644
--- a/android/TerminalApp/res/values-am/strings.xml
+++ b/android/TerminalApp/res/values-am/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> ነቅቷል"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"ረዥም የሚያሄዱ ተግባሮች"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"የሥርዓት ክስተቶች"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-ar/strings.xml b/android/TerminalApp/res/values-ar/strings.xml
index d67feb6..5fe49ec 100644
--- a/android/TerminalApp/res/values-ar/strings.xml
+++ b/android/TerminalApp/res/values-ar/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"تم تفعيل <xliff:g id="ID_1">VirGL</xliff:g>"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"المهام الطويلة المدى"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"أحداث النظام"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-as/strings.xml b/android/TerminalApp/res/values-as/strings.xml
index d9ba74c..81d87e3 100644
--- a/android/TerminalApp/res/values-as/strings.xml
+++ b/android/TerminalApp/res/values-as/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> সক্ষম কৰা আছে"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"দীঘলীয়া সময় জুৰি চলা কাৰ্য"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"ছিষ্টেমৰ ঘটনা"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-az/strings.xml b/android/TerminalApp/res/values-az/strings.xml
index b3f45fc..0ba4116 100644
--- a/android/TerminalApp/res/values-az/strings.xml
+++ b/android/TerminalApp/res/values-az/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> aktivləşdirilib"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Uzunmüddətli tapşırıqlar"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Sistem tədbirləri"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-b+sr+Latn/strings.xml b/android/TerminalApp/res/values-b+sr+Latn/strings.xml
index 490bc0a..fc0af18 100644
--- a/android/TerminalApp/res/values-b+sr+Latn/strings.xml
+++ b/android/TerminalApp/res/values-b+sr+Latn/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> je omogućen"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Dugotrajni zadaci"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Sistemski događaji"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-be/strings.xml b/android/TerminalApp/res/values-be/strings.xml
index 236ffc8..4ab472c 100644
--- a/android/TerminalApp/res/values-be/strings.xml
+++ b/android/TerminalApp/res/values-be/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"Модуль <xliff:g id="ID_1">VirGL</xliff:g> уключаны"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Працяглыя задачы"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Сістэмныя падзеі"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-bg/strings.xml b/android/TerminalApp/res/values-bg/strings.xml
index 40943a6..7009eb3 100644
--- a/android/TerminalApp/res/values-bg/strings.xml
+++ b/android/TerminalApp/res/values-bg/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> е активирано"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Продължителни задачи"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Системни събития"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-bn/strings.xml b/android/TerminalApp/res/values-bn/strings.xml
index a2d9095..08207cf 100644
--- a/android/TerminalApp/res/values-bn/strings.xml
+++ b/android/TerminalApp/res/values-bn/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> চালু করা আছে"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"দীর্ঘ সময় ধরে চালানো টাস্ক"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"সিস্টেম ইভেন্ট"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-bs/strings.xml b/android/TerminalApp/res/values-bs/strings.xml
index fd4a460..45be635 100644
--- a/android/TerminalApp/res/values-bs/strings.xml
+++ b/android/TerminalApp/res/values-bs/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"Omogućeno: <xliff:g id="ID_1">VirGL</xliff:g>"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Dugotrajni zadaci"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Događaji sistema"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-ca/strings.xml b/android/TerminalApp/res/values-ca/strings.xml
index 1180208..11f3ce5 100644
--- a/android/TerminalApp/res/values-ca/strings.xml
+++ b/android/TerminalApp/res/values-ca/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> està activat"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tasques de llarga durada"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Esdeveniments del sistema"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-cs/strings.xml b/android/TerminalApp/res/values-cs/strings.xml
index a164818..fc3afaf 100644
--- a/android/TerminalApp/res/values-cs/strings.xml
+++ b/android/TerminalApp/res/values-cs/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"Modul <xliff:g id="ID_1">VirGL</xliff:g> je aktivován"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Dlouho spuštěné úlohy"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Systémové události"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-da/strings.xml b/android/TerminalApp/res/values-da/strings.xml
index f3a499b..a6c211e 100644
--- a/android/TerminalApp/res/values-da/strings.xml
+++ b/android/TerminalApp/res/values-da/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> er aktiveret"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Længerevarende opgaver"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Systemhændelser"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-de/strings.xml b/android/TerminalApp/res/values-de/strings.xml
index 107f275..3123008 100644
--- a/android/TerminalApp/res/values-de/strings.xml
+++ b/android/TerminalApp/res/values-de/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> ist aktiviert"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Aufgaben mit langer Ausführungszeit"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Systemereignisse"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-el/strings.xml b/android/TerminalApp/res/values-el/strings.xml
index bcb7256..0cc1ad3 100644
--- a/android/TerminalApp/res/values-el/strings.xml
+++ b/android/TerminalApp/res/values-el/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"Το <xliff:g id="ID_1">VirGL</xliff:g> είναι ενεργοποιημένο"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Εργασίες μεγάλης διάρκειας"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Συμβάντα συστήματος"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-en-rAU/strings.xml b/android/TerminalApp/res/values-en-rAU/strings.xml
index 0403b74..3d9e5a8 100644
--- a/android/TerminalApp/res/values-en-rAU/strings.xml
+++ b/android/TerminalApp/res/values-en-rAU/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> is enabled"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Long-running tasks"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"System events"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-en-rCA/strings.xml b/android/TerminalApp/res/values-en-rCA/strings.xml
index 5842cb2..9ac492a 100644
--- a/android/TerminalApp/res/values-en-rCA/strings.xml
+++ b/android/TerminalApp/res/values-en-rCA/strings.xml
@@ -90,4 +90,5 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> is enabled"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Long running tasks"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"System events"</string>
+ <string name="tab_default_title" msgid="2300417689389397930">"Tab"</string>
</resources>
diff --git a/android/TerminalApp/res/values-en-rGB/strings.xml b/android/TerminalApp/res/values-en-rGB/strings.xml
index 0403b74..3d9e5a8 100644
--- a/android/TerminalApp/res/values-en-rGB/strings.xml
+++ b/android/TerminalApp/res/values-en-rGB/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> is enabled"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Long-running tasks"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"System events"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-en-rIN/strings.xml b/android/TerminalApp/res/values-en-rIN/strings.xml
index 0403b74..3d9e5a8 100644
--- a/android/TerminalApp/res/values-en-rIN/strings.xml
+++ b/android/TerminalApp/res/values-en-rIN/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> is enabled"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Long-running tasks"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"System events"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-es-rUS/strings.xml b/android/TerminalApp/res/values-es-rUS/strings.xml
index e25e5c5..4764e78 100644
--- a/android/TerminalApp/res/values-es-rUS/strings.xml
+++ b/android/TerminalApp/res/values-es-rUS/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"Se habilitó <xliff:g id="ID_1">VirGL</xliff:g>"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tareas extensas"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Eventos del sistema"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-es/strings.xml b/android/TerminalApp/res/values-es/strings.xml
index 5a9a3c6..2569f43 100644
--- a/android/TerminalApp/res/values-es/strings.xml
+++ b/android/TerminalApp/res/values-es/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> se ha habilitado"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tareas de larga duración"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Eventos del sistema"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-et/strings.xml b/android/TerminalApp/res/values-et/strings.xml
index 30916ca..a8a6d72 100644
--- a/android/TerminalApp/res/values-et/strings.xml
+++ b/android/TerminalApp/res/values-et/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> on lubatud"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Pikalt kestvad ülesanded"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Süsteemisündmused"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-eu/strings.xml b/android/TerminalApp/res/values-eu/strings.xml
index 19284a2..c84cdaf 100644
--- a/android/TerminalApp/res/values-eu/strings.xml
+++ b/android/TerminalApp/res/values-eu/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> gaituta dago"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Luze exekutatzen diren zereginak"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Sistemako gertaerak"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-fa/strings.xml b/android/TerminalApp/res/values-fa/strings.xml
index d4ebb2b..6b98dd4 100644
--- a/android/TerminalApp/res/values-fa/strings.xml
+++ b/android/TerminalApp/res/values-fa/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> فعال شد"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"تکالیف بلندمدت"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"رویدادهای سیستم"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-fi/strings.xml b/android/TerminalApp/res/values-fi/strings.xml
index 526ae93..9c62084 100644
--- a/android/TerminalApp/res/values-fi/strings.xml
+++ b/android/TerminalApp/res/values-fi/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> on käytössä"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Pitkäkestoiset tehtävät"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Järjestelmätapahtumat"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-fr-rCA/strings.xml b/android/TerminalApp/res/values-fr-rCA/strings.xml
index 47e1d41..affea77 100644
--- a/android/TerminalApp/res/values-fr-rCA/strings.xml
+++ b/android/TerminalApp/res/values-fr-rCA/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> est activé"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tâches de longue durée"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Événements système"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-fr/strings.xml b/android/TerminalApp/res/values-fr/strings.xml
index 83a2ce4..65cb9e3 100644
--- a/android/TerminalApp/res/values-fr/strings.xml
+++ b/android/TerminalApp/res/values-fr/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> est activé"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tâches de longue durée"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Événements système"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-gl/strings.xml b/android/TerminalApp/res/values-gl/strings.xml
index 61b71ae..4af29a7 100644
--- a/android/TerminalApp/res/values-gl/strings.xml
+++ b/android/TerminalApp/res/values-gl/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"Activouse <xliff:g id="ID_1">VirGL</xliff:g>"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tarefas de longa duración"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Eventos do sistema"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-gu/strings.xml b/android/TerminalApp/res/values-gu/strings.xml
index 9136302..bb0240e 100644
--- a/android/TerminalApp/res/values-gu/strings.xml
+++ b/android/TerminalApp/res/values-gu/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> ચાલુ કરેલું છે"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"લાંબો સમય ચાલનારા કાર્યો"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"સિસ્ટમ ઇવેન્ટ"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-hi/strings.xml b/android/TerminalApp/res/values-hi/strings.xml
index bd5756b..3b106bd 100644
--- a/android/TerminalApp/res/values-hi/strings.xml
+++ b/android/TerminalApp/res/values-hi/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> चालू है"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"लंबे समय तक चलने वाले टास्क"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"सिस्टम इवेंट"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-hr/strings.xml b/android/TerminalApp/res/values-hr/strings.xml
index 27e51e3..93f321d 100644
--- a/android/TerminalApp/res/values-hr/strings.xml
+++ b/android/TerminalApp/res/values-hr/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"Omogućeno je: <xliff:g id="ID_1">VirGL</xliff:g>"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Dugotrajni zadaci"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Događaji sustava"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-hu/strings.xml b/android/TerminalApp/res/values-hu/strings.xml
index 046081e..d04b71e 100644
--- a/android/TerminalApp/res/values-hu/strings.xml
+++ b/android/TerminalApp/res/values-hu/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"A(z) <xliff:g id="ID_1">VirGL</xliff:g> engedélyezve van"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Hosszan futó feladatok"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Rendszeresemények"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-hy/strings.xml b/android/TerminalApp/res/values-hy/strings.xml
index 6026fae..670d778 100644
--- a/android/TerminalApp/res/values-hy/strings.xml
+++ b/android/TerminalApp/res/values-hy/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g>-ը միացված է"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Երկար աշխատող առաջադրանքներ"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Համակարգի իրադարձություններ"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-in/strings.xml b/android/TerminalApp/res/values-in/strings.xml
index b114246..4485173 100644
--- a/android/TerminalApp/res/values-in/strings.xml
+++ b/android/TerminalApp/res/values-in/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> diaktifkan"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tugas yang berjalan lama"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Peristiwa sistem"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-is/strings.xml b/android/TerminalApp/res/values-is/strings.xml
index 9bb0df4..949b5cd 100644
--- a/android/TerminalApp/res/values-is/strings.xml
+++ b/android/TerminalApp/res/values-is/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"Kveikt er á <xliff:g id="ID_1">VirGL</xliff:g>"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Langvarandi verkefni"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Kerfistilvik"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-it/strings.xml b/android/TerminalApp/res/values-it/strings.xml
index a8848ed..870cf60 100644
--- a/android/TerminalApp/res/values-it/strings.xml
+++ b/android/TerminalApp/res/values-it/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> è abilitata"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Attività di lunga durata"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Eventi di sistema"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-iw/strings.xml b/android/TerminalApp/res/values-iw/strings.xml
index 6156a1c..1a57334 100644
--- a/android/TerminalApp/res/values-iw/strings.xml
+++ b/android/TerminalApp/res/values-iw/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> מופעל"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"משימות ממושכות"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"אירועי מערכת"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-ja/strings.xml b/android/TerminalApp/res/values-ja/strings.xml
index d28c957..5117e5a 100644
--- a/android/TerminalApp/res/values-ja/strings.xml
+++ b/android/TerminalApp/res/values-ja/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g>は有効です"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"長時間実行タスク"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"システム イベント"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-ka/strings.xml b/android/TerminalApp/res/values-ka/strings.xml
index 5eb5bbf..3c33a95 100644
--- a/android/TerminalApp/res/values-ka/strings.xml
+++ b/android/TerminalApp/res/values-ka/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> ჩართულია"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"ხანგრძლივად გაშვებული ამოცანები"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"სისტემური მოვლენები"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-kk/strings.xml b/android/TerminalApp/res/values-kk/strings.xml
index c40ba60..7c51a60 100644
--- a/android/TerminalApp/res/values-kk/strings.xml
+++ b/android/TerminalApp/res/values-kk/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> қосылды."</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Ұзақ орындалатын тапсырмалар"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Жүйе оқиғалары"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-km/strings.xml b/android/TerminalApp/res/values-km/strings.xml
index b5b3ffa..feacc58 100644
--- a/android/TerminalApp/res/values-km/strings.xml
+++ b/android/TerminalApp/res/values-km/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> ត្រូវបានបើក"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"កិច្ចការដែលដំណើរការរយៈពេលយូរ"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"ព្រឹត្តិការណ៍ប្រព័ន្ធ"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-kn/strings.xml b/android/TerminalApp/res/values-kn/strings.xml
index 46b2d24..17b9ba4 100644
--- a/android/TerminalApp/res/values-kn/strings.xml
+++ b/android/TerminalApp/res/values-kn/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"ದೀರ್ಘಾವಧಿಯ ಕಾರ್ಯಗಳು"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"ಸಿಸ್ಟಮ್ ಈವೆಂಟ್ಗಳು"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-ko/strings.xml b/android/TerminalApp/res/values-ko/strings.xml
index ab523e2..49d015a 100644
--- a/android/TerminalApp/res/values-ko/strings.xml
+++ b/android/TerminalApp/res/values-ko/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g>이(가) 사용 설정되었습니다."</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"장기 실행 태스크"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"시스템 이벤트"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-ky/strings.xml b/android/TerminalApp/res/values-ky/strings.xml
index 3e4a3e4..b66eebd 100644
--- a/android/TerminalApp/res/values-ky/strings.xml
+++ b/android/TerminalApp/res/values-ky/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> иштетилди"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Узак тапшырмалар"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Тутумдук иш-чаралар"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-lo/strings.xml b/android/TerminalApp/res/values-lo/strings.xml
index 440d757..9d0ba5a 100644
--- a/android/TerminalApp/res/values-lo/strings.xml
+++ b/android/TerminalApp/res/values-lo/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"ເປີດການນຳໃຊ້ <xliff:g id="ID_1">VirGL</xliff:g> ແລ້ວ"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"ວຽກທີ່ດຳເນີນເປັນເວລາດົນ"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"ກິດຈະກຳລະບົບ"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-lt/strings.xml b/android/TerminalApp/res/values-lt/strings.xml
index 4abcd2d..f90c677 100644
--- a/android/TerminalApp/res/values-lt/strings.xml
+++ b/android/TerminalApp/res/values-lt/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"„<xliff:g id="ID_1">VirGL</xliff:g>“ įgalinta"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Ilgai vykdomos užduotys"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Sistemos įvykiai"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-lv/strings.xml b/android/TerminalApp/res/values-lv/strings.xml
index 0d017d1..326e443 100644
--- a/android/TerminalApp/res/values-lv/strings.xml
+++ b/android/TerminalApp/res/values-lv/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> ir iespējots"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Ilgstoši uzdevumi"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Sistēmas notikumi"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-mk/strings.xml b/android/TerminalApp/res/values-mk/strings.xml
index 3db6614..8660c50 100644
--- a/android/TerminalApp/res/values-mk/strings.xml
+++ b/android/TerminalApp/res/values-mk/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"Овозможено: <xliff:g id="ID_1">VirGL</xliff:g>"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Задачи што се извршуваат долго"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Системски настани"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-ml/strings.xml b/android/TerminalApp/res/values-ml/strings.xml
index 1117979..c0c3861 100644
--- a/android/TerminalApp/res/values-ml/strings.xml
+++ b/android/TerminalApp/res/values-ml/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> പ്രവർത്തനക്ഷമമാക്കി"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"ദീർഘസമയം റൺ ചെയ്യുന്ന ടാസ്ക്കുകൾ"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"സിസ്റ്റം ഇവന്റുകൾ"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-mn/strings.xml b/android/TerminalApp/res/values-mn/strings.xml
index 4c8305b..4b1110c 100644
--- a/android/TerminalApp/res/values-mn/strings.xml
+++ b/android/TerminalApp/res/values-mn/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> идэвхэжсэн"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Удаан ажиллаж буй ажил"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Системийн үйл явдал"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-mr/strings.xml b/android/TerminalApp/res/values-mr/strings.xml
index eff919f..147baeb 100644
--- a/android/TerminalApp/res/values-mr/strings.xml
+++ b/android/TerminalApp/res/values-mr/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> सुरू केले आहे"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"दीर्घवेळ रन होणाऱ्या टास्क"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"सिस्टीम इव्हेंट"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-ms/strings.xml b/android/TerminalApp/res/values-ms/strings.xml
index fb88ff1..215919e 100644
--- a/android/TerminalApp/res/values-ms/strings.xml
+++ b/android/TerminalApp/res/values-ms/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> didayakan"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tugasan yang memakan masa yang lama"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Peristiwa sistem"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-my/strings.xml b/android/TerminalApp/res/values-my/strings.xml
index 08ca00c..0124ecf 100644
--- a/android/TerminalApp/res/values-my/strings.xml
+++ b/android/TerminalApp/res/values-my/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> ဖွင့်ထားသည်"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"အချိန်ကြာသော လုပ်ဆောင်စရာများ"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"စနစ်ဖြစ်စဉ်များ"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-nb/strings.xml b/android/TerminalApp/res/values-nb/strings.xml
index 2016678..327de8c 100644
--- a/android/TerminalApp/res/values-nb/strings.xml
+++ b/android/TerminalApp/res/values-nb/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> er aktivert"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Langvarige oppgaver"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Systemhendelser"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-ne/strings.xml b/android/TerminalApp/res/values-ne/strings.xml
index 9e3b9e6..dc84699 100644
--- a/android/TerminalApp/res/values-ne/strings.xml
+++ b/android/TerminalApp/res/values-ne/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> अन गरिएको छ"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"लामो समयसम्म चलिरहने कार्यहरू"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"सिस्टमसम्बन्धी गतिविधिहरू"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-nl/strings.xml b/android/TerminalApp/res/values-nl/strings.xml
index eaea8a2..6ce1949 100644
--- a/android/TerminalApp/res/values-nl/strings.xml
+++ b/android/TerminalApp/res/values-nl/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> staat aan"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Langlopende taken"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Systeemgebeurtenissen"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-or/strings.xml b/android/TerminalApp/res/values-or/strings.xml
index 5383645..6cf8617 100644
--- a/android/TerminalApp/res/values-or/strings.xml
+++ b/android/TerminalApp/res/values-or/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g>କୁ ସକ୍ଷମ କରାଯାଇଛି"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"ଅଧିକ ସମୟ ଚାଲୁଥିବା ଟାସ୍କ"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"ସିଷ୍ଟମ ଇଭେଣ୍ଟ"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-pa/strings.xml b/android/TerminalApp/res/values-pa/strings.xml
index 0ff2a0d..ced3359 100644
--- a/android/TerminalApp/res/values-pa/strings.xml
+++ b/android/TerminalApp/res/values-pa/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> ਚਾਲੂ ਹੈ"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਚੱਲਣ ਵਾਲੇ ਕਾਰਜ"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"ਸਿਸਟਮ ਇਵੈਂਟ"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-pl/strings.xml b/android/TerminalApp/res/values-pl/strings.xml
index fe29d91..64c94c7 100644
--- a/android/TerminalApp/res/values-pl/strings.xml
+++ b/android/TerminalApp/res/values-pl/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"Układ <xliff:g id="ID_1">VirGL</xliff:g> jest włączony"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Długotrwałe zadania"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Zdarzenia systemowe"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-pt-rPT/strings.xml b/android/TerminalApp/res/values-pt-rPT/strings.xml
index 8dece3d..7d6c007 100644
--- a/android/TerminalApp/res/values-pt-rPT/strings.xml
+++ b/android/TerminalApp/res/values-pt-rPT/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"A <xliff:g id="ID_1">VirGL</xliff:g> está ativada"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tarefas de longa duração"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Eventos do sistema"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-pt/strings.xml b/android/TerminalApp/res/values-pt/strings.xml
index ec0df78..da8d436 100644
--- a/android/TerminalApp/res/values-pt/strings.xml
+++ b/android/TerminalApp/res/values-pt/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"O <xliff:g id="ID_1">VirGL</xliff:g> está ativado"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tarefas de longa duração"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Eventos do sistema"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-ro/strings.xml b/android/TerminalApp/res/values-ro/strings.xml
index fec9562..a57a5e5 100644
--- a/android/TerminalApp/res/values-ro/strings.xml
+++ b/android/TerminalApp/res/values-ro/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> este activat"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Activități de durată"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Evenimente de sistem"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-ru/strings.xml b/android/TerminalApp/res/values-ru/strings.xml
index eda9850..b371f03 100644
--- a/android/TerminalApp/res/values-ru/strings.xml
+++ b/android/TerminalApp/res/values-ru/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g>: включено."</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Длительные задачи"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Системные события"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-si/strings.xml b/android/TerminalApp/res/values-si/strings.xml
index 4ad9a5f..cf735c1 100644
--- a/android/TerminalApp/res/values-si/strings.xml
+++ b/android/TerminalApp/res/values-si/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> සබලයි"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"දිගු කාලයක් ධාවනය වන කාර්යයන්"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"පද්ධති සිදුවීම්"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-sk/strings.xml b/android/TerminalApp/res/values-sk/strings.xml
index a700b93..e8eb6e7 100644
--- a/android/TerminalApp/res/values-sk/strings.xml
+++ b/android/TerminalApp/res/values-sk/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"Procesor <xliff:g id="ID_1">VirGL</xliff:g> je aktivovaný"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Dlho spustené úlohy"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Systémové udalosti"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-sl/strings.xml b/android/TerminalApp/res/values-sl/strings.xml
index f6580aa..5b794a4 100644
--- a/android/TerminalApp/res/values-sl/strings.xml
+++ b/android/TerminalApp/res/values-sl/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> je omogočen"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Dolgotrajna opravila"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Sistemski dogodki"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-sq/strings.xml b/android/TerminalApp/res/values-sq/strings.xml
index 6edfd85..2dd85ae 100644
--- a/android/TerminalApp/res/values-sq/strings.xml
+++ b/android/TerminalApp/res/values-sq/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> është aktivizuar"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Detyrat afatgjata"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Ngjarjet e sistemit"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-sr/strings.xml b/android/TerminalApp/res/values-sr/strings.xml
index eb9a58b..40ae1b5 100644
--- a/android/TerminalApp/res/values-sr/strings.xml
+++ b/android/TerminalApp/res/values-sr/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> је омогућен"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Дуготрајни задаци"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Системски догађаји"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-sv/strings.xml b/android/TerminalApp/res/values-sv/strings.xml
index 6ca94c3..b248b37 100644
--- a/android/TerminalApp/res/values-sv/strings.xml
+++ b/android/TerminalApp/res/values-sv/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> har aktiverats"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Långvariga uppgifter"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Systemhändelser"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-sw/strings.xml b/android/TerminalApp/res/values-sw/strings.xml
index f0da173..34d044e 100644
--- a/android/TerminalApp/res/values-sw/strings.xml
+++ b/android/TerminalApp/res/values-sw/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> imewashwa"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Majukumu yanayodumu zaidi"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Matukio ya mfumo"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-ta/strings.xml b/android/TerminalApp/res/values-ta/strings.xml
index 4942b27..96e25fb 100644
--- a/android/TerminalApp/res/values-ta/strings.xml
+++ b/android/TerminalApp/res/values-ta/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> இயக்கப்பட்டது"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"நீண்ட நேரம் இயங்கும் பணிகள்"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"சிஸ்டம் நிகழ்வுகள்"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-te/strings.xml b/android/TerminalApp/res/values-te/strings.xml
index bce8c4d..b6d98ea 100644
--- a/android/TerminalApp/res/values-te/strings.xml
+++ b/android/TerminalApp/res/values-te/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> ప్రారంభించబడింది"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"ఎక్కువసేపు రన్ అయ్యే టాస్క్లు"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"సిస్టమ్ ఈవెంట్లు"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-th/strings.xml b/android/TerminalApp/res/values-th/strings.xml
index 9fb2a92..0fecd1a 100644
--- a/android/TerminalApp/res/values-th/strings.xml
+++ b/android/TerminalApp/res/values-th/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"เปิดใช้งาน <xliff:g id="ID_1">VirGL</xliff:g> แล้ว"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"งานที่ใช้เวลานาน"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"เหตุการณ์ของระบบ"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-tl/strings.xml b/android/TerminalApp/res/values-tl/strings.xml
index 5cdb3e7..71de5d4 100644
--- a/android/TerminalApp/res/values-tl/strings.xml
+++ b/android/TerminalApp/res/values-tl/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"Na-enable ang <xliff:g id="ID_1">VirGL</xliff:g>"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Mga gawaing matagal gawin"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Mga event ng system"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-tr/strings.xml b/android/TerminalApp/res/values-tr/strings.xml
index 780826a..df679d4 100644
--- a/android/TerminalApp/res/values-tr/strings.xml
+++ b/android/TerminalApp/res/values-tr/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> etkinleştirildi"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Uzun süredir çalışan görevler"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Sistem etkinlikleri"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-uk/strings.xml b/android/TerminalApp/res/values-uk/strings.xml
index 55bdcf3..838545a 100644
--- a/android/TerminalApp/res/values-uk/strings.xml
+++ b/android/TerminalApp/res/values-uk/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> увімкнено"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Довготривалі завдання"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Події системи"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-ur/strings.xml b/android/TerminalApp/res/values-ur/strings.xml
index c1bf900..87f2cb2 100644
--- a/android/TerminalApp/res/values-ur/strings.xml
+++ b/android/TerminalApp/res/values-ur/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> فعال ہے"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"لمبے وقت تک چلنے والے ٹاسکس"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"سسٹم ایونٹس"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-uz/strings.xml b/android/TerminalApp/res/values-uz/strings.xml
index 8fecef9..f4bd27c 100644
--- a/android/TerminalApp/res/values-uz/strings.xml
+++ b/android/TerminalApp/res/values-uz/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> yoniq"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Uzoq davom etuvchi vazifalar"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Tizim tadbirlari"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-vi/strings.xml b/android/TerminalApp/res/values-vi/strings.xml
index 867d534..f3130e8 100644
--- a/android/TerminalApp/res/values-vi/strings.xml
+++ b/android/TerminalApp/res/values-vi/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> đã được bật"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tác vụ chạy trong thời gian dài"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Sự kiện hệ thống"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-zh-rCN/strings.xml b/android/TerminalApp/res/values-zh-rCN/strings.xml
index 2c4d653..a42dd4c 100644
--- a/android/TerminalApp/res/values-zh-rCN/strings.xml
+++ b/android/TerminalApp/res/values-zh-rCN/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> 已启用"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"长时间运行的任务"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"系统事件"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-zh-rHK/strings.xml b/android/TerminalApp/res/values-zh-rHK/strings.xml
index 062dc2d..a320685 100644
--- a/android/TerminalApp/res/values-zh-rHK/strings.xml
+++ b/android/TerminalApp/res/values-zh-rHK/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"已啟用 <xliff:g id="ID_1">VirGL</xliff:g>"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"長時間執行的工作"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"系統活動"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-zh-rTW/strings.xml b/android/TerminalApp/res/values-zh-rTW/strings.xml
index 352784c..cd2c4b7 100644
--- a/android/TerminalApp/res/values-zh-rTW/strings.xml
+++ b/android/TerminalApp/res/values-zh-rTW/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> 已啟用"</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"長時間執行的工作"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"系統事件"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values-zu/strings.xml b/android/TerminalApp/res/values-zu/strings.xml
index 641fea0..b4213c5 100644
--- a/android/TerminalApp/res/values-zu/strings.xml
+++ b/android/TerminalApp/res/values-zu/strings.xml
@@ -90,4 +90,6 @@
<string name="virgl_enabled" msgid="5242525588039698086">"I-<xliff:g id="ID_1">VirGL</xliff:g> inikwe amandla."</string>
<string name="notification_channel_long_running_name" msgid="7916541360369402952">"Imisebenzi esebenza isikhathi eside"</string>
<string name="notification_channel_system_events_name" msgid="1004951444029742137">"Imicimbi yesistimu"</string>
+ <!-- no translation found for tab_default_title (2300417689389397930) -->
+ <skip />
</resources>
diff --git a/android/TerminalApp/res/values/strings.xml b/android/TerminalApp/res/values/strings.xml
index 228700c..a6d461e 100644
--- a/android/TerminalApp/res/values/strings.xml
+++ b/android/TerminalApp/res/values/strings.xml
@@ -181,4 +181,7 @@
<!-- This is the name of the notification channel for system events [CHAR LIMIT=none] -->
<string name="notification_channel_system_events_name">System events</string>
+
+ <!-- Default title of a terminal tab [CHAR LIMIT=10] -->
+ <string name="tab_default_title">Tab</string>
</resources>
diff --git a/android/virtmgr/src/aidl.rs b/android/virtmgr/src/aidl.rs
index b5cf643..1a263bd 100644
--- a/android/virtmgr/src/aidl.rs
+++ b/android/virtmgr/src/aidl.rs
@@ -707,6 +707,12 @@
config
.disks
.iter()
+ .flat_map(|disk| disk.image.as_ref())
+ .try_for_each(|image| check_label_for_file(image, "disk image", calling_partition))
+ .or_service_specific_exception(-1)?;
+ config
+ .disks
+ .iter()
.flat_map(|disk| disk.partitions.iter())
.filter(|partition| {
if is_app_config {
@@ -1582,7 +1588,7 @@
Ok(())
}
fn check_label_for_file(
- file: &File,
+ file: &impl AsRawFd,
name: &str,
calling_partition: CallingPartition,
) -> Result<()> {
diff --git a/android/virtualizationservice/src/aidl.rs b/android/virtualizationservice/src/aidl.rs
index 0f16291..f4e64e3 100644
--- a/android/virtualizationservice/src/aidl.rs
+++ b/android/virtualizationservice/src/aidl.rs
@@ -412,8 +412,12 @@
}
fn isRemoteAttestationSupported(&self) -> binder::Result<bool> {
- Ok(is_remote_provisioning_hal_declared()?
- && remote_provisioning::is_remote_attestation_supported())
+ if is_remote_provisioning_hal_declared()? {
+ Ok(remote_provisioning::is_remote_attestation_supported())
+ } else {
+ warn!("AVF IRemotelyProvisionedComponent HAL is not declared");
+ Ok(false)
+ }
}
fn getAssignableDevices(&self) -> binder::Result<Vec<AssignableDevice>> {
diff --git a/build/debian/build.sh b/build/debian/build.sh
index 616dd00..63035ae 100755
--- a/build/debian/build.sh
+++ b/build/debian/build.sh
@@ -13,7 +13,7 @@
echo "Options:"
echo "-h Print usage and this help message and exit."
echo "-a ARCH Architecture of the image [default is host arch: $(uname -m)]"
- echo "-k Build and use our custom kernel [default is cloud kernel]"
+ echo "-g Use Debian generic kernel [default is our custom kernel]"
echo "-r Release mode build"
echo "-w Save temp work directory [for debugging]"
}
@@ -25,7 +25,7 @@
}
parse_options() {
- while getopts "a:hkrw" option; do
+ while getopts "a:ghrw" option; do
case ${option} in
h)
show_help ; exit
@@ -33,8 +33,8 @@
a)
arch="$OPTARG"
;;
- k)
- use_custom_kernel=1
+ g)
+ use_generic_kernel=1
;;
r)
mode=release
@@ -122,7 +122,7 @@
)
fi
- if [[ "$use_custom_kernel" -eq 1 ]]; then
+ if [[ "$use_generic_kernel" != 1 ]]; then
packages+=(
bc
bison
@@ -215,20 +215,20 @@
}
package_custom_kernel() {
- if [[ "$use_custom_kernel" != 1 ]]; then
- # NOTE: Install generic headers for the default Debian kernel.
+ if [[ "$use_generic_kernel" == 1 ]]; then
+ # NOTE: For bpfcc-tools, install generic headers for the generic kernel.
cat > "${config_space}/package_config/LAST" <<EOF
PACKAGES install
linux-headers-generic
EOF
return
- else
- # NOTE: Prevent FAI from installing a default Debian kernel, by removing
- # linux-image meta package names from arch-specific class files.
- sed -i "/linux-image.*-${debian_arch}/d" \
- "${config_space}/package_config/${debian_arch^^}"
fi
+ # NOTE: Prevent FAI from installing a default Debian kernel, by removing
+ # linux-image meta package names from arch-specific class files.
+ sed -i "/linux-image.*-${debian_arch}/d" \
+ "${config_space}/package_config/${debian_arch^^}"
+
local deb_base_url="https://deb.debian.org/debian"
local deb_security_base_url="https://security.debian.org/debian-security"
@@ -344,6 +344,11 @@
losetup -d "${loop}"
cp ${vm_config} vm_config.json
+ # TODO(b/363985291): remove this when ballooning is supported on generic kernel
+ if [[ "$use_generic_kernel" == 1 ]] && [[ "$arch" == "aarch64" ]]; then
+ sed -i 's/"auto_memory_balloon": true/"auto_memory_balloon": false/g' vm_config.json
+ fi
+
sed -i "s/{root_part_guid}/$(sfdisk --part-uuid $raw_disk_image $root_partition_num)/g" vm_config.json
if [[ "$arch" == "x86_64" ]]; then
sed -i "s/{bios_part_guid}/$(sfdisk --part-uuid $raw_disk_image $bios_partition_num)/g" vm_config.json
@@ -395,7 +400,7 @@
arch="$(uname -m)"
mode=debug
save_workdir=0
-use_custom_kernel=0
+use_generic_kernel=0
parse_options "$@"
check_sudo
diff --git a/build/debian/build_in_container.sh b/build/debian/build_in_container.sh
index e3adcae..739d2dd 100755
--- a/build/debian/build_in_container.sh
+++ b/build/debian/build_in_container.sh
@@ -6,7 +6,7 @@
echo "Options:"
echo "-h Print usage and this help message and exit."
echo "-a ARCH Architecture of the image [default is host arch: $(uname -m)]"
- echo "-k Build and use our custom kernel [default is cloud kernel]"
+ echo "-g Use Debian generic kernel [default is our custom kernel]"
echo "-r Release mode build"
echo "-s Leave a shell open [default: only if the build fails]"
echo "-w Save temp work directory in the container [for debugging]"
@@ -18,17 +18,17 @@
save_workdir_flag=
shell_condition="||"
-while getopts "a:hkrsw" option; do
+while getopts "a:ghrsw" option; do
case ${option} in
a)
arch="$OPTARG"
;;
+ g)
+ kernel_flag="-g"
+ ;;
h)
show_help ; exit
;;
- k)
- kernel_flag="-k"
- ;;
r)
release_flag="-r"
;;
diff --git a/build/debian/fai_config/package_config/AVF b/build/debian/fai_config/package_config/AVF
index ec68434..3aa8ab0 100644
--- a/build/debian/fai_config/package_config/AVF
+++ b/build/debian/fai_config/package_config/AVF
@@ -13,3 +13,4 @@
mesa-vulkan-drivers
libvulkan1
vulkan-tools
+pulseaudio
diff --git a/build/debian/kernel/config b/build/debian/kernel/config
index 1ba603c..58e783a 100644
--- a/build/debian/kernel/config
+++ b/build/debian/kernel/config
@@ -1 +1,4 @@
CONFIG_DRM=m
+CONFIG_SND_VIRTIO=y
+CONFIG_SND=y
+CONFIG_SOUND=y
diff --git a/build/debian/kokoro/gcp_ubuntu_docker/aarch64/build.sh b/build/debian/kokoro/gcp_ubuntu_docker/aarch64/build.sh
index 7476fc3..d9d1e8f 100644
--- a/build/debian/kokoro/gcp_ubuntu_docker/aarch64/build.sh
+++ b/build/debian/kokoro/gcp_ubuntu_docker/aarch64/build.sh
@@ -5,7 +5,7 @@
cd "${KOKORO_ARTIFACTS_DIR}/git/avf/build/debian/"
sudo losetup -D
grep vmx /proc/cpuinfo || true
-sudo ./build.sh -a aarch64 -k -r
+sudo ./build.sh -a aarch64 -r
sudo mv images.tar.gz ${KOKORO_ARTIFACTS_DIR} || true
mkdir -p ${KOKORO_ARTIFACTS_DIR}/logs
sudo cp -r /var/log/fai/* ${KOKORO_ARTIFACTS_DIR}/logs || true
diff --git a/build/debian/kokoro/gcp_ubuntu_docker/x86_64/build.sh b/build/debian/kokoro/gcp_ubuntu_docker/x86_64/build.sh
index a935591..a22e194 100644
--- a/build/debian/kokoro/gcp_ubuntu_docker/x86_64/build.sh
+++ b/build/debian/kokoro/gcp_ubuntu_docker/x86_64/build.sh
@@ -5,7 +5,7 @@
cd "${KOKORO_ARTIFACTS_DIR}/git/avf/build/debian/"
sudo losetup -D
grep vmx /proc/cpuinfo || true
-sudo ./build.sh -a x86_64 -k -r
+sudo ./build.sh -a x86_64 -r
sudo mv images.tar.gz ${KOKORO_ARTIFACTS_DIR} || true
mkdir -p ${KOKORO_ARTIFACTS_DIR}/logs
sudo cp -r /var/log/fai/* ${KOKORO_ARTIFACTS_DIR}/logs || true
diff --git a/guest/trusty/security_vm/vm/Android.bp b/guest/trusty/security_vm/vm/Android.bp
index a348699..cc01d1c 100644
--- a/guest/trusty/security_vm/vm/Android.bp
+++ b/guest/trusty/security_vm/vm/Android.bp
@@ -34,6 +34,7 @@
],
visibility: [
"//packages/modules/Virtualization/guest/trusty/test_vm/vm",
+ "//vendor:__subpackages__",
],
}
diff --git a/tests/testapk/Android.bp b/tests/testapk/Android.bp
index d9f74dc..cc0015d 100644
--- a/tests/testapk/Android.bp
+++ b/tests/testapk/Android.bp
@@ -28,6 +28,9 @@
use_embedded_native_libs: true,
// We only support 64-bit ABI, but CTS demands all APKs to be multi-ABI.
compile_multilib: "both",
+ lint: {
+ error_checks: ["NewApi"],
+ },
}
java_defaults {