Merge "Import translations. DO NOT MERGE ANYWHERE" into main
diff --git a/res/values-ca/arrays.xml b/res/values-ca/arrays.xml
index 612822a..aa67dfe 100644
--- a/res/values-ca/arrays.xml
+++ b/res/values-ca/arrays.xml
@@ -375,7 +375,7 @@
     <item msgid="2262719249581510939">"Desconnectada"</item>
     <item msgid="9141074028293812365">"S\'està inicialitzant..."</item>
     <item msgid="2234425878608626285">"S\'està connectant..."</item>
-    <item msgid="27547778933579155">"Connectat"</item>
+    <item msgid="27547778933579155">"Connectada"</item>
     <item msgid="893506841727300393">"Temps d\'espera esgotat"</item>
     <item msgid="2974952010554140659">"Incorrecte"</item>
   </string-array>
diff --git a/res/values-ne/arrays.xml b/res/values-ne/arrays.xml
index d81d683..2cd1c5c 100644
--- a/res/values-ne/arrays.xml
+++ b/res/values-ne/arrays.xml
@@ -411,7 +411,7 @@
     <item msgid="9080166583718385565">"0"</item>
   </string-array>
   <string-array name="wifi_metered_entries">
-    <item msgid="3237321077949659241">"स्वतः पत्ता लगाइयोस्"</item>
+    <item msgid="3237321077949659241">"स्वतः पत्ता लगाउनुहोस्"</item>
     <item msgid="3779092145391320375">"सशुल्क Wi-Fi का रूपमा लिइयोस्"</item>
     <item msgid="2047166446768045816">"नि:शुल्क Wi-Fi का रूपमा लिइयोस्"</item>
   </string-array>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5d4cb63..3e500b9 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -8794,13 +8794,13 @@
     <!-- [CHAR LIMIT=NONE] App notification settings: link to app notification settings-->
     <string name="app_settings_link">Additional settings in the app</string>
 
-    <!-- [CHAR LIMIT=20] 3-dot menu option, reloads the screen to show channels that have not
+    <!-- [CHAR LIMIT=35] 3-dot menu option, reloads the screen to show channels that have not
     received notifications in the last two week -->
-    <string name="show_unused_channels">Show unused channels</string>
+    <string name="show_unused_channels">Show unused categories</string>
 
-    <!-- [CHAR LIMIT=20] 3-dot menu option, reloads the screen to hide channels that have not
+    <!-- [CHAR LIMIT=35] 3-dot menu option, reloads the screen to hide channels that have not
     received notifications in the last two week -->
-    <string name="hide_unused_channels">Hide unused channels</string>
+    <string name="hide_unused_channels">Hide unused categories</string>
 
     <!-- [CHAR LIMIT=NONE] Footer listing a count of deleted channels. -->
     <string name="deleted_channels">{count, plural,
diff --git a/res/xml/system_dashboard_fragment.xml b/res/xml/system_dashboard_fragment.xml
index a2cb8fa..628eab9 100644
--- a/res/xml/system_dashboard_fragment.xml
+++ b/res/xml/system_dashboard_fragment.xml
@@ -21,14 +21,6 @@
     android:title="@string/header_category_system">
 
     <Preference
-        android:key="language_input_settings"
-        android:title="@string/language_settings"
-        android:icon="@drawable/ic_settings_language"
-        android:order="-260"
-        android:fragment="com.android.settings.language.LanguageAndInputSettings"
-        settings:controller="com.android.settings.language.LanguageAndInputPreferenceController"/>
-
-    <Preference
         android:key="language_settings"
         android:title="@string/languages_settings"
         android:summary="@string/languages_setting_summary"
diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
index a068a08..f4c928c 100644
--- a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
+++ b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
@@ -50,6 +50,7 @@
 import com.android.settings.homepage.SettingsHomepageActivity;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.password.ChooseLockPattern;
+import com.android.settings.privatespace.PrivateSpaceSetupActivity;
 import com.android.settings.remoteauth.RemoteAuthActivity;
 import com.android.settings.remoteauth.RemoteAuthActivityInternal;
 
@@ -264,6 +265,7 @@
         addActivityFilter(activityFilters, RemoteAuthActivity.class);
         addActivityFilter(activityFilters, RemoteAuthActivityInternal.class);
         addActivityFilter(activityFilters, ChooseLockPattern.class);
+        addActivityFilter(activityFilters, PrivateSpaceSetupActivity.class);
         String action = mContext.getString(R.string.config_avatar_picker_action);
         addActivityFilter(activityFilters, new Intent(action));
 
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index 57ddca2..bee1da7 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -135,7 +135,6 @@
 import com.android.settings.inputmethod.TrackpadSettings;
 import com.android.settings.inputmethod.UserDictionaryList;
 import com.android.settings.inputmethod.UserDictionarySettings;
-import com.android.settings.language.LanguageAndInputSettings;
 import com.android.settings.language.LanguageSettings;
 import com.android.settings.localepicker.LocaleListEditor;
 import com.android.settings.location.LocationServices;
@@ -226,7 +225,6 @@
             DateTimeSettings.class.getName(),
             LocaleListEditor.class.getName(),
             AvailableVirtualKeyboardFragment.class.getName(),
-            LanguageAndInputSettings.class.getName(),
             LanguageSettings.class.getName(),
             KeyboardSettings.class.getName(),
             ModifierKeysSettings.class.getName(),
diff --git a/src/com/android/settings/dashboard/DashboardFragmentRegistry.java b/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
index ffe81f1..849a80b 100644
--- a/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
+++ b/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
@@ -38,7 +38,6 @@
 import com.android.settings.fuelgauge.batteryusage.PowerUsageSummary;
 import com.android.settings.gestures.GestureSettings;
 import com.android.settings.homepage.TopLevelSettings;
-import com.android.settings.language.LanguageAndInputSettings;
 import com.android.settings.network.NetworkDashboardFragment;
 import com.android.settings.notification.ConfigureNotificationSettings;
 import com.android.settings.notification.SoundSettings;
@@ -102,8 +101,6 @@
                 CategoryKey.CATEGORY_ACCOUNT);
         PARENT_TO_CATEGORY_KEY_MAP.put(
                 SystemDashboardFragment.class.getName(), CategoryKey.CATEGORY_SYSTEM);
-        PARENT_TO_CATEGORY_KEY_MAP.put(LanguageAndInputSettings.class.getName(),
-                CategoryKey.CATEGORY_SYSTEM_LANGUAGE);
         // TODO(b/242680328) Tie new category key to LanguageSettings and KeyboardSettings page
         PARENT_TO_CATEGORY_KEY_MAP.put(DevelopmentSettingsDashboardFragment.class.getName(),
                 CategoryKey.CATEGORY_SYSTEM_DEVELOPMENT);
diff --git a/src/com/android/settings/development/bluetooth/BluetoothCodecListPreferenceController.java b/src/com/android/settings/development/bluetooth/BluetoothCodecListPreferenceController.java
index 79b629e..863cd27 100644
--- a/src/com/android/settings/development/bluetooth/BluetoothCodecListPreferenceController.java
+++ b/src/com/android/settings/development/bluetooth/BluetoothCodecListPreferenceController.java
@@ -78,6 +78,10 @@
 
     @Override
     public boolean onPreferenceChange(@Nullable Preference preference, @NonNull Object newValue) {
+        if (!Flags.a2dpOffloadCodecExtensibilitySettings()) {
+            return false;
+        }
+
         if (DEBUG) {
             Log.d(TAG, "onPreferenceChange: newValue=" + (String) newValue);
         }
@@ -120,6 +124,10 @@
     @Override
     public void updateState(@Nullable Preference preference) {
         super.updateState(preference);
+        if (!Flags.a2dpOffloadCodecExtensibilitySettings()) {
+            return;
+        }
+
         final List<String> codecIds = new ArrayList<>();
         final List<String> labels = new ArrayList<>();
         String selectedCodecId = mDefaultValue;
diff --git a/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceController.java b/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceController.java
index fa71c34..4c02feb 100644
--- a/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceController.java
@@ -80,7 +80,6 @@
             try {
                 mModuleVersion =
                         mPackageManager.getPackageInfo(moduleProvider, 0 /* flags */).versionName;
-                return;
             } catch (PackageManager.NameNotFoundException e) {
                 Log.e(TAG, "Failed to get mainline version.", e);
                 mModuleVersion = null;
@@ -124,7 +123,8 @@
             return mModuleVersion;
         }
 
-        return DateFormat.getLongDateFormat(mContext).format(parsedDate.get());
+        String format = DateFormat.getBestDateTimePattern(Locale.getDefault(), "dMMMMyyyy");
+        return DateFormat.format(format, parsedDate.get());
     }
 
     private Optional<Date> parseDateFromVersionName(String text) {
diff --git a/src/com/android/settings/inputmethod/KeyboardPreferenceController.java b/src/com/android/settings/inputmethod/KeyboardPreferenceController.java
index 26b07d8..37207b8 100644
--- a/src/com/android/settings/inputmethod/KeyboardPreferenceController.java
+++ b/src/com/android/settings/inputmethod/KeyboardPreferenceController.java
@@ -18,7 +18,6 @@
 
 import android.content.Context;
 import android.hardware.input.InputManager;
-import android.util.FeatureFlagUtils;
 
 import androidx.preference.Preference;
 
@@ -78,9 +77,7 @@
 
     @Override
     public int getAvailabilityStatus() {
-        return FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI)
-                ? AVAILABLE
-                : CONDITIONALLY_UNAVAILABLE;
+        return AVAILABLE;
     }
 
     private void updateSummary() {
diff --git a/src/com/android/settings/inputmethod/KeyboardSettings.java b/src/com/android/settings/inputmethod/KeyboardSettings.java
index 9fddb93..38f7343 100644
--- a/src/com/android/settings/inputmethod/KeyboardSettings.java
+++ b/src/com/android/settings/inputmethod/KeyboardSettings.java
@@ -23,7 +23,6 @@
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.os.Bundle;
-import android.util.FeatureFlagUtils;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -111,11 +110,5 @@
     }
 
     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-            new BaseSearchIndexProvider(R.xml.keyboard_settings) {
-                @Override
-                protected boolean isPageSearchEnabled(Context context) {
-                    return FeatureFlagUtils
-                            .isEnabled(context, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI);
-                }
-            };
+            new BaseSearchIndexProvider(R.xml.keyboard_settings);
 }
