diff --git a/res/xml/app_channels_bypassing_dnd_settings.xml b/res/xml/app_channels_bypassing_dnd_settings.xml
index 4f6291d..433d26d 100644
--- a/res/xml/app_channels_bypassing_dnd_settings.xml
+++ b/res/xml/app_channels_bypassing_dnd_settings.xml
@@ -16,7 +16,7 @@
 -->
 
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-    android:title="@string/zen_mode_settings_title">
+    android:title="@string/zen_mode_apps_title">
     <com.android.settingslib.widget.LayoutPreference
         android:key="pref_app_header"
         android:layout="@layout/settings_entity_header" />
@@ -26,4 +26,4 @@
         android:title="@string/zen_mode_bypassing_app_channels_header">
         <!-- add app channel toggles here -->
     </PreferenceCategory>
-</PreferenceScreen>
\ No newline at end of file
+</PreferenceScreen>
diff --git a/res/xml/storage_dashboard_fragment.xml b/res/xml/storage_dashboard_fragment.xml
index f14f4ad..6c2b8d4 100644
--- a/res/xml/storage_dashboard_fragment.xml
+++ b/res/xml/storage_dashboard_fragment.xml
@@ -101,7 +101,8 @@
             android:key="pref_system"
             android:title="@string/storage_os_name"
             android:icon="@drawable/ic_android_vd_theme_24"
-            android:order="202"/>
+            android:order="202"
+            settings:searchable="false"/>
         <com.android.settings.deviceinfo.StorageItemPreference
             android:key="temporary_files"
             android:title="@string/storage_temporary_files"
diff --git a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java
index 80d1ce0..91e65b1 100644
--- a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java
@@ -67,7 +67,7 @@
         initLaunchPreference();
 
         final View view = super.onCreateView(inflater, container, savedInstanceState);
-        removePreference(KEY_USE_SERVICE_PREFERENCE);
+        removePreference(getUseServicePreferenceKey());
         return view;
     }
 
diff --git a/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragment.java
index ccba9e7f..24aae3f 100644
--- a/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragment.java
@@ -33,6 +33,8 @@
 import android.view.View;
 import android.view.ViewGroup;
 
+import androidx.annotation.VisibleForTesting;
+
 import com.android.settings.R;
 import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -52,7 +54,10 @@
     private static final String TAG = "ToggleColorInversionPreferenceFragment";
     private static final String ENABLED = Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED;
 
-    private static final String KEY_SHORTCUT_PREFERENCE = "color_inversion_shortcut_key";
+    @VisibleForTesting
+    static final String KEY_SHORTCUT_PREFERENCE = "color_inversion_shortcut_key";
+    @VisibleForTesting
+    static final String KEY_SWITCH_PREFERENCE = "color_inversion_switch_preference_key";
 
     @Override
     protected void registerKeysToObserverCallback(
@@ -73,9 +78,9 @@
         mHtmlDescription = getText(R.string.accessibility_display_inversion_preference_subtitle);
         mTopIntroTitle = getText(R.string.accessibility_display_inversion_preference_intro_text);
         mImageUri = new Uri.Builder().scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
-            .authority(getPrefContext().getPackageName())
-            .appendPath(String.valueOf(R.raw.a11y_color_inversion_banner))
-            .build();
+                .authority(getPrefContext().getPackageName())
+                .appendPath(String.valueOf(R.raw.a11y_color_inversion_banner))
+                .build();
         final View view = super.onCreateView(inflater, container, savedInstanceState);
         updateFooterPreference();
         return view;
@@ -132,6 +137,11 @@
     }
 
     @Override
+    protected String getUseServicePreferenceKey() {
+        return KEY_SWITCH_PREFERENCE;
+    }
+
+    @Override
     protected CharSequence getShortcutTitle() {
         return getText(R.string.accessibility_display_inversion_shortcut_title);
     }
@@ -165,7 +175,7 @@
     @Override
     int getUserShortcutTypes() {
         return AccessibilityUtil.getUserShortcutTypesFromSettings(getPrefContext(),
-            mComponentName);
+                mComponentName);
     }
 
     @Override
@@ -176,8 +186,8 @@
     @Override
     CharSequence getTileTooltipContent(@QuickSettingsTooltipType int type) {
         return getText(type == QuickSettingsTooltipType.GUIDE_TO_EDIT
-            ? R.string.accessibility_color_inversion_qs_tooltip_content
-            : R.string.accessibility_color_inversion_auto_added_qs_tooltip_content);
+                ? R.string.accessibility_color_inversion_qs_tooltip_content
+                : R.string.accessibility_color_inversion_auto_added_qs_tooltip_content);
     }
 
     @Override
@@ -194,12 +204,22 @@
                 @Override
                 public List<SearchIndexableRaw> getRawDataToIndex(Context context,
                         boolean enabled) {
-                    final List<SearchIndexableRaw> rawData = new ArrayList<>();
+                    final List<SearchIndexableRaw> rawData =
+                            super.getRawDataToIndex(context, enabled);
+
                     SearchIndexableRaw raw = new SearchIndexableRaw(context);
                     raw.key = KEY_SHORTCUT_PREFERENCE;
                     raw.title = context.getString(
-                        R.string.accessibility_display_inversion_shortcut_title);
+                            R.string.accessibility_display_inversion_shortcut_title);
                     rawData.add(raw);
+
+                    if (Flags.fixA11ySettingsSearch()) {
+                        SearchIndexableRaw mainPreferenceRaw = new SearchIndexableRaw(context);
+                        mainPreferenceRaw.key = KEY_SWITCH_PREFERENCE;
+                        mainPreferenceRaw.title = context.getString(
+                                R.string.accessibility_display_inversion_switch_title);
+                        rawData.add(mainPreferenceRaw);
+                    }
                     return rawData;
                 }
             };
diff --git a/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java
index 86ddd71..747efaa 100644
--- a/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java
@@ -25,6 +25,7 @@
 
 import android.app.settings.SettingsEnums;
 import android.content.ComponentName;
+import android.content.Context;
 import android.os.Bundle;
 import android.provider.Settings;
 import android.view.LayoutInflater;
@@ -38,6 +39,7 @@
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.widget.SettingsMainSwitchPreference;
 import com.android.settingslib.search.SearchIndexable;
+import com.android.settingslib.search.SearchIndexableRaw;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -53,6 +55,11 @@
     private static final String KEY_PROTANOMALY = "daltonizer_mode_protanomaly";
     private static final String KEY_TRITANOMEALY = "daltonizer_mode_tritanomaly";
     private static final String KEY_GRAYSCALE = "daltonizer_mode_grayscale";
+
+    @VisibleForTesting
+    static final String KEY_SHORTCUT_PREFERENCE = "daltonizer_shortcut_key";
+    @VisibleForTesting
+    static final String KEY_SWITCH_PREFERENCE = "daltonizer_switch_preference_key";
     @VisibleForTesting
     static final String KEY_SATURATION = "daltonizer_saturation";
 
@@ -106,7 +113,7 @@
         final List<String> lists = new ArrayList<>();
         lists.add(KEY_TOP_INTRO_PREFERENCE);
         lists.add(KEY_PREVIEW);
-        lists.add(KEY_USE_SERVICE_PREFERENCE);
+        lists.add(getUseServicePreferenceKey());
         // Putting saturation level close to the preview so users can see what is changing.
         lists.add(KEY_SATURATION);
         lists.add(KEY_DEUTERANOMALY);
@@ -171,6 +178,11 @@
     }
 
     @Override
+    protected String getUseServicePreferenceKey() {
+        return KEY_SWITCH_PREFERENCE;
+    }
+
+    @Override
     protected CharSequence getShortcutTitle() {
         return getText(R.string.accessibility_daltonizer_shortcut_title);
     }
@@ -203,5 +215,27 @@
     }
 
     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-            new BaseSearchIndexProvider(R.xml.accessibility_daltonizer_settings);
+            new BaseSearchIndexProvider(R.xml.accessibility_daltonizer_settings) {
+                @Override
+                public List<SearchIndexableRaw> getRawDataToIndex(Context context,
+                        boolean enabled) {
+                    final List<SearchIndexableRaw> rawData =
+                            super.getRawDataToIndex(context, enabled);
+
+                    if (Flags.fixA11ySettingsSearch()) {
+                        SearchIndexableRaw shortcutRaw = new SearchIndexableRaw(context);
+                        shortcutRaw.key = KEY_SHORTCUT_PREFERENCE;
+                        shortcutRaw.title = context.getString(
+                                R.string.accessibility_daltonizer_shortcut_title);
+                        rawData.add(shortcutRaw);
+
+                        SearchIndexableRaw mainSwitchRaw = new SearchIndexableRaw(context);
+                        mainSwitchRaw.key = KEY_SWITCH_PREFERENCE;
+                        mainSwitchRaw.title = context.getString(
+                                R.string.accessibility_daltonizer_primary_switch_title);
+                        rawData.add(mainSwitchRaw);
+                    }
+                    return rawData;
+                }
+            };
 }
diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
index 6649cf4..a9f422e 100644
--- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
@@ -83,7 +83,6 @@
     public static final String KEY_GENERAL_CATEGORY = "general_categories";
     public static final String KEY_SHORTCUT_PREFERENCE = "shortcut_preference";
     protected static final String KEY_TOP_INTRO_PREFERENCE = "top_intro";
-    protected static final String KEY_USE_SERVICE_PREFERENCE = "use_service";
     protected static final String KEY_HTML_DESCRIPTION_PREFERENCE = "html_description";
     protected static final String KEY_SAVED_QS_TOOLTIP_RESHOW = "qs_tooltip_reshow";
     protected static final String KEY_SAVED_QS_TOOLTIP_TYPE = "qs_tooltip_type";
@@ -325,6 +324,10 @@
         switchPreference.setTitle(title);
     }
 
+    protected String getUseServicePreferenceKey() {
+        return "use_service";
+    }
+
     protected CharSequence getShortcutTitle() {
         return getString(R.string.accessibility_shortcut_title, mPackageName);
     }
@@ -411,7 +414,7 @@
         final List<String> lists = new ArrayList<>();
         lists.add(KEY_TOP_INTRO_PREFERENCE);
         lists.add(KEY_ANIMATED_IMAGE);
-        lists.add(KEY_USE_SERVICE_PREFERENCE);
+        lists.add(getUseServicePreferenceKey());
         lists.add(KEY_GENERAL_CATEGORY);
         lists.add(KEY_HTML_DESCRIPTION_PREFERENCE);
         return lists;
@@ -476,7 +479,7 @@
 
     private void initToggleServiceSwitchPreference() {
         mToggleServiceSwitchPreference = new SettingsMainSwitchPreference(getPrefContext());
-        mToggleServiceSwitchPreference.setKey(KEY_USE_SERVICE_PREFERENCE);
+        mToggleServiceSwitchPreference.setKey(getUseServicePreferenceKey());
         if (getArguments().containsKey(AccessibilitySettings.EXTRA_CHECKED)) {
             final boolean enabled = getArguments().getBoolean(AccessibilitySettings.EXTRA_CHECKED);
             mToggleServiceSwitchPreference.setChecked(enabled);
diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
index bc14288..ee49450 100644
--- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
@@ -54,7 +54,6 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceCategory;
 import androidx.preference.SwitchPreferenceCompat;
-import androidx.preference.TwoStatePreference;
 
 import com.android.internal.accessibility.common.ShortcutConstants;
 import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
@@ -64,7 +63,11 @@
 import com.android.settings.R;
 import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType;
 import com.android.settings.accessibility.shortcuts.EditShortcutsPreferenceFragment;
+import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.search.Indexable;
+import com.android.settingslib.search.SearchIndexable;
+import com.android.settingslib.search.SearchIndexableRaw;
 import com.android.settingslib.widget.IllustrationPreference;
 
 import com.google.android.setupcompat.util.WizardManagerHelper;
@@ -73,16 +76,20 @@
 import java.util.List;
 import java.util.Set;
 import java.util.StringJoiner;
+import java.util.stream.Stream;
 
 /**
  * Fragment that shows the actual UI for providing basic magnification accessibility service setup
  * and does not have toggle bar to turn on service to use.
  */
+@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
 public class ToggleScreenMagnificationPreferenceFragment extends
         ToggleFeaturePreferenceFragment implements
         MagnificationModePreferenceController.DialogHelper {
 
     private static final String TAG = "ToggleScreenMagnificationPreferenceFragment";
+    @VisibleForTesting
+    static final String KEY_MAGNIFICATION_SHORTCUT_PREFERENCE = "magnification_shortcut_preference";
     private static final char COMPONENT_NAME_SEPARATOR = ':';
     private static final TextUtils.SimpleStringSplitter sStringColonSplitter =
             new TextUtils.SimpleStringSplitter(COMPONENT_NAME_SEPARATOR);
@@ -181,38 +188,29 @@
         }
     }
 
+    private static boolean isWindowMagnificationSupported(Context context) {
+        return context.getResources().getBoolean(
+                com.android.internal.R.bool.config_magnification_area)
+                && context.getPackageManager().hasSystemFeature(
+                PackageManager.FEATURE_WINDOW_MAGNIFICATION);
+    }
+
     @Override
     protected void initSettingsPreference() {
         // If the device doesn't support window magnification feature, it should hide the
         // settings preference.
-        final boolean supportWindowMagnification =
-                getContext().getResources().getBoolean(
-                        com.android.internal.R.bool.config_magnification_area)
-                        && getContext().getPackageManager().hasSystemFeature(
-                        PackageManager.FEATURE_WINDOW_MAGNIFICATION);
-        if (!supportWindowMagnification) {
+        if (!isWindowMagnificationSupported(getContext())) {
             return;
         }
-        mSettingsPreference = new Preference(getPrefContext());
-        mSettingsPreference.setTitle(R.string.accessibility_magnification_mode_title);
-        mSettingsPreference.setKey(MagnificationModePreferenceController.PREF_KEY);
-        mSettingsPreference.setPersistent(false);
 
         final PreferenceCategory generalCategory = findPreference(KEY_GENERAL_CATEGORY);
-        generalCategory.addPreference(mSettingsPreference);
-
-        final MagnificationModePreferenceController magnificationModePreferenceController =
-                new MagnificationModePreferenceController(getContext(),
-                        MagnificationModePreferenceController.PREF_KEY);
-        magnificationModePreferenceController.setDialogHelper(this);
-        getSettingsLifecycle().addObserver(magnificationModePreferenceController);
-        magnificationModePreferenceController.displayPreference(getPreferenceScreen());
-        addPreferenceController(magnificationModePreferenceController);
-
+        // LINT.IfChange(:preference_list)
+        addMagnificationModeSetting(generalCategory);
         addFollowTypingSetting(generalCategory);
         addOneFingerPanningSetting(generalCategory);
         addAlwaysOnSetting(generalCategory);
         addJoystickSetting(generalCategory);
+        // LINT.ThenChange(:search_data)
     }
 
     @Override
@@ -233,22 +231,44 @@
                 && !Flags.enableMagnificationOneFingerPanningGesture()) {
             String summary = MessageFormat.format(
                     context.getString(R.string.accessibility_screen_magnification_summary),
-                            new Object[]{1, 2, 3, 4, 5});
+                    new Object[]{1, 2, 3, 4, 5});
             arguments.putCharSequence(AccessibilitySettings.EXTRA_HTML_DESCRIPTION, summary);
         }
 
         super.onProcessArguments(arguments);
     }
 
