summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/notification/ZenModeHelper.java20
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java76
2 files changed, 86 insertions, 10 deletions
diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java
index 6ab7748ff116..28d692ad624a 100644
--- a/services/core/java/com/android/server/notification/ZenModeHelper.java
+++ b/services/core/java/com/android/server/notification/ZenModeHelper.java
@@ -782,13 +782,13 @@ public class ZenModeHelper {
}
private void setPreviousRingerModeSetting(Integer previousRingerLevel) {
- Slog.d("beverlyt", "setPreviousRingerMode=" + previousRingerLevel);
Global.putString(
mContext.getContentResolver(), Global.ZEN_MODE_RINGER_LEVEL,
previousRingerLevel == null ? null : Integer.toString(previousRingerLevel));
}
- private boolean evaluateZenMode(String reason, boolean setRingerMode) {
+ @VisibleForTesting
+ protected boolean evaluateZenMode(String reason, boolean setRingerMode) {
if (DEBUG) Log.d(TAG, "evaluateZenMode");
final int zenBefore = mZenMode;
final int zen = computeZenMode();
@@ -796,7 +796,7 @@ public class ZenModeHelper {
mZenMode = zen;
setZenModeSetting(mZenMode);
updateRingerModeAffectedStreams();
- if (setRingerMode) {
+ if (setRingerMode && zen != zenBefore) {
applyZenToRingerMode();
}
applyRestrictions();
@@ -813,8 +813,8 @@ public class ZenModeHelper {
}
private int computeZenMode() {
+ if (mConfig == null) return Global.ZEN_MODE_OFF;
synchronized (mConfig) {
- if (mConfig == null) return Global.ZEN_MODE_OFF;
if (mConfig.manualRule != null) return mConfig.manualRule.zenMode;
int zen = Global.ZEN_MODE_OFF;
for (ZenRule automaticRule : mConfig.automaticRules.values()) {
@@ -1018,6 +1018,13 @@ public class ZenModeHelper {
int ringerModeExternalOut = ringerModeNew;
+ if (mZenMode == Global.ZEN_MODE_OFF
+ || (mZenMode == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS
+ && !ZenModeConfig.areAllPriorityOnlyNotificationZenSoundsMuted(mConfig))) {
+ // in priority only with ringer not muted, save ringer mode changes
+ // in dnd off, save ringer mode changes
+ setPreviousRingerModeSetting(ringerModeNew);
+ }
int newZen = -1;
switch (ringerModeNew) {
case AudioManager.RINGER_MODE_SILENT:
@@ -1046,12 +1053,7 @@ public class ZenModeHelper {
if (newZen != -1) {
setManualZenMode(newZen, null, "ringerModeInternal", null,
false /*setRingerMode*/);
- } else if (mZenMode == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS
- && !ZenModeConfig.areAllPriorityOnlyNotificationZenSoundsMuted(mConfig)) {
- // in priority only with ringer not muted, save ringer mode changes
- setPreviousRingerModeSetting(ringerModeNew);
}
-
if (isChange || newZen != -1 || ringerModeExternal != ringerModeExternalOut) {
ZenLog.traceSetRingerModeInternal(ringerModeOld, ringerModeNew, caller,
ringerModeExternal, ringerModeExternalOut);
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
index 93c711c4cbc0..5bfa15a7b8c0 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
@@ -407,7 +407,7 @@ public class ZenModeHelperTest extends UiServiceTestCase {
verify(mAudioManager, atLeastOnce()).setRingerModeInternal(AudioManager.RINGER_MODE_NORMAL,
mZenModeHelperSpy.TAG);
- // 3. change ringer from normal to silent, verify previous ringer set to new rigner (silent)
+ // 3. change ringer from normal to silent, verify previous ringer set to new ringer (silent)
ZenModeHelper.RingerModeDelegate ringerModeDelegate =
mZenModeHelperSpy.new RingerModeDelegate();
ringerModeDelegate.onSetRingerModeInternal(AudioManager.RINGER_MODE_NORMAL,
@@ -423,4 +423,78 @@ public class ZenModeHelperTest extends UiServiceTestCase {
verify(mAudioManager, atLeastOnce()).setRingerModeInternal(AudioManager.RINGER_MODE_SILENT,
mZenModeHelperSpy.TAG);
}
+
+ @Test
+ public void testSilentRingerSavedInZenOff_startsZenOff() {
+ AudioManagerInternal mAudioManager = mock(AudioManagerInternal.class);
+ mZenModeHelperSpy.mAudioManager = mAudioManager;
+
+ // apply zen off multiple times - verify ringer is not set to normal
+ when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_SILENT);
+ mZenModeHelperSpy.mZenMode = Global.ZEN_MODE_OFF;
+ mZenModeHelperSpy.mConfig = null; // will evaluate config to zen mode off
+ for (int i = 0; i < 3; i++) {
+ // if zen doesn't change, zen should not reapply itself to the ringer
+ mZenModeHelperSpy.evaluateZenMode("test", true);
+ }
+ verify(mZenModeHelperSpy, never()).applyZenToRingerMode();
+ verify(mAudioManager, never()).setRingerModeInternal(AudioManager.RINGER_MODE_NORMAL,
+ mZenModeHelperSpy.TAG);
+ }
+
+ @Test
+ public void testSilentRingerSavedOnZenOff_startsZenOn() {
+ AudioManagerInternal mAudioManager = mock(AudioManagerInternal.class);
+ mZenModeHelperSpy.mAudioManager = mAudioManager;
+ mZenModeHelperSpy.mZenMode = Global.ZEN_MODE_OFF;
+
+ // previously set silent ringer
+ ZenModeHelper.RingerModeDelegate ringerModeDelegate =
+ mZenModeHelperSpy.new RingerModeDelegate();
+ ringerModeDelegate.onSetRingerModeInternal(AudioManager.RINGER_MODE_NORMAL,
+ AudioManager.RINGER_MODE_SILENT, "test", AudioManager.RINGER_MODE_NORMAL,
+ VolumePolicy.DEFAULT);
+ assertEquals(AudioManager.RINGER_MODE_SILENT, Global.getInt(mContext.getContentResolver(),
+ Global.ZEN_MODE_RINGER_LEVEL, AudioManager.RINGER_MODE_NORMAL));
+
+ // apply zen off multiple times - verify ringer is not set to normal
+ when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_SILENT);
+ mZenModeHelperSpy.mZenMode = Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
+ mZenModeHelperSpy.mConfig = null; // will evaluate config to zen mode off
+ for (int i = 0; i < 3; i++) {
+ // if zen doesn't change, zen should not reapply itself to the ringer
+ mZenModeHelperSpy.evaluateZenMode("test", true);
+ }
+ verify(mZenModeHelperSpy, times(1)).applyZenToRingerMode();
+ verify(mAudioManager, never()).setRingerModeInternal(AudioManager.RINGER_MODE_NORMAL,
+ mZenModeHelperSpy.TAG);
+ }
+
+ @Test
+ public void testVibrateRingerSavedOnZenOff_startsZenOn() {
+ AudioManagerInternal mAudioManager = mock(AudioManagerInternal.class);
+ mZenModeHelperSpy.mAudioManager = mAudioManager;
+ mZenModeHelperSpy.mZenMode = Global.ZEN_MODE_OFF;
+
+ // previously set silent ringer
+ ZenModeHelper.RingerModeDelegate ringerModeDelegate =
+ mZenModeHelperSpy.new RingerModeDelegate();
+ ringerModeDelegate.onSetRingerModeInternal(AudioManager.RINGER_MODE_NORMAL,
+ AudioManager.RINGER_MODE_VIBRATE, "test", AudioManager.RINGER_MODE_NORMAL,
+ VolumePolicy.DEFAULT);
+ assertEquals(AudioManager.RINGER_MODE_VIBRATE, Global.getInt(mContext.getContentResolver(),
+ Global.ZEN_MODE_RINGER_LEVEL, AudioManager.RINGER_MODE_NORMAL));
+
+ // apply zen off multiple times - verify ringer is not set to normal
+ when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_VIBRATE);
+ mZenModeHelperSpy.mZenMode = Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
+ mZenModeHelperSpy.mConfig = null; // will evaluate config to zen mode off
+ for (int i = 0; i < 3; i++) {
+ // if zen doesn't change, zen should not reapply itself to the ringer
+ mZenModeHelperSpy.evaluateZenMode("test", true);
+ }
+ verify(mZenModeHelperSpy, times(1)).applyZenToRingerMode();
+ verify(mAudioManager, never()).setRingerModeInternal(AudioManager.RINGER_MODE_NORMAL,
+ mZenModeHelperSpy.TAG);
+ }
}