\ No newline at end of file
diff --git a/src/com/android/settings/inputmethod/KeyboardSettingsPreferenceController.java b/src/com/android/settings/inputmethod/KeyboardSettingsPreferenceController.java
index 06a132d..ccaf037 100644
--- a/src/com/android/settings/inputmethod/KeyboardSettingsPreferenceController.java
+++ b/src/com/android/settings/inputmethod/KeyboardSettingsPreferenceController.java
@@ -20,7 +20,6 @@
 import android.content.Context;
 import android.content.Intent;
 import android.provider.Settings;
-import android.util.FeatureFlagUtils;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
@@ -69,8 +68,7 @@
     @Override
     public int getAvailabilityStatus() {
         List<HardKeyboardDeviceInfo> newHardKeyboards = getHardKeyboardList();
-        if (FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI)
-                && !newHardKeyboards.isEmpty()) {
+        if (!newHardKeyboards.isEmpty()) {
             for (HardKeyboardDeviceInfo hardKeyboardDeviceInfo : newHardKeyboards) {
                 if (mCachedDevice.getAddress() != null
                         && hardKeyboardDeviceInfo.mBluetoothAddress != null
diff --git a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
index e102241..5ba1c84 100644
--- a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
+++ b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
@@ -110,7 +110,6 @@
 
 
     private Intent mIntentWaitingForResult;
-    private boolean mIsNewKeyboardSettings;
     private boolean mSupportsFirmwareUpdate;
 
     static final String EXTRA_BT_ADDRESS = "extra_bt_address";
@@ -152,8 +151,6 @@
         if (mSupportsFirmwareUpdate) {
             mFeatureProvider.addFirmwareUpdateCategory(getContext(), getPreferenceScreen());
         }
-        mIsNewKeyboardSettings = FeatureFlagUtils.isEnabled(
-                getContext(), FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI);
         boolean isModifierKeySettingsEnabled = FeatureFlagUtils
                 .isEnabled(getContext(), FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_MODIFIER_KEY);
         if (!isModifierKeySettingsEnabled) {
@@ -287,27 +284,19 @@
             // TODO(yukawa): Consider using com.android.settings.widget.GearPreference
             final Preference pref = new Preference(getPrefContext());
             pref.setTitle(hardKeyboardDeviceInfo.mDeviceName);
-            if (mIsNewKeyboardSettings) {
-                String currentLayout =
-                        NewKeyboardSettingsUtils.getSelectedKeyboardLayoutLabelForUser(getContext(),
-                                UserHandle.myUserId(), hardKeyboardDeviceInfo.mDeviceIdentifier);
-                if (currentLayout != null) {
-                    pref.setSummary(currentLayout);
-                }
-                pref.setOnPreferenceClickListener(
-                        preference -> {
-                            showEnabledLocalesKeyboardLayoutList(
-                                    hardKeyboardDeviceInfo.mDeviceIdentifier);
-                            return true;
-                        });
-            } else {
-                pref.setSummary(hardKeyboardDeviceInfo.mLayoutLabel);
-                pref.setOnPreferenceClickListener(
-                        preference -> {
-                            showKeyboardLayoutDialog(hardKeyboardDeviceInfo.mDeviceIdentifier);
-                            return true;
-                        });
+            String currentLayout =
+                    NewKeyboardSettingsUtils.getSelectedKeyboardLayoutLabelForUser(getContext(),
+                            UserHandle.myUserId(), hardKeyboardDeviceInfo.mDeviceIdentifier);
+            if (currentLayout != null) {
+                pref.setSummary(currentLayout);
             }
+            pref.setOnPreferenceClickListener(
+                    preference -> {
+                        showEnabledLocalesKeyboardLayoutList(
+                                hardKeyboardDeviceInfo.mDeviceIdentifier);
+                        return true;
+                    });
+
             category.addPreference(pref);
             StringBuilder vendorAndProductId = new StringBuilder();
             String vendorId = String.valueOf(hardKeyboardDeviceInfo.mVendorId);
diff --git a/src/com/android/settings/language/LanguageAndInputPreferenceController.java b/src/com/android/settings/language/LanguageAndInputPreferenceController.java
deleted file mode 100644
index 691d907..0000000
--- a/src/com/android/settings/language/LanguageAndInputPreferenceController.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2019 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.language;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.provider.Settings;
-import android.text.TextUtils;
-import android.util.FeatureFlagUtils;
-import android.view.inputmethod.InputMethodInfo;
-import android.view.inputmethod.InputMethodManager;
-
-import com.android.settings.core.BasePreferenceController;
-
-import java.util.List;
-
-public class LanguageAndInputPreferenceController extends BasePreferenceController {
-
-    private PackageManager mPackageManager;
-    private InputMethodManager mInputMethodManager;
-
-    public LanguageAndInputPreferenceController(Context context, String key) {
-        super(context, key);
-        mPackageManager = mContext.getPackageManager();
-        mInputMethodManager = mContext.getSystemService(InputMethodManager.class);
-    }
-
-    @Override
-    public int getAvailabilityStatus() {
-        boolean isFeatureOn = FeatureFlagUtils
-                .isEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI);
-        return isFeatureOn ? CONDITIONALLY_UNAVAILABLE : AVAILABLE;
-    }
-
-    @Override
-    public CharSequence getSummary() {
-        final String flattenComponent = Settings.Secure.getString(
-                mContext.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);
-        if (!TextUtils.isEmpty(flattenComponent)) {
-            final String pkg = ComponentName.unflattenFromString(flattenComponent)
-                    .getPackageName();
-            final List<InputMethodInfo> imis = mInputMethodManager.getInputMethodList();
-            for (InputMethodInfo imi : imis) {
-                if (TextUtils.equals(imi.getPackageName(), pkg)) {
-                    return imi.loadLabel(mPackageManager);
-                }
-            }
-        }
-        return "";
-    }
-}
diff --git a/src/com/android/settings/language/LanguageAndInputSettings.java b/src/com/android/settings/language/LanguageAndInputSettings.java
deleted file mode 100644
index f40473c..0000000
--- a/src/com/android/settings/language/LanguageAndInputSettings.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright (C) 2016 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.language;
-
-import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_DICTIONARY_FOR_WORK;
-import static android.app.admin.DevicePolicyResources.Strings.Settings.SPELL_CHECKER_FOR_WORK;
-import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_KEYBOARDS_AND_TOOLS;
-
-import android.app.Activity;
-import android.app.settings.SettingsEnums;
-import android.content.Context;
-import android.os.Bundle;
-import android.util.FeatureFlagUtils;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.android.settings.R;
-import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.inputmethod.PhysicalKeyboardPreferenceController;
-import com.android.settings.inputmethod.SpellCheckerPreferenceController;
-import com.android.settings.inputmethod.VirtualKeyboardPreferenceController;
-import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settings.widget.PreferenceCategoryController;
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.search.SearchIndexable;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-@SearchIndexable
-public class LanguageAndInputSettings extends DashboardFragment {
-
-    private static final String TAG = "LangAndInputSettings";
-
-    private static final String KEY_KEYBOARDS_CATEGORY = "keyboards_category";
-    private static final String KEY_SPEECH_CATEGORY = "speech_category";
-    private static final String KEY_ON_DEVICE_RECOGNITION = "odsr_settings";
-    private static final String KEY_TEXT_TO_SPEECH = "tts_settings_summary";
-    private static final String KEY_POINTER_CATEGORY = "pointer_category";
-
-    @Override
-    public int getMetricsCategory() {
-        return SettingsEnums.SETTINGS_LANGUAGE_CATEGORY;
-    }
-
-    @Override
-    protected String getLogTag() {
-        return TAG;
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        // Hack to update action bar title. It's necessary to refresh title because this page user
-        // can change locale from here and fragment won't relaunch. Once language changes, title
-        // must display in the new language.
-        final Activity activity = getActivity();
-        if (activity == null) {
-            return;
-        }
-        activity.setTitle(R.string.language_settings);
-    }
-
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-        replaceEnterpriseStringTitle("language_and_input_for_work_category",
-                WORK_PROFILE_KEYBOARDS_AND_TOOLS,
-                R.string.language_and_input_for_work_category_title);
-        replaceEnterpriseStringTitle("spellcheckers_settings_for_work_pref",
-                SPELL_CHECKER_FOR_WORK,
-                R.string.spellcheckers_settings_for_work_title);
-        replaceEnterpriseStringTitle("user_dictionary_settings_for_work_pref",
-                PERSONAL_DICTIONARY_FOR_WORK,
-                R.string.user_dict_settings_for_work_title);
-    }
-
-    @Override
-    protected int getPreferenceScreenResId() {
-        return R.xml.language_and_input;
-    }
-
-    @Override
-    protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
-        return buildPreferenceControllers(context, getSettingsLifecycle());
-    }
-
-    private static List<AbstractPreferenceController> buildPreferenceControllers(
-            @NonNull Context context, @Nullable Lifecycle lifecycle) {
-        final List<AbstractPreferenceController> controllers = new ArrayList<>();
-
-        // Input
-        final VirtualKeyboardPreferenceController virtualKeyboardPreferenceController =
-                new VirtualKeyboardPreferenceController(context);
-        final PhysicalKeyboardPreferenceController physicalKeyboardPreferenceController =
-                new PhysicalKeyboardPreferenceController(context, lifecycle);
-        controllers.add(virtualKeyboardPreferenceController);
-        controllers.add(physicalKeyboardPreferenceController);
-        controllers.add(new PreferenceCategoryController(context,
-                KEY_KEYBOARDS_CATEGORY).setChildren(
-                Arrays.asList(virtualKeyboardPreferenceController,
-                        physicalKeyboardPreferenceController)));
-
-        // Speech
-        final DefaultVoiceInputPreferenceController defaultVoiceInputPreferenceController =
-                new DefaultVoiceInputPreferenceController(context, lifecycle);
-        final TtsPreferenceController ttsPreferenceController =
-                new TtsPreferenceController(context, KEY_TEXT_TO_SPEECH);
-        final OnDeviceRecognitionPreferenceController onDeviceRecognitionPreferenceController =
-                new OnDeviceRecognitionPreferenceController(context, KEY_ON_DEVICE_RECOGNITION);
-
-        controllers.add(defaultVoiceInputPreferenceController);
-        controllers.add(ttsPreferenceController);
-        List<AbstractPreferenceController> speechCategoryChildren = new ArrayList<>(
-                List.of(defaultVoiceInputPreferenceController, ttsPreferenceController));
-
-        if (onDeviceRecognitionPreferenceController.isAvailable()) {
-            controllers.add(onDeviceRecognitionPreferenceController);
-            speechCategoryChildren.add(onDeviceRecognitionPreferenceController);
-        }
-
-        controllers.add(new PreferenceCategoryController(context, KEY_SPEECH_CATEGORY)
-                .setChildren(speechCategoryChildren));
-
-        // Pointer
-        final PointerSpeedController pointerController = new PointerSpeedController(context);
-        controllers.add(pointerController);
-        controllers.add(new PreferenceCategoryController(context,
-                KEY_POINTER_CATEGORY).setChildren(Arrays.asList(pointerController)));
-
-        // Input Assistance
-        controllers.add(new SpellCheckerPreferenceController(context));
-
-        return controllers;
-    }
-
-    public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-            new BaseSearchIndexProvider(R.xml.language_and_input) {
-                @Override
-                public List<AbstractPreferenceController> createPreferenceControllers(
-                        Context context) {
-                    return buildPreferenceControllers(context, null);
-                }
-
-                @Override
-                protected boolean isPageSearchEnabled(Context context) {
-                    return !FeatureFlagUtils
-                            .isEnabled(context, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI);
-                }
-            };
-}
diff --git a/src/com/android/settings/language/LanguagePreferenceController.java b/src/com/android/settings/language/LanguagePreferenceController.java
index cbccb00..84624a2 100644
--- a/src/com/android/settings/language/LanguagePreferenceController.java
+++ b/src/com/android/settings/language/LanguagePreferenceController.java
@@ -19,7 +19,6 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.PackageManager;
-import android.util.FeatureFlagUtils;
 
 import com.android.settings.Settings;
 import com.android.settings.core.BasePreferenceController;
@@ -29,28 +28,14 @@
  * TODO(b/273642892): When new layout is on board, this class shall be removed.
  */
 public class LanguagePreferenceController extends BasePreferenceController {
-    private static final String TAG = LanguagePreferenceController.class.getSimpleName();
-
-    private boolean mCacheIsFeatureOn = false;
-
     public LanguagePreferenceController(Context context, String key) {
         super(context, key);
     }
 
     @Override
     public int getAvailabilityStatus() {
-        boolean isFeatureOn = FeatureFlagUtils
-                .isEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI);
-
-        // LanguageSettingsActivity is a new entry page for new language layout.
-        // LanguageAndInputSettingsActivity is existed entry page for current language layout.
-        if (mCacheIsFeatureOn != isFeatureOn) {
-            setActivityEnabled(
-                    mContext, Settings.LanguageAndInputSettingsActivity.class, !isFeatureOn);
-            setActivityEnabled(mContext, Settings.LanguageSettingsActivity.class, isFeatureOn);
-            mCacheIsFeatureOn = isFeatureOn;
-        }
-        return isFeatureOn ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+        setActivityEnabled(mContext, Settings.LanguageSettingsActivity.class, true);
+        return AVAILABLE;
     }
 
     private static void setActivityEnabled(Context context, Class klass, final boolean isEnabled) {
diff --git a/src/com/android/settings/language/LanguageSettings.java b/src/com/android/settings/language/LanguageSettings.java
index 8253311..a5adb02 100644
--- a/src/com/android/settings/language/LanguageSettings.java
+++ b/src/com/android/settings/language/LanguageSettings.java
@@ -19,7 +19,6 @@
 import android.app.Activity;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
-import android.util.FeatureFlagUtils;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -112,8 +111,7 @@
                 }
                 @Override
                 protected boolean isPageSearchEnabled(Context context) {
-                    return FeatureFlagUtils
-                            .isEnabled(context, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI);
+                    return true;
                 }
             };
 }
\ No newline at end of file
diff --git a/src/com/android/settings/media/MediaDeviceUpdateWorker.java b/src/com/android/settings/media/MediaDeviceUpdateWorker.java
index d4aef47..c87f1e8 100644
--- a/src/com/android/settings/media/MediaDeviceUpdateWorker.java
+++ b/src/com/android/settings/media/MediaDeviceUpdateWorker.java
@@ -81,7 +81,7 @@
         mIsTouched = false;
         if (mLocalMediaManager == null || !TextUtils.equals(mPackageName,
                 mLocalMediaManager.getPackageName())) {
-            mLocalMediaManager = new LocalMediaManager(mContext, mPackageName, null);
+            mLocalMediaManager = new LocalMediaManager(mContext, mPackageName);
         }
 
         // Delaying initialization to allow mocking in Roboelectric tests.
diff --git a/src/com/android/settings/media/MediaOutputIndicatorWorker.java b/src/com/android/settings/media/MediaOutputIndicatorWorker.java
index 6e56153..0ebb373 100644
--- a/src/com/android/settings/media/MediaOutputIndicatorWorker.java
+++ b/src/com/android/settings/media/MediaOutputIndicatorWorker.java
@@ -92,8 +92,7 @@
             }
             if (mLocalMediaManager == null || !TextUtils.equals(mPackageName,
                     mLocalMediaManager.getPackageName())) {
-                mLocalMediaManager = new LocalMediaManager(mContext, mPackageName,
-                        null /* notification */);
+                mLocalMediaManager = new LocalMediaManager(mContext, mPackageName);
             }
             mLocalMediaManager.registerCallback(this);
             mLocalMediaManager.startScan();