+    private static Preference createMagnificationModePreference(Context context) {
+        final Preference pref = new Preference(context);
+        pref.setTitle(R.string.accessibility_magnification_mode_title);
+        pref.setKey(MagnificationModePreferenceController.PREF_KEY);
+        pref.setPersistent(false);
+        return pref;
+    }
+
+    private void addMagnificationModeSetting(PreferenceCategory generalCategory) {
+        mSettingsPreference = createMagnificationModePreference(getPrefContext());
+        generalCategory.addPreference(mSettingsPreference);
+
+        final MagnificationModePreferenceController magnificationModePreferenceController =
+                new MagnificationModePreferenceController(getContext(),
+                        MagnificationModePreferenceController.PREF_KEY);
+        magnificationModePreferenceController.setDialogHelper(this);
+        getSettingsLifecycle().addObserver(magnificationModePreferenceController);
+        magnificationModePreferenceController.displayPreference(getPreferenceScreen());
+        addPreferenceController(magnificationModePreferenceController);
+    }
+
+    private static Preference createFollowTypingPreference(Context context) {
+        final Preference pref = new SwitchPreferenceCompat(context);
+        pref.setTitle(R.string.accessibility_screen_magnification_follow_typing_title);
+        pref.setSummary(R.string.accessibility_screen_magnification_follow_typing_summary);
+        pref.setKey(MagnificationFollowTypingPreferenceController.PREF_KEY);
+        return pref;
+    }
+
     private void addFollowTypingSetting(PreferenceCategory generalCategory) {
-        var followingTypingSwitchPreference = new SwitchPreferenceCompat(getPrefContext());
-        followingTypingSwitchPreference.setTitle(
-                R.string.accessibility_screen_magnification_follow_typing_title);
-        followingTypingSwitchPreference.setSummary(
-                R.string.accessibility_screen_magnification_follow_typing_summary);
-        followingTypingSwitchPreference.setKey(
-                MagnificationFollowTypingPreferenceController.PREF_KEY);
-        generalCategory.addPreference(followingTypingSwitchPreference);
+        generalCategory.addPreference(createFollowTypingPreference(getPrefContext()));
 
         var followTypingPreferenceController = new MagnificationFollowTypingPreferenceController(
                 getContext(), MagnificationFollowTypingPreferenceController.PREF_KEY);
@@ -257,8 +277,8 @@
         addPreferenceController(followTypingPreferenceController);
     }
 
-    private boolean isAlwaysOnSettingEnabled() {
-        final boolean defaultValue = getContext().getResources().getBoolean(
+    private static boolean isAlwaysOnSupported(Context context) {
+        final boolean defaultValue = context.getResources().getBoolean(
                 com.android.internal.R.bool.config_magnification_always_on_enabled);
 
         return DeviceConfig.getBoolean(
@@ -268,19 +288,21 @@
         );
     }
 
+    private static Preference createAlwaysOnPreference(Context context) {
+        final Preference pref = new SwitchPreferenceCompat(context);
+        pref.setTitle(R.string.accessibility_screen_magnification_always_on_title);
+        pref.setSummary(R.string.accessibility_screen_magnification_always_on_summary);
+        pref.setKey(MagnificationAlwaysOnPreferenceController.PREF_KEY);
+        return pref;
+    }
+
     private void addAlwaysOnSetting(PreferenceCategory generalCategory) {
-        if (!isAlwaysOnSettingEnabled()) {
+        if (!isAlwaysOnSupported(getContext())) {
             return;
         }
 
-        var alwaysOnPreference = new SwitchPreferenceCompat(getPrefContext());
-        alwaysOnPreference.setTitle(
-                R.string.accessibility_screen_magnification_always_on_title);
-        alwaysOnPreference.setSummary(
-                R.string.accessibility_screen_magnification_always_on_summary);
-        alwaysOnPreference.setKey(
-                MagnificationAlwaysOnPreferenceController.PREF_KEY);
-        generalCategory.addPreference(alwaysOnPreference);
+        final Preference pref = createAlwaysOnPreference(getPrefContext());
+        generalCategory.addPreference(pref);
 
         var alwaysOnPreferenceController = new MagnificationAlwaysOnPreferenceController(
                 getContext(), MagnificationAlwaysOnPreferenceController.PREF_KEY);
@@ -290,17 +312,24 @@
         addPreferenceController(alwaysOnPreferenceController);
     }
 
+    private static Preference createOneFingerPanningPreference(Context context) {
+        final Preference pref = new SwitchPreferenceCompat(context);
+        pref.setTitle(R.string.accessibility_magnification_one_finger_panning_title);
+        pref.setKey(MagnificationOneFingerPanningPreferenceController.PREF_KEY);
+        return pref;
+    }
+
+    private static boolean isOneFingerPanningSupported() {
+        return Flags.enableMagnificationOneFingerPanningGesture();
+    }
+
     private void addOneFingerPanningSetting(PreferenceCategory generalCategory) {
-        if (!Flags.enableMagnificationOneFingerPanningGesture()) {
+        if (!isOneFingerPanningSupported()) {
             return;
         }
 
-        var oneFingerPanningPreference = new SwitchPreferenceCompat(getPrefContext());
-        oneFingerPanningPreference.setTitle(
-                R.string.accessibility_magnification_one_finger_panning_title);
-        oneFingerPanningPreference.setKey(
-                MagnificationOneFingerPanningPreferenceController.PREF_KEY);
-        generalCategory.addPreference(oneFingerPanningPreference);
+        final Preference pref = createOneFingerPanningPreference(getPrefContext());
+        generalCategory.addPreference(pref);
 
         mOneFingerPanningPreferenceController =
                 new MagnificationOneFingerPanningPreferenceController(getContext());
@@ -310,23 +339,28 @@
         addPreferenceController(mOneFingerPanningPreferenceController);
     }
 
-    private void addJoystickSetting(PreferenceCategory generalCategory) {
-        if (!DeviceConfig.getBoolean(
+    private static Preference createJoystickPreference(Context context) {
+        final Preference pref = new SwitchPreferenceCompat(context);
+        pref.setTitle(R.string.accessibility_screen_magnification_joystick_title);
+        pref.setSummary(R.string.accessibility_screen_magnification_joystick_summary);
+        pref.setKey(MagnificationJoystickPreferenceController.PREF_KEY);
+        return pref;
+    }
+
+    private static boolean isJoystickSupported() {
+        return DeviceConfig.getBoolean(
                 DeviceConfig.NAMESPACE_WINDOW_MANAGER,
                 "MagnificationJoystick__enable_magnification_joystick",
-                false
-        )) {
+                false);
+    }
+
+    private void addJoystickSetting(PreferenceCategory generalCategory) {
+        if (!isJoystickSupported()) {
             return;
         }
 
-        TwoStatePreference joystickPreference = new SwitchPreferenceCompat(getPrefContext());
-        joystickPreference.setTitle(
-                R.string.accessibility_screen_magnification_joystick_title);
-        joystickPreference.setSummary(
-                R.string.accessibility_screen_magnification_joystick_summary);
-        joystickPreference.setKey(
-                MagnificationJoystickPreferenceController.PREF_KEY);
-        generalCategory.addPreference(joystickPreference);
+        final Preference pref = createJoystickPreference(getPrefContext());
+        generalCategory.addPreference(pref);
 
         MagnificationJoystickPreferenceController joystickPreferenceController =
                 new MagnificationJoystickPreferenceController(
@@ -354,9 +388,9 @@
         super.registerKeysToObserverCallback(contentObserver);
 
         var keysToObserve = List.of(
-            Settings.Secure.ACCESSIBILITY_MAGNIFICATION_FOLLOW_TYPING_ENABLED,
-            Settings.Secure.ACCESSIBILITY_MAGNIFICATION_ALWAYS_ON_ENABLED,
-            Settings.Secure.ACCESSIBILITY_MAGNIFICATION_JOYSTICK_ENABLED
+                Settings.Secure.ACCESSIBILITY_MAGNIFICATION_FOLLOW_TYPING_ENABLED,
+                Settings.Secure.ACCESSIBILITY_MAGNIFICATION_ALWAYS_ON_ENABLED,
+                Settings.Secure.ACCESSIBILITY_MAGNIFICATION_JOYSTICK_ENABLED
         );
         contentObserver.registerKeysToObserverCallback(keysToObserve,
                 key -> updatePreferencesState());
@@ -409,7 +443,7 @@
 
         return getShortcutSummaryList(context,
                 PreferredShortcuts.retrieveUserShortcutType(context,
-                MAGNIFICATION_CONTROLLER_NAME));
+                        MAGNIFICATION_CONTROLLER_NAME));
     }
 
     @Override
@@ -518,6 +552,11 @@
     }
 
     @Override
+    protected String getShortcutPreferenceKey() {
+        return KEY_MAGNIFICATION_SHORTCUT_PREFERENCE;
+    }
+
+    @Override
     protected CharSequence getShortcutTitle() {
         return getText(R.string.accessibility_screen_magnification_shortcut_title);
     }
@@ -777,8 +816,8 @@
         final int userShortcutType = getUserShortcutTypeFromSettings(context);
         final CharSequence featureState =
                 (userShortcutType != DEFAULT)
-                ? context.getText(R.string.accessibility_summary_shortcut_enabled)
-                : context.getText(R.string.generic_accessibility_feature_shortcut_off);
+                        ? context.getText(R.string.accessibility_summary_shortcut_enabled)
+                        : context.getText(R.string.generic_accessibility_feature_shortcut_off);
         final CharSequence featureSummary = context.getText(R.string.magnification_feature_summary);
         return context.getString(
                 com.android.settingslib.R.string.preference_summary_default_combination,
@@ -790,4 +829,81 @@
         return PreferredShortcuts.retrieveUserShortcutType(
                 getPrefContext(), MAGNIFICATION_CONTROLLER_NAME);
     }
+
+    public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+            new BaseSearchIndexProvider() {
+                // LINT.IfChange(:search_data)
+                @Override
+                public List<SearchIndexableRaw> getRawDataToIndex(Context context,
+                        boolean enabled) {
+                    final List<SearchIndexableRaw> rawData =
+                            super.getRawDataToIndex(context, enabled);
+
+                    if (!com.android.settings.accessibility.Flags.fixA11ySettingsSearch()) {
+                        return rawData;
+                    }
+
+                    rawData.add(createShortcutPreferenceSearchData(context));
+                    Stream.of(
+                                    createMagnificationModePreference(context),
+                                    createFollowTypingPreference(context),
+                                    createOneFingerPanningPreference(context),
+                                    createAlwaysOnPreference(context),
+                                    createJoystickPreference(context)
+                            )
+                            .forEach(pref ->
+                                    rawData.add(createPreferenceSearchData(context, pref)));
+                    return rawData;
+                }
+
+                @Override
+                public List<String> getNonIndexableKeys(Context context) {
+                    final List<String> niks = super.getNonIndexableKeys(context);
+
+                    if (!com.android.settings.accessibility.Flags.fixA11ySettingsSearch()) {
+                        return niks;
+                    }
+
+                    if (!isWindowMagnificationSupported(context)) {
+                        niks.add(MagnificationModePreferenceController.PREF_KEY);
+                        niks.add(MagnificationFollowTypingPreferenceController.PREF_KEY);
+                        niks.add(MagnificationOneFingerPanningPreferenceController.PREF_KEY);
+                        niks.add(MagnificationAlwaysOnPreferenceController.PREF_KEY);
+                        niks.add(MagnificationJoystickPreferenceController.PREF_KEY);
+                    } else {
+                        if (!isAlwaysOnSupported(context)
+                                // This preference's title "Keep on while switching apps" does not
+                                // mention magnification so it may confuse users who search a term
+                                // like "Keep on".
+                                // So we hide it if the user has no magnification shortcut enabled.
+                                || getUserShortcutTypeFromSettings(context) == DEFAULT) {
+                            niks.add(MagnificationAlwaysOnPreferenceController.PREF_KEY);
+                        }
+                        if (!isOneFingerPanningSupported()) {
+                            niks.add(MagnificationOneFingerPanningPreferenceController.PREF_KEY);
+                        }
+                        if (!isJoystickSupported()) {
+                            niks.add(MagnificationJoystickPreferenceController.PREF_KEY);
+                        }
+                    }
+                    return niks;
+                }
+                // LINT.ThenChange(:preference_list)
+
+                private SearchIndexableRaw createPreferenceSearchData(
+                        Context context, Preference pref) {
+                    final SearchIndexableRaw raw = new SearchIndexableRaw(context);
+                    raw.key = pref.getKey();
+                    raw.title = pref.getTitle().toString();
+                    return raw;
+                }
+
+                private SearchIndexableRaw createShortcutPreferenceSearchData(Context context) {
+                    final SearchIndexableRaw raw = new SearchIndexableRaw(context);
+                    raw.key = KEY_MAGNIFICATION_SHORTCUT_PREFERENCE;
+                    raw.title = context.getString(
+                            R.string.accessibility_screen_magnification_shortcut_title);
+                    return raw;
+                }
+            };
 }
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBluetoothDeviceUpdater.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBluetoothDeviceUpdater.java
index 60a8a13..6fd6f18 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBluetoothDeviceUpdater.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBluetoothDeviceUpdater.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.connecteddevice.audiosharing;
 
-import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.util.Log;
 
@@ -30,6 +29,7 @@
 import com.android.settingslib.bluetooth.BluetoothUtils;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.utils.ThreadUtils;
 
 public class AudioSharingBluetoothDeviceUpdater extends BluetoothDeviceUpdater
         implements Preference.OnPreferenceClickListener {
@@ -73,7 +73,9 @@
     @Override
     public boolean onPreferenceClick(Preference preference) {
         mMetricsFeatureProvider.logClickedPreference(preference, mMetricsCategory);
-        mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_AUDIO_SHARING_DEVICE_CLICK);
+        var unused =
+                ThreadUtils.postOnBackgroundThread(
+                        () -> mDevicePreferenceCallback.onDeviceClick(preference));
         return true;
     }
 
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingCallAudioPreferenceController.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingCallAudioPreferenceController.java
index 168fce5..468ac3d 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingCallAudioPreferenceController.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingCallAudioPreferenceController.java
@@ -31,6 +31,7 @@
 import android.os.Looper;
 import android.provider.Settings;
 import android.util.Log;
+import android.util.Pair;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -195,40 +196,33 @@
                         }
                         updateDeviceItemsInSharingSession();
                         if (!mDeviceItemsInSharingSession.isEmpty()) {
-                            int checkedItemIndex = getActiveItemIndex(mDeviceItemsInSharingSession);
+                            Pair<Integer, AudioSharingDeviceItem> pair = getActiveItemWithIndex();
                             AudioSharingCallAudioDialogFragment.show(
                                     mFragment,
                                     mDeviceItemsInSharingSession,
-                                    checkedItemIndex,
+                                    pair == null ? -1 : pair.first,
                                     (AudioSharingDeviceItem item) -> {
                                         int currentGroupId =
                                                 BluetoothUtils.getPrimaryGroupIdForBroadcast(
                                                         mContext.getContentResolver());
-                                        if (item.getGroupId() == currentGroupId) {
-                                            Log.d(
-                                                    TAG,
-                                                    "Skip set fallback active device: unchanged");
+                                        int clickedGroupId = item.getGroupId();
+                                        if (clickedGroupId == currentGroupId) {
+                                            Log.d(TAG, "Skip set call audio device: unchanged");
                                             return;
                                         }
                                         List<BluetoothDevice> devices =
                                                 mGroupedConnectedDevices.getOrDefault(
-                                                        item.getGroupId(), ImmutableList.of());
+                                                        clickedGroupId, ImmutableList.of());
                                         CachedBluetoothDevice lead =
                                                 AudioSharingUtils.getLeadDevice(
                                                         mCacheManager, devices);
                                         if (lead != null) {
-                                            Log.d(
-                                                    TAG,
-                                                    "Set fallback active device: "
-                                                            + lead.getDevice()
-                                                                    .getAnonymizedAddress());
+                                            String addr = lead.getDevice().getAnonymizedAddress();
+                                            Log.d(TAG, "Set call audio device: " + addr);
                                             lead.setActive();
                                             logCallAudioDeviceChange(currentGroupId, lead);
                                         } else {
-                                            Log.d(
-                                                    TAG,
-                                                    "Fail to set fallback active device: no"
-                                                            + " lead device");
+                                            Log.d(TAG, "Skip set call audio device: no lead");
                                         }
                                     });
                         }
@@ -263,6 +257,18 @@
         }
     }
 
