diff --git a/res/values/config.xml b/res/values/config.xml
index 4b638b2..0d7f231 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -839,4 +839,7 @@
 
     <!-- Package name for diagnostics app. -->
     <string name="config_device_diagnostics_package_name" translatable="false">com.android.devicediagnostics</string>
+
+    <!-- Package name for Linux terminal app -->
+    <string name="config_linux_terminal_app_package_name" translatable="false">com.android.virtualization.terminal</string>
 </resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 0bd0406..deebb7f 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -455,11 +455,13 @@
     </style>
 
     <style name="SearchBarStyle">
+        <item name="android:theme">@style/Theme.MaterialComponents.DayNight</item>
         <item name="cardCornerRadius">@dimen/search_bar_corner_radius</item>
         <item name="cardElevation">0dp</item>
     </style>
 
     <style name="SearchBarStyle_v2">
+        <item name="android:theme">@style/Theme.MaterialComponents.DayNight</item>
         <item name="cardCornerRadius">40dp</item>
         <item name="cardElevation">0dp</item>
         <item name="strokeWidth">1dp</item>
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index 866a529..fd222bc 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -200,6 +200,11 @@
             android:summary="@string/enable_terminal_summary" />
 
         <SwitchPreferenceCompat
+            android:key="enable_linux_terminal"
+            android:title="@string/enable_linux_terminal_title"
+            android:summary="@string/enable_linux_terminal_summary" />
+
+        <SwitchPreferenceCompat
             android:key="bugreport_in_power"
             android:title="@string/bugreport_in_power"
             android:summary="@string/bugreport_in_power_summary" />
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index 46d74fa..8f2a13c 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -676,6 +676,7 @@
         controllers.add(new WirelessDebuggingPreferenceController(context, lifecycle));
         controllers.add(new AdbAuthorizationTimeoutPreferenceController(context));
         controllers.add(new LocalTerminalPreferenceController(context));
+        controllers.add(new LinuxTerminalPreferenceController(context));
         controllers.add(new BugReportInPowerPreferenceController(context));
         controllers.add(new AutomaticSystemServerHeapDumpPreferenceController(context));
         controllers.add(new MockLocationAppPreferenceController(context, fragment));
diff --git a/src/com/android/settings/development/LinuxTerminalPreferenceController.java b/src/com/android/settings/development/LinuxTerminalPreferenceController.java
new file mode 100644
index 0000000..3e419e4
--- /dev/null
+++ b/src/com/android/settings/development/LinuxTerminalPreferenceController.java
@@ -0,0 +1,127 @@
+/*
+ * 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.
+ */
+
+package com.android.settings.development;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.TwoStatePreference;
+
+import com.android.settings.R;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.development.DeveloperOptionsPreferenceController;
+
+public class LinuxTerminalPreferenceController extends DeveloperOptionsPreferenceController
+        implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
+    private static final String TAG = "LinuxTerminalPrefCtrl";
+
+    private static final String ENABLE_TERMINAL_KEY = "enable_linux_terminal";
+
+    @NonNull
+    private final PackageManager mPackageManager;
+
+    @Nullable
+    private final String mTerminalPackageName;
+
+    public LinuxTerminalPreferenceController(@NonNull Context context) {
+        super(context);
+        mPackageManager = mContext.getPackageManager();
+
+        String packageName = mContext.getString(R.string.config_linux_terminal_app_package_name);
+        mTerminalPackageName =
+                isPackageInstalled(mPackageManager, packageName) ? packageName : null;
+
+        Log.d(TAG, "Terminal app package name=" + packageName + ", isAvailable=" + isAvailable());
+    }
+
+    // Avoid lazy initialization because this may be called before displayPreference().
+    @Override
+    public boolean isAvailable() {
+        // Returns true only if the terminal app is installed which only happens when the build flag
+        // RELEASE_AVF_SUPPORT_CUSTOM_VM_WITH_PARAVIRTUALIZED_DEVICES is true.
+        // TODO(b/343795511): Add explicitly check for the flag when it's accessible from Java code.
+        return getTerminalPackageName() != null;
+    }
+
+    @Override
+    @NonNull
+    public String getPreferenceKey() {
+        return ENABLE_TERMINAL_KEY;
+    }
+
+    @Override
+    public void displayPreference(@NonNull PreferenceScreen screen) {
+        super.displayPreference(screen);
+        mPreference.setEnabled(isAvailable());
+    }
+
+    @Override
+    public boolean onPreferenceChange(
+                @NonNull Preference preference, @NonNull Object newValue) {
+        String packageName = getTerminalPackageName();
+        if (packageName == null) {
+            return false;
+        }
+
+        boolean terminalEnabled = (Boolean) newValue;
+        int state = terminalEnabled
+                ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
+                : PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
+        mPackageManager.setApplicationEnabledSetting(packageName, state, /* flags=*/ 0);
+        ((TwoStatePreference) mPreference).setChecked(terminalEnabled);
+        return true;
+    }
+
+    @Override
+    public void updateState(@NonNull Preference preference) {
+        String packageName = getTerminalPackageName();
+        if (packageName == null) {
+            return;
+        }
+
+        boolean isTerminalEnabled = mPackageManager.getApplicationEnabledSetting(packageName)
+                == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
+        ((TwoStatePreference) mPreference).setChecked(isTerminalEnabled);
+    }
+
+    // Can be mocked for testing
+    @VisibleForTesting
+    @Nullable
+    String getTerminalPackageName() {
+        return mTerminalPackageName;
+    }
+
+    private static boolean isPackageInstalled(PackageManager manager, String packageName) {
+        if (TextUtils.isEmpty(packageName)) {
+            return false;
+        }
+        try {
+            return manager.getPackageInfo(
+                    packageName,
+                    PackageManager.MATCH_ALL | PackageManager.MATCH_DISABLED_COMPONENTS) != null;
+        } catch (PackageManager.NameNotFoundException e) {
+            return false;
+        }
+    }
+}
diff --git a/src/com/android/settings/widget/TintDrawable.java b/src/com/android/settings/widget/TintDrawable.java
index 7b34890..caa683b 100644
--- a/src/com/android/settings/widget/TintDrawable.java
+++ b/src/com/android/settings/widget/TintDrawable.java
@@ -39,7 +39,7 @@
  * underlying drawable. This class should only be used in XML.
  *
  * @attr ref android.R.styleable#DrawableWrapper_drawable