diff --git a/src/com/android/settings/network/SatelliteManagerUtil.kt b/src/com/android/settings/network/SatelliteManagerUtil.kt
deleted file mode 100644
index 5dc1a84..0000000
--- a/src/com/android/settings/network/SatelliteManagerUtil.kt
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 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.network
-
-import android.content.Context
-import android.os.OutcomeReceiver
-import android.telephony.satellite.SatelliteManager
-import android.util.Log
-import androidx.concurrent.futures.CallbackToFutureAdapter
-import com.google.common.util.concurrent.Futures.immediateFuture
-import com.google.common.util.concurrent.ListenableFuture
-import java.util.concurrent.Executor
-
-/**
- * Utility class for interacting with the SatelliteManager API.
- */
-object SatelliteManagerUtil {
-
-    private const val TAG: String = "SatelliteManagerUtil"
-
-    /**
-     * Checks if the satellite modem is enabled.
-     *
-     * @param context  The application context
-     * @param executor The executor to run the asynchronous operation on
-     * @return A ListenableFuture that will resolve to `true` if the satellite modem enabled,
-     *         `false` otherwise.
-     */
-    @JvmStatic
-    fun requestIsEnabled(context: Context, executor: Executor): ListenableFuture<Boolean> {
-        val satelliteManager: SatelliteManager? =
-            context.getSystemService(SatelliteManager::class.java)
-        if (satelliteManager == null) {
-            Log.w(TAG, "SatelliteManager is null")
-            return immediateFuture(false)
-        }
-
-        return CallbackToFutureAdapter.getFuture { completer ->
-            satelliteManager.requestIsEnabled(executor,
-                object : OutcomeReceiver<Boolean, SatelliteManager.SatelliteException> {
-                    override fun onResult(result: Boolean) {
-                        Log.i(TAG, "Satellite modem enabled status: $result")
-                        completer.set(result)
-                    }
-
-                    override fun onError(error: SatelliteManager.SatelliteException) {
-                        super.onError(error)
-                        Log.w(TAG, "Can't get satellite modem enabled status", error)
-                        completer.set(false)
-                    }
-                })
-            "requestIsEnabled"
-        }
-    }
-}
diff --git a/src/com/android/settings/network/SatelliteRepository.kt b/src/com/android/settings/network/SatelliteRepository.kt
new file mode 100644
index 0000000..3dab7e6
--- /dev/null
+++ b/src/com/android/settings/network/SatelliteRepository.kt
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 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.network
+
+import android.content.Context
+import android.os.OutcomeReceiver
+import android.telephony.satellite.SatelliteManager
+import android.telephony.satellite.SatelliteModemStateCallback
+import android.util.Log
+import androidx.annotation.VisibleForTesting
+import androidx.concurrent.futures.CallbackToFutureAdapter
+import com.google.common.util.concurrent.Futures.immediateFuture
+import com.google.common.util.concurrent.ListenableFuture
+import java.util.concurrent.Executor
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.asExecutor
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.flowOf
+
+/**
+ * A repository class for interacting with the SatelliteManager API.
+ */
+class SatelliteRepository(
+    private val context: Context,
+) {
+
+    /**
+     * Checks if the satellite modem is enabled.
+     *
+     * @param executor The executor to run the asynchronous operation on
+     * @return A ListenableFuture that will resolve to `true` if the satellite modem enabled,
+     *         `false` otherwise.
+     */
+    fun requestIsEnabled(executor: Executor): ListenableFuture<Boolean> {
+        val satelliteManager: SatelliteManager? =
+            context.getSystemService(SatelliteManager::class.java)
+        if (satelliteManager == null) {
+            Log.w(TAG, "SatelliteManager is null")
+            return immediateFuture(false)
+        }
+
+        return CallbackToFutureAdapter.getFuture { completer ->
+            satelliteManager.requestIsEnabled(executor,
+                object : OutcomeReceiver<Boolean, SatelliteManager.SatelliteException> {
+                    override fun onResult(result: Boolean) {
+                        Log.i(TAG, "Satellite modem enabled status: $result")
+                        completer.set(result)
+                    }
+
+                    override fun onError(error: SatelliteManager.SatelliteException) {
+                        super.onError(error)
+                        Log.w(TAG, "Can't get satellite modem enabled status", error)
+                        completer.set(false)
+                    }
+                })
+            "requestIsEnabled"
+        }
+    }
+
+    /**
+     * Provides a Flow that emits the enabled state of the satellite modem. Updates are triggered
+     * when the modem state changes.
+     *
+     * @param defaultDispatcher The CoroutineDispatcher to use (Defaults to `Dispatchers.Default`).
+     * @return A Flow emitting `true` when the modem is enabled and `false` otherwise.
+     */
+    fun getIsModemEnabledFlow(
+        defaultDispatcher: CoroutineDispatcher = Dispatchers.Default,
+    ): Flow<Boolean> {
+        val satelliteManager: SatelliteManager? =
+            context.getSystemService(SatelliteManager::class.java)
+        if (satelliteManager == null) {
+            Log.w(TAG, "SatelliteManager is null")
+            return flowOf(false)
+        }
+
+        return callbackFlow {
+            val callback = SatelliteModemStateCallback { state ->
+                val isEnabled = convertSatelliteModemStateToEnabledState(state)
+                Log.i(TAG, "Satellite modem state changed: state=$state, isEnabled=$isEnabled")
+                trySend(isEnabled)
+            }
+
+            val result = satelliteManager.registerForModemStateChanged(
+                defaultDispatcher.asExecutor(),
+                callback
+            )
+            Log.i(TAG, "Call registerForModemStateChanged: result=$result")
+
+            awaitClose { satelliteManager.unregisterForModemStateChanged(callback) }
+        }
+    }
+
+    /**
+     * Converts a [SatelliteManager.SatelliteModemState] to a boolean representing whether the modem
+     * is enabled.
+     *
+     * @param state The SatelliteModemState provided by the SatelliteManager.
+     * @return `true` if the modem is enabled, `false` otherwise.
+     */
+    @VisibleForTesting
+    fun convertSatelliteModemStateToEnabledState(
+        @SatelliteManager.SatelliteModemState state: Int,
+    ): Boolean {
+        // Mapping table based on logic from b/315928920#comment24
+        return when (state) {
+            SatelliteManager.SATELLITE_MODEM_STATE_IDLE,
+            SatelliteManager.SATELLITE_MODEM_STATE_LISTENING,
+            SatelliteManager.SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING,
+            SatelliteManager.SATELLITE_MODEM_STATE_DATAGRAM_RETRYING,
+            SatelliteManager.SATELLITE_MODEM_STATE_NOT_CONNECTED,
+            SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED -> true
+            else -> false
+        }
+    }
+
+    companion object {
+        private const val TAG: String = "SatelliteRepository"
+    }
+}
diff --git a/src/com/android/settings/network/SimOnboardingActivity.kt b/src/com/android/settings/network/SimOnboardingActivity.kt
index 0160f2c..eea7286 100644
--- a/src/com/android/settings/network/SimOnboardingActivity.kt
+++ b/src/com/android/settings/network/SimOnboardingActivity.kt
@@ -46,15 +46,18 @@
 import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.platform.LocalLifecycleOwner
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.text.style.TextAlign
+import androidx.lifecycle.LifecycleRegistry
 import com.android.settings.R
 import com.android.settings.SidecarFragment
 import com.android.settings.network.telephony.SubscriptionActionDialogActivity
 import com.android.settings.network.telephony.ToggleSubscriptionDialogActivity
 import com.android.settings.spa.SpaActivity.Companion.startSpaActivity
 import com.android.settings.spa.network.SimOnboardingPageProvider.getRoute