+    @Override
+    public void onActiveDeviceChanged(@Nullable CachedBluetoothDevice activeDevice,
+            int bluetoothProfile) {
+        if (activeDevice != null && bluetoothProfile == BluetoothProfile.LE_AUDIO
+                && BluetoothUtils.isBroadcasting(mBtManager)) {
+            Log.d(TAG, "onActiveDeviceChanged: update summary, device = "
+                    + activeDevice.getDevice().getAnonymizedAddress()
+                    + ", profile = " + bluetoothProfile);
+            updateSummary();
+        }
+    }
+
     /**
      * Initialize the controller.
      *
@@ -348,30 +354,22 @@
      */
     private void updateSummary() {
         updateDeviceItemsInSharingSession();
-        int fallbackActiveGroupId =
-                BluetoothUtils.getPrimaryGroupIdForBroadcast(mContext.getContentResolver());
-        if (fallbackActiveGroupId != BluetoothCsipSetCoordinator.GROUP_ID_INVALID) {
-            for (AudioSharingDeviceItem item : mDeviceItemsInSharingSession) {
-                if (item.getGroupId() == fallbackActiveGroupId) {
-                    Log.d(
-                            TAG,
-                            "updatePreference: set summary to fallback group "
-                                    + fallbackActiveGroupId);
-                    AudioSharingUtils.postOnMainThread(
-                            mContext,
-                            () -> {
-                                if (mPreference != null) {
-                                    mPreference.setSummary(
-                                            mContext.getString(
-                                                    R.string.audio_sharing_call_audio_description,
-                                                    item.getName()));
-                                }
-                            });
-                    return;
-                }
-            }
+        Pair<Integer, AudioSharingDeviceItem> pair = getActiveItemWithIndex();
+        if (pair != null) {
+            Log.d(TAG, "updateSummary, group = " + pair.second.getGroupId());
+            AudioSharingUtils.postOnMainThread(
+                    mContext,
+                    () -> {
+                        if (mPreference != null) {
+                            mPreference.setSummary(
+                                    mContext.getString(
+                                            R.string.audio_sharing_call_audio_description,
+                                            pair.second.getName()));
+                        }
+                    });
+            return;
         }
-        Log.d(TAG, "updatePreference: set empty summary");
+        Log.d(TAG, "updateSummary: set empty");
         AudioSharingUtils.postOnMainThread(
                 mContext,
                 () -> {
@@ -388,16 +386,26 @@
                         mBtManager, mGroupedConnectedDevices, /* filterByInSharing= */ true);
     }
 
-    private int getActiveItemIndex(List<AudioSharingDeviceItem> deviceItems) {
-        int checkedItemIndex = -1;
+    @Nullable
+    private Pair<Integer, AudioSharingDeviceItem> getActiveItemWithIndex() {
+        List<AudioSharingDeviceItem> deviceItems = new ArrayList<>(mDeviceItemsInSharingSession);
         int fallbackActiveGroupId =
                 BluetoothUtils.getPrimaryGroupIdForBroadcast(mContext.getContentResolver());
-        for (AudioSharingDeviceItem item : deviceItems) {
-            if (item.getGroupId() == fallbackActiveGroupId) {
-                return deviceItems.indexOf(item);
+        if (fallbackActiveGroupId != BluetoothCsipSetCoordinator.GROUP_ID_INVALID) {
+            for (AudioSharingDeviceItem item : deviceItems) {
+                if (item.getGroupId() == fallbackActiveGroupId) {
+                    Log.d(TAG, "getActiveItemWithIndex, fallback group = " + item.getGroupId());
+                    return new Pair<>(deviceItems.indexOf(item), item);
+                }
             }
         }
-        return checkedItemIndex;
+        for (AudioSharingDeviceItem item : deviceItems) {
+            if (item.isActive()) {
+                Log.d(TAG, "getActiveItemWithIndex, active LEA group = " + item.getGroupId());
+                return new Pair<>(deviceItems.indexOf(item), item);
+            }
+        }
+        return null;
     }
 
     @VisibleForTesting
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceItem.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceItem.java
index 5998e30..ca62dc3 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceItem.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceItem.java
@@ -19,6 +19,8 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import androidx.annotation.NonNull;
+
 public final class AudioSharingDeviceItem implements Parcelable {
     private final String mName;
     private final int mGroupId;
@@ -72,4 +74,10 @@
                     return new AudioSharingDeviceItem[size];
                 }
             };
+
+    @Override
+    @NonNull
+    public String toString() {
+        return "AudioSharingDeviceItem groupId = " + mGroupId + ", isActive = " + mIsActive;
+    }
 }
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceController.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceController.java
index 8b4c7f2..db2c7b2 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceController.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceController.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.connecteddevice.audiosharing;
 
+import static com.android.settingslib.Utils.isAudioModeOngoingCall;
 import static com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast.EXTRA_BLUETOOTH_DEVICE;
 
 import android.app.settings.SettingsEnums;
@@ -39,7 +40,9 @@
 import androidx.preference.PreferenceGroup;
 import androidx.preference.PreferenceScreen;
 
+import com.android.settings.R;
 import com.android.settings.SettingsActivity;
+import com.android.settings.bluetooth.BluetoothDevicePreference;
 import com.android.settings.bluetooth.BluetoothDeviceUpdater;
 import com.android.settings.bluetooth.Utils;
 import com.android.settings.connecteddevice.DevicePreferenceCallback;
@@ -91,6 +94,7 @@
     @Nullable private DashboardFragment mFragment;
     @Nullable private AudioSharingDialogHandler mDialogHandler;
     private AtomicBoolean mIntentHandled = new AtomicBoolean(false);
+    private AtomicBoolean mIsAudioModeOngoingCall = new AtomicBoolean(false);
 
     @VisibleForTesting
     BluetoothLeBroadcastAssistant.Callback mBroadcastAssistantCallback =
@@ -201,51 +205,57 @@
 
     @Override
     public void onStart(@NonNull LifecycleOwner owner) {
-        if (!isAvailable()) {
-            Log.d(TAG, "Skip onStart(), feature is not supported.");
-            return;
-        }
-        if (!AudioSharingUtils.isAudioSharingProfileReady(mProfileManager)
-                && mProfileManager != null) {
-            Log.d(TAG, "Register profile service listener");
-            mProfileManager.addServiceListener(this);
-        }
-        if (mEventManager == null
-                || mAssistant == null
-                || mDialogHandler == null
-                || mBluetoothDeviceUpdater == null) {
-            Log.d(TAG, "Skip onStart(), profile is not ready.");
-            return;
-        }
-        Log.d(TAG, "onStart() Register callbacks.");
-        mEventManager.registerCallback(this);
-        mAssistant.registerServiceCallBack(mExecutor, mBroadcastAssistantCallback);
-        mDialogHandler.registerCallbacks(mExecutor);
-        mBluetoothDeviceUpdater.registerCallback();
-        mBluetoothDeviceUpdater.refreshPreference();
+        var unused = ThreadUtils.postOnBackgroundThread(() -> {
+            if (!isAvailable()) {
+                Log.d(TAG, "Skip onStart(), feature is not supported.");
+                return;
+            }
+            if (!AudioSharingUtils.isAudioSharingProfileReady(mProfileManager)
+                    && mProfileManager != null) {
+                Log.d(TAG, "Register profile service listener");
+                mProfileManager.addServiceListener(this);
+            }
+            if (mEventManager == null
+                    || mAssistant == null
+                    || mDialogHandler == null
+                    || mBluetoothDeviceUpdater == null) {
+                Log.d(TAG, "Skip onStart(), profile is not ready.");
+                return;
+            }
+            Log.d(TAG, "onStart() Register callbacks.");
+            mEventManager.registerCallback(this);
+            mAssistant.registerServiceCallBack(mExecutor, mBroadcastAssistantCallback);
+            mDialogHandler.registerCallbacks(mExecutor);
+            mBluetoothDeviceUpdater.registerCallback();
+            mBluetoothDeviceUpdater.refreshPreference();
+            mIsAudioModeOngoingCall.set(isAudioModeOngoingCall(mContext));
+            updateTitle();
+        });
     }
 
     @Override
     public void onStop(@NonNull LifecycleOwner owner) {
-        if (!isAvailable()) {
-            Log.d(TAG, "Skip onStop(), feature is not supported.");
-            return;
-        }
-        if (mProfileManager != null) {
-            mProfileManager.removeServiceListener(this);
-        }
-        if (mEventManager == null
-                || mAssistant == null
-                || mDialogHandler == null
-                || mBluetoothDeviceUpdater == null) {
-            Log.d(TAG, "Skip onStop(), profile is not ready.");
-            return;
-        }
-        Log.d(TAG, "onStop() Unregister callbacks.");
-        mEventManager.unregisterCallback(this);
-        mAssistant.unregisterServiceCallBack(mBroadcastAssistantCallback);
-        mDialogHandler.unregisterCallbacks();
-        mBluetoothDeviceUpdater.unregisterCallback();
+        var unused = ThreadUtils.postOnBackgroundThread(() -> {
+            if (!isAvailable()) {
+                Log.d(TAG, "Skip onStop(), feature is not supported.");
+                return;
+            }
+            if (mProfileManager != null) {
+                mProfileManager.removeServiceListener(this);
+            }
+            if (mEventManager == null
+                    || mAssistant == null
+                    || mDialogHandler == null
+                    || mBluetoothDeviceUpdater == null) {
+                Log.d(TAG, "Skip onStop(), profile is not ready.");
+                return;
+            }
+            Log.d(TAG, "onStop() Unregister callbacks.");
+            mEventManager.unregisterCallback(this);
+            mAssistant.unregisterServiceCallBack(mBroadcastAssistantCallback);
+            mDialogHandler.unregisterCallbacks();
+            mBluetoothDeviceUpdater.unregisterCallback();
+        });
     }
 
     @Override
@@ -367,6 +377,25 @@
         handleOnProfileStateChanged(cachedDevice, bluetoothProfile);
     }
 
+    @Override
+    public void onAudioModeChanged() {
+        mIsAudioModeOngoingCall.set(isAudioModeOngoingCall(mContext));
+        updateTitle();
+    }
+
+    @Override
+    public void onDeviceClick(@NonNull Preference preference) {
+        boolean isCallMode = mIsAudioModeOngoingCall.get();
+        if (isCallMode) {
+            Log.d(TAG, "onDeviceClick, set active in call mode");
+            CachedBluetoothDevice cachedDevice =
+                    ((BluetoothDevicePreference) preference).getBluetoothDevice();
+            cachedDevice.setActive();
+        }
+        mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_AUDIO_SHARING_DEVICE_CLICK,
+                isCallMode);
+    }
+
     /**
      * Initialize the controller.
      *
@@ -499,4 +528,22 @@
             mDialogHandler.handleDeviceConnected(cachedDevice, /* userTriggered= */ true);
         }
     }
