diff --git a/src/com/android/settings/notification/NotificationVolumePreferenceController.java b/src/com/android/settings/notification/NotificationVolumePreferenceController.java
index 322bb6c..112debc 100644
--- a/src/com/android/settings/notification/NotificationVolumePreferenceController.java
+++ b/src/com/android/settings/notification/NotificationVolumePreferenceController.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.notification;
 
+import android.app.ActivityThread;
 import android.app.INotificationManager;
 import android.app.NotificationManager;
 import android.content.BroadcastReceiver;
@@ -29,26 +30,32 @@
 import android.os.Message;
 import android.os.ServiceManager;
 import android.os.Vibrator;
+import android.provider.DeviceConfig;
 import android.service.notification.NotificationListenerService;
 import android.text.TextUtils;
 import android.util.Log;
 
 import androidx.lifecycle.OnLifecycleEvent;
+import androidx.preference.PreferenceScreen;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
 import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
 import java.util.Objects;
+import java.util.Set;
 
 /**
- * Update notification volume icon in Settings in response to user adjusting volume
+ * Update notification volume icon in Settings in response to user adjusting volume.
  */
 public class NotificationVolumePreferenceController extends VolumeSeekBarPreferenceController {
 
     private static final String TAG = "NotificationVolumePreferenceController";
     private static final String KEY_NOTIFICATION_VOLUME = "notification_volume";
+    private static final boolean CONFIG_DEFAULT_VAL = false;
+    private boolean mSeparateNotification;
 
     private Vibrator mVibrator;
     private int mRingerMode = AudioManager.RINGER_MODE_NORMAL;
@@ -56,39 +63,74 @@
     private final RingReceiver mReceiver = new RingReceiver();
     private final H mHandler = new H();
     private INotificationManager mNoMan;
-
-
     private int mMuteIcon;
     private final int mNormalIconId =  R.drawable.ic_notifications;
     private final int mVibrateIconId = R.drawable.ic_volume_ringer_vibrate;
     private final int mSilentIconId = R.drawable.ic_notifications_off_24dp;
 
-    private final boolean mRingNotificationAliased;
-
-
     public NotificationVolumePreferenceController(Context context) {
         this(context, KEY_NOTIFICATION_VOLUME);
     }
 
     public NotificationVolumePreferenceController(Context context, String key) {
         super(context, key);
+
         mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
         if (mVibrator != null && !mVibrator.hasVibrator()) {
             mVibrator = null;
         }
 
-        mRingNotificationAliased = mContext.getResources().getBoolean(
-                com.android.internal.R.bool.config_alias_ring_notif_stream_types);
         updateRingerMode();
     }
 
+    /**
+     * Allow for notification slider to be enabled in the scenario where the config switches on
+     * while settings page is already on the screen by always configuring the preference, even if it
+     * is currently inactive.
+     */
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        if (mPreference == null) {
+            setupVolPreference(screen);
+        }
+        mSeparateNotification = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
+                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, CONFIG_DEFAULT_VAL);
+        if (mPreference != null) {
+            mPreference.setVisible(getAvailabilityStatus() == AVAILABLE);
+        }
+        updateEffectsSuppressor();
+        updatePreferenceIconAndSliderState();
+    }
+
+    /**
+     * Only display the notification slider when the corresponding device config flag is set
+     */
+    private void onDeviceConfigChange(DeviceConfig.Properties properties) {
+        Set<String> changeSet = properties.getKeyset();
+
+        if (changeSet.contains(SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION)) {
+            boolean newVal = properties.getBoolean(
+                    SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, CONFIG_DEFAULT_VAL);
+            if (newVal != mSeparateNotification) {
+                mSeparateNotification = newVal;
+                // manually hiding the preference because being unavailable does not do the job
+                if (mPreference != null) {
+                    mPreference.setVisible(getAvailabilityStatus() == AVAILABLE);
+                }
+            }
+        }
+    }
+
+
     @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
     @Override
     public void onResume() {
         super.onResume();
         mReceiver.register(true);
-        updateEffectsSuppressor();
-        updatePreferenceIconAndSliderState();
+        DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI,
+                ActivityThread.currentApplication().getMainExecutor(),
+                this::onDeviceConfigChange);
     }
 
     @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