+import com.android.settings.wifi.WifiPickerTrackerHelper
 import com.android.settingslib.spa.SpaBaseDialogActivity
 import com.android.settingslib.spa.framework.theme.SettingsDimension
 import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle
@@ -74,6 +77,8 @@
 
 class SimOnboardingActivity : SpaBaseDialogActivity() {
     lateinit var scope: CoroutineScope
+    lateinit var wifiPickerTrackerHelper: WifiPickerTrackerHelper
+    lateinit var context: Context
     lateinit var showStartingDialog: MutableState<Boolean>
     lateinit var showError: MutableState<ErrorType>
     lateinit var showProgressDialog: MutableState<Boolean>
@@ -86,6 +91,7 @@
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
+
         if (!this.userManager.isAdminUser) {
             Log.e(TAG, "It is not the admin user. Unable to toggle subscription.")
             finish()
@@ -152,7 +158,10 @@
 
             CallbackType.CALLBACK_SETUP_PRIMARY_SIM -> {
                 scope.launch {
-                    onboardingService.startSetupPrimarySim(this@SimOnboardingActivity)
+                    onboardingService.startSetupPrimarySim(
+                        this@SimOnboardingActivity,
+                        wifiPickerTrackerHelper
+                    )
                 }
             }
 
@@ -184,6 +193,12 @@
         showDsdsProgressDialog = rememberSaveable { mutableStateOf(false) }
         showRestartDialog = rememberSaveable { mutableStateOf(false) }
         scope = rememberCoroutineScope()
+        context = LocalContext.current
+        val lifecycleOwner = LocalLifecycleOwner.current
+        wifiPickerTrackerHelper = WifiPickerTrackerHelper(
+            LifecycleRegistry(lifecycleOwner), context,
+            null /* WifiPickerTrackerCallback */
+        )
 
         registerSidecarReceiverFlow()
 
diff --git a/src/com/android/settings/network/SimOnboardingService.kt b/src/com/android/settings/network/SimOnboardingService.kt
index b99f18d..b7df754 100644
--- a/src/com/android/settings/network/SimOnboardingService.kt
+++ b/src/com/android/settings/network/SimOnboardingService.kt
@@ -30,6 +30,7 @@
 import com.android.settings.spa.network.setDefaultData
 import com.android.settings.spa.network.setDefaultSms
 import com.android.settings.spa.network.setDefaultVoice
+import com.android.settings.wifi.WifiPickerTrackerHelper
 import com.android.settingslib.utils.ThreadUtils
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.flow.MutableStateFlow
@@ -336,14 +337,17 @@
         }
     }
 