+
+    private void updateTitle() {
+        if (mPreferenceGroup == null) return;
+        int titleResId;
+        if (mIsAudioModeOngoingCall.get()) {
+            // in phone call
+            titleResId = R.string.connected_device_call_device_title;
+        } else {
+            // without phone call
+            titleResId = R.string.audio_sharing_device_group_title;
+        }
+        AudioSharingUtils.postOnMainThread(mContext,
+                () -> {
+                    if (mPreferenceGroup != null) {
+                        mPreferenceGroup.setTitle(titleResId);
+                    }
+                });
+    }
 }
diff --git a/src/com/android/settings/development/DesktopModePreferenceController.java b/src/com/android/settings/development/DesktopModePreferenceController.java
index f43e17c..492686e 100644
--- a/src/com/android/settings/development/DesktopModePreferenceController.java
+++ b/src/com/android/settings/development/DesktopModePreferenceController.java
@@ -17,14 +17,14 @@
 package com.android.settings.development;
 
 import static android.provider.Settings.Global.DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES;
-import static android.window.flags.DesktopModeFlags.ToggleOverride.fromSetting;
-import static android.window.flags.DesktopModeFlags.ToggleOverride.OVERRIDE_OFF;
-import static android.window.flags.DesktopModeFlags.ToggleOverride.OVERRIDE_ON;
-import static android.window.flags.DesktopModeFlags.ToggleOverride.OVERRIDE_UNSET;
+import static android.window.DesktopModeFlags.ToggleOverride.fromSetting;
+import static android.window.DesktopModeFlags.ToggleOverride.OVERRIDE_OFF;
+import static android.window.DesktopModeFlags.ToggleOverride.OVERRIDE_ON;
+import static android.window.DesktopModeFlags.ToggleOverride.OVERRIDE_UNSET;
 
 import android.content.Context;
 import android.provider.Settings;
-import android.window.flags.DesktopModeFlags.ToggleOverride;
+import android.window.DesktopModeFlags.ToggleOverride;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffData.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffData.java
index b5d5099..fb5a9f3 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffData.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffData.java
@@ -169,6 +169,7 @@
             }
             if (packageName != null && hideBackgroundUsageTimeSet.contains(packageName)) {
                 entry.mBackgroundUsageTimeInMs = 0;
+                entry.mForegroundServiceUsageTimeInMs = 0;
             }
         }
     }
diff --git a/src/com/android/settings/nfc/PaymentSettings.java b/src/com/android/settings/nfc/PaymentSettings.java
index a1f75bc..28df8ed 100644
--- a/src/com/android/settings/nfc/PaymentSettings.java
+++ b/src/com/android/settings/nfc/PaymentSettings.java
@@ -30,6 +30,7 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
+import com.android.internal.hidden_from_bootclasspath.android.permission.flags.Flags;
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -120,6 +121,9 @@
 
                 @Override
                 protected boolean isPageSearchEnabled(Context context) {
+                    if (Flags.walletRoleEnabled()) {
+                        return false;
+                    }
                     final UserManager userManager = context.getSystemService(UserManager.class);
                     final UserInfo myUserInfo = userManager.getUserInfo(UserHandle.myUserId());
                     if (myUserInfo.isGuest()) {
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index 3188240..0881b29 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -1860,6 +1860,10 @@
                         boolean suppressAllPage) {
                     final List<String> niks = super.getNonIndexableKeysFromXml(context, xmlResId,
                             suppressAllPage);
+                    if (TextUtils.isEmpty(context.getString(
+                            com.android.internal.R.string.config_supervisedUserCreationPackage))) {
+                        niks.add(KEY_ADD_SUPERVISED_USER);
+                    }
                     AddUserWhenLockedPreferenceController controller =
                             new AddUserWhenLockedPreferenceController(
                                     context, KEY_ADD_USER_WHEN_LOCKED);
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragmentTest.java
index 1a82a25..e971186 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragmentTest.java
@@ -18,7 +18,8 @@
 
 import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
 import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
-import static com.android.settings.accessibility.ToggleColorInversionPreferenceFragment.KEY_USE_SERVICE_PREFERENCE;
+import static com.android.settings.accessibility.ToggleColorInversionPreferenceFragment.KEY_SHORTCUT_PREFERENCE;
+import static com.android.settings.accessibility.ToggleColorInversionPreferenceFragment.KEY_SWITCH_PREFERENCE;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -32,12 +33,12 @@
 import android.content.Context;
 import android.os.Bundle;
 import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
 import android.platform.test.flag.junit.SetFlagsRule;
 import android.provider.Settings;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.view.accessibility.Flags;
 import android.widget.PopupWindow;
 
 import androidx.fragment.app.FragmentActivity;
@@ -50,6 +51,7 @@
 import com.android.settings.testutils.XmlTestUtils;
 import com.android.settings.testutils.shadow.ShadowFragment;
 import com.android.settings.widget.SettingsMainSwitchPreference;
+import com.android.settingslib.search.SearchIndexableRaw;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -63,6 +65,7 @@
 import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowApplication;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /** Tests for {@link ToggleColorInversionPreferenceFragment} */
@@ -93,10 +96,10 @@
         when(mActivity.getContentResolver()).thenReturn(mContext.getContentResolver());
 
         mScreen = spy(new PreferenceScreen(mContext, /* attrs= */ null));
-        when(mScreen.findPreference(KEY_USE_SERVICE_PREFERENCE))
+        when(mScreen.findPreference(mFragment.getUseServicePreferenceKey()))
                 .thenReturn(mFragment.mToggleServiceSwitchPreference);
         doReturn(mScreen).when(mFragment).getPreferenceScreen();
-        mSwitchPreference = mScreen.findPreference(KEY_USE_SERVICE_PREFERENCE);
+        mSwitchPreference = mScreen.findPreference(mFragment.getUseServicePreferenceKey());
     }
 
     @Test
@@ -137,7 +140,7 @@
     }
 
     @Test
-    @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+    @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
     public void onPreferenceToggled_colorCorrectDisabled_shouldReturnTrueAndShowTooltipView() {
         Settings.Secure.putInt(mContext.getContentResolver(),
                 Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, OFF);
@@ -199,6 +202,41 @@
         assertThat(keys).containsAtLeastElementsIn(niks);
     }
 
+    @Test
+    @DisableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
+    public void getRawDataToIndex_flagOff_returnShortcutIndexablePreferences() {
+        List<SearchIndexableRaw> rawData = ToggleColorInversionPreferenceFragment
+                .SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(mContext, /* enabled= */ true);
+
+        assertThat(rawData).hasSize(1);
+        assertThat(rawData.get(0).key).isEqualTo(KEY_SHORTCUT_PREFERENCE);
+        assertThat(rawData.get(0).title).isEqualTo(mContext.getString(
+                R.string.accessibility_display_inversion_shortcut_title));
+
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
+    public void getRawDataToIndex_flagOn_returnAllIndexablePreferences() {
+        String[] expectedKeys = {KEY_SHORTCUT_PREFERENCE, KEY_SWITCH_PREFERENCE};
+        String[] expectedTitles = {
+                mContext.getString(R.string.accessibility_display_inversion_shortcut_title),
+                mContext.getString(R.string.accessibility_display_inversion_switch_title)};
+        List<String> keysResultList = new ArrayList<>();
+        List<String> titlesResultList = new ArrayList<>();
+        List<SearchIndexableRaw> rawData = ToggleColorInversionPreferenceFragment
+                .SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(mContext, /* enabled= */ true);
+
+        for (SearchIndexableRaw rawDataItem : rawData) {
+            keysResultList.add(rawDataItem.key);
+            titlesResultList.add(rawDataItem.title);
+        }
+
+        assertThat(rawData).hasSize(2);
+        assertThat(keysResultList).containsExactly(expectedKeys);
+        assertThat(titlesResultList).containsExactly(expectedTitles);
+    }
+
     private static PopupWindow getLatestPopupWindow() {
         final ShadowApplication shadowApplication =
                 Shadow.extract(ApplicationProvider.getApplicationContext());
@@ -220,7 +258,7 @@
             mComponentName = PLACEHOLDER_COMPONENT_NAME;
             final SettingsMainSwitchPreference switchPreference =
                     new SettingsMainSwitchPreference(context);
-            switchPreference.setKey(KEY_USE_SERVICE_PREFERENCE);
+            switchPreference.setKey(getUseServicePreferenceKey());
             mToggleServiceSwitchPreference = switchPreference;
             setArguments(new Bundle());
         }
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragmentTest.java
index a5bfec2..a33fefb 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragmentTest.java
@@ -18,7 +18,8 @@
 
 import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
 import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
-import static com.android.settings.accessibility.ToggleDaltonizerPreferenceFragment.KEY_USE_SERVICE_PREFERENCE;
+import static com.android.settings.accessibility.ToggleDaltonizerPreferenceFragment.KEY_SHORTCUT_PREFERENCE;
+import static com.android.settings.accessibility.ToggleDaltonizerPreferenceFragment.KEY_SWITCH_PREFERENCE;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -27,9 +28,9 @@
 import android.content.Intent;
 import android.os.Bundle;
 import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
 import android.platform.test.flag.junit.SetFlagsRule;
 import android.provider.Settings;
-import android.view.accessibility.Flags;
 import android.widget.PopupWindow;
 
 import androidx.fragment.app.Fragment;
@@ -39,6 +40,7 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.testutils.XmlTestUtils;
 import com.android.settings.widget.SettingsMainSwitchPreference;
+import com.android.settingslib.search.SearchIndexableRaw;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -49,6 +51,7 @@
 import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowApplication;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /** Tests for {@link ToggleDaltonizerPreferenceFragment} */
@@ -104,7 +107,7 @@
     }
 
     @Test
-    @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+    @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
     public void onPreferenceToggled_colorCorrectDisabled_shouldReturnTrueAndShowTooltipView() {
         Settings.Secure.putInt(mContext.getContentResolver(),
                 Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, OFF);
@@ -169,6 +172,37 @@
         assertThat(keys).containsAtLeastElementsIn(niks);
     }
 
