diff options
| -rw-r--r-- | services/core/java/com/android/server/notification/ZenModeHelper.java | 20 | ||||
| -rw-r--r-- | services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java | 76 |
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); + } } |