@@ -96,16 +138,17 @@
     public void onPause() {
         super.onPause();
         mReceiver.register(false);
+        DeviceConfig.removeOnPropertiesChangedListener(this::onDeviceConfigChange);
     }
 
     @Override
     public int getAvailabilityStatus() {
+        boolean separateNotification = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
+                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, false);
 
-        // Show separate notification slider if ring/notification are not aliased by AudioManager --
-        // if they are, notification volume is controlled by RingVolumePreferenceController.
         return mContext.getResources().getBoolean(R.bool.config_show_notification_volume)
-                && (!mRingNotificationAliased || !Utils.isVoiceCapable(mContext))
                 && !mHelper.isSingleVolume()
+                && (separateNotification || !Utils.isVoiceCapable(mContext))
                 ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
     }
 
diff --git a/src/com/android/settings/notification/RingVolumePreferenceController.java b/src/com/android/settings/notification/RingVolumePreferenceController.java
index a78689f..7fdb1e1 100644
--- a/src/com/android/settings/notification/RingVolumePreferenceController.java
+++ b/src/com/android/settings/notification/RingVolumePreferenceController.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.notification;
 
+import android.app.ActivityThread;
 import android.app.INotificationManager;
 import android.app.NotificationManager;
 import android.content.BroadcastReceiver;
@@ -29,6 +30,7 @@
 import android.os.Message;
 import android.os.ServiceManager;
 import android.os.Vibrator;
+import android.provider.DeviceConfig;
 import android.service.notification.NotificationListenerService;
 import android.text.TextUtils;
 import android.util.Log;
@@ -36,11 +38,13 @@
 import androidx.lifecycle.OnLifecycleEvent;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
 import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
 import java.util.Objects;
+import java.util.Set;
 
 /**
  * This slider can represent both ring and notification, if the corresponding streams are aliased,
@@ -59,24 +63,21 @@
 
     private int mMuteIcon;
 
-    /*
-     * Whether ring and notification streams are aliased together by AudioManager.
-     * If they are, we'll present one volume control for both.
-     * If not, we'll present separate volume controls.
-     */
-    private final boolean mRingAliasNotif;
-
-    private final int mNormalIconId;
+    private int mNormalIconId;
     @VisibleForTesting
-    final int mVibrateIconId;
+    int mVibrateIconId;
     @VisibleForTesting
-    final int mSilentIconId;
+    int mSilentIconId;
 
     @VisibleForTesting
-    final int mTitleId;
+    int mTitleId;
+
+    private boolean mSeparateNotification;
 
     private INotificationManager mNoMan;
 
+    private static final boolean CONFIG_DEFAULT_VAL = false;
+
     public RingVolumePreferenceController(Context context) {
         this(context, KEY_RING_VOLUME);
     }
@@ -87,29 +88,56 @@
         if (mVibrator != null && !mVibrator.hasVibrator()) {
             mVibrator = null;
         }
-
-        mRingAliasNotif = isRingAliasNotification();
-        if (mRingAliasNotif) {
-            mTitleId = R.string.ring_volume_option_title;
-
-            mNormalIconId = R.drawable.ic_notifications;
-            mSilentIconId = R.drawable.ic_notifications_off_24dp;
-        } else {
-            mTitleId = R.string.separate_ring_volume_option_title;
-
-            mNormalIconId = R.drawable.ic_ring_volume;
-            mSilentIconId = R.drawable.ic_ring_volume_off;
-        }
-        // todo: set a distinct vibrate icon for ring vs notification
-        mVibrateIconId = R.drawable.ic_volume_ringer_vibrate;
-
+        mSeparateNotification = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
+                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, CONFIG_DEFAULT_VAL);
+        loadPreferenceIconResources(mSeparateNotification);
         updateRingerMode();
     }
 