-    suspend fun startSetupPrimarySim(context: Context) {
+    suspend fun startSetupPrimarySim(
+        context: Context,
+        wifiPickerTrackerHelper: WifiPickerTrackerHelper
+    ) {
         withContext(Dispatchers.Default) {
                 setDefaultVoice(subscriptionManager, targetPrimarySimCalls)
                 setDefaultSms(subscriptionManager, targetPrimarySimTexts)
                 setDefaultData(
                     context,
                     subscriptionManager,
-                    null,
+                    wifiPickerTrackerHelper,
                     targetPrimarySimMobileData
                 )
                 TelephonyRepository(context).setAutomaticData(
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSwitchController.kt b/src/com/android/settings/network/telephony/MobileNetworkSwitchController.kt
index dcac74f..41cef50 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSwitchController.kt
+++ b/src/com/android/settings/network/telephony/MobileNetworkSwitchController.kt
@@ -26,16 +26,19 @@
 import androidx.compose.ui.res.stringResource
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.android.settings.R
+import com.android.settings.network.SatelliteRepository
 import com.android.settings.network.SubscriptionUtil
 import com.android.settings.spa.preference.ComposePreferenceController
 import com.android.settingslib.spa.widget.preference.MainSwitchPreference
 import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
+import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.map
 
 class MobileNetworkSwitchController @JvmOverloads constructor(
     context: Context,
     preferenceKey: String,
     private val subscriptionRepository: SubscriptionRepository = SubscriptionRepository(context),
+    private val satelliteRepository: SatelliteRepository = SatelliteRepository(context)
 ) : ComposePreferenceController(context, preferenceKey) {
 
     private var subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID
@@ -54,7 +57,12 @@
             subscriptionRepository.isSubscriptionEnabledFlow(subId)
         }.collectAsStateWithLifecycle(initialValue = null)
         val changeable by remember {
-            context.callStateFlow(subId).map { it == TelephonyManager.CALL_STATE_IDLE }
+            combine(
+                context.callStateFlow(subId).map { it == TelephonyManager.CALL_STATE_IDLE },
+                satelliteRepository.getIsModemEnabledFlow()
+            ) { isCallStateIdle, isSatelliteModemEnabled ->
+                isCallStateIdle && !isSatelliteModemEnabled
+            }
         }.collectAsStateWithLifecycle(initialValue = true)
         MainSwitchPreference(model = object : SwitchPreferenceModel {
             override val title = stringResource(R.string.mobile_network_use_sim_on)
diff --git a/src/com/android/settings/network/telephony/TelephonyRepository.kt b/src/com/android/settings/network/telephony/TelephonyRepository.kt
index 18af621..cc9b53d 100644
--- a/src/com/android/settings/network/telephony/TelephonyRepository.kt
+++ b/src/com/android/settings/network/telephony/TelephonyRepository.kt
@@ -21,6 +21,8 @@
 import android.telephony.TelephonyCallback
 import android.telephony.TelephonyManager
 import android.util.Log
+import com.android.settings.network.mobileDataEnabledFlow
+import com.android.settings.wifi.WifiPickerTrackerHelper
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.asExecutor
 import kotlinx.coroutines.channels.ProducerScope
@@ -62,6 +64,42 @@
         telephonyManager.setMobileDataPolicyEnabled(policy, enabled)
     }
 
+    fun isDataEnabled(
+        subId: Int,
+    ): Flow<Boolean> {
+        if (!SubscriptionManager.isValidSubscriptionId(subId)) return flowOf(false)
+
+        Log.d(TAG, "register mobileDataEnabledFlow: [$subId]")
+        return context.mobileDataEnabledFlow(subId)
+            .map {
+                Log.d(TAG, "mobileDataEnabledFlow: receive mobile data [$subId] start")
+                val telephonyManager = context.telephonyManager(subId)
+                telephonyManager.isDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_USER)
+                    .also { Log.d(TAG, "mobileDataEnabledFlow: [$subId] isDataEnabled(): $it") }
+            }
+    }
+
+    fun setMobileData(
+        subId: Int,
+        enabled: Boolean,
+        wifiPickerTrackerHelper: WifiPickerTrackerHelper? = null
+    ) {
+        if (!SubscriptionManager.isValidSubscriptionId(subId)) return
+
+        Log.d(TAG, "setMobileData: $enabled")
+        MobileNetworkUtils.setMobileDataEnabled(
+            context,
+            subId,
+            enabled /* enabled */,
+            true /* disableOtherSubscriptions */
+        )
+
+        if (wifiPickerTrackerHelper != null
+            && !wifiPickerTrackerHelper.isCarrierNetworkProvisionEnabled(subId)
+        ) {
+            wifiPickerTrackerHelper.setCarrierNetworkEnabled(enabled)
+        }
+    }
     private companion object {
         private const val TAG = "TelephonyRepository"
     }
diff --git a/src/com/android/settings/notification/RemoteVolumeGroupController.java b/src/com/android/settings/notification/RemoteVolumeGroupController.java
index 919b6d0..bea2ff3 100644
--- a/src/com/android/settings/notification/RemoteVolumeGroupController.java
+++ b/src/com/android/settings/notification/RemoteVolumeGroupController.java
@@ -68,7 +68,7 @@
     public RemoteVolumeGroupController(Context context, String preferenceKey) {
         super(context, preferenceKey);
         if (mLocalMediaManager == null) {
-            mLocalMediaManager = new LocalMediaManager(mContext, null, null);
+            mLocalMediaManager = new LocalMediaManager(mContext, /* packageName= */ null);
             mLocalMediaManager.registerCallback(this);
             mLocalMediaManager.startScan();
         }
diff --git a/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java b/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java
index 6d07305..3a08410 100644
--- a/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java
+++ b/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java
@@ -20,6 +20,7 @@
 import static android.provider.Settings.Secure.HIDE_PRIVATESPACE_ENTRY_POINT;
 import static android.provider.Settings.Secure.PRIVATE_SPACE_AUTO_LOCK;
 import static android.provider.Settings.Secure.PRIVATE_SPACE_AUTO_LOCK_AFTER_DEVICE_RESTART;
+import static android.provider.Settings.Secure.SKIP_FIRST_USE_HINTS;
 import static android.provider.Settings.Secure.USER_SETUP_COMPLETE;
 
 import android.app.ActivityManager;
@@ -122,6 +123,7 @@
             Log.i(TAG, "Private space created with id: " + mUserHandle.getIdentifier());
             resetPrivateSpaceSettings();
             setUserSetupComplete();
+            setSkipFirstUseHints();
         }
         return true;
     }
@@ -350,6 +352,17 @@
                 1, mUserHandle.getIdentifier());
     }
 
+    /**
+     * Sets the SKIP_FIRST_USE_HINTS for private profile so that the first launch of an app in
+     * private space will not display introductory hints.
+     */
+    @GuardedBy("this")
+    private void setSkipFirstUseHints() {
+        Log.d(TAG, "setting SKIP_FIRST_USE_HINTS = 1 for private profile");
+        Settings.Secure.putIntForUser(mContext.getContentResolver(), SKIP_FIRST_USE_HINTS,
+                1, mUserHandle.getIdentifier());
+    }
+
     private boolean isPrivateSpaceAutoLockSupported() {
         return android.os.Flags.allowPrivateProfile()
                 && android.multiuser.Flags.supportAutolockForPrivateSpace()
diff --git a/src/com/android/settings/privatespace/SetupPreFinishDelayFragment.java b/src/com/android/settings/privatespace/SetupPreFinishDelayFragment.java
index aee8512..9d04e79 100644
--- a/src/com/android/settings/privatespace/SetupPreFinishDelayFragment.java
+++ b/src/com/android/settings/privatespace/SetupPreFinishDelayFragment.java
@@ -124,6 +124,12 @@
     }
 
     @Override
+    public void onDestroy() {
+        sHandler.removeCallbacks(mRunnable);
+        super.onDestroy();
+    }
+
+    @Override
     public int getMetricsCategory() {
         return SettingsEnums.PRIVATE_SPACE_SETUP_PRE_FINISH;
     }
diff --git a/src/com/android/settings/sim/receivers/SimSlotChangeReceiver.java b/src/com/android/settings/sim/receivers/SimSlotChangeReceiver.java
index 9bba217..4920bb8 100644
--- a/src/com/android/settings/sim/receivers/SimSlotChangeReceiver.java
+++ b/src/com/android/settings/sim/receivers/SimSlotChangeReceiver.java
@@ -29,7 +29,7 @@
 import androidx.annotation.Nullable;
 
 import com.android.settings.R;
-import com.android.settings.network.SatelliteManagerUtil;
+import com.android.settings.network.SatelliteRepository;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -58,8 +58,8 @@
         if (shouldHandleSlotChange(context)) {
             Log.d(TAG, "Checking satellite enabled status");
             Executor executor = Executors.newSingleThreadExecutor();
-            ListenableFuture<Boolean> satelliteEnabledFuture = SatelliteManagerUtil
-                    .requestIsEnabled(context, executor);
+            ListenableFuture<Boolean> satelliteEnabledFuture = new SatelliteRepository(context)
+                    .requestIsEnabled(executor);
             satelliteEnabledFuture.addListener(() -> {
                 boolean isSatelliteEnabled = false;
                 try {
diff --git a/src/com/android/settings/spa/app/appinfo/AppArchiveButton.kt b/src/com/android/settings/spa/app/appinfo/AppArchiveButton.kt
index 38a8499..292c8b8 100644
--- a/src/com/android/settings/spa/app/appinfo/AppArchiveButton.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppArchiveButton.kt
@@ -21,6 +21,7 @@
 import android.content.IntentFilter
 import android.content.pm.ApplicationInfo
 import android.content.pm.PackageInstaller
+import android.content.pm.PackageManager
 import android.os.UserHandle
 import android.util.Log
 import android.widget.Toast
@@ -87,11 +88,15 @@
     }
 
     private fun ApplicationInfo.isActionButtonEnabled(): Boolean {
-        return !isArchived
-            && userPackageManager.isAppArchivable(packageName)
-            // We apply the same device policy for both the uninstallation and archive
-            // button.
-            && !appButtonRepository.isUninstallBlockedByAdmin(this)
+        return try {
+            (!isArchived
+                    && userPackageManager.isAppArchivable(packageName)
+                    // We apply the same device policy for both the uninstallation and archive
+                    // button.
+                    && !appButtonRepository.isUninstallBlockedByAdmin(this))
+        } catch (e: PackageManager.NameNotFoundException) {
+            false
+        }
     }
 
     private fun onArchiveClicked(app: ApplicationInfo) {
diff --git a/src/com/android/settings/spa/network/MobileDataSwitchingPreference.kt b/src/com/android/settings/spa/network/MobileDataSwitchingPreference.kt
new file mode 100644
index 0000000..8c382bd
--- /dev/null
+++ b/src/com/android/settings/spa/network/MobileDataSwitchingPreference.kt
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 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.spa.network
+
+import android.telephony.TelephonyManager
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.ui.res.stringResource
+import com.android.settings.R
+import com.android.settings.network.telephony.TelephonyRepository
+import com.android.settingslib.spa.widget.preference.SwitchPreference
+import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+
+@Composable
+fun MobileDataSwitchingPreference(
+    isMobileDataEnabled: () -> Boolean?,
+    setMobileDataEnabled: (newEnabled: Boolean) -> Unit,
+) {
+    val mobileDataSummary = stringResource(id = R.string.primary_sim_automatic_data_msg)
+    val coroutineScope = rememberCoroutineScope()
+    SwitchPreference(
+        object : SwitchPreferenceModel {
+            override val title = stringResource(id = R.string.mobile_data_settings_title)
+            override val summary = { mobileDataSummary }
+            override val checked = { isMobileDataEnabled() }
+            override val onCheckedChange: (Boolean) -> Unit = { newEnabled ->
+                coroutineScope.launch(Dispatchers.Default) {
+                    setMobileDataEnabled(newEnabled)
+                }
+            }
+            override val changeable:() -> Boolean = {true}
+        }
+    )
+}
diff --git a/src/com/android/settings/spa/network/NetworkCellularGroupProvider.kt b/src/com/android/settings/spa/network/NetworkCellularGroupProvider.kt
index 80be970..0ccedeb 100644
--- a/src/com/android/settings/spa/network/NetworkCellularGroupProvider.kt
+++ b/src/com/android/settings/spa/network/NetworkCellularGroupProvider.kt
@@ -38,11 +38,12 @@
 import androidx.compose.ui.platform.LocalLifecycleOwner
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.res.vectorResource
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.LifecycleRegistry
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import androidx.lifecycle.viewmodel.compose.viewModel
 import com.android.settings.R
 import com.android.settings.network.SubscriptionInfoListViewModel
-import com.android.settings.network.telephony.MobileNetworkUtils
 import com.android.settings.network.telephony.TelephonyRepository
 import com.android.settings.spa.network.PrimarySimRepository.PrimarySimInfo
 import com.android.settings.wifi.WifiPickerTrackerHelper
@@ -167,7 +168,7 @@
     defaultVoiceSubId: MutableIntState,
     defaultSmsSubId: MutableIntState,
     defaultDataSubId: MutableIntState,
-    nonDds: MutableIntState
+    nonDds: MutableIntState,
 ) {
     val selectableSubscriptionInfoList by selectableSubscriptionInfoListFlow
         .collectAsStateWithLifecycle(initialValue = emptyList())
@@ -175,22 +176,76 @@
     val stringSims = stringResource(R.string.provider_network_settings_title)
     RegularScaffold(title = stringSims) {
         SimsSection(selectableSubscriptionInfoList)
+        MobileDataSectionImpl(defaultDataSubId,
+            nonDds,
+        )
+
         PrimarySimSectionImpl(
             selectableSubscriptionInfoListFlow,
             defaultVoiceSubId,
             defaultSmsSubId,
             defaultDataSubId,
-            nonDds
         )
     }
 }
 
 @Composable
+fun MobileDataSectionImpl(
+    mobileDataSelectedId: MutableIntState,
+    nonDds: MutableIntState,
+) {
+    val context = LocalContext.current
+    val localLifecycleOwner = LocalLifecycleOwner.current
+    val wifiPickerTrackerHelper = getWifiPickerTrackerHelper(context, localLifecycleOwner)
+
+    val subscriptionManager: SubscriptionManager? =
+            context.getSystemService(SubscriptionManager::class.java)
+
+    Category(title = stringResource(id = R.string.mobile_data_settings_title)) {
+        val isAutoDataEnabled by remember(nonDds.intValue) {
+            TelephonyRepository(context).isMobileDataPolicyEnabledFlow(
+                subId = nonDds.intValue,
+                policy = TelephonyManager.MOBILE_DATA_POLICY_AUTO_DATA_SWITCH
+            )
+        }.collectAsStateWithLifecycle(initialValue = null)
+
+        val mobileDataStateChanged by remember(mobileDataSelectedId.intValue) {
+            TelephonyRepository(context).isDataEnabled(mobileDataSelectedId.intValue)
+        }.collectAsStateWithLifecycle(initialValue = false)
+        val coroutineScope = rememberCoroutineScope()
+
+        MobileDataSwitchingPreference(
+            isMobileDataEnabled = { mobileDataStateChanged },
+            setMobileDataEnabled = { newEnabled ->
+                coroutineScope.launch {
+                    setMobileData(
+                        context,
+                        subscriptionManager,
+                        wifiPickerTrackerHelper,
+                        mobileDataSelectedId.intValue,
+                        newEnabled
+                    )
+                }
+           },
+        )
+        if (nonDds.intValue != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+            AutomaticDataSwitchingPreference(
+                isAutoDataEnabled = { isAutoDataEnabled },
+                setAutoDataEnabled = { newEnabled ->
+                    TelephonyRepository(context).setAutomaticData(nonDds.intValue, newEnabled)
+                },
+            )
+        }
+    }
+}
+
+@Composable
 fun PrimarySimImpl(
     primarySimInfo: PrimarySimInfo,
     callsSelectedId: MutableIntState,
     textsSelectedId: MutableIntState,
     mobileDataSelectedId: MutableIntState,
+    wifiPickerTrackerHelper: WifiPickerTrackerHelper? = null,
     subscriptionManager: SubscriptionManager? =
         LocalContext.current.getSystemService(SubscriptionManager::class.java),
     coroutineScope: CoroutineScope = rememberCoroutineScope(),
@@ -208,20 +263,15 @@
         }
     },
     actionSetMobileData: (Int) -> Unit = {
-        mobileDataSelectedId.intValue = it
         coroutineScope.launch {
-            // TODO: to fix the WifiPickerTracker crash when create
-            //       the wifiPickerTrackerHelper
             setDefaultData(
                 context,
                 subscriptionManager,
-                null/*wifiPickerTrackerHelper*/,
+                wifiPickerTrackerHelper,
                 it
             )
         }
     },
-    isAutoDataEnabled: () -> Boolean?,
-    setAutoDataEnabled: (newEnabled: Boolean) -> Unit,
 ) {
     CreatePrimarySimListPreference(
         stringResource(id = R.string.primary_sim_calls_title),
@@ -244,8 +294,6 @@
         Icons.Outlined.DataUsage,
         actionSetMobileData
     )
-
-    AutomaticDataSwitchingPreference(isAutoDataEnabled, setAutoDataEnabled)
 }
 
 @Composable
@@ -254,9 +302,11 @@
     callsSelectedId: MutableIntState,
     textsSelectedId: MutableIntState,
     mobileDataSelectedId: MutableIntState,
-    nonDds: MutableIntState,
 ) {
     val context = LocalContext.current
+    val localLifecycleOwner = LocalLifecycleOwner.current
+    val wifiPickerTrackerHelper = getWifiPickerTrackerHelper(context, localLifecycleOwner)
+
     val primarySimInfo = remember(subscriptionInfoListFlow) {
         subscriptionInfoListFlow
             .map { subscriptionInfoList ->
@@ -267,25 +317,25 @@
     }.collectAsStateWithLifecycle(initialValue = null).value ?: return
 
     Category(title = stringResource(id = R.string.primary_sim_title)) {
-        val isAutoDataEnabled by remember(nonDds.intValue) {
-            TelephonyRepository(context).isMobileDataPolicyEnabledFlow(
-                subId = nonDds.intValue,
-                policy = TelephonyManager.MOBILE_DATA_POLICY_AUTO_DATA_SWITCH
-            )
-        }.collectAsStateWithLifecycle(initialValue = null)
         PrimarySimImpl(
             primarySimInfo,
             callsSelectedId,
             textsSelectedId,
             mobileDataSelectedId,
-            isAutoDataEnabled = { isAutoDataEnabled },
-            setAutoDataEnabled = { newEnabled ->
-                TelephonyRepository(context).setAutomaticData(nonDds.intValue, newEnabled)
-            },
+            wifiPickerTrackerHelper
         )
     }
 }
 
+private fun getWifiPickerTrackerHelper(
+    context: Context,
+    lifecycleOwner: LifecycleOwner
+): WifiPickerTrackerHelper {
+    return WifiPickerTrackerHelper(
+        LifecycleRegistry(lifecycleOwner), context,
+        null /* WifiPickerTrackerCallback */
+    )
+}
 private fun Context.defaultVoiceSubscriptionFlow(): Flow<Int> =
         merge(
                 flowOf(null), // kick an initial value
@@ -335,18 +385,27 @@
     wifiPickerTrackerHelper: WifiPickerTrackerHelper?,
     subId: Int
 ): Unit =
+    setMobileData(
+        context,
+        subscriptionManager,
+        wifiPickerTrackerHelper,
+        subId,
+        true
+    )
+
+suspend fun setMobileData(
+    context: Context,
+    subscriptionManager: SubscriptionManager?,
+    wifiPickerTrackerHelper: WifiPickerTrackerHelper?,
+    subId: Int,
+    enabled: Boolean,
+): Unit =
     withContext(Dispatchers.Default) {
-        subscriptionManager?.setDefaultDataSubId(subId)
-        Log.d(NetworkCellularGroupProvider.name, "setMobileDataEnabled: true")
-        MobileNetworkUtils.setMobileDataEnabled(
-            context,
-            subId,
-            true /* enabled */,
-            true /* disableOtherSubscriptions */
-        )
-        if (wifiPickerTrackerHelper != null
-            && !wifiPickerTrackerHelper.isCarrierNetworkProvisionEnabled(subId)
-        ) {
-            wifiPickerTrackerHelper.setCarrierNetworkEnabled(true)
+        Log.d(NetworkCellularGroupProvider.name, "setMobileData: $enabled")
+        if (enabled) {
+            Log.d(NetworkCellularGroupProvider.name, "setDefaultData: [$subId]")
+            subscriptionManager?.setDefaultDataSubId(subId)
         }
-    }
+        TelephonyRepository(context)
+            .setMobileData(subId, enabled, wifiPickerTrackerHelper)
+    }
\ No newline at end of file
diff --git a/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt b/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt
index 0306aad..1c96979 100644
--- a/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt
+++ b/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt
@@ -102,18 +102,21 @@
             mobileDataSelectedId = mobileDataSelectedId,
             actionSetCalls = {
                 callsSelectedId.intValue = it
-                onboardingService.targetPrimarySimCalls = it},
+                onboardingService.targetPrimarySimCalls = it
+            },
             actionSetTexts = {
                 textsSelectedId.intValue = it
-                onboardingService.targetPrimarySimTexts = it},
+                onboardingService.targetPrimarySimTexts = it
+            },
             actionSetMobileData = {
                 mobileDataSelectedId.intValue = it
-                onboardingService.targetPrimarySimMobileData = it},
-            isAutoDataEnabled = { isAutoDataEnabled },
+                onboardingService.targetPrimarySimMobileData = it
+            }
+        )
+        AutomaticDataSwitchingPreference(isAutoDataEnabled = { isAutoDataEnabled },
             setAutoDataEnabled = { newEnabled ->
                 onboardingService.targetPrimarySimAutoDataSwitch.value = newEnabled
-            },
-        )
+            })
     }
 }
 
