From 947f40c71c86c4c37ffe059bdd94aeca279c27b0 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Fri, 11 Sep 2020 14:09:42 -0400 Subject: [PATCH] Handle duplicate Uris in DND rules If a user creates 2 DND rules of the same type with the same criteria, DND would either not start properly or end properly when that criteria started/ended. This makes sure all rules with matching criteria have their Conditions updated. Test: atest Fixes: 141343447 Change-Id: Id8c56433ec3f238d3bfc08deb70212c8a7f27843 --- .../server/notification/ZenModeHelper.java | 27 +++++++----- .../notification/ZenModeHelperTest.java | 44 +++++++++++++++++++ 2 files changed, 60 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java index 5417275bc8f14..13cd6e547629b 100644 --- a/services/core/java/com/android/server/notification/ZenModeHelper.java +++ b/services/core/java/com/android/server/notification/ZenModeHelper.java @@ -417,7 +417,9 @@ public class ZenModeHelper { if (mConfig == null) return; newConfig = mConfig.copy(); - setAutomaticZenRuleStateLocked(newConfig, newConfig.automaticRules.get(id), condition); + ArrayList rules = new ArrayList<>(); + rules.add(newConfig.automaticRules.get(id)); + setAutomaticZenRuleStateLocked(newConfig, rules, condition); } } @@ -428,31 +430,34 @@ public class ZenModeHelper { newConfig = mConfig.copy(); setAutomaticZenRuleStateLocked(newConfig, - findMatchingRule(newConfig, ruleDefinition, condition), + findMatchingRules(newConfig, ruleDefinition, condition), condition); } } - private void setAutomaticZenRuleStateLocked(ZenModeConfig config, ZenRule rule, + private void setAutomaticZenRuleStateLocked(ZenModeConfig config, List rules, Condition condition) { - if (rule == null) return; + if (rules == null || rules.isEmpty()) return; - rule.condition = condition; - updateSnoozing(rule); - setConfigLocked(config, rule.component, "conditionChanged"); + for (ZenRule rule : rules) { + rule.condition = condition; + updateSnoozing(rule); + setConfigLocked(config, rule.component, "conditionChanged"); + } } - private ZenRule findMatchingRule(ZenModeConfig config, Uri id, Condition condition) { + private List findMatchingRules(ZenModeConfig config, Uri id, Condition condition) { + List matchingRules= new ArrayList<>(); if (ruleMatches(id, condition, config.manualRule)) { - return config.manualRule; + matchingRules.add(config.manualRule); } else { for (ZenRule automaticRule : config.automaticRules.values()) { if (ruleMatches(id, condition, automaticRule)) { - return automaticRule; + matchingRules.add(automaticRule); } } } - return null; + return matchingRules; } private boolean ruleMatches(Uri id, Condition condition, ZenRule rule) { 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 3c7206fee9d14..3430dbdce7533 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java @@ -44,6 +44,7 @@ import static com.android.os.AtomsProto.DNDModeProto.ZEN_MODE_FIELD_NUMBER; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertNotNull; import static junit.framework.TestCase.assertTrue; import static junit.framework.TestCase.fail; @@ -1556,6 +1557,49 @@ public class ZenModeHelperTest extends UiServiceTestCase { assertEquals(zenRule.getName(), ruleInConfig.name); } + @Test + public void testRulesWithSameUri() { + Uri sharedUri = ZenModeConfig.toScheduleConditionId(new ScheduleInfo()); + AutomaticZenRule zenRule = new AutomaticZenRule("name", + new ComponentName("android", "ScheduleConditionProvider"), + sharedUri, + NotificationManager.INTERRUPTION_FILTER_PRIORITY, true); + String id = mZenModeHelperSpy.addAutomaticZenRule(zenRule, "test"); + AutomaticZenRule zenRule2 = new AutomaticZenRule("name2", + new ComponentName("android", "ScheduleConditionProvider"), + sharedUri, + NotificationManager.INTERRUPTION_FILTER_PRIORITY, true); + String id2 = mZenModeHelperSpy.addAutomaticZenRule(zenRule2, "test"); + + Condition condition = new Condition(sharedUri, "", Condition.STATE_TRUE); + mZenModeHelperSpy.setAutomaticZenRuleState(sharedUri, condition); + + for (ZenModeConfig.ZenRule rule : mZenModeHelperSpy.mConfig.automaticRules.values()) { + if (rule.id.equals(id)) { + assertNotNull(rule.condition); + assertTrue(rule.condition.state == Condition.STATE_TRUE); + } + if (rule.id.equals(id2)) { + assertNotNull(rule.condition); + assertTrue(rule.condition.state == Condition.STATE_TRUE); + } + } + + condition = new Condition(sharedUri, "", Condition.STATE_FALSE); + mZenModeHelperSpy.setAutomaticZenRuleState(sharedUri, condition); + + for (ZenModeConfig.ZenRule rule : mZenModeHelperSpy.mConfig.automaticRules.values()) { + if (rule.id.equals(id)) { + assertNotNull(rule.condition); + assertTrue(rule.condition.state == Condition.STATE_FALSE); + } + if (rule.id.equals(id2)) { + assertNotNull(rule.condition); + assertTrue(rule.condition.state == Condition.STATE_FALSE); + } + } + } + private void setupZenConfig() { mZenModeHelperSpy.mZenMode = ZEN_MODE_IMPORTANT_INTERRUPTIONS; mZenModeHelperSpy.mConfig.allowAlarms = false;