-    @VisibleForTesting
-    boolean isRingAliasNotification() {
-        return mContext.getResources().getBoolean(
-                com.android.internal.R.bool.config_alias_ring_notif_stream_types);
+    private void loadPreferenceIconResources(boolean separateNotification) {
+        if (separateNotification) {
+            mTitleId = R.string.separate_ring_volume_option_title;
+            mNormalIconId = R.drawable.ic_ring_volume;
+            mSilentIconId = R.drawable.ic_ring_volume_off;
+        } else {
+            mTitleId = R.string.ring_volume_option_title;
+            mNormalIconId = R.drawable.ic_notifications;
+            mSilentIconId = R.drawable.ic_notifications_off_24dp;
+        }
+        // todo: set a distinct vibrate icon for ring vs notification
+        mVibrateIconId = R.drawable.ic_volume_ringer_vibrate;
+    }
+
+    /**
+     * As the responsibility of this slider changes, so should its title & icon
+     */
+    public void onDeviceConfigChange(DeviceConfig.Properties properties) {
+        Set<String> changeSet = properties.getKeyset();
+        if (changeSet.contains(SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION)) {
+            boolean valueUpdated = readSeparateNotificationVolumeConfig();
+            if (valueUpdated) {
+                updateEffectsSuppressor();
+                selectPreferenceIconState();
+                setPreferenceTitle();
+            }
+        }
+    }
+
+    /**
+     * side effect: updates the cached value of the config, and also the icon
+     * @return has the config changed?
+     */
+    private boolean readSeparateNotificationVolumeConfig() {
+        boolean newVal = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
+                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, CONFIG_DEFAULT_VAL);
+
+        boolean valueUpdated = newVal != mSeparateNotification;
+        if (valueUpdated) {
+            mSeparateNotification = newVal;
+            loadPreferenceIconResources(newVal);
+        }
+
+        return valueUpdated;
     }
 
     @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
@@ -117,8 +145,11 @@
     public void onResume() {
         super.onResume();
         mReceiver.register(true);
+        readSeparateNotificationVolumeConfig();
+        DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI,
+                ActivityThread.currentApplication().getMainExecutor(), this::onDeviceConfigChange);
         updateEffectsSuppressor();
-        updatePreferenceIcon();
+        selectPreferenceIconState();
         setPreferenceTitle();
     }
 
@@ -127,6 +158,7 @@
     public void onPause() {
         super.onPause();
         mReceiver.register(false);
+        DeviceConfig.removeOnPropertiesChangedListener(this::onDeviceConfigChange);
     }
 
     @Override
@@ -170,7 +202,7 @@
         final int ringerMode = mHelper.getRingerModeInternal();
         if (mRingerMode == ringerMode) return;
         mRingerMode = ringerMode;
-        updatePreferenceIcon();
+        selectPreferenceIconState();
     }
 
     private void updateEffectsSuppressor() {
@@ -190,7 +222,8 @@
             return;
         }
 
-        if (hintsMatch(hints, mRingAliasNotif)) {
+        if (hintsMatch(hints, DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
+                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, false))) {
             mSuppressor = suppressor;
             if (mPreference != null) {
                 final String text = SuppressorHelper.getSuppressionText(mContext, suppressor);
@@ -200,11 +233,11 @@
     }
 
     @VisibleForTesting
-    boolean hintsMatch(int hints, boolean ringNotificationAliased) {
+    boolean hintsMatch(int hints, boolean notificationSeparated) {
         return (hints & NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS) != 0
                 || (hints & NotificationListenerService.HINT_HOST_DISABLE_EFFECTS) != 0
                 || ((hints & NotificationListenerService.HINT_HOST_DISABLE_NOTIFICATION_EFFECTS)
-                != 0 && ringNotificationAliased);
+                != 0 && !notificationSeparated);
     }
 
     @VisibleForTesting
@@ -217,7 +250,7 @@
         mVibrator = vibrator;
     }
 