+    @Test
+    @DisableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
+    public void getRawDataToIndex_flagOff_returnEmptyData() {
+        List<SearchIndexableRaw> rawData = ToggleDaltonizerPreferenceFragment
+                .SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(mContext, /* enabled= */ true);
+
+        assertThat(rawData).isEmpty();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
+    public void getRawDataToIndex_flagOn_returnAllIndexablePreferences() {
+        String[] expectedKeys = {KEY_SHORTCUT_PREFERENCE, KEY_SWITCH_PREFERENCE};
+        String[] expectedTitles = {
+                mContext.getString(R.string.accessibility_daltonizer_shortcut_title),
+                mContext.getString(R.string.accessibility_daltonizer_primary_switch_title)};
+        List<String> keysResultList = new ArrayList<>();
+        List<String> titlesResultList = new ArrayList<>();
+        List<SearchIndexableRaw> rawData = ToggleDaltonizerPreferenceFragment
+                .SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(mContext, /* enabled= */ true);
+
+        for (SearchIndexableRaw rawDataItem : rawData) {
+            keysResultList.add(rawDataItem.key);
+            titlesResultList.add(rawDataItem.title);
+        }
+
+        assertThat(rawData).hasSize(2);
+        assertThat(keysResultList).containsExactly(expectedKeys);
+        assertThat(titlesResultList).containsExactly(expectedTitles);
+    }
+
     private static PopupWindow getLatestPopupWindow() {
         final ShadowApplication shadowApplication =
                 Shadow.extract(ApplicationProvider.getApplicationContext());
@@ -189,6 +223,6 @@
 
     private SettingsMainSwitchPreference getMainFeatureToggle(
             ToggleDaltonizerPreferenceFragment fragment) {
-        return fragment.findPreference(KEY_USE_SERVICE_PREFERENCE);
+        return fragment.findPreference(fragment.getUseServicePreferenceKey());
     }
 }
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
index 71855e0..844fabe 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
@@ -235,8 +235,7 @@
     @Test
     @Config(shadows = ShadowFragment.class)
     public void onPreferenceToggledOnDisabledService_notShowTooltipView() {
-        mFragment.onPreferenceToggled(
-                ToggleFeaturePreferenceFragment.KEY_USE_SERVICE_PREFERENCE, /* enabled= */ false);
+        mFragment.onPreferenceToggled(mFragment.getUseServicePreferenceKey(), /* enabled= */ false);
 
         assertThat(getLatestPopupWindow()).isNull();
     }
@@ -245,8 +244,7 @@
     @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
     @Config(shadows = ShadowFragment.class)
     public void onPreferenceToggledOnEnabledService_showTooltipView() {
-        mFragment.onPreferenceToggled(
-                ToggleFeaturePreferenceFragment.KEY_USE_SERVICE_PREFERENCE, /* enabled= */ true);
+        mFragment.onPreferenceToggled(mFragment.getUseServicePreferenceKey(), /* enabled= */ true);
 
         assertThat(getLatestPopupWindow().isShowing()).isTrue();
     }
@@ -258,8 +256,7 @@
         suwIntent.putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true);
         when(mActivity.getIntent()).thenReturn(suwIntent);
 
-        mFragment.onPreferenceToggled(
-                ToggleFeaturePreferenceFragment.KEY_USE_SERVICE_PREFERENCE, /* enabled= */ true);
+        mFragment.onPreferenceToggled(mFragment.getUseServicePreferenceKey(), /* enabled= */ true);
 
         assertThat(getLatestPopupWindow()).isNull();
     }
@@ -268,12 +265,10 @@
     @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
     @Config(shadows = ShadowFragment.class)
     public void onPreferenceToggledOnEnabledService_tooltipViewShown_notShowTooltipView() {
-        mFragment.onPreferenceToggled(
-                ToggleFeaturePreferenceFragment.KEY_USE_SERVICE_PREFERENCE, /* enabled= */ true);
+        mFragment.onPreferenceToggled(mFragment.getUseServicePreferenceKey(), /* enabled= */ true);
         getLatestPopupWindow().dismiss();
 
-        mFragment.onPreferenceToggled(
-                ToggleFeaturePreferenceFragment.KEY_USE_SERVICE_PREFERENCE, /* enabled= */ true);
+        mFragment.onPreferenceToggled(mFragment.getUseServicePreferenceKey(), /* enabled= */ true);
 
         assertThat(getLatestPopupWindow().isShowing()).isFalse();
     }
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
index 038672f..87632ae 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
@@ -24,6 +24,7 @@
 import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
 import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
 import static com.android.settings.accessibility.MagnificationCapabilities.MagnificationMode;
+import static com.android.settings.accessibility.ToggleScreenMagnificationPreferenceFragment.KEY_MAGNIFICATION_SHORTCUT_PREFERENCE;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -70,6 +71,7 @@
 import com.android.settings.testutils.shadow.ShadowStorageManager;
 import com.android.settings.testutils.shadow.ShadowUserManager;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.search.SearchIndexableRaw;
 
 import com.google.common.truth.Correspondence;
 
