Loading services/core/java/com/android/server/notification/ZenModeHelper.java +22 −0 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.notification; package com.android.server.notification; import static android.app.AutomaticZenRule.TYPE_DRIVING; import static android.app.AutomaticZenRule.TYPE_UNKNOWN; import static android.app.AutomaticZenRule.TYPE_UNKNOWN; import static android.app.NotificationManager.AUTOMATIC_RULE_STATUS_ACTIVATED; import static android.app.NotificationManager.AUTOMATIC_RULE_STATUS_ACTIVATED; import static android.app.NotificationManager.AUTOMATIC_RULE_STATUS_DEACTIVATED; import static android.app.NotificationManager.AUTOMATIC_RULE_STATUS_DEACTIVATED; Loading Loading @@ -46,6 +47,7 @@ import static android.service.notification.ZenModeConfig.isImplicitRuleId; import static com.android.internal.util.FrameworkStatsLog.DND_MODE_RULE; import static com.android.internal.util.FrameworkStatsLog.DND_MODE_RULE; import static com.android.internal.util.Preconditions.checkArgument; import static com.android.internal.util.Preconditions.checkArgument; import static com.android.server.notification.Flags.preventZenDeviceEffectsWhileDriving; import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull; Loading Loading @@ -2379,6 +2381,26 @@ public class ZenModeHelper { } } if (Flags.modesApi()) { if (Flags.modesApi()) { // Prevent other rules from applying grayscale if Driving is active (but allow it // if _Driving itself_ wants grayscale). if (Flags.modesUi() && preventZenDeviceEffectsWhileDriving()) { boolean hasActiveDriving = false; boolean hasActiveDrivingWithGrayscale = false; for (ZenRule rule : mConfig.automaticRules.values()) { if (rule.isActive() && rule.type == TYPE_DRIVING) { hasActiveDriving = true; if (rule.zenDeviceEffects != null && rule.zenDeviceEffects.shouldDisplayGrayscale()) { hasActiveDrivingWithGrayscale = true; break; // Further rules won't affect decision. } } } if (hasActiveDriving && !hasActiveDrivingWithGrayscale) { deviceEffectsBuilder.setShouldDisplayGrayscale(false); } } ZenDeviceEffects deviceEffects = deviceEffectsBuilder.build(); ZenDeviceEffects deviceEffects = deviceEffectsBuilder.build(); if (!deviceEffects.equals(mConsolidatedDeviceEffects)) { if (!deviceEffects.equals(mConsolidatedDeviceEffects)) { mConsolidatedDeviceEffects = deviceEffects; mConsolidatedDeviceEffects = deviceEffects; Loading services/core/java/com/android/server/notification/flags.aconfig +10 −0 Original line number Original line Diff line number Diff line Loading @@ -190,3 +190,13 @@ flag { purpose: PURPOSE_BUGFIX purpose: PURPOSE_BUGFIX } } } } flag { name: "prevent_zen_device_effects_while_driving" namespace: "systemui" description: "Don't apply certain device effects (such as grayscale) from active zen rules, if a rule of TYPE_DRIVING is active" bug: "390389174" metadata { purpose: PURPOSE_BUGFIX } } services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java +67 −0 Original line number Original line Diff line number Diff line Loading @@ -17,8 +17,10 @@ package com.android.server.notification; package com.android.server.notification; import static android.app.AutomaticZenRule.TYPE_BEDTIME; import static android.app.AutomaticZenRule.TYPE_BEDTIME; import static android.app.AutomaticZenRule.TYPE_DRIVING; import static android.app.AutomaticZenRule.TYPE_IMMERSIVE; import static android.app.AutomaticZenRule.TYPE_IMMERSIVE; import static android.app.AutomaticZenRule.TYPE_SCHEDULE_TIME; import static android.app.AutomaticZenRule.TYPE_SCHEDULE_TIME; import static android.app.AutomaticZenRule.TYPE_THEATER; import static android.app.AutomaticZenRule.TYPE_UNKNOWN; import static android.app.AutomaticZenRule.TYPE_UNKNOWN; import static android.app.Flags.FLAG_BACKUP_RESTORE_LOGGING; import static android.app.Flags.FLAG_BACKUP_RESTORE_LOGGING; import static android.app.Flags.FLAG_MODES_API; import static android.app.Flags.FLAG_MODES_API; Loading Loading @@ -87,6 +89,7 @@ import static com.android.os.dnd.DNDProtoEnums.PEOPLE_STARRED; import static com.android.os.dnd.DNDProtoEnums.ROOT_CONFIG; import static com.android.os.dnd.DNDProtoEnums.ROOT_CONFIG; import static com.android.os.dnd.DNDProtoEnums.STATE_ALLOW; import static com.android.os.dnd.DNDProtoEnums.STATE_ALLOW; import static com.android.os.dnd.DNDProtoEnums.STATE_DISALLOW; import static com.android.os.dnd.DNDProtoEnums.STATE_DISALLOW; import static com.android.server.notification.Flags.FLAG_PREVENT_ZEN_DEVICE_EFFECTS_WHILE_DRIVING; import static com.android.server.notification.ZenModeEventLogger.ACTIVE_RULE_TYPE_MANUAL; import static com.android.server.notification.ZenModeEventLogger.ACTIVE_RULE_TYPE_MANUAL; import static com.android.server.notification.ZenModeHelper.RULE_LIMIT_PER_PACKAGE; import static com.android.server.notification.ZenModeHelper.RULE_LIMIT_PER_PACKAGE; Loading Loading @@ -5518,8 +5521,72 @@ public class ZenModeHelperTest extends UiServiceTestCase { eq(ORIGIN_INIT_USER)); eq(ORIGIN_INIT_USER)); } } @Test @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI, FLAG_PREVENT_ZEN_DEVICE_EFFECTS_WHILE_DRIVING}) public void testDeviceEffects_allowsGrayscale() { mZenModeHelper.setDeviceEffectsApplier(mDeviceEffectsApplier); reset(mDeviceEffectsApplier); ZenDeviceEffects grayscale = new ZenDeviceEffects.Builder() .setShouldDisplayGrayscale(true) .build(); String ruleId = addRuleWithEffects(TYPE_THEATER, grayscale); mZenModeHelper.setAutomaticZenRuleState(UserHandle.CURRENT, ruleId, CONDITION_TRUE, ORIGIN_APP, CUSTOM_PKG_UID); mTestableLooper.processAllMessages(); verify(mDeviceEffectsApplier).apply(eq(grayscale), anyInt()); } @Test @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI, FLAG_PREVENT_ZEN_DEVICE_EFFECTS_WHILE_DRIVING}) public void testDeviceEffects_whileDriving_avoidsGrayscale() { mZenModeHelper.setDeviceEffectsApplier(mDeviceEffectsApplier); reset(mDeviceEffectsApplier); ZenDeviceEffects grayscale = new ZenDeviceEffects.Builder() .setShouldDisplayGrayscale(true) .build(); String ruleWithGrayscale = addRuleWithEffects(TYPE_THEATER, grayscale); String drivingRule = addRuleWithEffects(TYPE_DRIVING, null); mZenModeHelper.setAutomaticZenRuleState(UserHandle.CURRENT, ruleWithGrayscale, CONDITION_TRUE, ORIGIN_APP, CUSTOM_PKG_UID); mTestableLooper.processAllMessages(); verify(mDeviceEffectsApplier).apply(eq(grayscale), anyInt()); mZenModeHelper.setAutomaticZenRuleState(UserHandle.CURRENT, drivingRule, CONDITION_TRUE, ORIGIN_APP, CUSTOM_PKG_UID); mTestableLooper.processAllMessages(); verify(mDeviceEffectsApplier).apply(eq(NO_EFFECTS), anyInt()); } @Test @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI, FLAG_PREVENT_ZEN_DEVICE_EFFECTS_WHILE_DRIVING}) public void testDeviceEffects_whileDrivingWithGrayscale_allowsGrayscale() { mZenModeHelper.setDeviceEffectsApplier(mDeviceEffectsApplier); reset(mDeviceEffectsApplier); ZenDeviceEffects grayscale = new ZenDeviceEffects.Builder() .setShouldDisplayGrayscale(true) .build(); String weirdoDrivingWithGrayscale = addRuleWithEffects(TYPE_DRIVING, grayscale); mZenModeHelper.setAutomaticZenRuleState(UserHandle.CURRENT, weirdoDrivingWithGrayscale, CONDITION_TRUE, ORIGIN_APP, CUSTOM_PKG_UID); mTestableLooper.processAllMessages(); verify(mDeviceEffectsApplier).apply(eq(grayscale), anyInt()); } private String addRuleWithEffects(ZenDeviceEffects effects) { private String addRuleWithEffects(ZenDeviceEffects effects) { return addRuleWithEffects(TYPE_UNKNOWN, effects); } private String addRuleWithEffects(int type, @Nullable ZenDeviceEffects effects) { AutomaticZenRule rule = new AutomaticZenRule.Builder("Test", CONDITION_ID) AutomaticZenRule rule = new AutomaticZenRule.Builder("Test", CONDITION_ID) .setPackage(mContext.getPackageName()) .setType(type) .setDeviceEffects(effects) .setDeviceEffects(effects) .build(); .build(); return mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT, mContext.getPackageName(), return mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT, mContext.getPackageName(), Loading Loading
services/core/java/com/android/server/notification/ZenModeHelper.java +22 −0 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.notification; package com.android.server.notification; import static android.app.AutomaticZenRule.TYPE_DRIVING; import static android.app.AutomaticZenRule.TYPE_UNKNOWN; import static android.app.AutomaticZenRule.TYPE_UNKNOWN; import static android.app.NotificationManager.AUTOMATIC_RULE_STATUS_ACTIVATED; import static android.app.NotificationManager.AUTOMATIC_RULE_STATUS_ACTIVATED; import static android.app.NotificationManager.AUTOMATIC_RULE_STATUS_DEACTIVATED; import static android.app.NotificationManager.AUTOMATIC_RULE_STATUS_DEACTIVATED; Loading Loading @@ -46,6 +47,7 @@ import static android.service.notification.ZenModeConfig.isImplicitRuleId; import static com.android.internal.util.FrameworkStatsLog.DND_MODE_RULE; import static com.android.internal.util.FrameworkStatsLog.DND_MODE_RULE; import static com.android.internal.util.Preconditions.checkArgument; import static com.android.internal.util.Preconditions.checkArgument; import static com.android.server.notification.Flags.preventZenDeviceEffectsWhileDriving; import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull; Loading Loading @@ -2379,6 +2381,26 @@ public class ZenModeHelper { } } if (Flags.modesApi()) { if (Flags.modesApi()) { // Prevent other rules from applying grayscale if Driving is active (but allow it // if _Driving itself_ wants grayscale). if (Flags.modesUi() && preventZenDeviceEffectsWhileDriving()) { boolean hasActiveDriving = false; boolean hasActiveDrivingWithGrayscale = false; for (ZenRule rule : mConfig.automaticRules.values()) { if (rule.isActive() && rule.type == TYPE_DRIVING) { hasActiveDriving = true; if (rule.zenDeviceEffects != null && rule.zenDeviceEffects.shouldDisplayGrayscale()) { hasActiveDrivingWithGrayscale = true; break; // Further rules won't affect decision. } } } if (hasActiveDriving && !hasActiveDrivingWithGrayscale) { deviceEffectsBuilder.setShouldDisplayGrayscale(false); } } ZenDeviceEffects deviceEffects = deviceEffectsBuilder.build(); ZenDeviceEffects deviceEffects = deviceEffectsBuilder.build(); if (!deviceEffects.equals(mConsolidatedDeviceEffects)) { if (!deviceEffects.equals(mConsolidatedDeviceEffects)) { mConsolidatedDeviceEffects = deviceEffects; mConsolidatedDeviceEffects = deviceEffects; Loading
services/core/java/com/android/server/notification/flags.aconfig +10 −0 Original line number Original line Diff line number Diff line Loading @@ -190,3 +190,13 @@ flag { purpose: PURPOSE_BUGFIX purpose: PURPOSE_BUGFIX } } } } flag { name: "prevent_zen_device_effects_while_driving" namespace: "systemui" description: "Don't apply certain device effects (such as grayscale) from active zen rules, if a rule of TYPE_DRIVING is active" bug: "390389174" metadata { purpose: PURPOSE_BUGFIX } }
services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java +67 −0 Original line number Original line Diff line number Diff line Loading @@ -17,8 +17,10 @@ package com.android.server.notification; package com.android.server.notification; import static android.app.AutomaticZenRule.TYPE_BEDTIME; import static android.app.AutomaticZenRule.TYPE_BEDTIME; import static android.app.AutomaticZenRule.TYPE_DRIVING; import static android.app.AutomaticZenRule.TYPE_IMMERSIVE; import static android.app.AutomaticZenRule.TYPE_IMMERSIVE; import static android.app.AutomaticZenRule.TYPE_SCHEDULE_TIME; import static android.app.AutomaticZenRule.TYPE_SCHEDULE_TIME; import static android.app.AutomaticZenRule.TYPE_THEATER; import static android.app.AutomaticZenRule.TYPE_UNKNOWN; import static android.app.AutomaticZenRule.TYPE_UNKNOWN; import static android.app.Flags.FLAG_BACKUP_RESTORE_LOGGING; import static android.app.Flags.FLAG_BACKUP_RESTORE_LOGGING; import static android.app.Flags.FLAG_MODES_API; import static android.app.Flags.FLAG_MODES_API; Loading Loading @@ -87,6 +89,7 @@ import static com.android.os.dnd.DNDProtoEnums.PEOPLE_STARRED; import static com.android.os.dnd.DNDProtoEnums.ROOT_CONFIG; import static com.android.os.dnd.DNDProtoEnums.ROOT_CONFIG; import static com.android.os.dnd.DNDProtoEnums.STATE_ALLOW; import static com.android.os.dnd.DNDProtoEnums.STATE_ALLOW; import static com.android.os.dnd.DNDProtoEnums.STATE_DISALLOW; import static com.android.os.dnd.DNDProtoEnums.STATE_DISALLOW; import static com.android.server.notification.Flags.FLAG_PREVENT_ZEN_DEVICE_EFFECTS_WHILE_DRIVING; import static com.android.server.notification.ZenModeEventLogger.ACTIVE_RULE_TYPE_MANUAL; import static com.android.server.notification.ZenModeEventLogger.ACTIVE_RULE_TYPE_MANUAL; import static com.android.server.notification.ZenModeHelper.RULE_LIMIT_PER_PACKAGE; import static com.android.server.notification.ZenModeHelper.RULE_LIMIT_PER_PACKAGE; Loading Loading @@ -5518,8 +5521,72 @@ public class ZenModeHelperTest extends UiServiceTestCase { eq(ORIGIN_INIT_USER)); eq(ORIGIN_INIT_USER)); } } @Test @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI, FLAG_PREVENT_ZEN_DEVICE_EFFECTS_WHILE_DRIVING}) public void testDeviceEffects_allowsGrayscale() { mZenModeHelper.setDeviceEffectsApplier(mDeviceEffectsApplier); reset(mDeviceEffectsApplier); ZenDeviceEffects grayscale = new ZenDeviceEffects.Builder() .setShouldDisplayGrayscale(true) .build(); String ruleId = addRuleWithEffects(TYPE_THEATER, grayscale); mZenModeHelper.setAutomaticZenRuleState(UserHandle.CURRENT, ruleId, CONDITION_TRUE, ORIGIN_APP, CUSTOM_PKG_UID); mTestableLooper.processAllMessages(); verify(mDeviceEffectsApplier).apply(eq(grayscale), anyInt()); } @Test @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI, FLAG_PREVENT_ZEN_DEVICE_EFFECTS_WHILE_DRIVING}) public void testDeviceEffects_whileDriving_avoidsGrayscale() { mZenModeHelper.setDeviceEffectsApplier(mDeviceEffectsApplier); reset(mDeviceEffectsApplier); ZenDeviceEffects grayscale = new ZenDeviceEffects.Builder() .setShouldDisplayGrayscale(true) .build(); String ruleWithGrayscale = addRuleWithEffects(TYPE_THEATER, grayscale); String drivingRule = addRuleWithEffects(TYPE_DRIVING, null); mZenModeHelper.setAutomaticZenRuleState(UserHandle.CURRENT, ruleWithGrayscale, CONDITION_TRUE, ORIGIN_APP, CUSTOM_PKG_UID); mTestableLooper.processAllMessages(); verify(mDeviceEffectsApplier).apply(eq(grayscale), anyInt()); mZenModeHelper.setAutomaticZenRuleState(UserHandle.CURRENT, drivingRule, CONDITION_TRUE, ORIGIN_APP, CUSTOM_PKG_UID); mTestableLooper.processAllMessages(); verify(mDeviceEffectsApplier).apply(eq(NO_EFFECTS), anyInt()); } @Test @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI, FLAG_PREVENT_ZEN_DEVICE_EFFECTS_WHILE_DRIVING}) public void testDeviceEffects_whileDrivingWithGrayscale_allowsGrayscale() { mZenModeHelper.setDeviceEffectsApplier(mDeviceEffectsApplier); reset(mDeviceEffectsApplier); ZenDeviceEffects grayscale = new ZenDeviceEffects.Builder() .setShouldDisplayGrayscale(true) .build(); String weirdoDrivingWithGrayscale = addRuleWithEffects(TYPE_DRIVING, grayscale); mZenModeHelper.setAutomaticZenRuleState(UserHandle.CURRENT, weirdoDrivingWithGrayscale, CONDITION_TRUE, ORIGIN_APP, CUSTOM_PKG_UID); mTestableLooper.processAllMessages(); verify(mDeviceEffectsApplier).apply(eq(grayscale), anyInt()); } private String addRuleWithEffects(ZenDeviceEffects effects) { private String addRuleWithEffects(ZenDeviceEffects effects) { return addRuleWithEffects(TYPE_UNKNOWN, effects); } private String addRuleWithEffects(int type, @Nullable ZenDeviceEffects effects) { AutomaticZenRule rule = new AutomaticZenRule.Builder("Test", CONDITION_ID) AutomaticZenRule rule = new AutomaticZenRule.Builder("Test", CONDITION_ID) .setPackage(mContext.getPackageName()) .setType(type) .setDeviceEffects(effects) .setDeviceEffects(effects) .build(); .build(); return mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT, mContext.getPackageName(), return mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT, mContext.getPackageName(), Loading