-    private void updatePreferenceIcon() {
+    private void selectPreferenceIconState() {
         if (mPreference != null) {
             if (mRingerMode == AudioManager.RINGER_MODE_NORMAL) {
                 mPreference.showIcon(mNormalIconId);
diff --git a/src/com/android/settings/notification/VolumeSeekBarPreferenceController.java b/src/com/android/settings/notification/VolumeSeekBarPreferenceController.java
index d170159..0414565 100644
--- a/src/com/android/settings/notification/VolumeSeekBarPreferenceController.java
+++ b/src/com/android/settings/notification/VolumeSeekBarPreferenceController.java
@@ -55,13 +55,17 @@
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
         if (isAvailable()) {
-            mPreference = screen.findPreference(getPreferenceKey());
-            mPreference.setCallback(mVolumePreferenceCallback);
-            mPreference.setStream(getAudioStream());
-            mPreference.setMuteIcon(getMuteIcon());
+            setupVolPreference(screen);
         }
     }
 
+    protected void setupVolPreference(PreferenceScreen screen) {
+        mPreference = screen.findPreference(getPreferenceKey());
+        mPreference.setCallback(mVolumePreferenceCallback);
+        mPreference.setStream(getAudioStream());
+        mPreference.setMuteIcon(getMuteIcon());
+    }
+
     @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
     public void onResume() {
         if (mPreference != null) {
diff --git a/tests/robotests/src/com/android/settings/notification/NotificationVolumePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/NotificationVolumePreferenceControllerTest.java
index 96b9e62..7e7ad10 100644
--- a/tests/robotests/src/com/android/settings/notification/NotificationVolumePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/NotificationVolumePreferenceControllerTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
@@ -25,10 +26,17 @@
 import android.content.res.Resources;
 import android.media.AudioManager;
 import android.os.Vibrator;
+import android.provider.DeviceConfig;
 import android.service.notification.NotificationListenerService;
 import android.telephony.TelephonyManager;
 
-import com.android.internal.R;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.shadow.ShadowDeviceConfig;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -37,11 +45,12 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 
 @RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowDeviceConfig.class})
 public class NotificationVolumePreferenceControllerTest {
-
     @Mock
     private AudioHelper mHelper;
     @Mock
@@ -52,6 +61,11 @@
     private Vibrator mVibrator;
     @Mock
     private Resources mResources;
+    @Mock
+    private PreferenceManager mPreferenceManager;
+
+    private static final String READ_DEVICE_CONFIG_PERMISSION =
+            "android.permission.READ_DEVICE_CONFIG";
 
     private Context mContext;
     private NotificationVolumePreferenceController mController;
@@ -87,7 +101,9 @@
     public void isAvailable_voiceCapable_aliasedWithRing_shouldReturnFalse() {
         when(mResources.getBoolean(
                 com.android.settings.R.bool.config_show_notification_volume)).thenReturn(true);
-        when(mResources.getBoolean(R.bool.config_alias_ring_notif_stream_types)).thenReturn(true);
+
+        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "false", false);
 
         NotificationVolumePreferenceController controller =
                 new NotificationVolumePreferenceController(mContext);
@@ -105,7 +121,9 @@
     public void isAvailable_voiceCapable_separatedFromRing_shouldReturnTrue() {
         when(mResources.getBoolean(
                 com.android.settings.R.bool.config_show_notification_volume)).thenReturn(true);
-        when(mResources.getBoolean(R.bool.config_alias_ring_notif_stream_types)).thenReturn(false);
+
+        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "true", false);
 
         NotificationVolumePreferenceController controller =
                 new NotificationVolumePreferenceController(mContext);
@@ -170,4 +188,70 @@
                 .isTrue();
     }
 
+    @Test
+    public void enableSeparateNotificationConfig_controllerBecomesAvailable() {
+        PreferenceScreen screen = spy(new PreferenceScreen(mContext, null));
+        VolumeSeekBarPreference volumeSeekBarPreference = mock(VolumeSeekBarPreference.class);
+        when(screen.getPreferenceManager()).thenReturn(mPreferenceManager);
+        when(screen.getContext()).thenReturn(mContext);
+        when(mResources.getBoolean(
+                com.android.settings.R.bool.config_show_notification_volume)).thenReturn(true);
+        // block the alternative condition to enable controller
+        when(mTelephonyManager.isVoiceCapable()).thenReturn(true);
+
+        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "false", false);
+
+        NotificationVolumePreferenceController controller =
+                new NotificationVolumePreferenceController(mContext);
+        when(screen.findPreference(controller.getPreferenceKey()))
+                .thenReturn(volumeSeekBarPreference);
+
+        // allow the controller to subscribe
+        Shadows.shadowOf((android.app.Application) ApplicationProvider.getApplicationContext())
+                .grantPermissions(READ_DEVICE_CONFIG_PERMISSION);
+        controller.onResume();
+        controller.displayPreference(screen);
+
+        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, Boolean.toString(true),
+                false);
+
+        assertThat(controller.getAvailabilityStatus()
+                == BasePreferenceController.AVAILABLE).isTrue();
+    }
+
+    @Test
+    public void disableSeparateNotificationConfig_controllerBecomesUnavailable() {
+        PreferenceScreen screen = spy(new PreferenceScreen(mContext, null));
+        VolumeSeekBarPreference volumeSeekBarPreference = mock(VolumeSeekBarPreference.class);
+        when(screen.getPreferenceManager()).thenReturn(mPreferenceManager);
+        when(screen.getContext()).thenReturn(mContext);
+        when(mResources.getBoolean(
+                com.android.settings.R.bool.config_show_notification_volume)).thenReturn(true);
+
+        // block the alternative condition to enable controller
+        when(mTelephonyManager.isVoiceCapable()).thenReturn(true);
+
+        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "true", false);
+
+        NotificationVolumePreferenceController controller =
+                new NotificationVolumePreferenceController(mContext);
+
+        when(screen.findPreference(controller.getPreferenceKey()))
+                .thenReturn(volumeSeekBarPreference);
+
+        Shadows.shadowOf((android.app.Application) ApplicationProvider.getApplicationContext())
+                .grantPermissions(READ_DEVICE_CONFIG_PERMISSION);
+        controller.onResume();
+        controller.displayPreference(screen);
+
+        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "false", false);
+
+        assertThat(controller.getAvailabilityStatus()
+                == BasePreferenceController.UNSUPPORTED_ON_DEVICE).isTrue();
+    }
+
 }