diff --git a/tests/robotests/src/com/android/settings/applications/InstalledAppCounterTest.java b/tests/robotests/src/com/android/settings/applications/InstalledAppCounterTest.java
index fc5e768..af06d52 100644
--- a/tests/robotests/src/com/android/settings/applications/InstalledAppCounterTest.java
+++ b/tests/robotests/src/com/android/settings/applications/InstalledAppCounterTest.java
@@ -53,7 +53,6 @@
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowApplication;
 
 import java.util.ArrayList;
@@ -63,7 +62,6 @@
 import java.util.Set;
 
 @RunWith(RobolectricTestRunner.class)
-@LooperMode(LooperMode.Mode.LEGACY)
 public final class InstalledAppCounterTest {
 
     @Rule
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java
index 91707cd..8f983de 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java
@@ -79,7 +79,6 @@
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.android.controller.ActivityController;
-import org.robolectric.annotation.LooperMode;
 import org.robolectric.util.ReflectionHelpers;
 
 import java.util.ArrayList;
@@ -88,7 +87,6 @@
 
 @Ignore("b/295325503")
 @RunWith(RobolectricTestRunner.class)
-@LooperMode(LooperMode.Mode.LEGACY)
 public class FingerprintEnrollEnrollingTest {
     private static final String ENROLL_PROGRESS_COLOR_LIGHT = "#699FF3";
     private static final String ENROLL_PROGRESS_COLOR_DARK = "#7DA7F1";
diff --git a/tests/robotests/src/com/android/settings/development/bluetooth/BluetoothCodecListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/bluetooth/BluetoothCodecListPreferenceControllerTest.java
index b86d9df..fab867f 100644
--- a/tests/robotests/src/com/android/settings/development/bluetooth/BluetoothCodecListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/bluetooth/BluetoothCodecListPreferenceControllerTest.java
@@ -35,12 +35,14 @@
 import android.bluetooth.BluetoothDevice;
 import android.bluetooth.BluetoothProfile;
 import android.content.Context;
+import android.platform.test.annotations.RequiresFlagsEnabled;
 
 import androidx.lifecycle.LifecycleOwner;
 import androidx.preference.ListPreference;
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.development.BluetoothA2dpConfigStore;
+import com.android.settings.development.Flags;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
 import org.junit.Before;
@@ -57,7 +59,6 @@
 
 @RunWith(RobolectricTestRunner.class)
 public class BluetoothCodecListPreferenceControllerTest {
-
     private static final String DEVICE_ADDRESS = "00:11:22:33:44:55";
 
     @Mock private BluetoothA2dp mBluetoothA2dp;
@@ -245,6 +246,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_A2DP_OFFLOAD_CODEC_EXTENSIBILITY_SETTINGS)
     public void onPreferenceChange_notifyPreference() {
         assertFalse(
                 mController.onPreferenceChange(
diff --git a/tests/robotests/src/com/android/settings/language/LanguageAndInputPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/language/LanguageAndInputPreferenceControllerTest.java
deleted file mode 100644
index 3f27fdd..0000000
--- a/tests/robotests/src/com/android/settings/language/LanguageAndInputPreferenceControllerTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2019 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.language;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.ComponentName;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.provider.Settings;
-import android.view.inputmethod.InputMethodInfo;
-
-import com.android.settings.testutils.shadow.ShadowInputMethodManagerWithMethodList;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = ShadowInputMethodManagerWithMethodList.class)
-public class LanguageAndInputPreferenceControllerTest {
-    private Context mContext;
-
-    @Before
-    public void setUp() {
-        mContext = spy(RuntimeEnvironment.application);
-    }
-
-    @Test
-    public void getSummary_shouldSetToCurrentImeName() {
-        final ComponentName componentName = new ComponentName("name1", "cls");
-        final ContentResolver cr = mContext.getContentResolver();
-        Settings.Secure.putString(cr, Settings.Secure.DEFAULT_INPUT_METHOD,
-                componentName.flattenToString());
-        final List<InputMethodInfo> imis = new ArrayList<>();
-        imis.add(mock(InputMethodInfo.class));
-        when(imis.get(0).getPackageName()).thenReturn("name1");
-        when(imis.get(0).loadLabel(any())).thenReturn("label");
-        ShadowInputMethodManagerWithMethodList.getShadow().setInputMethodList(imis);
-
-        final LanguageAndInputPreferenceController controller =
-                new LanguageAndInputPreferenceController(mContext, "key");
-
-        assertThat(controller.getSummary().toString()).contains("label");
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java b/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java
deleted file mode 100644
index 4429dd7..0000000
--- a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (C) 2016 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.language;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.app.Activity;
-import android.app.admin.DevicePolicyManager;
-import android.content.Context;
-import android.content.res.Resources;
-import android.hardware.input.InputManager;
-import android.os.UserManager;
-import android.util.FeatureFlagUtils;
-import android.view.autofill.AutofillManager;
-import android.view.inputmethod.InputMethodManager;
-import android.view.textservice.TextServicesManager;
-
-import androidx.lifecycle.LifecycleObserver;
-
-import com.android.settings.R;
-import com.android.settings.testutils.XmlTestUtils;
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(RobolectricTestRunner.class)
-public class LanguageAndInputSettingsTest {
-
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private Activity mActivity;
-    @Mock
-    private InputManager mIm;
-    @Mock
-    private InputMethodManager mImm;
-    @Mock
-    private DevicePolicyManager mDpm;
-    @Mock
-    private AutofillManager mAutofillManager;
-    private TestFragment mFragment;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        when(mActivity.getSystemService(Context.USER_SERVICE)).thenReturn(mock(UserManager.class));
-        when(mActivity.getSystemService(Context.INPUT_SERVICE))
-                .thenReturn(mock(InputManager.class));
-        when(mActivity.getSystemService(Context.INPUT_SERVICE)).thenReturn(mIm);
-        when(mActivity.getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE))
-                .thenReturn(mock(TextServicesManager.class));
-        when(mActivity.getSystemService(Context.DEVICE_POLICY_SERVICE)).thenReturn(mDpm);
-        when(mActivity.getSystemService(Context.INPUT_METHOD_SERVICE)).thenReturn(mImm);
-        when((Object) mActivity.getSystemService(AutofillManager.class))
-                .thenReturn(mAutofillManager);
-        mFragment = new TestFragment(mActivity);
-    }
-
-    @Test
-    public void testGetPreferenceScreenResId() {
-        assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(R.xml.language_and_input);
-    }
-
-    @Test
-    public void testGetPreferenceControllers_shouldRegisterLifecycleObservers() {
-        final List<AbstractPreferenceController> controllers =
-                mFragment.createPreferenceControllers(mActivity);
-        int lifecycleObserverCount = 0;
-        for (AbstractPreferenceController controller : controllers) {
-            if (controller instanceof LifecycleObserver) {
-                lifecycleObserverCount++;
-            }
-        }
-        verify(mFragment.getSettingsLifecycle(), times(lifecycleObserverCount))
-                .addObserver(any(LifecycleObserver.class));
-    }
-
-    @Test
-    public void testGetPreferenceControllers_shouldAllBeCreated() {
-        final List<AbstractPreferenceController> controllers =
-                mFragment.createPreferenceControllers(mActivity);
-
-        assertThat(controllers.isEmpty()).isFalse();
-    }
-
-    @Test
-    public void testNonIndexableKeys_existInXmlLayout() {
-        final Context context = spy(RuntimeEnvironment.application);
-        final Resources res = spy(RuntimeEnvironment.application.getResources());
-        final InputManager inputManager = mock(InputManager.class);
-        final TextServicesManager textServicesManager = mock(TextServicesManager.class);
-        FeatureFlagUtils.setEnabled(context, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI, false);
-        when(inputManager.getInputDeviceIds()).thenReturn(new int[0]);
-        doReturn(inputManager).when(context).getSystemService(Context.INPUT_SERVICE);
-        doReturn(textServicesManager).when(context)
-            .getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE);
-        doReturn(res).when(context).getResources();
-        doReturn(false).when(res)
-                .getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys);
-        final List<String> niks =
-            LanguageAndInputSettings.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(context);
-        LanguageAndInputSettings settings = new LanguageAndInputSettings();
-        final int xmlId = settings.getPreferenceScreenResId();
-
-        final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId);
-
-        assertThat(keys).containsAtLeastElementsIn(niks);
-    }
-
-    @Test
-    public void testPreferenceControllers_getPreferenceKeys_existInPreferenceScreen() {
-        final Context context = spy(RuntimeEnvironment.application);
-        final TextServicesManager textServicesManager = mock(TextServicesManager.class);
-        doReturn(textServicesManager).when(context)
-            .getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE);
-        final LanguageAndInputSettings fragment = new LanguageAndInputSettings();
-        final List<String> preferenceScreenKeys =
-            XmlTestUtils.getKeysFromPreferenceXml(context, fragment.getPreferenceScreenResId());
-        final List<String> preferenceKeys = new ArrayList<>();
-
-        for (AbstractPreferenceController controller : fragment.createPreferenceControllers(context)) {
-            preferenceKeys.add(controller.getPreferenceKey());
-        }
-
-        assertThat(preferenceScreenKeys).containsAtLeastElementsIn(preferenceKeys);
-    }
-
-    /**
-     * Test fragment to expose lifecycle and context so we can verify behavior for observables.
-     */
-    public static class TestFragment extends LanguageAndInputSettings {
-
-        private Lifecycle mLifecycle;
-        private Context mContext;
-
-        public TestFragment(Context context) {
-            mContext = context;
-            mLifecycle = mock(Lifecycle.class);
-        }
-
-        @Override
-        public Context getContext() {
-            return mContext;
-        }
-
-        @Override
-        public Lifecycle getSettingsLifecycle() {
-            if (mLifecycle == null) {
-                return super.getSettingsLifecycle();
-            }
-            return mLifecycle;
-        }
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/network/SatelliteManagerUtilTest.kt b/tests/robotests/src/com/android/settings/network/SatelliteRepositoryTest.kt
similarity index 65%
rename from tests/robotests/src/com/android/settings/network/SatelliteManagerUtilTest.kt
rename to tests/robotests/src/com/android/settings/network/SatelliteRepositoryTest.kt
index 50d7897..c7d047a 100644
--- a/tests/robotests/src/com/android/settings/network/SatelliteManagerUtilTest.kt
+++ b/tests/robotests/src/com/android/settings/network/SatelliteRepositoryTest.kt
@@ -20,10 +20,12 @@
 import android.os.OutcomeReceiver
 import android.telephony.satellite.SatelliteManager
 import android.telephony.satellite.SatelliteManager.SatelliteException
+import android.telephony.satellite.SatelliteModemStateCallback
 import androidx.test.core.app.ApplicationProvider
-import com.android.settings.network.SatelliteManagerUtil.requestIsEnabled
+import com.google.common.truth.Truth.assertThat
 import com.google.common.util.concurrent.ListenableFuture
 import java.util.concurrent.Executor
+import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.runBlocking
 import org.junit.Assert.assertFalse
 import org.junit.Assert.assertTrue
@@ -42,7 +44,7 @@
 
 
 @RunWith(RobolectricTestRunner::class)
-class SatelliteManagerUtilTest {
+class SatelliteRepositoryTest {
 
     @JvmField
     @Rule
@@ -57,10 +59,15 @@
     @Mock
     private lateinit var mockExecutor: Executor
 
+    private lateinit var repository: SatelliteRepository
+
+
     @Before
     fun setUp() {
         `when`(this.spyContext.getSystemService(SatelliteManager::class.java))
             .thenReturn(mockSatelliteManager)
+
+        repository = SatelliteRepository(spyContext)
     }
 
     @Test
@@ -78,7 +85,7 @@
             }
 
         val result: ListenableFuture<Boolean> =
-            requestIsEnabled(spyContext, mockExecutor)
+            repository.requestIsEnabled(mockExecutor)
 
         assertTrue(result.get())
     }
@@ -98,7 +105,7 @@
             }
 
         val result: ListenableFuture<Boolean> =
-            requestIsEnabled(spyContext, mockExecutor)
+            repository.requestIsEnabled(mockExecutor)
         assertFalse(result.get())
     }
 
