From 2ac6fc57093487e87085298471d173947bf39015 Mon Sep 17 00:00:00 2001 From: Behnam Heydarshahi Date: Wed, 12 Oct 2022 15:08:22 +0000 Subject: [PATCH] Read flag to show/hide notification slider Replace the build-time boolean resource with a run time device config flag that signals whether the ring notification slider should be displayed or not Bug: b/38477228 Test: make DEBUG_ROBOLECTRIC=1 ROBOTEST_FILTER=NotificationVolumePreferenceControllerTest RunSettingsRoboTests -j40 make DEBUG_ROBOLECTRIC=1 ROBOTEST_FILTER=RingVolumePreferenceControllerTest RunSettingsRoboTests -j40 Change-Id: I8b9a2cbd5af7fa1bba56ff9ba62771d677d4a932 --- ...otificationVolumePreferenceController.java | 69 ++++++++--- .../RingVolumePreferenceController.java | 107 ++++++++++++------ .../VolumeSeekBarPreferenceController.java | 12 +- ...icationVolumePreferenceControllerTest.java | 92 ++++++++++++++- .../RingVolumePreferenceControllerTest.java | 29 +++-- 5 files changed, 240 insertions(+), 69 deletions(-) diff --git a/src/com/android/settings/notification/NotificationVolumePreferenceController.java b/src/com/android/settings/notification/NotificationVolumePreferenceController.java index 322bb6c229b..112debca647 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.Looper; 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 @@ public class NotificationVolumePreferenceController extends VolumeSeekBarPrefere 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 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 class NotificationVolumePreferenceController extends VolumeSeekBarPrefere 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 a78689f5a0a..7fdb1e16141 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.Looper; 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 android.util.Log; 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 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr 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 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr 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 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 class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr 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 class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr public void onPause() { super.onPause(); mReceiver.register(false); + DeviceConfig.removeOnPropertiesChangedListener(this::onDeviceConfigChange); } @Override @@ -170,7 +202,7 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr final int ringerMode = mHelper.getRingerModeInternal(); if (mRingerMode == ringerMode) return; mRingerMode = ringerMode; - updatePreferenceIcon(); + selectPreferenceIconState(); } private void updateEffectsSuppressor() { @@ -190,7 +222,8 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr 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 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr } @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 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr 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 d1701599c34..0414565721e 100644 --- a/src/com/android/settings/notification/VolumeSeekBarPreferenceController.java +++ b/src/com/android/settings/notification/VolumeSeekBarPreferenceController.java @@ -55,13 +55,17 @@ public abstract class VolumeSeekBarPreferenceController extends 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 96b9e6219c8..7e7ad10d8c1 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 @@ package com.android.settings.notification; 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.Context; 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.Mock; 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 @@ public class NotificationVolumePreferenceControllerTest { 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 class NotificationVolumePreferenceControllerTest { 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 class NotificationVolumePreferenceControllerTest { 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 @@ public class NotificationVolumePreferenceControllerTest { .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 02757d52874..1ad26c71546 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.Context; 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.Mock; 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 @@ public class RingVolumePreferenceControllerTest { // 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 @@ public class RingVolumePreferenceControllerTest { @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 @@ public class RingVolumePreferenceControllerTest { @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