- * @attr ref R.styleable#TintDrawable_tint
+ * @attr ref android.R.styleable#TintDrawable_tint
  */
 public class TintDrawable extends DrawableWrapper {
     private ColorStateList mTint;
diff --git a/tests/robotests/src/com/android/settings/development/LinuxTerminalPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/LinuxTerminalPreferenceControllerTest.java
new file mode 100644
index 0000000..96b6d6a
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/development/LinuxTerminalPreferenceControllerTest.java
@@ -0,0 +1,131 @@
+/*
+ * 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.
+ */
+
+package com.android.settings.development;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+public class LinuxTerminalPreferenceControllerTest {
+
+    @Mock
+    private Context mContext;
+    @Mock
+    private SwitchPreference mPreference;
+    @Mock
+    private PreferenceScreen mPreferenceScreen;
+    @Mock
+    private PackageManager mPackageManager;
+    @Mock
+    private ApplicationInfo mApplicationInfo;
+
+    private String mTerminalPackageName = "com.android.virtualization.terminal";
+    private LinuxTerminalPreferenceController mController;
+
+    @Before
+    public void setup() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        doReturn(mPackageManager).when(mContext).getPackageManager();
+        doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(
+                eq(mTerminalPackageName), any());
+
+        mController = spy(new LinuxTerminalPreferenceController(mContext));
+        doReturn(true).when(mController).isAvailable();
+        doReturn(mTerminalPackageName).when(mController).getTerminalPackageName();
+        when(mPreferenceScreen.findPreference(mController.getPreferenceKey()))
+                .thenReturn(mPreference);
+        mController.displayPreference(mPreferenceScreen);
+    }
+
+    @Test
+    public void isAvailable_whenPackageNameIsNull_returnsFalse() throws Exception {
+        mController = spy(new LinuxTerminalPreferenceController(mContext));
+        doReturn(null).when(mController).getTerminalPackageName();
+
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
+    public void isAvailable_whenAppDoesNotExist_returnsFalse() throws Exception {
+        doThrow(new NameNotFoundException()).when(mPackageManager).getApplicationInfo(
+                eq(mTerminalPackageName), any());
+
+        mController = spy(new LinuxTerminalPreferenceController(mContext));
+
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
+    public void onPreferenceChanged_turnOnTerminal() {
+        mController.onPreferenceChange(null, true);
+
+        verify(mPackageManager).setApplicationEnabledSetting(
+                mTerminalPackageName,
+                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+                /* flags= */ 0);
+    }
+
+    @Test
+    public void onPreferenceChanged_turnOffTerminal() {
+        mController.onPreferenceChange(null, false);
+
+        verify(mPackageManager).setApplicationEnabledSetting(
+                mTerminalPackageName,
+                PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
+                /* flags= */ 0);
+    }
+
+    @Test
+    public void updateState_preferenceShouldBeChecked() {
+        when(mPackageManager.getApplicationEnabledSetting(mTerminalPackageName))
+                .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
+        mController.updateState(mPreference);
+
+        verify(mPreference).setChecked(true);
+    }
+
+    @Test
+    public void updateState_preferenceShouldNotBeChecked() {
+        when(mPackageManager.getApplicationEnabledSetting(mTerminalPackageName))
+                .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
+        mController.updateState(mPreference);
+
+        verify(mPreference).setChecked(false);
+    }
+}
diff --git a/tests/unit/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsControllerTest.java b/tests/unit/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsControllerTest.java
index bb2d2ef..f0a2484 100644
--- a/tests/unit/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsControllerTest.java
+++ b/tests/unit/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsControllerTest.java
@@ -53,6 +53,8 @@
     public void setDefaultKey_percentage_shouldSuppressNotification() {
         Secure.putInt(
                 mContext.getContentResolver(), Secure.LOW_POWER_WARNING_ACKNOWLEDGED, 1);
+        Secure.putInt(
+                mContext.getContentResolver(), Secure.EXTRA_LOW_POWER_WARNING_ACKNOWLEDGED, 1);
         Settings.Global.putInt(mResolver, Global.AUTOMATIC_POWER_SAVE_MODE,
                 PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
         Settings.Global.putInt(mResolver, Global.LOW_POWER_MODE_TRIGGER_LEVEL, 5);
diff --git a/tests/unit/src/com/android/settings/vpn2/VpnSettingsTest.java b/tests/unit/src/com/android/settings/vpn2/VpnSettingsTest.java
index 953a524..8764d4f 100644
--- a/tests/unit/src/com/android/settings/vpn2/VpnSettingsTest.java
+++ b/tests/unit/src/com/android/settings/vpn2/VpnSettingsTest.java
@@ -130,6 +130,7 @@
     }
 
     @Test
+    @UiThreadTest
     public void setShownAdvancedPreferences_hasGeneralVpn_returnsVpnCountAs1() {
         Set<Preference> updates = new ArraySet<>();
         AppPreference pref =
@@ -144,6 +145,7 @@
     }
 
     @Test
+    @UiThreadTest
     public void setShownAdvancedPreferences_hasAdvancedVpn_returnsAdvancedVpnCountAs1() {
         Set<Preference> updates = new ArraySet<>();
         AppPreference pref =
@@ -158,6 +160,7 @@
     }
 
     @Test
+    @UiThreadTest
     public void setShownAdvancedPreferences_noVpn_returnsEmpty() {
         Set<Preference> updates = new ArraySet<>();
 
@@ -198,6 +201,7 @@
     }
 
     @Test
+    @UiThreadTest
     public void clickVpn_VpnConnected_doesNotStartVpnLaunchIntent()
             throws PackageManager.NameNotFoundException {
         Set<Preference> updates = new ArraySet<>();
@@ -217,6 +221,7 @@
     }
 
     @Test
+    @UiThreadTest
     public void clickVpn_VpnDisconnected_startsVpnLaunchIntent()
             throws PackageManager.NameNotFoundException {
         Set<Preference> updates = new ArraySet<>();
@@ -238,6 +243,7 @@
     }
 
     @Test
+    @UiThreadTest
     public void clickAdvancedVpn_VpnConnectedDisconnectDialogDisabled_startsAppLaunchIntent()
             throws PackageManager.NameNotFoundException {
         Set<Preference> updates = new ArraySet<>();
@@ -262,6 +268,7 @@
     }
 
     @Test
+    @UiThreadTest
     public void clickAdvancedVpn_VpnConnectedDisconnectDialogEnabled_doesNotStartAppLaunchIntent()
             throws PackageManager.NameNotFoundException {
         Set<Preference> updates = new ArraySet<>();