@@ -117,7 +124,7 @@
                 null
             }
 
-        val result = requestIsEnabled(spyContext, mockExecutor)
+        val result = repository.requestIsEnabled(mockExecutor)
 
         assertFalse(result.get())
     }
@@ -126,8 +133,52 @@
     fun requestIsEnabled_nullSatelliteManager() = runBlocking {
         `when`(spyContext.getSystemService(SatelliteManager::class.java)).thenReturn(null)
 
-        val result: ListenableFuture<Boolean> = requestIsEnabled(spyContext, mockExecutor)
+        val result: ListenableFuture<Boolean> = repository.requestIsEnabled(mockExecutor)
 
         assertFalse(result.get())
     }
+
+    @Test
+    fun getIsModemEnabledFlow_isSatelliteEnabledState() = runBlocking {
+        `when`(
+            mockSatelliteManager.registerForModemStateChanged(
+                any(),
+                any()
+            )
+        ).thenAnswer { invocation ->
+            val callback = invocation.getArgument<SatelliteModemStateCallback>(1)
+            callback.onSatelliteModemStateChanged(SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED)
+            SatelliteManager.SATELLITE_RESULT_SUCCESS
+        }
+
+        val flow = repository.getIsModemEnabledFlow()
+
+        assertThat(flow.first()).isTrue()
+    }
+
+    @Test
+    fun getIsModemEnabledFlow_isSatelliteDisabledState() = runBlocking {
+        `when`(
+            mockSatelliteManager.registerForModemStateChanged(
+                any(),
+                any()
+            )
+        ).thenAnswer { invocation ->
+            val callback = invocation.getArgument<SatelliteModemStateCallback>(1)
+            callback.onSatelliteModemStateChanged(SatelliteManager.SATELLITE_MODEM_STATE_OFF)
+            SatelliteManager.SATELLITE_RESULT_SUCCESS
+        }
+
+        val flow = repository.getIsModemEnabledFlow()
+
+        assertThat(flow.first()).isFalse()
+    }
+
+    @Test
+    fun getIsModemEnabledFlow_nullSatelliteManager() = runBlocking {
+        `when`(spyContext.getSystemService(SatelliteManager::class.java)).thenReturn(null)
+
+        val flow = repository.getIsModemEnabledFlow()
+        assertThat(flow.first()).isFalse()
+    }
 }