@@ -539,7 +541,7 @@
 
     @Test
     public void optInAllValuesToSettings_software_sizeValueIsNotNull_sizeValueIsNotChanged() {
-        for (int size : new int[] {FloatingMenuSizePreferenceController.Size.LARGE,
+        for (int size : new int[]{FloatingMenuSizePreferenceController.Size.LARGE,
                 FloatingMenuSizePreferenceController.Size.SMALL}) {
             Settings.Secure.putInt(mContext.getContentResolver(),
                     Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE, size);
@@ -557,7 +559,7 @@
 
     @Test
     public void optInAllValuesToSettings_hardware_sizeValueIsNotChanged() {
-        for (int size : new int[] {FloatingMenuSizePreferenceController.Size.UNKNOWN,
+        for (int size : new int[]{FloatingMenuSizePreferenceController.Size.UNKNOWN,
                 FloatingMenuSizePreferenceController.Size.LARGE,
                 FloatingMenuSizePreferenceController.Size.SMALL}) {
             Settings.Secure.putInt(mContext.getContentResolver(),
@@ -575,7 +577,7 @@
 
     @Test
     public void optInAllValuesToSettings_tripletap_sizeValueIsNotChanged() {
-        for (int size : new int[] {FloatingMenuSizePreferenceController.Size.UNKNOWN,
+        for (int size : new int[]{FloatingMenuSizePreferenceController.Size.UNKNOWN,
                 FloatingMenuSizePreferenceController.Size.LARGE,
                 FloatingMenuSizePreferenceController.Size.SMALL}) {
             Settings.Secure.putInt(mContext.getContentResolver(),
@@ -1025,6 +1027,107 @@
                 .isEqualTo(collectionInfo.getImportantForAccessibilityItemCount() + 1);
     }
 
+    @Test
+    @EnableFlags(com.android.settings.accessibility.Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
+    public void getRawDataToIndex_returnsAllPreferenceKeys() {
+        List<String> expectedSearchKeys = List.of(
+                KEY_MAGNIFICATION_SHORTCUT_PREFERENCE,
+                MagnificationModePreferenceController.PREF_KEY,
+                MagnificationFollowTypingPreferenceController.PREF_KEY,
+                MagnificationOneFingerPanningPreferenceController.PREF_KEY,
+                MagnificationAlwaysOnPreferenceController.PREF_KEY,
+                MagnificationJoystickPreferenceController.PREF_KEY);
+
+        final List<SearchIndexableRaw> rawData = ToggleScreenMagnificationPreferenceFragment
+                .SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(mContext, true);
+        final List<String> actualSearchKeys = rawData.stream().map(raw -> raw.key).toList();
+
+        assertThat(actualSearchKeys).containsExactlyElementsIn(expectedSearchKeys);
+    }
+
+    @Test
+    @EnableFlags(com.android.settings.accessibility.Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
+    public void
+            getNonIndexableKeys_windowMagnificationNotSupported_onlyShortcutPreferenceSearchable() {
+        setWindowMagnificationSupported(false, false);
+
+        final List<String> niks = ToggleScreenMagnificationPreferenceFragment
+                .SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
+        final List<SearchIndexableRaw> rawData = ToggleScreenMagnificationPreferenceFragment
+                .SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(mContext, true);
+        // Expect all search data, except the shortcut preference, to be in NIKs.
+        final List<String> expectedNiks = rawData.stream().map(raw -> raw.key)
+                .filter(key -> !key.equals(KEY_MAGNIFICATION_SHORTCUT_PREFERENCE)).toList();
+
+        // In NonIndexableKeys == not searchable
+        assertThat(niks).containsExactlyElementsIn(expectedNiks);
+    }
+
+    @Test
+    @EnableFlags({
+            com.android.settings.accessibility.Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH,
+            Flags.FLAG_ENABLE_MAGNIFICATION_ONE_FINGER_PANNING_GESTURE})
+    public void getNonIndexableKeys_hasShortcutAndAllFeaturesEnabled_allItemsSearchable() {
+        setMagnificationTripleTapEnabled(true);
+        setAlwaysOnSupported(true);
+        setJoystickSupported(true);
+
+        final List<String> niks = ToggleScreenMagnificationPreferenceFragment
+                .SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
+
+        // Empty NonIndexableKeys == all indexed items are searchable
+        assertThat(niks).isEmpty();
+    }
+
+    @Test
+    @EnableFlags(com.android.settings.accessibility.Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
+    public void getNonIndexableKeys_noShortcut_alwaysOnSupported_notSearchable() {
+        setMagnificationTripleTapEnabled(false);
+        setAlwaysOnSupported(true);
+
+        final List<String> niks = ToggleScreenMagnificationPreferenceFragment
+                .SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
+
+        // In NonIndexableKeys == not searchable
+        assertThat(niks).contains(MagnificationAlwaysOnPreferenceController.PREF_KEY);
+    }
+
+    @Test
+    @EnableFlags(com.android.settings.accessibility.Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
+    public void getNonIndexableKeys_hasShortcut_alwaysOnNotSupported_notSearchable() {
+        setMagnificationTripleTapEnabled(true);
+        setAlwaysOnSupported(false);
+
+        final List<String> niks = ToggleScreenMagnificationPreferenceFragment
+                .SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
+
+        // In NonIndexableKeys == not searchable
+        assertThat(niks).contains(MagnificationAlwaysOnPreferenceController.PREF_KEY);
+    }
+
+    @Test
+    @EnableFlags(com.android.settings.accessibility.Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
+    @DisableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_ONE_FINGER_PANNING_GESTURE)
+    public void getNonIndexableKeys_oneFingerPanningNotSupported_notSearchable() {
+        final List<String> niks = ToggleScreenMagnificationPreferenceFragment
+                .SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
+
+        // In NonIndexableKeys == not searchable
+        assertThat(niks).contains(MagnificationOneFingerPanningPreferenceController.PREF_KEY);
+    }
+
+    @Test
+    @EnableFlags(com.android.settings.accessibility.Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
+    public void getNonIndexableKeys_joystickNotSupported_notSearchable() {
+        setJoystickSupported(false);
+
+        final List<String> niks = ToggleScreenMagnificationPreferenceFragment
+                .SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
+
+        // In NonIndexableKeys == not searchable
+        assertThat(niks).contains(MagnificationJoystickPreferenceController.PREF_KEY);
+    }
+
     private void putStringIntoSettings(String key, String componentName) {
         Settings.Secure.putString(mContext.getContentResolver(), key, componentName);
     }
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsCompanionAppsControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsCompanionAppsControllerTest.java
index faea3d8..d9054a8 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsCompanionAppsControllerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsCompanionAppsControllerTest.java
@@ -115,7 +115,8 @@
                 /* pending */ false,
                 /* timeApprovedMs */ System.currentTimeMillis(),
                 /* lastTimeConnected */ Long.MAX_VALUE,
-                /* systemDataSyncFlags */ -1);
+                /* systemDataSyncFlags */ -1,
+                /* deviceIcon */ null);
 
         mAssociations.add(association);
         showScreen(mController);
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBluetoothDeviceUpdaterTest.java
index 879c6a4..11e31b6 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBluetoothDeviceUpdaterTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBluetoothDeviceUpdaterTest.java
@@ -28,7 +28,6 @@
 import static org.mockito.Mockito.when;
 import static org.robolectric.Shadows.shadowOf;
 
-import android.app.settings.SettingsEnums;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
 import android.bluetooth.BluetoothLeBroadcastReceiveState;
@@ -271,8 +270,9 @@
     public void onPreferenceClick_logClick() {
         Preference preference = new Preference(mContext);
         mDeviceUpdater.onPreferenceClick(preference);
-        verify(mFeatureFactory.metricsFeatureProvider)
-                .action(mContext, SettingsEnums.ACTION_AUDIO_SHARING_DEVICE_CLICK);
+        shadowOf(Looper.getMainLooper()).idle();
+
+        verify(mDevicePreferenceCallback).onDeviceClick(preference);
     }
 
     private void setupPreferenceMapWithDevice() {
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingCallAudioPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingCallAudioPreferenceControllerTest.java
index 87ae3d5..a575d5a 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingCallAudioPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingCallAudioPreferenceControllerTest.java
@@ -176,6 +176,22 @@
         bisSyncState.add(1L);
         when(mState.getBisSyncState()).thenReturn(bisSyncState);
         when(mContext.getContentResolver()).thenReturn(mContentResolver);
+        when(mCachedDevice1.getDevice()).thenReturn(mDevice1);
+        when(mCachedDevice1.getGroupId()).thenReturn(TEST_DEVICE_GROUP_ID1);
+        when(mCachedDevice1.getName()).thenReturn(TEST_DEVICE_NAME1);
+        when(mCachedDevice1.isActiveDevice(BluetoothProfile.LE_AUDIO)).thenReturn(false);
+        when(mCachedDevice1.getMemberDevice()).thenReturn(ImmutableSet.of(mCachedDevice2));
+        when(mCacheManager.findDevice(mDevice1)).thenReturn(mCachedDevice1);
+        when(mCachedDevice2.getDevice()).thenReturn(mDevice2);
+        when(mCachedDevice2.getGroupId()).thenReturn(TEST_DEVICE_GROUP_ID1);
+        when(mCachedDevice2.getName()).thenReturn(TEST_DEVICE_NAME1);
+        when(mCachedDevice2.isActiveDevice(BluetoothProfile.LE_AUDIO)).thenReturn(false);
+        when(mCacheManager.findDevice(mDevice2)).thenReturn(mCachedDevice2);
+        when(mCachedDevice3.getDevice()).thenReturn(mDevice3);
+        when(mCachedDevice3.getGroupId()).thenReturn(TEST_DEVICE_GROUP_ID2);
+        when(mCachedDevice3.getName()).thenReturn(TEST_DEVICE_NAME2);
+        when(mCachedDevice3.isActiveDevice(BluetoothProfile.LE_AUDIO)).thenReturn(false);
+        when(mCacheManager.findDevice(mDevice3)).thenReturn(mCachedDevice3);
         mController = new AudioSharingCallAudioPreferenceController(mContext);
         mController.init(null);
         mContentObserver = mController.getSettingsObserver();
@@ -323,7 +339,9 @@
         when(mBroadcast.isEnabled(any())).thenReturn(true);
         when(mAssistant.getAllConnectedDevices()).thenReturn(ImmutableList.of());
         mController.displayPreference(mScreen);
+        shadowOf(Looper.getMainLooper()).idle();
         mPreference.setSummary("test");
+
         mController.onProfileConnectionStateChanged(
                 mCachedDevice1,
                 BluetoothAdapter.STATE_DISCONNECTED,
@@ -335,14 +353,13 @@
     @Test
     public void onFallbackDeviceChanged_updateSummary() {
         Settings.Secure.putInt(mContentResolver, TEST_SETTINGS_KEY, TEST_DEVICE_GROUP_ID1);
-        when(mCachedDevice1.getGroupId()).thenReturn(TEST_DEVICE_GROUP_ID1);
-        when(mCachedDevice1.getDevice()).thenReturn(mDevice1);
-        when(mCachedDevice1.getName()).thenReturn(TEST_DEVICE_NAME1);
-        when(mCacheManager.findDevice(mDevice1)).thenReturn(mCachedDevice1);
         when(mBroadcast.isEnabled(any())).thenReturn(true);
         when(mAssistant.getAllConnectedDevices()).thenReturn(ImmutableList.of(mDevice1));
         when(mAssistant.getAllSources(any())).thenReturn(ImmutableList.of(mState));
         mController.displayPreference(mScreen);
+        shadowOf(Looper.getMainLooper()).idle();
+        mPreference.setSummary("test");
+
         mContentObserver.onChange(true);
         shadowOf(Looper.getMainLooper()).idle();
         assertThat(mPreference.getSummary().toString())
@@ -352,20 +369,29 @@
     }
 
     @Test
-    public void displayPreference_showCorrectSummary() {
+    public void onActiveDeviceChanged_updateSummary() {
+        Settings.Secure.putInt(mContentResolver, TEST_SETTINGS_KEY,
+                BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
+        when(mCachedDevice1.isActiveDevice(BluetoothProfile.LE_AUDIO)).thenReturn(true);
+        when(mBroadcast.isEnabled(any())).thenReturn(true);
+        when(mAssistant.getAllConnectedDevices()).thenReturn(ImmutableList.of(mDevice1));
+        when(mAssistant.getAllSources(any())).thenReturn(ImmutableList.of(mState));
+        mController.displayPreference(mScreen);
+        shadowOf(Looper.getMainLooper()).idle();
+        mPreference.setSummary("test");
+
+        mController.onActiveDeviceChanged(mCachedDevice1, BluetoothProfile.LE_AUDIO);
+        shadowOf(Looper.getMainLooper()).idle();
+        assertThat(mPreference.getSummary().toString())
+                .isEqualTo(
+                        mContext.getString(
+                                R.string.audio_sharing_call_audio_description, TEST_DEVICE_NAME1));
+    }
+
+    @Test
+    public void displayPreference_fallbackDeviceInSharing_showCorrectSummary() {
         Settings.Secure.putInt(mContentResolver, TEST_SETTINGS_KEY, TEST_DEVICE_GROUP_ID1);
-        when(mCachedDevice1.getGroupId()).thenReturn(TEST_DEVICE_GROUP_ID1);
-        when(mCachedDevice1.getDevice()).thenReturn(mDevice1);
-        when(mCachedDevice2.getGroupId()).thenReturn(TEST_DEVICE_GROUP_ID1);
-        when(mCachedDevice2.getDevice()).thenReturn(mDevice2);
-        when(mCachedDevice1.getMemberDevice()).thenReturn(ImmutableSet.of(mCachedDevice2));
-        when(mCachedDevice1.getName()).thenReturn(TEST_DEVICE_NAME1);
-        when(mCachedDevice3.getGroupId()).thenReturn(TEST_DEVICE_GROUP_ID2);
-        when(mCachedDevice3.getDevice()).thenReturn(mDevice3);
-        when(mCachedDevice3.getName()).thenReturn(TEST_DEVICE_NAME2);
-        when(mCacheManager.findDevice(mDevice1)).thenReturn(mCachedDevice1);
-        when(mCacheManager.findDevice(mDevice2)).thenReturn(mCachedDevice2);
-        when(mCacheManager.findDevice(mDevice3)).thenReturn(mCachedDevice3);
+        when(mCachedDevice3.isActiveDevice(BluetoothProfile.LE_AUDIO)).thenReturn(true);
         when(mBroadcast.isEnabled(any())).thenReturn(true);
         when(mAssistant.getAllConnectedDevices())
                 .thenReturn(ImmutableList.of(mDevice1, mDevice2, mDevice3));
@@ -379,14 +405,24 @@
     }
 
     @Test
-    public void displayPreference_noFallbackDeviceInSharing_showEmptySummary() {
+    public void displayPreference_activeDeviceInSharing_showCorrectSummary() {
         Settings.Secure.putInt(mContentResolver, TEST_SETTINGS_KEY, TEST_DEVICE_GROUP_ID2);
-        when(mCachedDevice1.getGroupId()).thenReturn(TEST_DEVICE_GROUP_ID1);
-        when(mCachedDevice1.getDevice()).thenReturn(mDevice1);
-        when(mCachedDevice1.getName()).thenReturn(TEST_DEVICE_NAME1);
-        when(mCacheManager.findDevice(mDevice1)).thenReturn(mCachedDevice1);
+        when(mCachedDevice1.isActiveDevice(BluetoothProfile.LE_AUDIO)).thenReturn(true);
         when(mBroadcast.isEnabled(any())).thenReturn(true);
-        when(mAssistant.getAllConnectedDevices()).thenReturn(ImmutableList.of(mDevice1));
+        when(mAssistant.getAllConnectedDevices()).thenReturn(ImmutableList.of(mDevice1, mDevice2));
+        when(mAssistant.getAllSources(any())).thenReturn(ImmutableList.of(mState));
+        mController.displayPreference(mScreen);
+        shadowOf(Looper.getMainLooper()).idle();
+        assertThat(mPreference.getSummary().toString())
+                .isEqualTo(mContext.getString(
+                        R.string.audio_sharing_call_audio_description, TEST_DEVICE_NAME1));
+    }
+
+    @Test
+    public void displayPreference_noFallbackDeviceOrActiveInSharing_showEmptySummary() {
+        Settings.Secure.putInt(mContentResolver, TEST_SETTINGS_KEY, TEST_DEVICE_GROUP_ID2);
+        when(mBroadcast.isEnabled(any())).thenReturn(true);
+        when(mAssistant.getAllConnectedDevices()).thenReturn(ImmutableList.of(mDevice1, mDevice2));
         when(mAssistant.getAllSources(any())).thenReturn(ImmutableList.of(mState));
         mController.displayPreference(mScreen);
         shadowOf(Looper.getMainLooper()).idle();
@@ -394,7 +430,7 @@
     }
 
     @Test
-    public void displayPreference_noFallbackDevice_showEmptySummary() {
+    public void displayPreference_noFallbackOrActiveDevice_showEmptySummary() {
         Settings.Secure.putInt(
                 mContentResolver, TEST_SETTINGS_KEY, BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
         when(mBroadcast.isEnabled(any())).thenReturn(true);
@@ -412,17 +448,11 @@
             ShadowAlertDialogCompat.reset();
         }
         Settings.Secure.putInt(mContentResolver, TEST_SETTINGS_KEY, TEST_DEVICE_GROUP_ID1);
-        when(mCachedDevice1.getGroupId()).thenReturn(TEST_DEVICE_GROUP_ID1);
-        when(mCachedDevice1.getName()).thenReturn(TEST_DEVICE_NAME1);
-        when(mCachedDevice1.getDevice()).thenReturn(mDevice1);
-        when(mCachedDevice2.getGroupId()).thenReturn(TEST_DEVICE_GROUP_ID2);
-        when(mCachedDevice2.getName()).thenReturn(TEST_DEVICE_NAME2);
-        when(mCachedDevice2.getDevice()).thenReturn(mDevice2);
-        when(mCacheManager.findDevice(mDevice1)).thenReturn(mCachedDevice1);
-        when(mCacheManager.findDevice(mDevice2)).thenReturn(mCachedDevice2);
-        mShadowBluetoothAdapter.setMostRecentlyConnectedDevices(List.of(mDevice1, mDevice2));
+        mShadowBluetoothAdapter.setMostRecentlyConnectedDevices(
+                List.of(mDevice1, mDevice2, mDevice3));
         when(mBroadcast.isEnabled(any())).thenReturn(true);
-        when(mAssistant.getAllConnectedDevices()).thenReturn(ImmutableList.of(mDevice1, mDevice2));
+        when(mAssistant.getAllConnectedDevices()).thenReturn(
+                ImmutableList.of(mDevice1, mDevice2, mDevice3));
         when(mAssistant.getAllSources(any())).thenReturn(ImmutableList.of(mState));
         mController.init(mParentFragment);
         mController.displayPreference(mScreen);
@@ -449,14 +479,9 @@
 
     @Test
     public void logCallAudioDeviceChange_changeCallAudioToEarlierConnectedDevice() {
-        when(mCachedDevice1.getGroupId()).thenReturn(TEST_DEVICE_GROUP_ID1);
-        when(mCachedDevice1.getDevice()).thenReturn(mDevice1);
-        when(mCachedDevice2.getGroupId()).thenReturn(TEST_DEVICE_GROUP_ID2);
-        when(mCachedDevice2.getDevice()).thenReturn(mDevice2);
-        when(mCacheManager.findDevice(mDevice1)).thenReturn(mCachedDevice1);
-        when(mCacheManager.findDevice(mDevice2)).thenReturn(mCachedDevice2);
-        mShadowBluetoothAdapter.setMostRecentlyConnectedDevices(List.of(mDevice1, mDevice2));
-        mController.logCallAudioDeviceChange(TEST_DEVICE_GROUP_ID1, mCachedDevice2);
+        mShadowBluetoothAdapter.setMostRecentlyConnectedDevices(
+                List.of(mDevice1, mDevice2, mDevice3));
+        mController.logCallAudioDeviceChange(TEST_DEVICE_GROUP_ID1, mCachedDevice3);
         verify(mFeatureFactory.metricsFeatureProvider)
                 .action(
                         mContext,
@@ -468,13 +493,8 @@
 
     @Test
     public void logCallAudioDeviceChange_changeCallAudioToLaterConnectedDevice() {
-        when(mCachedDevice1.getGroupId()).thenReturn(TEST_DEVICE_GROUP_ID1);
-        when(mCachedDevice1.getDevice()).thenReturn(mDevice1);
-        when(mCachedDevice2.getGroupId()).thenReturn(TEST_DEVICE_GROUP_ID2);
-        when(mCachedDevice2.getDevice()).thenReturn(mDevice2);
-        when(mCacheManager.findDevice(mDevice1)).thenReturn(mCachedDevice1);
-        when(mCacheManager.findDevice(mDevice2)).thenReturn(mCachedDevice2);
-        mShadowBluetoothAdapter.setMostRecentlyConnectedDevices(List.of(mDevice1, mDevice2));
+        mShadowBluetoothAdapter.setMostRecentlyConnectedDevices(
+                List.of(mDevice1, mDevice2, mDevice3));
         mController.logCallAudioDeviceChange(TEST_DEVICE_GROUP_ID2, mCachedDevice1);
         verify(mFeatureFactory.metricsFeatureProvider)
                 .action(
@@ -487,14 +507,8 @@
 
     @Test
     public void logCallAudioDeviceChange_deviceNotFoundInRecentList_unknownChangeType() {
-        when(mCachedDevice1.getGroupId()).thenReturn(TEST_DEVICE_GROUP_ID1);
-        when(mCachedDevice1.getDevice()).thenReturn(mDevice1);
-        when(mCachedDevice2.getGroupId()).thenReturn(TEST_DEVICE_GROUP_ID2);
-        when(mCachedDevice2.getDevice()).thenReturn(mDevice2);
-        when(mCacheManager.findDevice(mDevice1)).thenReturn(mCachedDevice1);
-        when(mCacheManager.findDevice(mDevice2)).thenReturn(mCachedDevice2);
-        mShadowBluetoothAdapter.setMostRecentlyConnectedDevices(List.of(mDevice1));
-        mController.logCallAudioDeviceChange(TEST_DEVICE_GROUP_ID1, mCachedDevice2);
+        mShadowBluetoothAdapter.setMostRecentlyConnectedDevices(List.of(mDevice1, mDevice2));
+        mController.logCallAudioDeviceChange(TEST_DEVICE_GROUP_ID1, mCachedDevice3);
         verify(mFeatureFactory.metricsFeatureProvider)
                 .action(
                         mContext,
@@ -505,10 +519,6 @@
 
     @Test
     public void testBluetoothLeBroadcastAssistantCallbacks_updateSummary() {
-        when(mCachedDevice1.getGroupId()).thenReturn(TEST_DEVICE_GROUP_ID1);
-        when(mCachedDevice1.getDevice()).thenReturn(mDevice1);
-        when(mCachedDevice1.getName()).thenReturn(TEST_DEVICE_NAME1);
-        when(mCacheManager.findDevice(mDevice1)).thenReturn(mCachedDevice1);
         Settings.Secure.putInt(
                 mContentResolver, TEST_SETTINGS_KEY, BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
         when(mBroadcast.isEnabled(any())).thenReturn(true);
@@ -532,10 +542,6 @@
 
     @Test
     public void testBluetoothLeBroadcastAssistantCallbacks_doNothing() {
-        when(mCachedDevice1.getGroupId()).thenReturn(TEST_DEVICE_GROUP_ID1);
-        when(mCachedDevice1.getDevice()).thenReturn(mDevice1);
-        when(mCachedDevice1.getName()).thenReturn(TEST_DEVICE_NAME1);
-        when(mCacheManager.findDevice(mDevice1)).thenReturn(mCachedDevice1);
         Settings.Secure.putInt(
                 mContentResolver, TEST_SETTINGS_KEY, BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
         when(mBroadcast.isEnabled(any())).thenReturn(true);
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceItemTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceItemTest.java
index b23882d..27bff76 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceItemTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceItemTest.java
@@ -78,4 +78,13 @@
         assertThat(itemFromParcel.getGroupId()).isEqualTo(TEST_GROUP_ID);
         assertThat(itemFromParcel.isActive()).isEqualTo(TEST_IS_ACTIVE);
     }
+
+    @Test
+    public void toString_correctValue() {
+        AudioSharingDeviceItem item =
+                new AudioSharingDeviceItem(TEST_NAME, TEST_GROUP_ID, TEST_IS_ACTIVE);
+        assertThat(item.toString()).isEqualTo(
+                "AudioSharingDeviceItem groupId = " + TEST_GROUP_ID + ", isActive = "
+                        + TEST_IS_ACTIVE);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceControllerTest.java
index 03f1303..61bc8aa 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceControllerTest.java
@@ -25,6 +25,7 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
@@ -44,10 +45,14 @@
 import android.bluetooth.BluetoothStatusCodes;
 import android.content.Context;
 import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.media.AudioManager;
 import android.os.Bundle;
 import android.os.Looper;
 import android.platform.test.flag.junit.SetFlagsRule;
+import android.util.Pair;
 
+import androidx.annotation.NonNull;
 import androidx.fragment.app.FragmentActivity;
 import androidx.lifecycle.LifecycleOwner;
 import androidx.preference.Preference;
@@ -56,10 +61,13 @@
 import androidx.preference.PreferenceScreen;
 import androidx.test.core.app.ApplicationProvider;
 
+import com.android.settings.R;
 import com.android.settings.SettingsActivity;
+import com.android.settings.bluetooth.BluetoothDevicePreference;
 import com.android.settings.bluetooth.Utils;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.shadow.ShadowAudioManager;
 import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
 import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
 import com.android.settings.testutils.shadow.ShadowFragment;
@@ -99,14 +107,16 @@
 @RunWith(RobolectricTestRunner.class)
 @Config(
         shadows = {
-            ShadowBluetoothAdapter.class,
-            ShadowBluetoothUtils.class,
-            ShadowFragment.class,
+                ShadowBluetoothAdapter.class,
+                ShadowBluetoothUtils.class,
+                ShadowFragment.class,
+                ShadowAudioManager.class,
         })
 public class AudioSharingDevicePreferenceControllerTest {
     private static final String KEY = "audio_sharing_device_list";
     private static final String KEY_AUDIO_SHARING_SETTINGS =
             "connected_device_audio_sharing_settings";
+    private static final String TEST_DEVICE_NAME = "test";
 
     @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
     @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@@ -140,6 +150,7 @@
     private PreferenceCategory mPreferenceGroup;
     private Preference mAudioSharingPreference;
     private FakeFeatureFactory mFeatureFactory;
+    private AudioManager mAudioManager;
 
     @Before
     public void setUp() {
@@ -153,6 +164,7 @@
         mLifecycleOwner = () -> mLifecycle;
         mLifecycle = new Lifecycle(mLifecycleOwner);
         mFeatureFactory = FakeFeatureFactory.setupForTest();
+        mAudioManager = mContext.getSystemService(AudioManager.class);
         ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBtManager;
         mLocalBtManager = Utils.getLocalBtManager(mContext);
         when(mLocalBtManager.getEventManager()).thenReturn(mEventManager);
@@ -571,4 +583,51 @@
         verify(mBluetoothDeviceUpdater, never()).forceUpdate();
         verifyNoMoreInteractions(mFeatureFactory.metricsFeatureProvider);
     }
+
+    @Test
+    public void testInCallState_showCallStateTitleAndSetActiveOnDeviceClick() {
+        mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
+        mController.displayPreference(mScreen);
+
+        mAudioManager.setMode(AudioManager.MODE_IN_CALL);
+        mController.onAudioModeChanged();
+        shadowOf(Looper.getMainLooper()).idle();
+
+        assertThat(mPreferenceGroup.getTitle().toString())
+                .isEqualTo(mContext.getString(R.string.connected_device_call_device_title));
+
+        BluetoothDevicePreference preference = createBluetoothDevicePreference();
+        mController.onDeviceClick(preference);
+        verify(mCachedDevice).setActive();
+    }
+
+    @Test
+    public void testInNormalState_showNormalStateTitleAndDoNothingOnDeviceClick() {
+        mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
+        mController.displayPreference(mScreen);
+
+        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        mController.onAudioModeChanged();
+        shadowOf(Looper.getMainLooper()).idle();
+
+        assertThat(mPreferenceGroup.getTitle().toString())
+                .isEqualTo(mContext.getString(R.string.audio_sharing_device_group_title));
+
+        BluetoothDevicePreference preference = createBluetoothDevicePreference();
+        mController.onDeviceClick(preference);
+
+        verify(mCachedDevice, never()).setActive();
+    }
+
+    @NonNull
+    private BluetoothDevicePreference createBluetoothDevicePreference() {
+        Drawable drawable = mock(Drawable.class);
+        Pair<Drawable, String> pairs = new Pair<>(drawable, TEST_DEVICE_NAME);
+        when(mCachedDevice.getDrawableWithDescription()).thenReturn(pairs);
+        return new BluetoothDevicePreference(
+                        mContext,
+                        mCachedDevice,
+                        /* showDeviceWithoutNames= */ false,
+                        BluetoothDevicePreference.SortType.TYPE_DEFAULT);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/development/DesktopModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/DesktopModePreferenceControllerTest.java
index 7fe9377..b9f5621 100644
--- a/tests/robotests/src/com/android/settings/development/DesktopModePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/DesktopModePreferenceControllerTest.java
@@ -17,9 +17,9 @@
 package com.android.settings.development;
 
 import static android.provider.Settings.Global.DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES;
-import static android.window.flags.DesktopModeFlags.ToggleOverride.OVERRIDE_ON;
-import static android.window.flags.DesktopModeFlags.ToggleOverride.OVERRIDE_OFF;
-import static android.window.flags.DesktopModeFlags.ToggleOverride.OVERRIDE_UNSET;
+import static android.window.DesktopModeFlags.ToggleOverride.OVERRIDE_ON;
+import static android.window.DesktopModeFlags.ToggleOverride.OVERRIDE_OFF;
+import static android.window.DesktopModeFlags.ToggleOverride.OVERRIDE_UNSET;
 
 import static com.google.common.truth.Truth.assertThat;
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java
index ae4c56d..1f3067e 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java
@@ -903,6 +903,7 @@
                                                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                                                 0L,
                                                 0L,
+                                                0L,
                                                 false)),
                         batteryHistoryKeys[1],
                                 Map.of(
@@ -920,6 +921,7 @@
                                                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                                                 0L,
                                                 0L,
+                                                0L,
                                                 false)),
                         batteryHistoryKeys[2],
                                 Map.of(
@@ -937,6 +939,7 @@
                                                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                                                 0L,
                                                 0L,
+                                                0L,
                                                 false)));
         final BatteryLevelData batteryLevelData = generateBatteryLevelData(batteryHistoryKeys);
         final Map<Integer, Map<Integer, Map<Long, Map<String, List<AppUsagePeriod>>>>>
@@ -993,6 +996,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 0L,
+                        /* foregroundServiceUsageTimeInMs= */ 0L,
                         /* backgroundUsageTimeInMs= */ 0L,
                         /* isHidden= */ false);
         // Adds the index = 0 data.
@@ -1010,6 +1014,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 10L,
+                        /* foregroundServiceUsageTimeInMs= */ 15L,
                         /* backgroundUsageTimeInMs= */ 20L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1034,6 +1039,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 15L,
+                        /* foregroundServiceUsageTimeInMs= */ 20L,
                         /* backgroundUsageTimeInMs= */ 25L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1054,6 +1060,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 25L,
+                        /* foregroundServiceUsageTimeInMs= */ 30L,
                         /* backgroundUsageTimeInMs= */ 35L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1070,6 +1077,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY,
                         /* foregroundUsageTimeInMs= */ 40L,
+                        /* foregroundServiceUsageTimeInMs= */ 45L,
                         /* backgroundUsageTimeInMs= */ 50L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1086,6 +1094,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 5L,
+                        /* foregroundServiceUsageTimeInMs= */ 5L,
                         /* backgroundUsageTimeInMs= */ 5L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1106,6 +1115,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 30L,
+                        /* foregroundServiceUsageTimeInMs= */ 35L,
                         /* backgroundUsageTimeInMs= */ 40L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1122,6 +1132,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY,
                         /* foregroundUsageTimeInMs= */ 50L,
+                        /* foregroundServiceUsageTimeInMs= */ 55L,
                         /* backgroundUsageTimeInMs= */ 60L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1138,6 +1149,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 5L,
+                        /* foregroundServiceUsageTimeInMs= */ 5L,
                         /* backgroundUsageTimeInMs= */ 5L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1195,6 +1207,7 @@
                 /* backgroundUsageConsumePower= */ 9,
                 /* cachedUsageConsumePower= */ 8,
                 /* foregroundUsageTimeInMs= */ 30,
+                /* foregroundServiceUsageTimeInMs= */ 35,
                 /* backgroundUsageTimeInMs= */ 40,
                 /* screenOnTimeInMs= */ 12);
         assertBatteryDiffEntry(
@@ -1208,6 +1221,7 @@
                 /* backgroundUsageConsumePower= */ 8,
                 /* cachedUsageConsumePower= */ 8,
                 /* foregroundUsageTimeInMs= */ 5,
+                /* foregroundServiceUsageTimeInMs= */ 5,
                 /* backgroundUsageTimeInMs= */ 5,
                 /* screenOnTimeInMs= */ 0);
         assertBatteryDiffEntry(
@@ -1221,6 +1235,7 @@
                 /* backgroundUsageConsumePower= */ 5,
                 /* cachedUsageConsumePower= */ 5,
                 /* foregroundUsageTimeInMs= */ 16,
+                /* foregroundServiceUsageTimeInMs= */ 55,
                 /* backgroundUsageTimeInMs= */ 60,
                 /* screenOnTimeInMs= */ 9);
         resultDiffData = resultMap.get(0).get(DataProcessor.SELECTED_INDEX_ALL);
@@ -1235,6 +1250,7 @@
                 /* backgroundUsageConsumePower= */ 5,
                 /* cachedUsageConsumePower= */ 5,
                 /* foregroundUsageTimeInMs= */ 15,
+                /* foregroundServiceUsageTimeInMs= */ 20,
                 /* backgroundUsageTimeInMs= */ 25,
                 /* screenOnTimeInMs= */ 5);
         resultDiffData = resultMap.get(1).get(DataProcessor.SELECTED_INDEX_ALL);
@@ -1249,6 +1265,7 @@
                 /* backgroundUsageConsumePower= */ 8,
                 /* cachedUsageConsumePower= */ 8,
                 /* foregroundUsageTimeInMs= */ 5,
+                /* foregroundServiceUsageTimeInMs= */ 5,
                 /* backgroundUsageTimeInMs= */ 5,
                 /* screenOnTimeInMs= */ 0);
         assertBatteryDiffEntry(
@@ -1262,6 +1279,7 @@
                 /* backgroundUsageConsumePower= */ 4,
                 /* cachedUsageConsumePower= */ 3,
                 /* foregroundUsageTimeInMs= */ 15,
+                /* foregroundServiceUsageTimeInMs= */ 15,
                 /* backgroundUsageTimeInMs= */ 15,
                 /* screenOnTimeInMs= */ 7);
         assertBatteryDiffEntry(
@@ -1275,6 +1293,7 @@
                 /* backgroundUsageConsumePower= */ 5,
                 /* cachedUsageConsumePower= */ 5,
                 /* foregroundUsageTimeInMs= */ 16,
+                /* foregroundServiceUsageTimeInMs= */ 55,
                 /* backgroundUsageTimeInMs= */ 60,
                 /* screenOnTimeInMs= */ 9);
     }
@@ -1308,6 +1327,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 10L,
+                        /* foregroundServiceUsageTimeInMs= */ 15L,
                         /* backgroundUsageTimeInMs= */ 20L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1324,6 +1344,7 @@
                         currentUserId + 1,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 10L,
+                        /* foregroundServiceUsageTimeInMs= */ 15L,
                         /* backgroundUsageTimeInMs= */ 20L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1340,6 +1361,7 @@
                         currentUserId + 2,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 20L,
+                        /* foregroundServiceUsageTimeInMs= */ 25L,
                         /* backgroundUsageTimeInMs= */ 30L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1359,6 +1381,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 20L,
+                        /* foregroundServiceUsageTimeInMs= */ 25L,
                         /* backgroundUsageTimeInMs= */ 30L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1375,6 +1398,7 @@
                         currentUserId + 1,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 10L,
+                        /* foregroundServiceUsageTimeInMs= */ 15L,
                         /* backgroundUsageTimeInMs= */ 20L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1391,6 +1415,7 @@
                         currentUserId + 2,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 30L,
+                        /* foregroundServiceUsageTimeInMs= */ 30L,
                         /* backgroundUsageTimeInMs= */ 30L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1410,6 +1435,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 20L,
+                        /* foregroundServiceUsageTimeInMs= */ 25L,
                         /* backgroundUsageTimeInMs= */ 30L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1426,6 +1452,7 @@
                         currentUserId + 1,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 20L,
+                        /* foregroundServiceUsageTimeInMs= */ 20L,
                         /* backgroundUsageTimeInMs= */ 20L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1442,6 +1469,7 @@
                         currentUserId + 2,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 30L,
+                        /* foregroundServiceUsageTimeInMs= */ 30L,
                         /* backgroundUsageTimeInMs= */ 30L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1477,6 +1505,7 @@
                 /* backgroundUsageConsumePower= */ 5,
                 /* cachedUsageConsumePower= */ 5,
                 /* foregroundUsageTimeInMs= */ 10,
+                /* foregroundServiceUsageTimeInMs= */ 10,
                 /* backgroundUsageTimeInMs= */ 10,
                 /* screenOnTimeInMs= */ 0);
         assertThat(resultDiffData.getSystemDiffEntryList()).isEmpty();
@@ -1509,6 +1538,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 0L,
+                        /* foregroundServiceUsageTimeInMs= */ 0L,
                         /* backgroundUsageTimeInMs= */ 0L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1528,6 +1558,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 0L,
+                        /* foregroundServiceUsageTimeInMs= */ 0L,
                         /* backgroundUsageTimeInMs= */ 0L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1547,6 +1578,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 3600000L,
+                        /* foregroundServiceUsageTimeInMs= */ 0L,
                         /* backgroundUsageTimeInMs= */ 7200000L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1587,6 +1619,7 @@
         final BatteryDiffEntry resultEntry = resultDiffData.getAppDiffEntryList().get(0);
         assertThat(resultEntry.mForegroundUsageTimeInMs)
                 .isEqualTo(Math.round(entry.mForegroundUsageTimeInMs * ratio));
+        assertThat(resultEntry.mForegroundServiceUsageTimeInMs).isEqualTo(0);
         assertThat(resultEntry.mBackgroundUsageTimeInMs).isEqualTo(0);
         assertThat(resultEntry.mConsumePower).isEqualTo(entry.mConsumePower * ratio);
         assertThat(resultEntry.mForegroundUsageConsumePower)
@@ -1627,6 +1660,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 0L,
+                        /* foregroundServiceUsageTimeInMs= */ 0L,
                         /* backgroundUsageTimeInMs= */ 0L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1643,6 +1677,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 0L,
+                        /* foregroundServiceUsageTimeInMs= */ 0L,
                         /* backgroundUsageTimeInMs= */ 0L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1662,6 +1697,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 0L,
+                        /* foregroundServiceUsageTimeInMs= */ 0L,
                         /* backgroundUsageTimeInMs= */ 0L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1678,6 +1714,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 0L,
+                        /* foregroundServiceUsageTimeInMs= */ 0L,
                         /* backgroundUsageTimeInMs= */ 0L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1697,6 +1734,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 10L,
+                        /* foregroundServiceUsageTimeInMs= */ 15L,
                         /* backgroundUsageTimeInMs= */ 20L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1713,6 +1751,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 10L,
+                        /* foregroundServiceUsageTimeInMs= */ 15L,
                         /* backgroundUsageTimeInMs= */ 20L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1748,6 +1787,7 @@
                 /* backgroundUsageConsumePower= */ 5,
                 /* cachedUsageConsumePower= */ 5,
                 /* foregroundUsageTimeInMs= */ 10,
+                /* foregroundServiceUsageTimeInMs= */ 15,
                 /* backgroundUsageTimeInMs= */ 20,
                 /* screenOnTimeInMs= */ 0);
     }
@@ -1777,6 +1817,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 0L,
+                        /* foregroundServiceUsageTimeInMs= */ 0L,
                         /* backgroundUsageTimeInMs= */ 0L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1793,6 +1834,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 0L,
+                        /* foregroundServiceUsageTimeInMs= */ 0L,
                         /* backgroundUsageTimeInMs= */ 0L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1812,6 +1854,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 0L,
+                        /* foregroundServiceUsageTimeInMs= */ 0L,
                         /* backgroundUsageTimeInMs= */ 0L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1828,6 +1871,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 0L,
+                        /* foregroundServiceUsageTimeInMs= */ 0L,
                         /* backgroundUsageTimeInMs= */ 0L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1847,6 +1891,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 10L,
+                        /* foregroundServiceUsageTimeInMs= */ 15L,
                         /* backgroundUsageTimeInMs= */ 20L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1863,6 +1908,7 @@
                         currentUserId,
                         ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                         /* foregroundUsageTimeInMs= */ 10L,
+                        /* foregroundServiceUsageTimeInMs= */ 15L,
                         /* backgroundUsageTimeInMs= */ 20L,
                         /* isHidden= */ false);
         entryMap.put(entry.getKey(), entry);
@@ -1892,6 +1938,7 @@
         assertThat(resultEntry.mBackgroundUsageTimeInMs).isEqualTo(20);
         resultEntry = resultDiffData.getAppDiffEntryList().get(1);
         assertThat(resultEntry.mBackgroundUsageTimeInMs).isEqualTo(0);
+        assertThat(resultEntry.mForegroundServiceUsageTimeInMs).isEqualTo(0);
     }
 
     @Test
@@ -1921,6 +1968,7 @@
         doReturn(0.0).when(mMockBatteryEntry1).getConsumedPowerInBackground();
         doReturn(0.0).when(mMockBatteryEntry1).getConsumedPowerInCached();
         doReturn(30L).when(mMockBatteryEntry1).getTimeInForegroundMs();
+        doReturn(35L).when(mMockBatteryEntry1).getTimeInForegroundServiceMs();
         doReturn(40L).when(mMockBatteryEntry1).getTimeInBackgroundMs();
         doReturn(1).when(mMockBatteryEntry1).getUid();
         doReturn(ConvertUtils.CONSUMER_TYPE_UID_BATTERY).when(mMockBatteryEntry1).getConsumerType();
@@ -1930,6 +1978,7 @@
         doReturn(0.0).when(mMockBatteryEntry2).getConsumedPowerInBackground();
         doReturn(0.0).when(mMockBatteryEntry2).getConsumedPowerInCached();
         doReturn(20L).when(mMockBatteryEntry2).getTimeInForegroundMs();
+        doReturn(20L).when(mMockBatteryEntry2).getTimeInForegroundServiceMs();
         doReturn(20L).when(mMockBatteryEntry2).getTimeInBackgroundMs();
         doReturn(2).when(mMockBatteryEntry2).getUid();
         doReturn(ConvertUtils.CONSUMER_TYPE_UID_BATTERY).when(mMockBatteryEntry2).getConsumerType();
@@ -1939,6 +1988,7 @@
         doReturn(0.0).when(mMockBatteryEntry3).getConsumedPowerInBackground();
         doReturn(0.0).when(mMockBatteryEntry3).getConsumedPowerInCached();
         doReturn(0L).when(mMockBatteryEntry3).getTimeInForegroundMs();
+        doReturn(0L).when(mMockBatteryEntry3).getTimeInForegroundServiceMs();
         doReturn(0L).when(mMockBatteryEntry3).getTimeInBackgroundMs();
         doReturn(3).when(mMockBatteryEntry3).getUid();
         doReturn(ConvertUtils.CONSUMER_TYPE_UID_BATTERY).when(mMockBatteryEntry3).getConsumerType();
@@ -1948,6 +1998,7 @@
         doReturn(0.3).when(mMockBatteryEntry4).getConsumedPowerInBackground();
         doReturn(0.1).when(mMockBatteryEntry4).getConsumedPowerInCached();
         doReturn(10L).when(mMockBatteryEntry4).getTimeInForegroundMs();
+        doReturn(10L).when(mMockBatteryEntry4).getTimeInForegroundServiceMs();
         doReturn(10L).when(mMockBatteryEntry4).getTimeInBackgroundMs();
         doReturn(4).when(mMockBatteryEntry4).getUid();
         doReturn(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY)
@@ -1978,6 +2029,7 @@
                 /* backgroundUsageConsumePower= */ 0,
                 /* cachedUsageConsumePower= */ 0,
                 /* foregroundUsageTimeInMs= */ 20,
+                /* foregroundServiceUsageTimeInMs= */ 20,
                 /* backgroundUsageTimeInMs= */ 20,
                 /* screenOnTimeInMs= */ 0);
         assertBatteryDiffEntry(
@@ -1991,6 +2043,7 @@
                 /* backgroundUsageConsumePower= */ 0,
                 /* cachedUsageConsumePower= */ 0,
                 /* foregroundUsageTimeInMs= */ 30,
+                /* foregroundServiceUsageTimeInMs= */ 35,
                 /* backgroundUsageTimeInMs= */ 40,
                 /* screenOnTimeInMs= */ 0);
         assertBatteryDiffEntry(
@@ -2004,6 +2057,7 @@
                 /* backgroundUsageConsumePower= */ 0.3,
                 /* cachedUsageConsumePower= */ 0.1,
                 /* foregroundUsageTimeInMs= */ 10,
+                /* foregroundServiceUsageTimeInMs= */ 10,
                 /* backgroundUsageTimeInMs= */ 10,
                 /* screenOnTimeInMs= */ 0);
     }
@@ -2390,6 +2444,7 @@
             final long userId,
             final int consumerType,
             final long foregroundUsageTimeInMs,
+            final long foregroundServiceUsageTimeInMs,
             final long backgroundUsageTimeInMs,
             final boolean isHidden) {
         // Only insert required fields.
@@ -2402,6 +2457,7 @@
                         .setBackgroundUsageConsumePower(backgroundUsageConsumePower)
                         .setCachedUsageConsumePower(cachedUsageConsumePower)
                         .setForegroundUsageTimeInMs(foregroundUsageTimeInMs)
+                        .setForegroundServiceUsageTimeInMs(foregroundServiceUsageTimeInMs)
                         .setBackgroundUsageTimeInMs(backgroundUsageTimeInMs)
                         .setIsHidden(isHidden)
                         .build();
@@ -2531,6 +2587,7 @@
             final double backgroundUsageConsumePower,
             final double cachedUsageConsumePower,
             final long foregroundUsageTimeInMs,
+            final long foregroundServiceUsageTimeInMs,
             final long backgroundUsageTimeInMs,
             final long screenOnTimeInMs) {
         assertThat(entry.mUserId).isEqualTo(userId);
@@ -2543,6 +2600,8 @@
         assertThat(entry.mBackgroundUsageConsumePower).isEqualTo(backgroundUsageConsumePower);
         assertThat(entry.mCachedUsageConsumePower).isEqualTo(cachedUsageConsumePower);
         assertThat(entry.mForegroundUsageTimeInMs).isEqualTo(foregroundUsageTimeInMs);
+        assertThat(entry.mForegroundServiceUsageTimeInMs)
+                .isEqualTo(foregroundServiceUsageTimeInMs);
         assertThat(entry.mBackgroundUsageTimeInMs).isEqualTo(backgroundUsageTimeInMs);
         assertThat(entry.mScreenOnTimeInMs).isEqualTo(screenOnTimeInMs);
     }
diff --git a/tests/robotests/src/com/android/settings/nfc/PaymentSettingsTest.java b/tests/robotests/src/com/android/settings/nfc/PaymentSettingsTest.java
index 458bc93..7380c66 100644
--- a/tests/robotests/src/com/android/settings/nfc/PaymentSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/nfc/PaymentSettingsTest.java
@@ -28,6 +28,10 @@
 import android.content.pm.UserInfo;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
 
 import androidx.preference.Preference;
 import androidx.preference.PreferenceManager;
@@ -36,6 +40,7 @@
 import com.android.settings.testutils.shadow.ShadowNfcAdapter;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -58,6 +63,9 @@
 
     private Context mContext;
 
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
     @Mock
     private PackageManager mPackageManager;
 
@@ -98,7 +106,19 @@
     }
 
     @Test
-    public void getNonIndexableKey_primaryUser_returnsTrue() {
+    @RequiresFlagsEnabled(android.permission.flags.Flags.FLAG_WALLET_ROLE_ENABLED)
+    public void getNonIndexableKey_primaryUser_returnsFalse_walletRoleEnabled() {
+        when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_NFC)).thenReturn(true);
+
+        final List<String> niks =
+                PaymentSettings.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
+
+        assertThat(niks).containsAtLeast(FOREGROUND_KEY, PAYMENT_KEY);
+    }
+
+    @Test
+    @RequiresFlagsDisabled(android.permission.flags.Flags.FLAG_WALLET_ROLE_ENABLED)
+    public void getNonIndexableKey_primaryUser_returnsTrue_walletRoleDisabled() {
         when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_NFC)).thenReturn(true);
 
         final List<String> niks =