diff --git a/tests/robotests/src/com/android/settings/notification/RingVolumePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/RingVolumePreferenceControllerTest.java
index 02757d5..1ad26c7 100644
--- a/tests/robotests/src/com/android/settings/notification/RingVolumePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/RingVolumePreferenceControllerTest.java
@@ -27,10 +27,13 @@
 import android.content.res.Resources;
 import android.media.AudioManager;
 import android.os.Vibrator;
+import android.provider.DeviceConfig;
 import android.service.notification.NotificationListenerService;
 import android.telephony.TelephonyManager;
 
+import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
 import com.android.settings.R;
+import com.android.settings.testutils.shadow.ShadowDeviceConfig;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -39,9 +42,11 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 
 @RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowDeviceConfig.class})
 public class RingVolumePreferenceControllerTest {
 
     @Mock
@@ -124,9 +129,10 @@
     // todo: verify that the title change is displayed, by examining the underlying preference
     @Test
     public void ringNotificationStreamsNotAliased_sliderTitleSetToRingOnly() {
-        when(mResources.getBoolean(
-                com.android.internal.R.bool.config_alias_ring_notif_stream_types))
-                .thenReturn(false);
+
+        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "true", false);
+
         final RingVolumePreferenceController controller =
                 new RingVolumePreferenceController(mContext);
 
@@ -138,8 +144,9 @@
     @Test
     public void ringNotificationStreamsAliased_sliderTitleIncludesBothRingNotification() {
 
-        when(mResources.getBoolean(
-                com.android.internal.R.bool.config_alias_ring_notif_stream_types)).thenReturn(true);
+        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "false", false);
+
         final RingVolumePreferenceController control = new RingVolumePreferenceController(mContext);
 
         int expectedTitleId = R.string.ring_volume_option_title;
@@ -150,39 +157,39 @@
     @Test
     public void setHintsRing_aliased_Matches() {
         assertThat(mController.hintsMatch(
-                NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS, true)).isTrue();
+                NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS, false)).isTrue();
     }
 
     @Test
     public void setHintsRingNotification_aliased_Matches() {
         assertThat(mController.hintsMatch(NotificationListenerService.HINT_HOST_DISABLE_EFFECTS,
-                true)).isTrue();
+                false)).isTrue();
     }
 
     @Test
     public void setHintNotification_aliased_Matches() {
         assertThat(mController
                 .hintsMatch(NotificationListenerService.HINT_HOST_DISABLE_NOTIFICATION_EFFECTS,
-                true)).isTrue();
+                false)).isTrue();
     }
 
     @Test
     public void setHintsRing_unaliased_Matches() {
         assertThat(mController.hintsMatch(
-                NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS, false)).isTrue();
+                NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS, true)).isTrue();
     }
 
     @Test
     public void setHintsRingNotification_unaliased_Matches() {
         assertThat(mController.hintsMatch(NotificationListenerService.HINT_HOST_DISABLE_EFFECTS,
-                false)).isTrue();
+                true)).isTrue();
     }
 
     @Test
     public void setHintNotification_unaliased_doesNotMatch() {
         assertThat(mController
                 .hintsMatch(NotificationListenerService.HINT_HOST_DISABLE_NOTIFICATION_EFFECTS,
-                        false)).isFalse();
+                        true)).isFalse();
     }
 
     @Test