\ No newline at end of file
diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/TelephonyRepositoryTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/TelephonyRepositoryTest.kt
index ce27ed4..6058935 100644
--- a/tests/spa_unit/src/com/android/settings/network/telephony/TelephonyRepositoryTest.kt
+++ b/tests/spa_unit/src/com/android/settings/network/telephony/TelephonyRepositoryTest.kt
@@ -92,6 +92,30 @@
     }
 
     @Test
+    fun isDataEnabled_invalidSub_returnFalse() = runBlocking {
+        val state = repository.isDataEnabled(
+            subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID,
+        )
+
+        assertThat(state.firstWithTimeoutOrNull()).isFalse()
+    }
+
+    @Test
+    fun isDataEnabled_validSub_returnPolicyState() = runBlocking {
+        mockTelephonyManager.stub {
+            on {
+                isDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_USER)
+            } doReturn true
+        }
+
+        val state = repository.isDataEnabled(
+            subId = SUB_ID,
+        )
+
+        assertThat(state.firstWithTimeoutOrNull()).isTrue()
+    }
+
+    @Test
     fun telephonyCallbackFlow_callbackRegistered() = runBlocking {
         val flow = context.telephonyCallbackFlow<Unit>(SUB_ID) {
             object : TelephonyCallback() {}
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppArchiveButtonTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppArchiveButtonTest.kt
index 2afb3f1..ac82756 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppArchiveButtonTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppArchiveButtonTest.kt
@@ -110,6 +110,19 @@
     }
 
     @Test
+    fun appArchiveButton_whenPackageIsNotFound_isDisabled() {
+        val app = ApplicationInfo().apply {
+            packageName = PACKAGE_NAME
+            isArchived = false
+        }
+        whenever(userPackageManager.isAppArchivable(app.packageName)).thenThrow(PackageManager.NameNotFoundException())
+
+        val actionButton = setContent(app)
+
+        assertThat(actionButton.enabled).isFalse()
+    }
+
+    @Test
     fun appArchiveButton_displaysRightTextAndIcon() {
         val app = ApplicationInfo().apply {
             packageName = PACKAGE_NAME
diff --git a/tests/unit/src/com/android/settings/language/LanguagePreferenceControllerTest.java b/tests/unit/src/com/android/settings/language/LanguagePreferenceControllerTest.java
index 6622753..f8e790f 100644
--- a/tests/unit/src/com/android/settings/language/LanguagePreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/language/LanguagePreferenceControllerTest.java
@@ -16,71 +16,32 @@
 
 package com.android.settings.language;
 
-import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
-
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.PackageManager;
-import android.util.FeatureFlagUtils;
 
 import androidx.test.core.app.ApplicationProvider;
 
 import com.android.settings.Settings;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
 public class LanguagePreferenceControllerTest {
-    private boolean mCacheFeatureFlagSwitch = false;
     private Context mContext;
     private LanguagePreferenceController mController;
 
     @Before
     public void setup() {
         mContext = ApplicationProvider.getApplicationContext();
-        mCacheFeatureFlagSwitch =
-                FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI);
         mController = new LanguagePreferenceController(mContext, "key");
-
-    }
-
-    @After
-    public void tearDown() {
-        FeatureFlagUtils.setEnabled(
-                mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI, mCacheFeatureFlagSwitch);
-    }
-
-    @Test
-    public void getAvailabilityStatus_featureFlagOff_returnUnavailable() {
-        FeatureFlagUtils.setEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI,
-                false);
-
-        int result = mController.getAvailabilityStatus();
-
-        assertEquals(CONDITIONALLY_UNAVAILABLE, result);
-    }
-
-    @Test
-    public void getAvailabilityStatus_featureFlagOff_LanguageAndInputSettingsActivityEnabled() {
-        FeatureFlagUtils.setEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI,
-                false);
-
-        mController.getAvailabilityStatus();
-
-        assertTrue(isActivityEnable(mContext, Settings.LanguageAndInputSettingsActivity.class));
-        assertFalse(isActivityEnable(mContext, Settings.LanguageSettingsActivity.class));
     }
 
     @Test
     public void getAvailabilityStatus_featureFlagOff_LanguageAndInputSettingsActivitydisabled() {
-        FeatureFlagUtils.setEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI,
-                true);
-
         mController.getAvailabilityStatus();
 
         assertFalse(isActivityEnable(mContext, Settings.LanguageAndInputSettingsActivity.class));
diff --git a/tests/unit/src/com/android/settings/privatespace/PrivateSpaceMaintainerTest.java b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceMaintainerTest.java
index 637b485..522dcd5 100644
--- a/tests/unit/src/com/android/settings/privatespace/PrivateSpaceMaintainerTest.java
+++ b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceMaintainerTest.java
@@ -421,6 +421,30 @@
         assertThat(privateSpaceMaintainer.isPrivateSpaceEntryPointEnabled()).isFalse();
     }
 
+    @Test
+    public void createPrivateSpace_psDoesNotExist_setsSkipFirstUseHints() {
+        mSetFlagsRule.enableFlags(
+                android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
+        assumeTrue(mContext.getSystemService(UserManager.class).canAddPrivateProfile());
+        PrivateSpaceMaintainer privateSpaceMaintainer =
+                PrivateSpaceMaintainer.getInstance(mContext);
+        privateSpaceMaintainer.createPrivateSpace();
+        assertThat(getSecureSkipFirstUseHints()).isEqualTo(1);
+    }
+
+    @Test
+    public void createPrivateSpace_pSExists_doesNotChangeSkipFirstUseHints() {
+        mSetFlagsRule.enableFlags(
+                android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
+        assumeTrue(mContext.getSystemService(UserManager.class).canAddPrivateProfile());
+        PrivateSpaceMaintainer privateSpaceMaintainer =
+                PrivateSpaceMaintainer.getInstance(mContext);
+        privateSpaceMaintainer.createPrivateSpace();
+        assertThat(getSecureSkipFirstUseHints()).isEqualTo(1);
+        privateSpaceMaintainer.createPrivateSpace();
+        assertThat(getSecureSkipFirstUseHints()).isEqualTo(1);
+    }
+
     private int getSecureUserSetupComplete() {
         PrivateSpaceMaintainer privateSpaceMaintainer =
                 PrivateSpaceMaintainer.getInstance(mContext);
@@ -431,6 +455,16 @@
                 privateSpaceMaintainer.getPrivateProfileHandle().getIdentifier());
     }
 
+    private int getSecureSkipFirstUseHints() {
+        PrivateSpaceMaintainer privateSpaceMaintainer =
+                PrivateSpaceMaintainer.getInstance(mContext);
+        return Settings.Secure.getIntForUser(
+                mContentResolver,
+                Settings.Secure.SKIP_FIRST_USE_HINTS,
+                0,
+                privateSpaceMaintainer.getPrivateProfileHandle().getIdentifier());
+    }
+
     private int getPsSensitiveNotificationsValue(PrivateSpaceMaintainer privateSpaceMaintainer) {
         return Settings.Secure.getIntForUser(mContentResolver,
                 LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS,