diff --git a/res/values/strings.xml b/res/values/strings.xml
index 3063f77..05fd19a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -655,7 +655,7 @@
     <string name="location_settings_loading_app_permission_stats">Loading\u2026</string>
     <!-- Location settings footer warning text when location is on [CHAR LIMIT=NONE] -->
     <string name="location_settings_footer_general">
-        Apps with the Nearby devices permission can determine the
+        Apps with the nearby devices permission can determine the
         relative position of connected devices.
     </string>
     <!-- Location settings footer warning text when location is off [CHAR LIMIT=NONE] -->
@@ -9357,6 +9357,8 @@
             other {{app_1}, {app_2}, and # more can interrupt}
         }
     </string>
+    <!-- Priority Modes: Entry in the "apps that can bypass DND" list that corresponds to a work profile app (e.g. "Chrome (Work)" [CHAR LIMIT=15]. -->
+    <string name="zen_mode_apps_work_app"><xliff:g id="app_label" example="Chrome">%s</xliff:g> (Work)</string>
     <!-- Text displayed (for a brief time) while the list of bypassing apps is being fetched. Will be replaced by a zen_mode_apps_subtext. [CHAR_LIMIT=60] -->
     <string name="zen_mode_apps_calculating">Calculating\u2026</string>
 
diff --git a/res/xml/accessibility_daltonizer_settings.xml b/res/xml/accessibility_daltonizer_settings.xml
index 1f77030..8dc5f3b 100644
--- a/res/xml/accessibility_daltonizer_settings.xml
+++ b/res/xml/accessibility_daltonizer_settings.xml
@@ -32,24 +32,28 @@
         android:key="daltonizer_mode_deuteranomaly"
         android:persistent="false"
         android:summary="@string/daltonizer_mode_deuteranomaly_summary"
-        android:title="@string/daltonizer_mode_deuteranomaly_title" />
+        android:title="@string/daltonizer_mode_deuteranomaly_title"
+        settings:controller="com.android.settings.accessibility.DaltonizerRadioButtonPreferenceController" />
 
     <com.android.settingslib.widget.SelectorWithWidgetPreference
         android:key="daltonizer_mode_protanomaly"
         android:persistent="false"
         android:summary="@string/daltonizer_mode_protanomaly_summary"
-        android:title="@string/daltonizer_mode_protanomaly_title" />
+        android:title="@string/daltonizer_mode_protanomaly_title"
+        settings:controller="com.android.settings.accessibility.DaltonizerRadioButtonPreferenceController" />
 
     <com.android.settingslib.widget.SelectorWithWidgetPreference
         android:key="daltonizer_mode_tritanomaly"
         android:persistent="false"
         android:summary="@string/daltonizer_mode_tritanomaly_summary"
-        android:title="@string/daltonizer_mode_tritanomaly_title" />
+        android:title="@string/daltonizer_mode_tritanomaly_title"
+        settings:controller="com.android.settings.accessibility.DaltonizerRadioButtonPreferenceController" />
 
     <com.android.settingslib.widget.SelectorWithWidgetPreference
         android:key="daltonizer_mode_grayscale"
         android:persistent="false"
-        android:title="@string/daltonizer_mode_grayscale_title" />
+        android:title="@string/daltonizer_mode_grayscale_title"
+        settings:controller="com.android.settings.accessibility.DaltonizerRadioButtonPreferenceController" />
 
     <com.android.settings.widget.SeekBarPreference
         android:key="daltonizer_saturation"
diff --git a/src/com/android/settings/accessibility/AvailableHearingDeviceUpdater.java b/src/com/android/settings/accessibility/AvailableHearingDeviceUpdater.java
index f600b03..31d069a 100644
--- a/src/com/android/settings/accessibility/AvailableHearingDeviceUpdater.java
+++ b/src/com/android/settings/accessibility/AvailableHearingDeviceUpdater.java
@@ -27,7 +27,7 @@
  */
 public class AvailableHearingDeviceUpdater extends AvailableMediaBluetoothDeviceUpdater {
 
-    private static final String PREF_KEY = "connected_hearing_device";
+    private static final String PREF_KEY_PREFIX = "connected_hearing_device_";
 
     public AvailableHearingDeviceUpdater(Context context,
             DevicePreferenceCallback devicePreferenceCallback, int metricsCategory) {
@@ -42,7 +42,7 @@
     }
 
     @Override
-    protected String getPreferenceKey() {
-        return PREF_KEY;
+    protected String getPreferenceKeyPrefix() {
+        return PREF_KEY_PREFIX;
     }
 }
diff --git a/src/com/android/settings/accessibility/DaltonizerRadioButtonPreferenceController.java b/src/com/android/settings/accessibility/DaltonizerRadioButtonPreferenceController.java
index 75d9229..296536c 100644
--- a/src/com/android/settings/accessibility/DaltonizerRadioButtonPreferenceController.java
+++ b/src/com/android/settings/accessibility/DaltonizerRadioButtonPreferenceController.java
@@ -19,17 +19,21 @@
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.res.Resources;
+import android.database.ContentObserver;
+import android.os.Handler;
+import android.os.Looper;
 import android.provider.Settings;
 import android.view.View;
 import android.view.accessibility.AccessibilityManager;
 
-import androidx.lifecycle.LifecycleObserver;
+import androidx.annotation.NonNull;
+import androidx.lifecycle.DefaultLifecycleObserver;
+import androidx.lifecycle.LifecycleOwner;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.R;
 import com.android.settings.core.BasePreferenceController;
-import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.widget.SelectorWithWidgetPreference;
 
 import com.google.common.primitives.Ints;
@@ -39,41 +43,36 @@
 
 /** Controller class that control radio button of accessibility daltonizer settings. */
 public class DaltonizerRadioButtonPreferenceController extends BasePreferenceController implements
-        LifecycleObserver, SelectorWithWidgetPreference.OnClickListener {
-    private static final String TYPE = Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER;
+        DefaultLifecycleObserver, SelectorWithWidgetPreference.OnClickListener {
+    private static final String DALTONIZER_TYPE_SETTINGS_KEY =
+            Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER;
 
     // pair the preference key and daltonizer value.
     private final Map<String, Integer> mAccessibilityDaltonizerKeyToValueMap = new HashMap<>();
 
     // RadioButtonPreference key, each preference represent a daltonizer value.
     private final ContentResolver mContentResolver;
+    private final ContentObserver mSettingsContentObserver;
     private final Resources mResources;
-    private DaltonizerRadioButtonPreferenceController.OnChangeListener mOnChangeListener;
     private SelectorWithWidgetPreference mPreference;
-    private int mAccessibilityDaltonizerValue;
 
     public DaltonizerRadioButtonPreferenceController(Context context, String preferenceKey) {
         super(context, preferenceKey);
-
         mContentResolver = context.getContentResolver();
         mResources = context.getResources();
+        mSettingsContentObserver = new ContentObserver(new Handler(Looper.getMainLooper())) {
+            @Override
+            public void onChange(boolean selfChange) {
+                if (mPreference != null) {
+                    updateState(mPreference);
+                }
+            }
+        };
     }
 
-    public DaltonizerRadioButtonPreferenceController(Context context, Lifecycle lifecycle,
-            String preferenceKey) {
-        super(context, preferenceKey);
-
-        mContentResolver = context.getContentResolver();
-        mResources = context.getResources();
-
-        if (lifecycle != null) {
-            lifecycle.addObserver(this);
-        }
-    }
-
-    protected static int getSecureAccessibilityDaltonizerValue(ContentResolver resolver,
-            String name) {
-        final String daltonizerStringValue = Settings.Secure.getString(resolver, name);
+    protected static int getSecureAccessibilityDaltonizerValue(ContentResolver resolver) {
+        final String daltonizerStringValue = Settings.Secure.getString(
+                resolver, DALTONIZER_TYPE_SETTINGS_KEY);
         if (daltonizerStringValue == null) {
             return AccessibilityManager.DALTONIZER_CORRECT_DEUTERANOMALY;
         }
@@ -82,13 +81,8 @@
                 : daltonizerIntValue;
     }
 
-    public void setOnChangeListener(
-            DaltonizerRadioButtonPreferenceController.OnChangeListener listener) {
-        mOnChangeListener = listener;
-    }
-
     private Map<String, Integer> getDaltonizerValueToKeyMap() {
-        if (mAccessibilityDaltonizerKeyToValueMap.size() == 0) {
+        if (mAccessibilityDaltonizerKeyToValueMap.isEmpty()) {
 
             final String[] daltonizerKeys = mResources.getStringArray(
                     R.array.daltonizer_mode_keys);
@@ -104,12 +98,8 @@
         return mAccessibilityDaltonizerKeyToValueMap;
     }
 
-    private void putSecureString(String name, String value) {
-        Settings.Secure.putString(mContentResolver, name, value);
-    }
-
     private void handlePreferenceChange(String value) {
-        putSecureString(TYPE, value);
+        Settings.Secure.putString(mContentResolver, DALTONIZER_TYPE_SETTINGS_KEY, value);
     }
 
     @Override
@@ -124,44 +114,38 @@
                 screen.findPreference(getPreferenceKey());
         mPreference.setOnClickListener(this);
         mPreference.setAppendixVisibility(View.GONE);
-        updateState(mPreference);
     }
 
     @Override
     public void onRadioButtonClicked(SelectorWithWidgetPreference preference) {
         final int value = getDaltonizerValueToKeyMap().get(mPreferenceKey);
         handlePreferenceChange(String.valueOf(value));
-        if (mOnChangeListener != null) {
-            mOnChangeListener.onCheckedChanged(mPreference);
-        }
     }
 
     private int getAccessibilityDaltonizerValue() {
-        final int daltonizerValue = getSecureAccessibilityDaltonizerValue(mContentResolver,
-                TYPE);
+        final int daltonizerValue = getSecureAccessibilityDaltonizerValue(mContentResolver);
         return daltonizerValue;
     }
 
-    protected void updatePreferenceCheckedState(int value) {
-        if (mAccessibilityDaltonizerValue == value) {
-            mPreference.setChecked(true);
-        }
-    }
-
     @Override
     public void updateState(Preference preference) {
         super.updateState(preference);
-        mAccessibilityDaltonizerValue = getAccessibilityDaltonizerValue();
-
-        // reset RadioButton
-        mPreference.setChecked(false);
+        final int daltonizerValueInSetting = getAccessibilityDaltonizerValue();
         final int preferenceValue = getDaltonizerValueToKeyMap().get(mPreference.getKey());
-        updatePreferenceCheckedState(preferenceValue);
+        mPreference.setChecked(preferenceValue == daltonizerValueInSetting);
     }
 
-    /** Listener interface handles checked event. */
-    public interface OnChangeListener {
-        /** A hook that is called when preference checked. */
-        void onCheckedChanged(Preference preference);
+    @Override
+    public void onResume(@NonNull LifecycleOwner owner) {
+        mContentResolver.registerContentObserver(
+                Settings.Secure.getUriFor(DALTONIZER_TYPE_SETTINGS_KEY),
+                /* notifyForDescendants= */ false,
+                mSettingsContentObserver
+        );
+    }
+
+    @Override
+    public void onPause(@NonNull LifecycleOwner owner) {
+        mContentResolver.unregisterContentObserver(mSettingsContentObserver);
     }
 }
diff --git a/src/com/android/settings/accessibility/SavedHearingDeviceUpdater.java b/src/com/android/settings/accessibility/SavedHearingDeviceUpdater.java
index 645d091..1de9c72 100644
--- a/src/com/android/settings/accessibility/SavedHearingDeviceUpdater.java
+++ b/src/com/android/settings/accessibility/SavedHearingDeviceUpdater.java
@@ -29,7 +29,7 @@
  */
 public class SavedHearingDeviceUpdater extends SavedBluetoothDeviceUpdater {
 
-    private static final String PREF_KEY = "saved_hearing_device";
+    private static final String PREF_KEY_PREFIX = "saved_hearing_device_";
 
     public SavedHearingDeviceUpdater(Context context,
             DevicePreferenceCallback devicePreferenceCallback, int metricsCategory) {
@@ -47,7 +47,7 @@
     }
 
     @Override
-    protected String getPreferenceKey() {
-        return PREF_KEY;
+    protected String getPreferenceKeyPrefix() {
+        return PREF_KEY_PREFIX;
     }
 }
diff --git a/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java
index 0cfa756..52f1695 100644
--- a/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java
@@ -24,8 +24,6 @@
 
 import android.app.settings.SettingsEnums;
 import android.content.ComponentName;
-import android.content.Context;
-import android.content.res.Resources;
 import android.os.Bundle;
 import android.provider.Settings;
 import android.view.LayoutInflater;
@@ -33,14 +31,11 @@
 import android.view.ViewGroup;
 
 import androidx.annotation.VisibleForTesting;
-import androidx.preference.Preference;
 
 import com.android.settings.R;
 import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.widget.SettingsMainSwitchPreference;
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.search.SearchIndexable;
 
 import java.util.ArrayList;
@@ -48,40 +43,18 @@
 
 /** Settings for daltonizer. */
 @SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
-public class ToggleDaltonizerPreferenceFragment extends ToggleFeaturePreferenceFragment
-        implements DaltonizerRadioButtonPreferenceController.OnChangeListener {
+public class ToggleDaltonizerPreferenceFragment extends ToggleFeaturePreferenceFragment {
 
     private static final String TAG = "ToggleDaltonizerPreferenceFragment";
     private static final String ENABLED = Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED;
     private static final String KEY_PREVIEW = "daltonizer_preview";
-    @VisibleForTesting
-    static final String KEY_DEUTERANOMALY = "daltonizer_mode_deuteranomaly";
-    @VisibleForTesting
-    static final String KEY_PROTANOMALY = "daltonizer_mode_protanomaly";
-    @VisibleForTesting
-    static final String KEY_TRITANOMEALY = "daltonizer_mode_tritanomaly";
-    @VisibleForTesting
-    static final String KEY_GRAYSCALE = "daltonizer_mode_grayscale";
+    private static final String KEY_DEUTERANOMALY = "daltonizer_mode_deuteranomaly";
+    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_SATURATION = "daltonizer_saturation";
 
-    private static final List<AbstractPreferenceController> sControllers = new ArrayList<>();
-
-    private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
-            Lifecycle lifecycle) {
-        if (sControllers.size() == 0) {
-            final Resources resources = context.getResources();
-            final String[] daltonizerKeys = resources.getStringArray(
-                    R.array.daltonizer_mode_keys);
-
-            for (String daltonizerKey : daltonizerKeys) {
-                sControllers.add(new DaltonizerRadioButtonPreferenceController(
-                        context, lifecycle, daltonizerKey));
-            }
-        }
-        return sControllers;
-    }
-
     @Override
     protected void registerKeysToObserverCallback(
             AccessibilitySettingsContentObserver contentObserver) {
@@ -117,13 +90,6 @@
         }
     }
 
-    @Override
-    public void onCheckedChanged(Preference preference) {
-        for (AbstractPreferenceController controller : sControllers) {
-            controller.updateState(preference);
-        }
-    }
-
     private void updateFooterPreference() {
         final String title = getPrefContext()
                 .getString(R.string.accessibility_daltonizer_about_title);
@@ -155,21 +121,6 @@
     public void onResume() {
         super.onResume();
         updateSwitchBarToggleSwitch();
-        for (AbstractPreferenceController controller :
-                buildPreferenceControllers(getPrefContext(), getSettingsLifecycle())) {
-            ((DaltonizerRadioButtonPreferenceController) controller).setOnChangeListener(this);
-            ((DaltonizerRadioButtonPreferenceController) controller).displayPreference(
-                    getPreferenceScreen());
-        }
-    }
-
-    @Override
-    public void onPause() {
-        for (AbstractPreferenceController controller :
-                buildPreferenceControllers(getPrefContext(), getSettingsLifecycle())) {
-            ((DaltonizerRadioButtonPreferenceController) controller).setOnChangeListener(null);
-        }
-        super.onPause();
     }
 
     @Override
diff --git a/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdater.java
index b361bd2..183de7f 100644
--- a/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdater.java
+++ b/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdater.java
@@ -35,7 +35,7 @@
     private static final String TAG = "AvailableMediaBluetoothDeviceUpdater";
     private static final boolean DBG = Log.isLoggable(BluetoothDeviceUpdater.TAG, Log.DEBUG);
 
-    private static final String PREF_KEY = "available_media_bt";
+    private static final String PREF_KEY_PREFIX = "available_media_bt_";
 
     private final AudioManager mAudioManager;
     private final LocalBluetoothManager mLocalBtManager;
@@ -141,8 +141,8 @@
     }
 
     @Override
-    protected String getPreferenceKey() {
-        return PREF_KEY;
+    protected String getPreferenceKeyPrefix() {
+        return PREF_KEY_PREFIX;
     }
 
     @Override
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
index 2e5daeb..91d7a2e 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
@@ -182,7 +182,15 @@
         }
 
         if (profile instanceof LeAudioProfile) {
-            profilePref.setVisible(mIsLeAudioToggleEnabled);
+            boolean showLeAudioToggle = mIsLeAudioToggleEnabled;
+            if (Flags.hideLeAudioToggleForLeAudioOnlyDevice() && mIsLeAudioOnlyDevice) {
+                showLeAudioToggle = false;
+                Log.d(
+                        TAG,
+                        "Hide LeAudio toggle for LeAudio-only Device: "
+                                + mCachedDevice.getDevice().getAnonymizedAddress());
+            }
+            profilePref.setVisible(showLeAudioToggle);
         }
 
         if (profile instanceof MapProfile) {
@@ -526,13 +534,6 @@
         boolean isLeEnabledByDefault =
                 SystemProperties.getBoolean(LE_AUDIO_CONNECTION_BY_DEFAULT_PROPERTY, true);
         mIsLeAudioToggleEnabled = isLeAudioToggleVisible || isLeEnabledByDefault;
-        if (Flags.hideLeAudioToggleForLeAudioOnlyDevice() && mIsLeAudioOnlyDevice) {
-            mIsLeAudioToggleEnabled = false;
-            Log.d(
-                    TAG,
-                    "Hide LeAudio toggle for LeAudio-only Device: "
-                            + mCachedDevice.getDevice().getAnonymizedAddress());
-        }
         Log.d(TAG, "BT_LE_AUDIO_CONTACT_SHARING_ENABLED:" + mIsLeContactSharingEnabled
                 + ", LE_AUDIO_TOGGLE_VISIBLE_PROPERTY:" + isLeAudioToggleVisible
                 + ", LE_AUDIO_CONNECTION_BY_DEFAULT_PROPERTY:" + isLeEnabledByDefault);
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java
index 4b21b2e..965bb94 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java
@@ -213,9 +213,9 @@
     public abstract boolean isFilterMatched(CachedBluetoothDevice cachedBluetoothDevice);
 
     /**
-     * Return a preference key for logging
+     * Return a preference key prefix for logging
      */
-    protected abstract String getPreferenceKey();
+    protected abstract String getPreferenceKeyPrefix();
 
     /**
      * Update whether to show {@link CachedBluetoothDevice} in the list.
@@ -248,7 +248,7 @@
                     new BluetoothDevicePreference(mPrefContext, cachedDevice,
                             true /* showDeviceWithoutNames */,
                             type);
-            btPreference.setKey(getPreferenceKey());
+            btPreference.setKey(getPreferenceKeyPrefix() + cachedDevice.hashCode());
             btPreference.setOnGearClickListener(mDeviceProfilesListener);
             if (this instanceof Preference.OnPreferenceClickListener) {
                 btPreference.setOnPreferenceClickListener(
diff --git a/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java
index d15696b..2107569 100644
--- a/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java
+++ b/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java
@@ -36,7 +36,7 @@
     private static final String TAG = "ConnBluetoothDeviceUpdater";
     private static final boolean DBG = Log.isLoggable(BluetoothDeviceUpdater.TAG, Log.DEBUG);
 
-    private static final String PREF_KEY = "connected_bt";
+    private static final String PREF_KEY_PREFIX = "connected_bt_";
 
     private final AudioManager mAudioManager;
 
@@ -126,8 +126,8 @@
     }
 
     @Override
-    protected String getPreferenceKey() {
-        return PREF_KEY;
+    protected String getPreferenceKeyPrefix() {
+        return PREF_KEY_PREFIX;
     }
 
     @Override
diff --git a/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java
index ed1be7a..d7c0366 100644
--- a/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java
+++ b/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java
@@ -41,7 +41,7 @@
 
     private static final String TAG = "SavedBluetoothDeviceUpdater";
 
-    private static final String PREF_KEY = "saved_bt";
+    private static final String PREF_KEY_PREFIX = "saved_bt_";
 
     private final boolean mShowConnectedDevice;
 
@@ -134,8 +134,8 @@
     }
 
     @Override
-    protected String getPreferenceKey() {
-        return PREF_KEY;
+    protected String getPreferenceKeyPrefix() {
+        return PREF_KEY_PREFIX;
     }
 
     @Override
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBluetoothDeviceUpdater.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBluetoothDeviceUpdater.java
index 4d7e699..21eb4d1 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBluetoothDeviceUpdater.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBluetoothDeviceUpdater.java
@@ -21,6 +21,7 @@
 import android.util.Log;
 
 import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
 
 import com.android.settings.bluetooth.BluetoothDeviceUpdater;
@@ -35,7 +36,8 @@
 
     private static final String TAG = "AudioSharingBluetoothDeviceUpdater";
 
-    private static final String PREF_KEY = "audio_sharing_bt";
+    @VisibleForTesting
+    static final String PREF_KEY_PREFIX = "audio_sharing_bt_";
 
     @Nullable private LocalBluetoothManager mLocalBtManager;
 
@@ -76,8 +78,8 @@
     }
 
     @Override
-    protected String getPreferenceKey() {
-        return PREF_KEY;
+    protected String getPreferenceKeyPrefix() {
+        return PREF_KEY_PREFIX;
     }
 
     @Override
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceVolumeControlUpdater.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceVolumeControlUpdater.java
index 660229d..0fbb892 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceVolumeControlUpdater.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceVolumeControlUpdater.java
@@ -25,6 +25,7 @@
 import android.widget.SeekBar;
 
 import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
 
 import com.android.settings.bluetooth.BluetoothDevicePreference;
@@ -41,7 +42,8 @@
 
     private static final String TAG = "AudioSharingDeviceVolumeControlUpdater";
 
-    private static final String PREF_KEY = "audio_sharing_volume_control";
+    @VisibleForTesting
+    static final String PREF_KEY_PREFIX = "audio_sharing_volume_control_";
 
     @Nullable private final LocalBluetoothManager mBtManager;
     @Nullable private final VolumeControlProfile mVolumeControl;
@@ -119,7 +121,7 @@
                     new AudioSharingDeviceVolumePreference(mPrefContext, cachedDevice);
             vPreference.initialize();
             vPreference.setOnSeekBarChangeListener(listener);
-            vPreference.setKey(getPreferenceKey());
+            vPreference.setKey(getPreferenceKeyPrefix() + cachedDevice.hashCode());
             vPreference.setIcon(com.android.settingslib.R.drawable.ic_bt_untethered_earbuds);
             vPreference.setTitle(cachedDevice.getName());
             mPreferenceMap.put(device, vPreference);
@@ -128,8 +130,8 @@
     }
 
     @Override
-    protected String getPreferenceKey() {
-        return PREF_KEY;
+    protected String getPreferenceKeyPrefix() {
+        return PREF_KEY_PREFIX;
     }
 
     @Override
diff --git a/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceController.java b/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceController.java
index 810b1b5..9c3f267 100644
--- a/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceController.java
+++ b/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceController.java
@@ -19,28 +19,32 @@
 import static android.app.NotificationManager.INTERRUPTION_FILTER_ALL;
 import static android.provider.Settings.EXTRA_AUTOMATIC_ZEN_RULE_ID;
 
+import android.app.Application;
 import android.content.Context;
 import android.os.Bundle;
+import android.os.UserHandle;
+import android.os.UserManager;
 import android.text.TextUtils;
-import android.util.ArraySet;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
-import androidx.core.text.BidiFormatter;
 import androidx.fragment.app.Fragment;
 import androidx.preference.Preference;
 
 import com.android.settings.R;
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settingslib.applications.ApplicationsState;
+import com.android.settingslib.applications.ApplicationsState.AppEntry;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Multimap;
+
 import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.Comparator;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
 
 /**
  * Preference with a link and summary about what apps can break through the mode
@@ -51,6 +55,7 @@
 
     private final ZenModeSummaryHelper mSummaryHelper;
     private final ApplicationsState mApplicationsState;
+    private final UserManager mUserManager;
     private ApplicationsState.Session mAppSession;
     private final ZenHelperBackend mHelperBackend;
     private ZenMode mZenMode;
@@ -58,12 +63,21 @@
     private final Fragment mHost;
 
     ZenModeAppsLinkPreferenceController(Context context, String key, Fragment host,
+            ZenModesBackend backend, ZenHelperBackend helperBackend) {
+        this(context, key, host,
+                ApplicationsState.getInstance((Application) context.getApplicationContext()),
+                backend, helperBackend);
+    }
+
+    @VisibleForTesting
+    ZenModeAppsLinkPreferenceController(Context context, String key, Fragment host,
             ApplicationsState applicationsState, ZenModesBackend backend,
             ZenHelperBackend helperBackend) {
         super(context, key, backend);
         mSummaryHelper = new ZenModeSummaryHelper(mContext, helperBackend);
         mHelperBackend = helperBackend;
         mApplicationsState = applicationsState;
+        mUserManager = context.getSystemService(UserManager.class);
         mHost = host;
     }
 
@@ -90,10 +104,10 @@
         if (mApplicationsState != null && mHost != null) {
             mAppSession = mApplicationsState.newSession(mAppSessionCallbacks, mHost.getLifecycle());
         }
-        triggerUpdateAppsBypassingDndSummaryText();
+        triggerUpdateAppsBypassingDnd();
     }
 
-    private void triggerUpdateAppsBypassingDndSummaryText() {
+    private void triggerUpdateAppsBypassingDnd() {
         if (mAppSession == null) {
             return;
         }
@@ -108,31 +122,28 @@
         mAppSession.rebuild(filter, ApplicationsState.ALPHA_COMPARATOR, false);
     }
 
-    private void updateAppsBypassingDndSummaryText(List<ApplicationsState.AppEntry> apps) {
-        Set<String> appNames = getAppsBypassingDnd(apps);
-        mPreference.setSummary(mSummaryHelper.getAppsSummary(mZenMode, appNames));
+    private void displayAppsBypassingDnd(List<AppEntry> allApps) {
+        ImmutableList<AppEntry> apps = getAppsBypassingDndSortedByName(allApps);
+
+        mPreference.setSummary(mSummaryHelper.getAppsSummary(mZenMode, apps));
     }
 
     @VisibleForTesting
-    ArraySet<String> getAppsBypassingDnd(@NonNull List<ApplicationsState.AppEntry> apps) {
-        ArraySet<String> appsBypassingDnd = new ArraySet<>();
+    ImmutableList<AppEntry> getAppsBypassingDndSortedByName(@NonNull List<AppEntry> allApps) {
+        Multimap<Integer, String> packagesBypassingDnd = HashMultimap.create();
+        for (UserHandle userHandle : mUserManager.getUserProfiles()) {
+            packagesBypassingDnd.putAll(userHandle.getIdentifier(),
+                    mHelperBackend.getPackagesBypassingDnd(userHandle.getIdentifier(),
+                            /* includeConversationChannels= */ false));
+        }
 
-        Map<String, String> pkgLabelMap = new HashMap<String, String>();
-        for (ApplicationsState.AppEntry entry : apps) {
-            if (entry.info != null) {
-                pkgLabelMap.put(entry.info.packageName, entry.label);
-            }
-        }
-        for (String pkg : mHelperBackend.getPackagesBypassingDnd(mContext.getUserId(),
-                /* includeConversationChannels= */ false)) {
-            // Settings may hide some packages from the user, so if they're not present here
-            // we skip displaying them, even if they bypass dnd.
-            if (pkgLabelMap.get(pkg) == null) {
-                continue;
-            }
-            appsBypassingDnd.add(BidiFormatter.getInstance().unicodeWrap(pkgLabelMap.get(pkg)));
-        }
-        return appsBypassingDnd;
+        return ImmutableList.copyOf(
+                allApps.stream()
+                        .filter(app -> packagesBypassingDnd.containsEntry(
+                                UserHandle.getUserId(app.info.uid), app.info.packageName))
+                        .sorted(Comparator.comparing((AppEntry app) -> app.label)
+                                .thenComparing(app -> UserHandle.getUserId(app.info.uid)))
+                        .toList());
     }
 
     @VisibleForTesting
@@ -145,12 +156,12 @@
 
                 @Override
                 public void onPackageListChanged() {
-                    triggerUpdateAppsBypassingDndSummaryText();
+                    triggerUpdateAppsBypassingDnd();
                 }
 
                 @Override
                 public void onRebuildComplete(ArrayList<ApplicationsState.AppEntry> apps) {
-                    updateAppsBypassingDndSummaryText(apps);
+                    displayAppsBypassingDnd(apps);
                 }
 
                 @Override
@@ -171,7 +182,7 @@
 
                 @Override
                 public void onLoadEntriesCompleted() {
-                    triggerUpdateAppsBypassingDndSummaryText();
+                    triggerUpdateAppsBypassingDnd();
                 }
             };
 }
diff --git a/src/com/android/settings/notification/modes/ZenModeFragment.java b/src/com/android/settings/notification/modes/ZenModeFragment.java
index c5b52a9..7d7631b 100644
--- a/src/com/android/settings/notification/modes/ZenModeFragment.java
+++ b/src/com/android/settings/notification/modes/ZenModeFragment.java
@@ -17,7 +17,6 @@
 package com.android.settings.notification.modes;
 
 import android.app.AlertDialog;
-import android.app.Application;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.view.Menu;
@@ -29,7 +28,6 @@
 import androidx.core.view.MenuProvider;
 
 import com.android.settings.R;
-import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.notification.modes.ZenMode;
 
@@ -58,9 +56,7 @@
         prefControllers.add(new ZenModePeopleLinkPreferenceController(
                 context, "zen_mode_people", mHelperBackend));
         prefControllers.add(new ZenModeAppsLinkPreferenceController(
-                context, "zen_mode_apps", this,
-                ApplicationsState.getInstance((Application) context.getApplicationContext()),
-                mBackend, mHelperBackend));
+                context, "zen_mode_apps", this, mBackend, mHelperBackend));
         prefControllers.add(new ZenModeOtherLinkPreferenceController(
                 context, "zen_other_settings", mHelperBackend));
         prefControllers.add(new ZenModeDisplayLinkPreferenceController(
diff --git a/src/com/android/settings/notification/modes/ZenModeSummaryHelper.java b/src/com/android/settings/notification/modes/ZenModeSummaryHelper.java
index 00d0eef..26de9ee 100644
--- a/src/com/android/settings/notification/modes/ZenModeSummaryHelper.java
+++ b/src/com/android/settings/notification/modes/ZenModeSummaryHelper.java
@@ -49,17 +49,18 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.core.text.BidiFormatter;
 
 import com.android.settings.R;
+import com.android.settingslib.applications.ApplicationsState.AppEntry;
 import com.android.settingslib.notification.modes.ZenMode;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-import java.util.Set;
 import java.util.function.Predicate;
 
 class ZenModeSummaryHelper {
@@ -412,7 +413,7 @@
      * on the given mode and provided set of apps.
      */
     public @NonNull String getAppsSummary(@NonNull ZenMode zenMode,
-            @Nullable Set<String> appsBypassing) {
+            @Nullable List<AppEntry> appsBypassing) {
         if (zenMode.getPolicy().getAllowedChannels() == ZenPolicy.CHANNEL_POLICY_PRIORITY) {
             return formatAppsList(appsBypassing);
         } else if (zenMode.getPolicy().getAllowedChannels() == ZenPolicy.CHANNEL_POLICY_NONE) {
@@ -424,28 +425,34 @@
     /**
      * Generates a formatted string declaring which apps can interrupt in the style of
      * "App, App2, and 4 more can interrupt."
-     * Apps selected for explicit mention are selected in order from the provided set sorted
-     * alphabetically.
+     * Apps selected for explicit mention are picked in order from the provided list.
      */
-    public @NonNull String formatAppsList(@Nullable Set<String> appsBypassingDnd) {
+    @VisibleForTesting
+    public @NonNull String formatAppsList(@Nullable List<AppEntry> appsBypassingDnd) {
         if (appsBypassingDnd == null) {
             return mContext.getResources().getString(R.string.zen_mode_apps_priority_apps);
         }
-        final int numAppsBypassingDnd = appsBypassingDnd.size();
-        String[] appsBypassingDndArr = appsBypassingDnd.toArray(new String[numAppsBypassingDnd]);
-        // Sorts the provided apps alphabetically.
-        Arrays.sort(appsBypassingDndArr);
+        List<String> appNames = appsBypassingDnd.stream().limit(3)
+                .map(app -> {
+                    String appName = BidiFormatter.getInstance().unicodeWrap(app.label);
+                    if (app.isManagedProfile()) {
+                        appName = mContext.getString(R.string.zen_mode_apps_work_app, appName);
+                    }
+                    return appName;
+                })
+                .toList();
+
         MessageFormat msgFormat = new MessageFormat(
                 mContext.getString(R.string.zen_mode_apps_subtext),
                 Locale.getDefault());
         Map<String, Object> args = new HashMap<>();
-        args.put("count", numAppsBypassingDnd);
-        if (numAppsBypassingDnd >= 1) {
-            args.put("app_1", appsBypassingDndArr[0]);
-            if (numAppsBypassingDnd >= 2) {
-                args.put("app_2", appsBypassingDndArr[1]);
-                if (numAppsBypassingDnd == 3) {
-                    args.put("app_3", appsBypassingDndArr[2]);
+        args.put("count", appsBypassingDnd.size());
+        if (appNames.size() >= 1) {
+            args.put("app_1", appNames.get(0));
+            if (appNames.size() >= 2) {
+                args.put("app_2", appNames.get(1));
+                if (appNames.size() == 3) {
+                    args.put("app_3", appNames.get(2));
                 }
             }
         }
diff --git a/tests/robotests/src/com/android/settings/accessibility/DaltonizerRadioButtonPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/DaltonizerRadioButtonPreferenceControllerTest.java
index 28954c5..56c0842 100644
--- a/tests/robotests/src/com/android/settings/accessibility/DaltonizerRadioButtonPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/DaltonizerRadioButtonPreferenceControllerTest.java
@@ -18,61 +18,65 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.atLeastOnce;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
 import android.content.Context;
 import android.provider.Settings;
 
-import androidx.preference.Preference;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.PreferenceManager;
 import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
 
+import com.android.settings.R;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.widget.SelectorWithWidgetPreference;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadows.ShadowLooper;
 
+/**
+ * Tests for {@link DaltonizerRadioButtonPreferenceController}
+ */
 @RunWith(RobolectricTestRunner.class)
-public class DaltonizerRadioButtonPreferenceControllerTest implements
-        DaltonizerRadioButtonPreferenceController.OnChangeListener {
-    private static final String PREF_KEY = "daltonizer_mode_protanomaly";
-    private static final String PREF_VALUE = "11";
-    private static final String PREF_FAKE_VALUE = "-1";
+public class DaltonizerRadioButtonPreferenceControllerTest {
+    private static final int DALTONIZER_MODE_INDEX = 0;
+    private static final String PREF_INVALID_VALUE = "-1";
 
+    private final Context mContext = ApplicationProvider.getApplicationContext();
+    private final String mPrefKey =
+            mContext.getResources()
+                    .getStringArray(R.array.daltonizer_mode_keys)[DALTONIZER_MODE_INDEX];
+    private final String mPrefValue =
+            String.valueOf(mContext.getResources()
+                    .getIntArray(R.array.daltonizer_type_values)[DALTONIZER_MODE_INDEX]);
     private DaltonizerRadioButtonPreferenceController mController;
-
-    @Mock
-    private SelectorWithWidgetPreference mMockPref;
-    private Context mContext;
-
-    @Mock
+    private SelectorWithWidgetPreference mPreference;
     private PreferenceScreen mScreen;
 
+    private LifecycleOwner mLifecycleOwner;
+    private Lifecycle mLifecycle;
+
     @Before
     public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mContext = RuntimeEnvironment.application;
-        mController = new DaltonizerRadioButtonPreferenceController(mContext, mock(Lifecycle.class),
-                PREF_KEY);
-        mController.setOnChangeListener(this);
-
-        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mMockPref);
-        when(mMockPref.getKey()).thenReturn(PREF_KEY);
+        // initialize the value as unchecked
+        Settings.Secure.putString(mContext.getContentResolver(),
+                Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, PREF_INVALID_VALUE);
+        mController = new DaltonizerRadioButtonPreferenceController(mContext, mPrefKey);
+        mPreference = new SelectorWithWidgetPreference(mContext);
+        mPreference.setKey(mPrefKey);
+        mScreen = new PreferenceManager(mContext).createPreferenceScreen(mContext);
+        mScreen.addPreference(mPreference);
         mController.displayPreference(mScreen);
+        mLifecycleOwner = () -> mLifecycle;
+        mLifecycle = new Lifecycle(mLifecycleOwner);
     }
 
-    @Override
-    public void onCheckedChanged(Preference preference) {
-        mController.updateState(preference);
+    @After
+    public void cleanUp() {
+        mLifecycle.removeObserver(mController);
     }
 
     @Test
@@ -81,36 +85,62 @@
     }
 
     @Test
-    public void updateState_notChecked() {
+    public void updateState_valueNotMatched_notChecked() {
         Settings.Secure.putString(mContext.getContentResolver(),
-                Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, PREF_FAKE_VALUE);
+                Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, PREF_INVALID_VALUE);
 
-        mController.updateState(mMockPref);
+        mController.updateState(mPreference);
 
-        // the first checked state is set to false by control
-        verify(mMockPref, atLeastOnce()).setChecked(false);
-        verify(mMockPref, never()).setChecked(true);
+        assertThat(mPreference.isChecked()).isFalse();
     }
 
     @Test
-    public void updateState_checked() {
+    public void updateState_valueMatched_checked() {
         Settings.Secure.putString(mContext.getContentResolver(),
-                Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, PREF_VALUE);
+                Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, mPrefValue);
 
-        mController.updateState(mMockPref);
+        mController.updateState(mPreference);
 
-        // the first checked state is set to false by control
-        verify(mMockPref, atLeastOnce()).setChecked(false);
-        verify(mMockPref, atLeastOnce()).setChecked(true);
+        assertThat(mPreference.isChecked()).isTrue();
     }
 
     @Test
     public void onRadioButtonClick_shouldReturnDaltonizerValue() {
-        mController.onRadioButtonClicked(mMockPref);
+        mController.onRadioButtonClicked(mPreference);
+
         final String accessibilityDaltonizerValue = Settings.Secure.getString(
                 mContext.getContentResolver(),
                 Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER);
+        assertThat(accessibilityDaltonizerValue).isEqualTo(mPrefValue);
+    }
 
-        assertThat(accessibilityDaltonizerValue).isEqualTo(PREF_VALUE);
+    @Test
+    public void onResume_settingsValueChangedToUnmatch_preferenceBecomesUnchecked() {
+        Settings.Secure.putString(mContext.getContentResolver(),
+                Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, mPrefValue);
+        mController.updateState(mPreference);
+        assertThat(mPreference.isChecked()).isTrue();
+        mLifecycle.addObserver(mController);
+
+        mLifecycle.handleLifecycleEvent(androidx.lifecycle.Lifecycle.Event.ON_RESUME);
+        Settings.Secure.putString(mContext.getContentResolver(),
+                Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, PREF_INVALID_VALUE);
+        ShadowLooper.idleMainLooper();
+
+        assertThat(mPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void onPause_settingsValueChangedAndMatch_preferenceStateNotUpdated() {
+        assertThat(mPreference.isChecked()).isFalse();
+        mLifecycle.addObserver(mController);
+        mLifecycle.handleLifecycleEvent(androidx.lifecycle.Lifecycle.Event.ON_RESUME);
+
+        mLifecycle.handleLifecycleEvent(androidx.lifecycle.Lifecycle.Event.ON_PAUSE);
+        Settings.Secure.putString(mContext.getContentResolver(),
+                Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, mPrefValue);
+        ShadowLooper.idleMainLooper();
+
+        assertThat(mPreference.isChecked()).isFalse();
     }
 }
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragmentTest.java
index 850d1d79..a5bfec2 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragmentTest.java
@@ -18,53 +18,34 @@
 
 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_DEUTERANOMALY;
-import static com.android.settings.accessibility.ToggleDaltonizerPreferenceFragment.KEY_GRAYSCALE;
-import static com.android.settings.accessibility.ToggleDaltonizerPreferenceFragment.KEY_PROTANOMALY;
-import static com.android.settings.accessibility.ToggleDaltonizerPreferenceFragment.KEY_TRITANOMEALY;
 import static com.android.settings.accessibility.ToggleDaltonizerPreferenceFragment.KEY_USE_SERVICE_PREFERENCE;
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
 import android.app.settings.SettingsEnums;
-import android.content.ComponentName;
 import android.content.Context;
+import android.content.Intent;
 import android.os.Bundle;
 import android.platform.test.annotations.DisableFlags;
 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;
-import androidx.preference.PreferenceManager;
-import androidx.preference.PreferenceScreen;
+import androidx.fragment.app.Fragment;
 import androidx.test.core.app.ApplicationProvider;
 
 import com.android.settings.R;
-import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType;
+import com.android.settings.SettingsActivity;
 import com.android.settings.testutils.XmlTestUtils;
-import com.android.settings.testutils.shadow.ShadowFragment;
 import com.android.settings.widget.SettingsMainSwitchPreference;
-import com.android.settingslib.widget.SelectorWithWidgetPreference;
 
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
+import org.robolectric.android.controller.ActivityController;
 import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowApplication;
 
@@ -72,89 +53,52 @@
 
 /** Tests for {@link ToggleDaltonizerPreferenceFragment} */
 @RunWith(RobolectricTestRunner.class)
-@Config(shadows = ShadowFragment.class)
 public class ToggleDaltonizerPreferenceFragmentTest {
     @Rule
     public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
     private final Context mContext = ApplicationProvider.getApplicationContext();
-    private TestToggleDaltonizerPreferenceFragment mFragment;
-    private PreferenceScreen mScreen;
-    private SettingsMainSwitchPreference mSwitchPreference;
-
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private PreferenceManager mPreferenceManager;
-    @Mock
-    private SelectorWithWidgetPreference mMockDeuteranomalyPref;
-    @Mock
-    private SelectorWithWidgetPreference mMockProtanomalyPref;
-    @Mock
-    private SelectorWithWidgetPreference mMockTritanomalyPref;
-    @Mock
-    private SelectorWithWidgetPreference mMockGrayscalePref;
-    @Mock
-    private FragmentActivity mActivity;
+    private ActivityController<SettingsActivity> mActivityController;
 
     @Before
-    public void setUpTestFragment() {
-        MockitoAnnotations.initMocks(this);
+    public void setUp() {
+        Intent intent = new Intent();
+        intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT,
+                ToggleDaltonizerPreferenceFragment.class.getName());
+        intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS, new Bundle());
 
-        mFragment = spy(new TestToggleDaltonizerPreferenceFragment(mContext));
-        when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
-        when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext);
-        when(mFragment.getContext()).thenReturn(mContext);
-        when(mFragment.getActivity()).thenReturn(mActivity);
-        when(mActivity.getContentResolver()).thenReturn(mContext.getContentResolver());
-
-        mScreen = spy(new PreferenceScreen(mContext, /* attrs= */ null));
-        when(mScreen.findPreference(KEY_USE_SERVICE_PREFERENCE))
-                .thenReturn(mFragment.mToggleServiceSwitchPreference);
-        when(mScreen.findPreference(KEY_DEUTERANOMALY)).thenReturn(mMockDeuteranomalyPref);
-        when(mMockDeuteranomalyPref.getKey()).thenReturn(KEY_DEUTERANOMALY);
-        when(mScreen.findPreference(KEY_PROTANOMALY)).thenReturn(mMockProtanomalyPref);
-        when(mMockProtanomalyPref.getKey()).thenReturn(KEY_PROTANOMALY);
-        when(mScreen.findPreference(KEY_TRITANOMEALY)).thenReturn(mMockTritanomalyPref);
-        when(mMockTritanomalyPref.getKey()).thenReturn(KEY_TRITANOMEALY);
-        when(mScreen.findPreference(KEY_GRAYSCALE)).thenReturn(mMockGrayscalePref);
-        when(mMockGrayscalePref.getKey()).thenReturn(KEY_GRAYSCALE);
-        when(mScreen.getPreferenceManager()).thenReturn(mPreferenceManager);
-        doReturn(mScreen).when(mFragment).getPreferenceScreen();
-
-        mSwitchPreference = mScreen.findPreference(KEY_USE_SERVICE_PREFERENCE);
+        mActivityController = ActivityController.of(new SettingsActivity(), intent);
     }
 
     @Test
     public void onResume_colorCorrectEnabled_shouldReturnTrue() {
         Settings.Secure.putInt(mContext.getContentResolver(),
                 Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, ON);
-        mFragment.onAttach(mContext);
-        mFragment.onCreate(Bundle.EMPTY);
 
-        mFragment.onResume();
+        ToggleDaltonizerPreferenceFragment fragment = getFragmentInResumedState();
 
-        assertThat(mSwitchPreference.isChecked()).isTrue();
+        SettingsMainSwitchPreference switchPreference = getMainFeatureToggle(fragment);
+        assertThat(switchPreference.isChecked()).isTrue();
     }
 
     @Test
     public void onResume_colorCorrectDisabled_shouldReturnFalse() {
         Settings.Secure.putInt(mContext.getContentResolver(),
                 Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, OFF);
-        mFragment.onAttach(mContext);
-        mFragment.onCreate(Bundle.EMPTY);
 
-        mFragment.onResume();
+        ToggleDaltonizerPreferenceFragment fragment = getFragmentInResumedState();
 
-        assertThat(mSwitchPreference.isChecked()).isFalse();
+        SettingsMainSwitchPreference switchPreference = getMainFeatureToggle(fragment);
+        assertThat(switchPreference.isChecked()).isFalse();
     }
 
     @Test
     public void onResume_colorCorrectEnabled_switchPreferenceChecked_notShowTooltips() {
         Settings.Secure.putInt(mContext.getContentResolver(),
                 Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, ON);
-        mSwitchPreference.setChecked(true);
-        mFragment.onAttach(mContext);
-        mFragment.onCreate(Bundle.EMPTY);
 
-        mFragment.onResume();
+        ToggleDaltonizerPreferenceFragment fragment = getFragmentInResumedState();
+        SettingsMainSwitchPreference switchPreference = getMainFeatureToggle(fragment);
+        assertThat(switchPreference.isChecked()).isTrue();
 
         assertThat(getLatestPopupWindow()).isNull();
     }
@@ -164,12 +108,10 @@
     public void onPreferenceToggled_colorCorrectDisabled_shouldReturnTrueAndShowTooltipView() {
         Settings.Secure.putInt(mContext.getContentResolver(),
                 Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, OFF);
-        mSwitchPreference.setChecked(false);
-        mFragment.onAttach(mContext);
-        mFragment.onCreateView(LayoutInflater.from(mContext), mock(ViewGroup.class), Bundle.EMPTY);
-        mFragment.onViewCreated(mFragment.getView(), Bundle.EMPTY);
+        ToggleDaltonizerPreferenceFragment fragment = getFragmentInResumedState();
+        SettingsMainSwitchPreference switchPreference = getMainFeatureToggle(fragment);
 
-        mFragment.onPreferenceToggled(mSwitchPreference.getKey(), true);
+        fragment.onPreferenceToggled(switchPreference.getKey(), true);
 
         final boolean isEnabled = Settings.Secure.getInt(mContext.getContentResolver(),
                 Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, OFF) == ON;
@@ -182,11 +124,10 @@
     public void onPreferenceToggled_colorCorrectEnabled_shouldReturnFalseAndNotShowTooltipView() {
         Settings.Secure.putInt(mContext.getContentResolver(),
                 Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, ON);
-        mSwitchPreference.setChecked(true);
-        mFragment.onAttach(mContext);
-        mFragment.onCreate(Bundle.EMPTY);
+        ToggleDaltonizerPreferenceFragment fragment = getFragmentInResumedState();
+        SettingsMainSwitchPreference switchPreference = getMainFeatureToggle(fragment);
 
-        mFragment.onPreferenceToggled(mSwitchPreference.getKey(), false);
+        fragment.onPreferenceToggled(switchPreference.getKey(), false);
 
         final boolean isEnabled = Settings.Secure.getInt(mContext.getContentResolver(),
                 Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, OFF) == ON;
@@ -196,19 +137,25 @@
 
     @Test
     public void getMetricsCategory_returnsCorrectCategory() {
-        assertThat(mFragment.getMetricsCategory()).isEqualTo(
+        ToggleDaltonizerPreferenceFragment fragment = getFragmentInResumedState();
+
+        assertThat(fragment.getMetricsCategory()).isEqualTo(
                 SettingsEnums.ACCESSIBILITY_TOGGLE_DALTONIZER);
     }
 
     @Test
     public void getPreferenceScreenResId_returnsCorrectXml() {
-        assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(
+        ToggleDaltonizerPreferenceFragment fragment = getFragmentInResumedState();
+
+        assertThat(fragment.getPreferenceScreenResId()).isEqualTo(
                 R.xml.accessibility_daltonizer_settings);
     }
 
     @Test
     public void getHelpResource_returnsCorrectHelpResource() {
-        assertThat(mFragment.getHelpResource()).isEqualTo(R.string.help_url_color_correction);
+        ToggleDaltonizerPreferenceFragment fragment = getFragmentInResumedState();
+
+        assertThat(fragment.getHelpResource()).isEqualTo(R.string.help_url_color_correction);
     }
 
     @Test
@@ -228,55 +175,20 @@
         return shadowApplication.getLatestPopupWindow();
     }
 
-    private static class TestToggleDaltonizerPreferenceFragment extends
-            ToggleDaltonizerPreferenceFragment {
-        private static final String PLACEHOLDER_PACKAGE_NAME = "com.placeholder.example";
-        private static final String PLACEHOLDER_CLASS_NAME =
-                PLACEHOLDER_PACKAGE_NAME + ".placeholder";
-        private static final ComponentName PLACEHOLDER_COMPONENT_NAME = new ComponentName(
-                PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_CLASS_NAME);
-        private static final String PLACEHOLDER_TILE_TOOLTIP_CONTENT =
-                PLACEHOLDER_PACKAGE_NAME + "tooltip_content";
+    private ToggleDaltonizerPreferenceFragment getFragmentInResumedState() {
 
-        TestToggleDaltonizerPreferenceFragment(Context context) {
-            super();
-            mComponentName = PLACEHOLDER_COMPONENT_NAME;
-            final SettingsMainSwitchPreference switchPreference =
-                    new SettingsMainSwitchPreference(context);
-            switchPreference.setKey(KEY_USE_SERVICE_PREFERENCE);
-            mToggleServiceSwitchPreference = switchPreference;
-            setArguments(new Bundle());
-        }
+        mActivityController.create().start().resume();
+        Fragment fragment = mActivityController.get().getSupportFragmentManager().findFragmentById(
+                R.id.main_content);
 
-        @Override
-        public void onViewCreated(View view, Bundle savedInstanceState) {
-            // do nothing
-        }
+        assertThat(fragment).isNotNull();
+        assertThat(fragment).isInstanceOf(ToggleDaltonizerPreferenceFragment.class);
 
-        @Override
-        public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                Bundle savedInstanceState) {
-            return mock(View.class);
-        }
+        return (ToggleDaltonizerPreferenceFragment) fragment;
+    }
 
-        @Override
-        protected void updateShortcutPreference() {
-            // UI related function, do nothing in tests
-        }
-
-        @Override
-        ComponentName getTileComponentName() {
-            return PLACEHOLDER_COMPONENT_NAME;
-        }
-
-        @Override
-        protected CharSequence getTileTooltipContent(@QuickSettingsTooltipType int type) {
-            return PLACEHOLDER_TILE_TOOLTIP_CONTENT;
-        }
-
-        @Override
-        public View getView() {
-            return mock(View.class);
-        }
+    private SettingsMainSwitchPreference getMainFeatureToggle(
+            ToggleDaltonizerPreferenceFragment fragment) {
+        return fragment.findPreference(KEY_USE_SERVICE_PREFERENCE);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java
index d165aa5..4bfe335 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java
@@ -275,7 +275,7 @@
         }
 
         @Override
-        protected String getPreferenceKey() {
+        protected String getPreferenceKeyPrefix() {
             return "test_bt";
         }
     }
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 785b1dc..879c6a4 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBluetoothDeviceUpdaterTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBluetoothDeviceUpdaterTest.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.connecteddevice.audiosharing;
 
+import static com.android.settings.connecteddevice.audiosharing.AudioSharingBluetoothDeviceUpdater.PREF_KEY_PREFIX;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -85,7 +87,6 @@
 public class AudioSharingBluetoothDeviceUpdaterTest {
     private static final String MAC_ADDRESS = "04:52:C7:0B:D8:3C";
     private static final String TEST_DEVICE_NAME = "test";
-    private static final String PREF_KEY = "audio_sharing_bt";
     private static final String TAG = "AudioSharingBluetoothDeviceUpdater";
 
     @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
@@ -263,7 +264,7 @@
 
     @Test
     public void getPreferenceKey_returnsCorrectKey() {
-        assertThat(mDeviceUpdater.getPreferenceKey()).isEqualTo(PREF_KEY);
+        assertThat(mDeviceUpdater.getPreferenceKeyPrefix()).isEqualTo(PREF_KEY_PREFIX);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceVolumeControlUpdaterTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceVolumeControlUpdaterTest.java
index e7cfb85..3c12946 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceVolumeControlUpdaterTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceVolumeControlUpdaterTest.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.connecteddevice.audiosharing;
 
+import static com.android.settings.connecteddevice.audiosharing.AudioSharingDeviceVolumeControlUpdater.PREF_KEY_PREFIX;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -79,7 +81,6 @@
 public class AudioSharingDeviceVolumeControlUpdaterTest {
     private static final String TEST_DEVICE_NAME = "test";
     private static final String TAG = "AudioSharingDeviceVolumeControlUpdater";
-    private static final String PREF_KEY = "audio_sharing_volume_control";
     private static final String TEST_SETTINGS_KEY =
             "bluetooth_le_broadcast_fallback_active_group_id";
     private static final int TEST_DEVICE_GROUP_ID = 1;
@@ -326,7 +327,7 @@
 
     @Test
     public void getPreferenceKey_returnsCorrectKey() {
-        assertThat(mDeviceUpdater.getPreferenceKey()).isEqualTo(PREF_KEY);
+        assertThat(mDeviceUpdater.getPreferenceKeyPrefix()).isEqualTo(PREF_KEY_PREFIX);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceControllerTest.java
index 1faba30..6d12594 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceControllerTest.java
@@ -22,17 +22,22 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
+import static org.robolectric.Shadows.shadowOf;
 
 import android.app.Flags;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
+import android.content.pm.UserInfo;
 import android.os.Bundle;
+import android.os.UserHandle;
+import android.os.UserManager;
 import android.platform.test.annotations.EnableFlags;
 import android.platform.test.flag.junit.SetFlagsRule;
 import android.service.notification.ZenPolicy;
@@ -41,6 +46,7 @@
 
 import com.android.settings.SettingsActivity;
 import com.android.settingslib.applications.ApplicationsState;
+import com.android.settingslib.applications.ApplicationsState.AppEntry;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
@@ -58,6 +64,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Random;
 
 @RunWith(RobolectricTestRunner.class)
 @EnableFlags(Flags.FLAG_MODES_UI)
@@ -90,13 +97,13 @@
                 mZenModesBackend, mHelperBackend);
     }
 
-    private ApplicationsState.AppEntry createAppEntry(String packageName, String label) {
-        ApplicationsState.AppEntry entry = mock(ApplicationsState.AppEntry.class);
-        entry.info = new ApplicationInfo();
-        entry.info.packageName = packageName;
-        entry.label = label;
-        entry.info.uid = 0;
-        return entry;
+    private AppEntry createAppEntry(String packageName, int userId) {
+        ApplicationInfo applicationInfo = new ApplicationInfo();
+        applicationInfo.packageName = packageName;
+        applicationInfo.uid = UserHandle.getUid(userId, new Random().nextInt(100));
+        AppEntry appEntry = new AppEntry(mContext, applicationInfo, 1);
+        appEntry.label = packageName;
+        return appEntry;
     }
 
     private ZenMode createPriorityChannelsZenMode() {
@@ -137,14 +144,52 @@
 
     @Test
     public void testGetAppsBypassingDnd() {
-        ApplicationsState.AppEntry entry = createAppEntry("test", "testLabel");
-        ApplicationsState.AppEntry entryConv = createAppEntry("test_conv", "test_convLabel");
-        List<ApplicationsState.AppEntry> appEntries = List.of(entry, entryConv);
+        ApplicationsState.AppEntry app1 = createAppEntry("app1", mContext.getUserId());
+        ApplicationsState.AppEntry app2 = createAppEntry("app2", mContext.getUserId());
+        List<ApplicationsState.AppEntry> allApps = List.of(app1, app2);
 
         when(mHelperBackend.getPackagesBypassingDnd(mContext.getUserId(),
-                false)).thenReturn(List.of("test"));
+                false)).thenReturn(List.of("app1"));
 
-        assertThat(mController.getAppsBypassingDnd(appEntries)).containsExactly("testLabel");
+        assertThat(mController.getAppsBypassingDndSortedByName(allApps)).containsExactly(app1);
+    }
+
+    @Test
+    public void testGetAppsBypassingDnd_sortsByName() {
+        ApplicationsState.AppEntry appC = createAppEntry("C", mContext.getUserId());
+        ApplicationsState.AppEntry appA = createAppEntry("A", mContext.getUserId());
+        ApplicationsState.AppEntry appB = createAppEntry("B", mContext.getUserId());
+        List<ApplicationsState.AppEntry> allApps = List.of(appC, appA, appB);
+
+        when(mHelperBackend.getPackagesBypassingDnd(eq(mContext.getUserId()), anyBoolean()))
+                .thenReturn(List.of("B", "C", "A"));
+
+        assertThat(mController.getAppsBypassingDndSortedByName(allApps))
+                .containsExactly(appA, appB, appC).inOrder();
+    }
+
+    @Test
+    public void testGetAppsBypassingDnd_withWorkProfile_includesProfileAndSorts() {
+        UserInfo workProfile = new UserInfo(10, "Work Profile", 0);
+        workProfile.userType = UserManager.USER_TYPE_PROFILE_MANAGED;
+        UserManager userManager = mContext.getSystemService(UserManager.class);
+        shadowOf(userManager).addProfile(mContext.getUserId(), 10, workProfile);
+
+        ApplicationsState.AppEntry personalCopy = createAppEntry("app", mContext.getUserId());
+        ApplicationsState.AppEntry workCopy = createAppEntry("app", 10);
+        ApplicationsState.AppEntry otherPersonal = createAppEntry("p2", mContext.getUserId());
+        ApplicationsState.AppEntry otherWork = createAppEntry("w2", 10);
+        List<ApplicationsState.AppEntry> allApps = List.of(workCopy, personalCopy, otherPersonal,
+                otherWork);
+
+        when(mHelperBackend.getPackagesBypassingDnd(eq(mContext.getUserId()), anyBoolean()))
+                .thenReturn(List.of("app", "p2"));
+        when(mHelperBackend.getPackagesBypassingDnd(eq(10), anyBoolean()))
+                .thenReturn(List.of("app"));
+
+        // Personal copy before work copy (names match).
+        assertThat(mController.getAppsBypassingDndSortedByName(allApps))
+                .containsExactly(personalCopy, workCopy, otherPersonal).inOrder();
     }
 
     @Test
@@ -156,7 +201,7 @@
 
         // Create some applications.
         ArrayList<ApplicationsState.AppEntry> appEntries = new ArrayList<>();
-        appEntries.add(createAppEntry("test", "pkgLabel"));
+        appEntries.add(createAppEntry("test", mContext.getUserId()));
 
         when(mHelperBackend.getPackagesBypassingDnd(
                 mContext.getUserId(), false))
@@ -170,7 +215,7 @@
 
         // Manually triggers the callback that will happen on rebuild.
         mController.mAppSessionCallbacks.onRebuildComplete(appEntries);
-        assertThat(String.valueOf(preference.getSummary())).isEqualTo("pkgLabel can interrupt");
+        assertThat(String.valueOf(preference.getSummary())).isEqualTo("test can interrupt");
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModesSummaryHelperTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModesSummaryHelperTest.java
index e847fb7..672a0d7 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModesSummaryHelperTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModesSummaryHelperTest.java
@@ -28,10 +28,16 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.robolectric.Shadows.shadowOf;
+
 import android.app.Flags;
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.UserInfo;
 import android.net.Uri;
+import android.os.UserHandle;
+import android.os.UserManager;
 import android.platform.test.annotations.EnableFlags;
 import android.platform.test.flag.junit.SetFlagsRule;
 import android.service.notification.Condition;
@@ -39,9 +45,12 @@
 import android.service.notification.ZenModeConfig;
 import android.service.notification.ZenPolicy;
 
+import com.android.settingslib.applications.ApplicationsState.AppEntry;
 import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 
+import com.google.common.collect.ImmutableList;
+
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -50,10 +59,12 @@
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-import java.util.LinkedHashSet;
-import java.util.Set;
+import java.util.Random;
+
 @RunWith(RobolectricTestRunner.class)
 public class ZenModesSummaryHelperTest {
+    private static final int WORK_PROFILE_ID = 3;
+
     private Context mContext;
     private ZenHelperBackend mBackend;
 
@@ -69,6 +80,11 @@
         mContext = RuntimeEnvironment.application;
         mBackend = new ZenHelperBackend(mContext);
         mSummaryHelper = new ZenModeSummaryHelper(mContext, mBackend);
+
+        UserInfo workProfile = new UserInfo(WORK_PROFILE_ID, "Work Profile", 0);
+        workProfile.userType = UserManager.USER_TYPE_PROFILE_MANAGED;
+        UserManager userManager = mContext.getSystemService(UserManager.class);
+        shadowOf(userManager).addProfile(mContext.getUserId(), WORK_PROFILE_ID, workProfile);
     }
 
     @Test
@@ -306,7 +322,7 @@
                         .build())
                 .build();
 
-        assertThat(mSummaryHelper.getAppsSummary(zenMode, new LinkedHashSet<>())).isEqualTo("None");
+        assertThat(mSummaryHelper.getAppsSummary(zenMode, ImmutableList.of())).isEqualTo("None");
     }
 
     @Test
@@ -321,54 +337,85 @@
     }
 
     @Test
-    public void getAppsSummary_formatAppsListEmpty() {
-        Set<String> apps = new LinkedHashSet<>();
+    public void formatAppsList_listEmpty() {
+        ImmutableList<AppEntry> apps = ImmutableList.of();
         assertThat(mSummaryHelper.formatAppsList(apps)).isEqualTo("No apps can interrupt");
     }
 
     @Test
-    public void getAppsSummary_formatAppsListSingle() {
-        Set<String> apps = Set.of("My App");
+    public void formatAppsList_single() {
+        ImmutableList<AppEntry> apps = ImmutableList.of(newAppEntry("My App"));
         assertThat(mSummaryHelper.formatAppsList(apps)).isEqualTo("My App can interrupt");
     }
 
     @Test
-    public void getAppsSummary_formatAppsListTwo() {
-        Set<String> apps = Set.of("My App", "SecondApp");
+    public void formatAppsList_two() {
+        ImmutableList<AppEntry> apps = ImmutableList.of(newAppEntry("My App"),
+                newAppEntry("SecondApp"));
         assertThat(mSummaryHelper.formatAppsList(apps)).isEqualTo("My App and SecondApp "
                 + "can interrupt");
     }
 
     @Test
-    public void getAppsSummary_formatAppsListThree() {
-        Set<String> apps = Set.of("My App", "SecondApp", "ThirdApp");
+    public void formatAppsList_three() {
+        ImmutableList<AppEntry> apps = ImmutableList.of(newAppEntry("My App"),
+                newAppEntry("SecondApp"), newAppEntry("ThirdApp"));
         assertThat(mSummaryHelper.formatAppsList(apps)).isEqualTo("My App, SecondApp, "
                 + "and ThirdApp can interrupt");
     }
 
     @Test
-    public void getAppsSummary_formatAppsListMany() {
-        Set<String> apps = Set.of("My App", "SecondApp", "ThirdApp", "FourthApp",
-                "FifthApp", "SixthApp");
-        // Note that apps are selected alphabetically.
-        assertThat(mSummaryHelper.formatAppsList(apps)).isEqualTo("FifthApp, FourthApp, "
+    public void formatAppsList_many() {
+        ImmutableList<AppEntry> apps = ImmutableList.of(newAppEntry("My App"),
+                newAppEntry("SecondApp"), newAppEntry("ThirdApp"), newAppEntry("FourthApp"),
+                newAppEntry("FifthApp"), newAppEntry("SixthApp"));
+        assertThat(mSummaryHelper.formatAppsList(apps)).isEqualTo("My App, SecondApp, "
                 + "and 4 more can interrupt");
     }
 
     @Test
+    public void formatAppsList_singleWorkProfile() {
+        ImmutableList<AppEntry> apps = ImmutableList.of(newAppEntry("My App", WORK_PROFILE_ID));
+        assertThat(mSummaryHelper.formatAppsList(apps)).isEqualTo("My App (Work) can interrupt");
+    }
+
+    @Test
+    public void formatAppsList_mixOfProfiles() {
+        ImmutableList<AppEntry> apps = ImmutableList.of(
+                newAppEntry("My App", mContext.getUserId()),
+                newAppEntry("My App", WORK_PROFILE_ID),
+                newAppEntry("SecondApp", mContext.getUserId()));
+        assertThat(mSummaryHelper.formatAppsList(apps)).isEqualTo("My App, My App (Work), "
+                + "and SecondApp can interrupt");
+    }
+
+    @Test
     public void getAppsSummary_priorityApps() {
         ZenMode zenMode = new TestModeBuilder()
                 .setZenPolicy(new ZenPolicy.Builder()
                         .allowChannels(ZenPolicy.CHANNEL_POLICY_PRIORITY)
                         .build())
                 .build();
-        Set<String> apps = Set.of("My App", "SecondApp", "ThirdApp", "FourthApp",
-                "FifthApp", "SixthApp");
+        ImmutableList<AppEntry> apps = ImmutableList.of(newAppEntry("My App"),
+                newAppEntry("SecondApp"), newAppEntry("ThirdApp"), newAppEntry("FourthApp"),
+                newAppEntry("FifthApp"), newAppEntry("SixthApp"));
 
-        assertThat(mSummaryHelper.getAppsSummary(zenMode, apps)).isEqualTo("FifthApp, FourthApp, "
+        assertThat(mSummaryHelper.getAppsSummary(zenMode, apps)).isEqualTo("My App, SecondApp, "
                 + "and 4 more can interrupt");
     }
 
+    private AppEntry newAppEntry(String name) {
+        return newAppEntry(name, mContext.getUserId());
+    }
+
+    private AppEntry newAppEntry(String name, int userId) {
+        ApplicationInfo applicationInfo = new ApplicationInfo();
+        applicationInfo.uid = UserHandle.getUid(userId, new Random().nextInt(100));
+        AppEntry appEntry = new AppEntry(mContext, applicationInfo, 1);
+        appEntry.label = name;
+        return appEntry;
+    }
+
     @Test
     @EnableFlags(Flags.FLAG_MODES_UI)
     public void getSoundSummary_off_noRules() {
