Loading core/java/android/app/NotificationManager.java +35 −40 Original line number Diff line number Diff line Loading @@ -1638,46 +1638,6 @@ public class NotificationManager { return true; } /** * @hide */ public static boolean areAnyScreenOffEffectsSuppressed(int effects) { for (int i = 0; i < SCREEN_OFF_SUPPRESSED_EFFECTS.length; i++) { final int effect = SCREEN_OFF_SUPPRESSED_EFFECTS[i]; if ((effects & effect) != 0) { return true; } } return false; } /** * @hide */ public static boolean areAnyScreenOnEffectsSuppressed(int effects) { for (int i = 0; i < SCREEN_ON_SUPPRESSED_EFFECTS.length; i++) { final int effect = SCREEN_ON_SUPPRESSED_EFFECTS[i]; if ((effects & effect) != 0) { return true; } } return false; } /** * @hide */ public static int toggleScreenOffEffectsSuppressed(int currentEffects, boolean suppress) { return toggleEffects(currentEffects, SCREEN_OFF_SUPPRESSED_EFFECTS, suppress); } /** * @hide */ public static int toggleScreenOnEffectsSuppressed(int currentEffects, boolean suppress) { return toggleEffects(currentEffects, SCREEN_ON_SUPPRESSED_EFFECTS, suppress); } private static int toggleEffects(int currentEffects, int[] effects, boolean suppress) { for (int i = 0; i < effects.length; i++) { final int effect = effects[i]; Loading Loading @@ -1837,6 +1797,41 @@ public class NotificationManager { return priorityMessageSenders; } /** @hide **/ public boolean showFullScreenIntents() { return (suppressedVisualEffects & SUPPRESSED_EFFECT_FULL_SCREEN_INTENT) == 0; } /** @hide **/ public boolean showLights() { return (suppressedVisualEffects & SUPPRESSED_EFFECT_LIGHTS) == 0; } /** @hide **/ public boolean showPeeking() { return (suppressedVisualEffects & SUPPRESSED_EFFECT_PEEK) == 0; } /** @hide **/ public boolean showStatusBarIcons() { return (suppressedVisualEffects & SUPPRESSED_EFFECT_STATUS_BAR) == 0; } /** @hide **/ public boolean showAmbient() { return (suppressedVisualEffects & SUPPRESSED_EFFECT_AMBIENT) == 0; } /** @hide **/ public boolean showBadges() { return (suppressedVisualEffects & SUPPRESSED_EFFECT_BADGE) == 0; } /** @hide **/ public boolean showInNotificationList() { return (suppressedVisualEffects & SUPPRESSED_EFFECT_NOTIFICATION_LIST) == 0; } /** * returns a deep copy of this policy * @hide Loading core/java/android/preference/SeekBarVolumizer.java +2 −2 Original line number Diff line number Diff line Loading @@ -123,7 +123,7 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba mContext = context; mAudioManager = context.getSystemService(AudioManager.class); mNotificationManager = context.getSystemService(NotificationManager.class); mNotificationPolicy = mNotificationManager.getNotificationPolicy(); mNotificationPolicy = mNotificationManager.getConsolidatedNotificationPolicy(); mAllowAlarms = (mNotificationPolicy.priorityCategories & NotificationManager.Policy .PRIORITY_CATEGORY_ALARMS) != 0; mAllowMedia = (mNotificationPolicy.priorityCategories & NotificationManager.Policy Loading Loading @@ -485,7 +485,7 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba mZenMode = mNotificationManager.getZenMode(); updateSlider(); } else if (NotificationManager.ACTION_NOTIFICATION_POLICY_CHANGED.equals(action)) { mNotificationPolicy = mNotificationManager.getNotificationPolicy(); mNotificationPolicy = mNotificationManager.getConsolidatedNotificationPolicy(); mAllowAlarms = (mNotificationPolicy.priorityCategories & NotificationManager.Policy .PRIORITY_CATEGORY_ALARMS) != 0; mAllowMedia = (mNotificationPolicy.priorityCategories Loading core/java/android/service/notification/ZenModeConfig.java +190 −10 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package android.service.notification; import static android.app.NotificationManager.Policy.PRIORITY_CATEGORY_REMINDERS; import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_FULL_SCREEN_INTENT; import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_LIGHTS; import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_PEEK; Loading Loading @@ -126,6 +125,15 @@ public class ZenModeConfig implements Parcelable { private static final String STATE_TAG = "state"; private static final String STATE_ATT_CHANNELS_BYPASSING_DND = "areChannelsBypassingDnd"; // zen policy visual effects attributes private static final String SHOW_ATT_FULL_SCREEN_INTENT = "showFullScreenIntent"; private static final String SHOW_ATT_LIGHTS = "showLights"; private static final String SHOW_ATT_PEEK = "shoePeek"; private static final String SHOW_ATT_STATUS_BAR_ICONS = "showStatusBarIcons"; private static final String SHOW_ATT_BADGES = "showBadges"; private static final String SHOW_ATT_AMBIENT = "showAmbient"; private static final String SHOW_ATT_NOTIFICATION_LIST = "showNotificationList"; private static final String CONDITION_ATT_ID = "id"; private static final String CONDITION_ATT_SUMMARY = "summary"; private static final String CONDITION_ATT_LINE1 = "line1"; Loading @@ -134,6 +142,8 @@ public class ZenModeConfig implements Parcelable { private static final String CONDITION_ATT_STATE = "state"; private static final String CONDITION_ATT_FLAGS = "flags"; private static final String ZEN_POLICY_TAG = "zen_policy"; private static final String MANUAL_TAG = "manual"; private static final String AUTOMATIC_TAG = "automatic"; Loading Loading @@ -650,6 +660,7 @@ public class ZenModeConfig implements Parcelable { rt.zenMode = Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS; } rt.modified = safeBoolean(parser, RULE_ATT_MODIFIED, false); rt.zenPolicy = readZenPolicyXml(parser); return rt; } Loading @@ -676,6 +687,9 @@ public class ZenModeConfig implements Parcelable { if (rule.condition != null) { writeConditionXml(rule.condition, out); } if (rule.zenPolicy != null) { writeZenPolicyXml(rule.zenPolicy, out); } out.attribute(null, RULE_ATT_MODIFIED, Boolean.toString(rule.modified)); } Loading Loading @@ -706,6 +720,141 @@ public class ZenModeConfig implements Parcelable { out.attribute(null, CONDITION_ATT_FLAGS, Integer.toString(c.flags)); } /** * Read the zen policy from xml * Returns null if no zen policy exists */ public static ZenPolicy readZenPolicyXml(XmlPullParser parser) { boolean policySet = false; ZenPolicy.Builder builder = new ZenPolicy.Builder(); final int calls = safeInt(parser, ALLOW_ATT_CALLS_FROM, ZenPolicy.PEOPLE_TYPE_UNSET); final int messages = safeInt(parser, ALLOW_ATT_MESSAGES_FROM, ZenPolicy.PEOPLE_TYPE_UNSET); final int repeatCallers = safeInt(parser, ALLOW_ATT_REPEAT_CALLERS, ZenPolicy.STATE_UNSET); final int alarms = safeInt(parser, ALLOW_ATT_ALARMS, ZenPolicy.STATE_UNSET); final int media = safeInt(parser, ALLOW_ATT_MEDIA, ZenPolicy.STATE_UNSET); final int system = safeInt(parser, ALLOW_ATT_SYSTEM, ZenPolicy.STATE_UNSET); final int events = safeInt(parser, ALLOW_ATT_EVENTS, ZenPolicy.STATE_UNSET); final int reminders = safeInt(parser, ALLOW_ATT_REMINDERS, ZenPolicy.STATE_UNSET); if (calls != ZenPolicy.PEOPLE_TYPE_UNSET) { builder.allowCalls(calls); policySet = true; } if (messages != ZenPolicy.PEOPLE_TYPE_UNSET) { builder.allowMessages(messages); policySet = true; } if (repeatCallers != ZenPolicy.STATE_UNSET) { builder.allowRepeatCallers(repeatCallers == ZenPolicy.STATE_ALLOW); policySet = true; } if (alarms != ZenPolicy.STATE_UNSET) { builder.allowAlarms(alarms == ZenPolicy.STATE_ALLOW); policySet = true; } if (media != ZenPolicy.STATE_UNSET) { builder.allowMedia(media == ZenPolicy.STATE_ALLOW); policySet = true; } if (system != ZenPolicy.STATE_UNSET) { builder.allowSystem(system == ZenPolicy.STATE_ALLOW); policySet = true; } if (events != ZenPolicy.STATE_UNSET) { builder.allowEvents(events == ZenPolicy.STATE_ALLOW); policySet = true; } if (reminders != ZenPolicy.STATE_UNSET) { builder.allowReminders(reminders == ZenPolicy.STATE_ALLOW); policySet = true; } final int fullScreenIntent = safeInt(parser, SHOW_ATT_FULL_SCREEN_INTENT, ZenPolicy.STATE_UNSET); final int lights = safeInt(parser, SHOW_ATT_LIGHTS, ZenPolicy.STATE_UNSET); final int peek = safeInt(parser, SHOW_ATT_PEEK, ZenPolicy.STATE_UNSET); final int statusBar = safeInt(parser, SHOW_ATT_STATUS_BAR_ICONS, ZenPolicy.STATE_UNSET); final int badges = safeInt(parser, SHOW_ATT_BADGES, ZenPolicy.STATE_UNSET); final int ambient = safeInt(parser, SHOW_ATT_AMBIENT, ZenPolicy.STATE_UNSET); final int notificationList = safeInt(parser, SHOW_ATT_NOTIFICATION_LIST, ZenPolicy.STATE_UNSET); if (fullScreenIntent != ZenPolicy.STATE_UNSET) { builder.showFullScreenIntent(fullScreenIntent == ZenPolicy.STATE_ALLOW); policySet = true; } if (lights != ZenPolicy.STATE_UNSET) { builder.showLights(lights == ZenPolicy.STATE_ALLOW); policySet = true; } if (peek != ZenPolicy.STATE_UNSET) { builder.showPeeking(peek == ZenPolicy.STATE_ALLOW); policySet = true; } if (statusBar != ZenPolicy.STATE_UNSET) { builder.showStatusBarIcons(statusBar == ZenPolicy.STATE_ALLOW); policySet = true; } if (badges != ZenPolicy.STATE_UNSET) { builder.showBadges(badges == ZenPolicy.STATE_ALLOW); policySet = true; } if (ambient != ZenPolicy.STATE_UNSET) { builder.showInAmbientDisplay(ambient == ZenPolicy.STATE_ALLOW); policySet = true; } if (notificationList != ZenPolicy.STATE_UNSET) { builder.showInNotificationList(notificationList == ZenPolicy.STATE_ALLOW); policySet = true; } if (policySet) { return builder.build(); } return null; } /** * Writes zen policy to xml */ public static void writeZenPolicyXml(ZenPolicy policy, XmlSerializer out) throws IOException { writeZenPolicyState(ALLOW_ATT_CALLS_FROM, policy.getPriorityCallSenders(), out); writeZenPolicyState(ALLOW_ATT_MESSAGES_FROM, policy.getPriorityMessageSenders(), out); writeZenPolicyState(ALLOW_ATT_REPEAT_CALLERS, policy.getPriorityCategoryRepeatCallers(), out); writeZenPolicyState(ALLOW_ATT_ALARMS, policy.getPriorityCategoryAlarms(), out); writeZenPolicyState(ALLOW_ATT_MEDIA, policy.getPriorityCategoryMedia(), out); writeZenPolicyState(ALLOW_ATT_SYSTEM, policy.getPriorityCategorySystem(), out); writeZenPolicyState(ALLOW_ATT_REMINDERS, policy.getPriorityCategoryReminders(), out); writeZenPolicyState(ALLOW_ATT_EVENTS, policy.getPriorityCategoryEvents(), out); writeZenPolicyState(SHOW_ATT_FULL_SCREEN_INTENT, policy.getVisualEffectFullScreenIntent(), out); writeZenPolicyState(SHOW_ATT_LIGHTS, policy.getVisualEffectLights(), out); writeZenPolicyState(SHOW_ATT_PEEK, policy.getVisualEffectPeek(), out); writeZenPolicyState(SHOW_ATT_STATUS_BAR_ICONS, policy.getVisualEffectStatusBar(), out); writeZenPolicyState(SHOW_ATT_BADGES, policy.getVisualEffectBadge(), out); writeZenPolicyState(SHOW_ATT_AMBIENT, policy.getVisualEffectAmbient(), out); writeZenPolicyState(SHOW_ATT_NOTIFICATION_LIST, policy.getVisualEffectNotificationList(), out); } private static void writeZenPolicyState(String attr, int val, XmlSerializer out) throws IOException { if (Objects.equals(attr, ALLOW_ATT_CALLS_FROM) || Objects.equals(attr, ALLOW_ATT_MESSAGES_FROM)) { if (val != ZenPolicy.PEOPLE_TYPE_UNSET) { out.attribute(null, attr, Integer.toString(val)); } } else { if (val != ZenPolicy.STATE_UNSET) { out.attribute(null, attr, Integer.toString(val)); } } } public static boolean isValidHour(int val) { return val >= 0 && val < 24; } Loading Loading @@ -798,7 +947,7 @@ public class ZenModeConfig implements Parcelable { if (zenPolicy.isCategoryAllowed(ZenPolicy.PRIORITY_CATEGORY_REMINDERS, isPriorityCategoryEnabled(Policy.PRIORITY_CATEGORY_REMINDERS, defaultPolicy))) { priorityCategories |= PRIORITY_CATEGORY_REMINDERS; priorityCategories |= Policy.PRIORITY_CATEGORY_REMINDERS; } if (zenPolicy.isCategoryAllowed(ZenPolicy.PRIORITY_CATEGORY_EVENTS, Loading Loading @@ -839,15 +988,30 @@ public class ZenModeConfig implements Parcelable { priorityCategories |= Policy.PRIORITY_CATEGORY_SYSTEM; } if (!zenPolicy.isVisualEffectAllowed(ZenPolicy.VISUAL_EFFECT_FULL_SCREEN_INTENT, boolean suppressFullScreenIntent = !zenPolicy.isVisualEffectAllowed( ZenPolicy.VISUAL_EFFECT_FULL_SCREEN_INTENT, isVisualEffectAllowed(Policy.SUPPRESSED_EFFECT_FULL_SCREEN_INTENT, defaultPolicy))) { defaultPolicy)); boolean suppressLights = !zenPolicy.isVisualEffectAllowed( ZenPolicy.VISUAL_EFFECT_LIGHTS, isVisualEffectAllowed(Policy.SUPPRESSED_EFFECT_LIGHTS, defaultPolicy)); boolean suppressAmbient = !zenPolicy.isVisualEffectAllowed( ZenPolicy.VISUAL_EFFECT_AMBIENT, isVisualEffectAllowed(Policy.SUPPRESSED_EFFECT_AMBIENT, defaultPolicy)); if (suppressFullScreenIntent && suppressLights && suppressAmbient) { suppressedVisualEffects |= Policy.SUPPRESSED_EFFECT_SCREEN_OFF; } if (suppressFullScreenIntent) { suppressedVisualEffects |= Policy.SUPPRESSED_EFFECT_FULL_SCREEN_INTENT; } if (!zenPolicy.isVisualEffectAllowed(ZenPolicy.VISUAL_EFFECT_LIGHTS, isVisualEffectAllowed(Policy.SUPPRESSED_EFFECT_LIGHTS, defaultPolicy))) { if (suppressLights) { suppressedVisualEffects |= Policy.SUPPRESSED_EFFECT_LIGHTS; } Loading @@ -855,6 +1019,7 @@ public class ZenModeConfig implements Parcelable { isVisualEffectAllowed(Policy.SUPPRESSED_EFFECT_PEEK, defaultPolicy))) { suppressedVisualEffects |= Policy.SUPPRESSED_EFFECT_PEEK; suppressedVisualEffects |= Policy.SUPPRESSED_EFFECT_SCREEN_ON; } if (!zenPolicy.isVisualEffectAllowed(ZenPolicy.VISUAL_EFFECT_STATUS_BAR, Loading @@ -869,9 +1034,7 @@ public class ZenModeConfig implements Parcelable { suppressedVisualEffects |= Policy.SUPPRESSED_EFFECT_BADGE; } if (!zenPolicy.isVisualEffectAllowed(ZenPolicy.VISUAL_EFFECT_AMBIENT, isVisualEffectAllowed(Policy.SUPPRESSED_EFFECT_AMBIENT, defaultPolicy))) { if (suppressAmbient) { suppressedVisualEffects |= Policy.SUPPRESSED_EFFECT_AMBIENT; } Loading @@ -898,13 +1061,30 @@ public class ZenModeConfig implements Parcelable { case ZenPolicy.PEOPLE_TYPE_ANYONE: return Policy.PRIORITY_SENDERS_ANY; case ZenPolicy.PEOPLE_TYPE_CONTACTS: return Policy.PRIORITY_SENDERS_CONTACTS; case ZenPolicy.PEOPLE_TYPE_STARRED: default: return Policy.PRIORITY_SENDERS_STARRED; } } /** * Maps NotificationManager.Policy senders type to ZenPolicy.PeopleType */ public static @ZenPolicy.PeopleType int getZenPolicySenders(int senders) { switch (senders) { case Policy.PRIORITY_SENDERS_ANY: return ZenPolicy.PEOPLE_TYPE_ANYONE; case Policy.PRIORITY_SENDERS_CONTACTS: return ZenPolicy.PEOPLE_TYPE_CONTACTS; case Policy.PRIORITY_SENDERS_STARRED: default: return ZenPolicy.PEOPLE_TYPE_STARRED; } } public Policy toNotificationPolicy() { int priorityCategories = 0; Loading core/java/android/service/notification/ZenPolicy.java +116 −24 Original line number Diff line number Diff line Loading @@ -326,6 +326,32 @@ public final class ZenPolicy implements Parcelable { return mVisualEffects.get(VISUAL_EFFECT_NOTIFICATION_LIST); } /** * Whether this policy hides all visual effects * @hide */ public boolean shouldHideAllVisualEffects() { for (int i = 0; i < mVisualEffects.size(); i++) { if (mVisualEffects.get(i) != STATE_DISALLOW) { return false; } } return true; } /** * Whether this policy shows all visual effects * @hide */ public boolean shouldShowAllVisualEffects() { for (int i = 0; i < mVisualEffects.size(); i++) { if (mVisualEffects.get(i) != STATE_ALLOW) { return false; } } return true; } /** * Builder class for {@link ZenPolicy} objects. * Provides a convenient way to set the various fields of a {@link ZenPolicy}. If a field Loading @@ -338,6 +364,17 @@ public final class ZenPolicy implements Parcelable { mZenPolicy = new ZenPolicy(); } /** * @hide */ public Builder(ZenPolicy policy) { if (policy != null) { mZenPolicy = policy.copy(); } else { mZenPolicy = new ZenPolicy(); } } /** * Builds the current ZenPolicy. */ Loading Loading @@ -532,6 +569,34 @@ public final class ZenPolicy implements Parcelable { return this; } /** * Whether to allow {@link PriorityCategory} sounds to play when DND is active. * @hide */ public Builder allowCategory(@PriorityCategory int category, boolean allow) { switch (category) { case PRIORITY_CATEGORY_ALARMS: allowAlarms(allow); break; case PRIORITY_CATEGORY_MEDIA: allowMedia(allow); break; case PRIORITY_CATEGORY_SYSTEM: allowSystem(allow); break; case PRIORITY_CATEGORY_REMINDERS: allowReminders(allow); break; case PRIORITY_CATEGORY_EVENTS: allowEvents(allow); break; case PRIORITY_CATEGORY_REPEAT_CALLERS: allowRepeatCallers(allow); break; } return this; } /** * Whether {@link Notification#fullScreenIntent full screen intents} that are intercepted * by DND are shown. Loading Loading @@ -601,6 +666,38 @@ public final class ZenPolicy implements Parcelable { show ? STATE_ALLOW : STATE_DISALLOW); return this; } /** * Whether notifications intercepted by DND are prevented from appearing for * {@link VisualEffect} * @hide */ public Builder showVisualEffect(@VisualEffect int effect, boolean show) { switch (effect) { case VISUAL_EFFECT_FULL_SCREEN_INTENT: showFullScreenIntent(show); break; case VISUAL_EFFECT_LIGHTS: showLights(show); break; case VISUAL_EFFECT_PEEK: showPeeking(show); break; case VISUAL_EFFECT_STATUS_BAR: showStatusBarIcons(show); break; case VISUAL_EFFECT_BADGE: showBadges(show); break; case VISUAL_EFFECT_AMBIENT: showInAmbientDisplay(show); break; case VISUAL_EFFECT_NOTIFICATION_LIST: showInNotificationList(show); break; } return this; } } @Override Loading Loading @@ -640,8 +737,8 @@ public final class ZenPolicy implements Parcelable { .append('{') .append("priorityCategories=[").append(priorityCategoriesToString()) .append("], visualEffects=[").append(visualEffectsToString()) .append(", priorityCalls=").append(stateToString(mPriorityCalls)) .append("], priorityMessages=").append(stateToString(mPriorityMessages)) .append("], priorityCalls=").append(peopleTypeToString(mPriorityCalls)) .append(", priorityMessages=").append(peopleTypeToString(mPriorityMessages)) .append('}') .toString(); } Loading Loading @@ -726,7 +823,23 @@ public final class ZenPolicy implements Parcelable { case STATE_ALLOW: return "allow"; } return null; return "invalidState{" + state + "}"; } private String peopleTypeToString(@PeopleType int peopleType) { switch (peopleType) { case PEOPLE_TYPE_ANYONE: return "anyone"; case PEOPLE_TYPE_CONTACTS: return "contacts"; case PEOPLE_TYPE_NONE: return "none"; case PEOPLE_TYPE_STARRED: return "starred_contacts"; case STATE_UNSET: return "unset"; } return "invalidPeopleType{" + peopleType + "}"; } @Override Loading Loading @@ -856,27 +969,6 @@ public final class ZenPolicy implements Parcelable { } } /** * @hide */ public boolean areValuesSet() { return getPriorityCategoryReminders() != STATE_UNSET || getPriorityCategoryEvents() != STATE_UNSET || getPriorityCategoryMessages() != STATE_UNSET || getPriorityCategoryCalls() != STATE_UNSET || getPriorityCategoryRepeatCallers() != STATE_UNSET || getPriorityCategoryAlarms() != STATE_UNSET || getPriorityCategoryMedia() != STATE_UNSET || getPriorityCategorySystem() != STATE_UNSET || getVisualEffectFullScreenIntent() != STATE_UNSET || getVisualEffectLights() != STATE_UNSET || getVisualEffectPeek() != STATE_UNSET || getVisualEffectStatusBar() != STATE_UNSET || getVisualEffectBadge() != STATE_UNSET || getVisualEffectAmbient() != STATE_UNSET || getVisualEffectNotificationList() != STATE_UNSET; } /** * @hide */ Loading packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java +2 −3 Original line number Diff line number Diff line Loading @@ -117,8 +117,8 @@ public class ZenModeControllerImpl extends CurrentUserTracker @Override public boolean areNotificationsHiddenInShade() { if (mZenMode != Global.ZEN_MODE_OFF) { return (mConfig.suppressedVisualEffects & NotificationManager.Policy .SUPPRESSED_EFFECT_NOTIFICATION_LIST) != 0; return (mConsolidatedNotificationPolicy.suppressedVisualEffects & NotificationManager.Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST) != 0; } return false; } Loading Loading @@ -260,7 +260,6 @@ public class ZenModeControllerImpl extends CurrentUserTracker } } @VisibleForTesting protected void updateZenModeConfig() { final ZenModeConfig config = mNoMan.getZenModeConfig(); Loading Loading
core/java/android/app/NotificationManager.java +35 −40 Original line number Diff line number Diff line Loading @@ -1638,46 +1638,6 @@ public class NotificationManager { return true; } /** * @hide */ public static boolean areAnyScreenOffEffectsSuppressed(int effects) { for (int i = 0; i < SCREEN_OFF_SUPPRESSED_EFFECTS.length; i++) { final int effect = SCREEN_OFF_SUPPRESSED_EFFECTS[i]; if ((effects & effect) != 0) { return true; } } return false; } /** * @hide */ public static boolean areAnyScreenOnEffectsSuppressed(int effects) { for (int i = 0; i < SCREEN_ON_SUPPRESSED_EFFECTS.length; i++) { final int effect = SCREEN_ON_SUPPRESSED_EFFECTS[i]; if ((effects & effect) != 0) { return true; } } return false; } /** * @hide */ public static int toggleScreenOffEffectsSuppressed(int currentEffects, boolean suppress) { return toggleEffects(currentEffects, SCREEN_OFF_SUPPRESSED_EFFECTS, suppress); } /** * @hide */ public static int toggleScreenOnEffectsSuppressed(int currentEffects, boolean suppress) { return toggleEffects(currentEffects, SCREEN_ON_SUPPRESSED_EFFECTS, suppress); } private static int toggleEffects(int currentEffects, int[] effects, boolean suppress) { for (int i = 0; i < effects.length; i++) { final int effect = effects[i]; Loading Loading @@ -1837,6 +1797,41 @@ public class NotificationManager { return priorityMessageSenders; } /** @hide **/ public boolean showFullScreenIntents() { return (suppressedVisualEffects & SUPPRESSED_EFFECT_FULL_SCREEN_INTENT) == 0; } /** @hide **/ public boolean showLights() { return (suppressedVisualEffects & SUPPRESSED_EFFECT_LIGHTS) == 0; } /** @hide **/ public boolean showPeeking() { return (suppressedVisualEffects & SUPPRESSED_EFFECT_PEEK) == 0; } /** @hide **/ public boolean showStatusBarIcons() { return (suppressedVisualEffects & SUPPRESSED_EFFECT_STATUS_BAR) == 0; } /** @hide **/ public boolean showAmbient() { return (suppressedVisualEffects & SUPPRESSED_EFFECT_AMBIENT) == 0; } /** @hide **/ public boolean showBadges() { return (suppressedVisualEffects & SUPPRESSED_EFFECT_BADGE) == 0; } /** @hide **/ public boolean showInNotificationList() { return (suppressedVisualEffects & SUPPRESSED_EFFECT_NOTIFICATION_LIST) == 0; } /** * returns a deep copy of this policy * @hide Loading
core/java/android/preference/SeekBarVolumizer.java +2 −2 Original line number Diff line number Diff line Loading @@ -123,7 +123,7 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba mContext = context; mAudioManager = context.getSystemService(AudioManager.class); mNotificationManager = context.getSystemService(NotificationManager.class); mNotificationPolicy = mNotificationManager.getNotificationPolicy(); mNotificationPolicy = mNotificationManager.getConsolidatedNotificationPolicy(); mAllowAlarms = (mNotificationPolicy.priorityCategories & NotificationManager.Policy .PRIORITY_CATEGORY_ALARMS) != 0; mAllowMedia = (mNotificationPolicy.priorityCategories & NotificationManager.Policy Loading Loading @@ -485,7 +485,7 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba mZenMode = mNotificationManager.getZenMode(); updateSlider(); } else if (NotificationManager.ACTION_NOTIFICATION_POLICY_CHANGED.equals(action)) { mNotificationPolicy = mNotificationManager.getNotificationPolicy(); mNotificationPolicy = mNotificationManager.getConsolidatedNotificationPolicy(); mAllowAlarms = (mNotificationPolicy.priorityCategories & NotificationManager.Policy .PRIORITY_CATEGORY_ALARMS) != 0; mAllowMedia = (mNotificationPolicy.priorityCategories Loading
core/java/android/service/notification/ZenModeConfig.java +190 −10 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package android.service.notification; import static android.app.NotificationManager.Policy.PRIORITY_CATEGORY_REMINDERS; import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_FULL_SCREEN_INTENT; import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_LIGHTS; import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_PEEK; Loading Loading @@ -126,6 +125,15 @@ public class ZenModeConfig implements Parcelable { private static final String STATE_TAG = "state"; private static final String STATE_ATT_CHANNELS_BYPASSING_DND = "areChannelsBypassingDnd"; // zen policy visual effects attributes private static final String SHOW_ATT_FULL_SCREEN_INTENT = "showFullScreenIntent"; private static final String SHOW_ATT_LIGHTS = "showLights"; private static final String SHOW_ATT_PEEK = "shoePeek"; private static final String SHOW_ATT_STATUS_BAR_ICONS = "showStatusBarIcons"; private static final String SHOW_ATT_BADGES = "showBadges"; private static final String SHOW_ATT_AMBIENT = "showAmbient"; private static final String SHOW_ATT_NOTIFICATION_LIST = "showNotificationList"; private static final String CONDITION_ATT_ID = "id"; private static final String CONDITION_ATT_SUMMARY = "summary"; private static final String CONDITION_ATT_LINE1 = "line1"; Loading @@ -134,6 +142,8 @@ public class ZenModeConfig implements Parcelable { private static final String CONDITION_ATT_STATE = "state"; private static final String CONDITION_ATT_FLAGS = "flags"; private static final String ZEN_POLICY_TAG = "zen_policy"; private static final String MANUAL_TAG = "manual"; private static final String AUTOMATIC_TAG = "automatic"; Loading Loading @@ -650,6 +660,7 @@ public class ZenModeConfig implements Parcelable { rt.zenMode = Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS; } rt.modified = safeBoolean(parser, RULE_ATT_MODIFIED, false); rt.zenPolicy = readZenPolicyXml(parser); return rt; } Loading @@ -676,6 +687,9 @@ public class ZenModeConfig implements Parcelable { if (rule.condition != null) { writeConditionXml(rule.condition, out); } if (rule.zenPolicy != null) { writeZenPolicyXml(rule.zenPolicy, out); } out.attribute(null, RULE_ATT_MODIFIED, Boolean.toString(rule.modified)); } Loading Loading @@ -706,6 +720,141 @@ public class ZenModeConfig implements Parcelable { out.attribute(null, CONDITION_ATT_FLAGS, Integer.toString(c.flags)); } /** * Read the zen policy from xml * Returns null if no zen policy exists */ public static ZenPolicy readZenPolicyXml(XmlPullParser parser) { boolean policySet = false; ZenPolicy.Builder builder = new ZenPolicy.Builder(); final int calls = safeInt(parser, ALLOW_ATT_CALLS_FROM, ZenPolicy.PEOPLE_TYPE_UNSET); final int messages = safeInt(parser, ALLOW_ATT_MESSAGES_FROM, ZenPolicy.PEOPLE_TYPE_UNSET); final int repeatCallers = safeInt(parser, ALLOW_ATT_REPEAT_CALLERS, ZenPolicy.STATE_UNSET); final int alarms = safeInt(parser, ALLOW_ATT_ALARMS, ZenPolicy.STATE_UNSET); final int media = safeInt(parser, ALLOW_ATT_MEDIA, ZenPolicy.STATE_UNSET); final int system = safeInt(parser, ALLOW_ATT_SYSTEM, ZenPolicy.STATE_UNSET); final int events = safeInt(parser, ALLOW_ATT_EVENTS, ZenPolicy.STATE_UNSET); final int reminders = safeInt(parser, ALLOW_ATT_REMINDERS, ZenPolicy.STATE_UNSET); if (calls != ZenPolicy.PEOPLE_TYPE_UNSET) { builder.allowCalls(calls); policySet = true; } if (messages != ZenPolicy.PEOPLE_TYPE_UNSET) { builder.allowMessages(messages); policySet = true; } if (repeatCallers != ZenPolicy.STATE_UNSET) { builder.allowRepeatCallers(repeatCallers == ZenPolicy.STATE_ALLOW); policySet = true; } if (alarms != ZenPolicy.STATE_UNSET) { builder.allowAlarms(alarms == ZenPolicy.STATE_ALLOW); policySet = true; } if (media != ZenPolicy.STATE_UNSET) { builder.allowMedia(media == ZenPolicy.STATE_ALLOW); policySet = true; } if (system != ZenPolicy.STATE_UNSET) { builder.allowSystem(system == ZenPolicy.STATE_ALLOW); policySet = true; } if (events != ZenPolicy.STATE_UNSET) { builder.allowEvents(events == ZenPolicy.STATE_ALLOW); policySet = true; } if (reminders != ZenPolicy.STATE_UNSET) { builder.allowReminders(reminders == ZenPolicy.STATE_ALLOW); policySet = true; } final int fullScreenIntent = safeInt(parser, SHOW_ATT_FULL_SCREEN_INTENT, ZenPolicy.STATE_UNSET); final int lights = safeInt(parser, SHOW_ATT_LIGHTS, ZenPolicy.STATE_UNSET); final int peek = safeInt(parser, SHOW_ATT_PEEK, ZenPolicy.STATE_UNSET); final int statusBar = safeInt(parser, SHOW_ATT_STATUS_BAR_ICONS, ZenPolicy.STATE_UNSET); final int badges = safeInt(parser, SHOW_ATT_BADGES, ZenPolicy.STATE_UNSET); final int ambient = safeInt(parser, SHOW_ATT_AMBIENT, ZenPolicy.STATE_UNSET); final int notificationList = safeInt(parser, SHOW_ATT_NOTIFICATION_LIST, ZenPolicy.STATE_UNSET); if (fullScreenIntent != ZenPolicy.STATE_UNSET) { builder.showFullScreenIntent(fullScreenIntent == ZenPolicy.STATE_ALLOW); policySet = true; } if (lights != ZenPolicy.STATE_UNSET) { builder.showLights(lights == ZenPolicy.STATE_ALLOW); policySet = true; } if (peek != ZenPolicy.STATE_UNSET) { builder.showPeeking(peek == ZenPolicy.STATE_ALLOW); policySet = true; } if (statusBar != ZenPolicy.STATE_UNSET) { builder.showStatusBarIcons(statusBar == ZenPolicy.STATE_ALLOW); policySet = true; } if (badges != ZenPolicy.STATE_UNSET) { builder.showBadges(badges == ZenPolicy.STATE_ALLOW); policySet = true; } if (ambient != ZenPolicy.STATE_UNSET) { builder.showInAmbientDisplay(ambient == ZenPolicy.STATE_ALLOW); policySet = true; } if (notificationList != ZenPolicy.STATE_UNSET) { builder.showInNotificationList(notificationList == ZenPolicy.STATE_ALLOW); policySet = true; } if (policySet) { return builder.build(); } return null; } /** * Writes zen policy to xml */ public static void writeZenPolicyXml(ZenPolicy policy, XmlSerializer out) throws IOException { writeZenPolicyState(ALLOW_ATT_CALLS_FROM, policy.getPriorityCallSenders(), out); writeZenPolicyState(ALLOW_ATT_MESSAGES_FROM, policy.getPriorityMessageSenders(), out); writeZenPolicyState(ALLOW_ATT_REPEAT_CALLERS, policy.getPriorityCategoryRepeatCallers(), out); writeZenPolicyState(ALLOW_ATT_ALARMS, policy.getPriorityCategoryAlarms(), out); writeZenPolicyState(ALLOW_ATT_MEDIA, policy.getPriorityCategoryMedia(), out); writeZenPolicyState(ALLOW_ATT_SYSTEM, policy.getPriorityCategorySystem(), out); writeZenPolicyState(ALLOW_ATT_REMINDERS, policy.getPriorityCategoryReminders(), out); writeZenPolicyState(ALLOW_ATT_EVENTS, policy.getPriorityCategoryEvents(), out); writeZenPolicyState(SHOW_ATT_FULL_SCREEN_INTENT, policy.getVisualEffectFullScreenIntent(), out); writeZenPolicyState(SHOW_ATT_LIGHTS, policy.getVisualEffectLights(), out); writeZenPolicyState(SHOW_ATT_PEEK, policy.getVisualEffectPeek(), out); writeZenPolicyState(SHOW_ATT_STATUS_BAR_ICONS, policy.getVisualEffectStatusBar(), out); writeZenPolicyState(SHOW_ATT_BADGES, policy.getVisualEffectBadge(), out); writeZenPolicyState(SHOW_ATT_AMBIENT, policy.getVisualEffectAmbient(), out); writeZenPolicyState(SHOW_ATT_NOTIFICATION_LIST, policy.getVisualEffectNotificationList(), out); } private static void writeZenPolicyState(String attr, int val, XmlSerializer out) throws IOException { if (Objects.equals(attr, ALLOW_ATT_CALLS_FROM) || Objects.equals(attr, ALLOW_ATT_MESSAGES_FROM)) { if (val != ZenPolicy.PEOPLE_TYPE_UNSET) { out.attribute(null, attr, Integer.toString(val)); } } else { if (val != ZenPolicy.STATE_UNSET) { out.attribute(null, attr, Integer.toString(val)); } } } public static boolean isValidHour(int val) { return val >= 0 && val < 24; } Loading Loading @@ -798,7 +947,7 @@ public class ZenModeConfig implements Parcelable { if (zenPolicy.isCategoryAllowed(ZenPolicy.PRIORITY_CATEGORY_REMINDERS, isPriorityCategoryEnabled(Policy.PRIORITY_CATEGORY_REMINDERS, defaultPolicy))) { priorityCategories |= PRIORITY_CATEGORY_REMINDERS; priorityCategories |= Policy.PRIORITY_CATEGORY_REMINDERS; } if (zenPolicy.isCategoryAllowed(ZenPolicy.PRIORITY_CATEGORY_EVENTS, Loading Loading @@ -839,15 +988,30 @@ public class ZenModeConfig implements Parcelable { priorityCategories |= Policy.PRIORITY_CATEGORY_SYSTEM; } if (!zenPolicy.isVisualEffectAllowed(ZenPolicy.VISUAL_EFFECT_FULL_SCREEN_INTENT, boolean suppressFullScreenIntent = !zenPolicy.isVisualEffectAllowed( ZenPolicy.VISUAL_EFFECT_FULL_SCREEN_INTENT, isVisualEffectAllowed(Policy.SUPPRESSED_EFFECT_FULL_SCREEN_INTENT, defaultPolicy))) { defaultPolicy)); boolean suppressLights = !zenPolicy.isVisualEffectAllowed( ZenPolicy.VISUAL_EFFECT_LIGHTS, isVisualEffectAllowed(Policy.SUPPRESSED_EFFECT_LIGHTS, defaultPolicy)); boolean suppressAmbient = !zenPolicy.isVisualEffectAllowed( ZenPolicy.VISUAL_EFFECT_AMBIENT, isVisualEffectAllowed(Policy.SUPPRESSED_EFFECT_AMBIENT, defaultPolicy)); if (suppressFullScreenIntent && suppressLights && suppressAmbient) { suppressedVisualEffects |= Policy.SUPPRESSED_EFFECT_SCREEN_OFF; } if (suppressFullScreenIntent) { suppressedVisualEffects |= Policy.SUPPRESSED_EFFECT_FULL_SCREEN_INTENT; } if (!zenPolicy.isVisualEffectAllowed(ZenPolicy.VISUAL_EFFECT_LIGHTS, isVisualEffectAllowed(Policy.SUPPRESSED_EFFECT_LIGHTS, defaultPolicy))) { if (suppressLights) { suppressedVisualEffects |= Policy.SUPPRESSED_EFFECT_LIGHTS; } Loading @@ -855,6 +1019,7 @@ public class ZenModeConfig implements Parcelable { isVisualEffectAllowed(Policy.SUPPRESSED_EFFECT_PEEK, defaultPolicy))) { suppressedVisualEffects |= Policy.SUPPRESSED_EFFECT_PEEK; suppressedVisualEffects |= Policy.SUPPRESSED_EFFECT_SCREEN_ON; } if (!zenPolicy.isVisualEffectAllowed(ZenPolicy.VISUAL_EFFECT_STATUS_BAR, Loading @@ -869,9 +1034,7 @@ public class ZenModeConfig implements Parcelable { suppressedVisualEffects |= Policy.SUPPRESSED_EFFECT_BADGE; } if (!zenPolicy.isVisualEffectAllowed(ZenPolicy.VISUAL_EFFECT_AMBIENT, isVisualEffectAllowed(Policy.SUPPRESSED_EFFECT_AMBIENT, defaultPolicy))) { if (suppressAmbient) { suppressedVisualEffects |= Policy.SUPPRESSED_EFFECT_AMBIENT; } Loading @@ -898,13 +1061,30 @@ public class ZenModeConfig implements Parcelable { case ZenPolicy.PEOPLE_TYPE_ANYONE: return Policy.PRIORITY_SENDERS_ANY; case ZenPolicy.PEOPLE_TYPE_CONTACTS: return Policy.PRIORITY_SENDERS_CONTACTS; case ZenPolicy.PEOPLE_TYPE_STARRED: default: return Policy.PRIORITY_SENDERS_STARRED; } } /** * Maps NotificationManager.Policy senders type to ZenPolicy.PeopleType */ public static @ZenPolicy.PeopleType int getZenPolicySenders(int senders) { switch (senders) { case Policy.PRIORITY_SENDERS_ANY: return ZenPolicy.PEOPLE_TYPE_ANYONE; case Policy.PRIORITY_SENDERS_CONTACTS: return ZenPolicy.PEOPLE_TYPE_CONTACTS; case Policy.PRIORITY_SENDERS_STARRED: default: return ZenPolicy.PEOPLE_TYPE_STARRED; } } public Policy toNotificationPolicy() { int priorityCategories = 0; Loading
core/java/android/service/notification/ZenPolicy.java +116 −24 Original line number Diff line number Diff line Loading @@ -326,6 +326,32 @@ public final class ZenPolicy implements Parcelable { return mVisualEffects.get(VISUAL_EFFECT_NOTIFICATION_LIST); } /** * Whether this policy hides all visual effects * @hide */ public boolean shouldHideAllVisualEffects() { for (int i = 0; i < mVisualEffects.size(); i++) { if (mVisualEffects.get(i) != STATE_DISALLOW) { return false; } } return true; } /** * Whether this policy shows all visual effects * @hide */ public boolean shouldShowAllVisualEffects() { for (int i = 0; i < mVisualEffects.size(); i++) { if (mVisualEffects.get(i) != STATE_ALLOW) { return false; } } return true; } /** * Builder class for {@link ZenPolicy} objects. * Provides a convenient way to set the various fields of a {@link ZenPolicy}. If a field Loading @@ -338,6 +364,17 @@ public final class ZenPolicy implements Parcelable { mZenPolicy = new ZenPolicy(); } /** * @hide */ public Builder(ZenPolicy policy) { if (policy != null) { mZenPolicy = policy.copy(); } else { mZenPolicy = new ZenPolicy(); } } /** * Builds the current ZenPolicy. */ Loading Loading @@ -532,6 +569,34 @@ public final class ZenPolicy implements Parcelable { return this; } /** * Whether to allow {@link PriorityCategory} sounds to play when DND is active. * @hide */ public Builder allowCategory(@PriorityCategory int category, boolean allow) { switch (category) { case PRIORITY_CATEGORY_ALARMS: allowAlarms(allow); break; case PRIORITY_CATEGORY_MEDIA: allowMedia(allow); break; case PRIORITY_CATEGORY_SYSTEM: allowSystem(allow); break; case PRIORITY_CATEGORY_REMINDERS: allowReminders(allow); break; case PRIORITY_CATEGORY_EVENTS: allowEvents(allow); break; case PRIORITY_CATEGORY_REPEAT_CALLERS: allowRepeatCallers(allow); break; } return this; } /** * Whether {@link Notification#fullScreenIntent full screen intents} that are intercepted * by DND are shown. Loading Loading @@ -601,6 +666,38 @@ public final class ZenPolicy implements Parcelable { show ? STATE_ALLOW : STATE_DISALLOW); return this; } /** * Whether notifications intercepted by DND are prevented from appearing for * {@link VisualEffect} * @hide */ public Builder showVisualEffect(@VisualEffect int effect, boolean show) { switch (effect) { case VISUAL_EFFECT_FULL_SCREEN_INTENT: showFullScreenIntent(show); break; case VISUAL_EFFECT_LIGHTS: showLights(show); break; case VISUAL_EFFECT_PEEK: showPeeking(show); break; case VISUAL_EFFECT_STATUS_BAR: showStatusBarIcons(show); break; case VISUAL_EFFECT_BADGE: showBadges(show); break; case VISUAL_EFFECT_AMBIENT: showInAmbientDisplay(show); break; case VISUAL_EFFECT_NOTIFICATION_LIST: showInNotificationList(show); break; } return this; } } @Override Loading Loading @@ -640,8 +737,8 @@ public final class ZenPolicy implements Parcelable { .append('{') .append("priorityCategories=[").append(priorityCategoriesToString()) .append("], visualEffects=[").append(visualEffectsToString()) .append(", priorityCalls=").append(stateToString(mPriorityCalls)) .append("], priorityMessages=").append(stateToString(mPriorityMessages)) .append("], priorityCalls=").append(peopleTypeToString(mPriorityCalls)) .append(", priorityMessages=").append(peopleTypeToString(mPriorityMessages)) .append('}') .toString(); } Loading Loading @@ -726,7 +823,23 @@ public final class ZenPolicy implements Parcelable { case STATE_ALLOW: return "allow"; } return null; return "invalidState{" + state + "}"; } private String peopleTypeToString(@PeopleType int peopleType) { switch (peopleType) { case PEOPLE_TYPE_ANYONE: return "anyone"; case PEOPLE_TYPE_CONTACTS: return "contacts"; case PEOPLE_TYPE_NONE: return "none"; case PEOPLE_TYPE_STARRED: return "starred_contacts"; case STATE_UNSET: return "unset"; } return "invalidPeopleType{" + peopleType + "}"; } @Override Loading Loading @@ -856,27 +969,6 @@ public final class ZenPolicy implements Parcelable { } } /** * @hide */ public boolean areValuesSet() { return getPriorityCategoryReminders() != STATE_UNSET || getPriorityCategoryEvents() != STATE_UNSET || getPriorityCategoryMessages() != STATE_UNSET || getPriorityCategoryCalls() != STATE_UNSET || getPriorityCategoryRepeatCallers() != STATE_UNSET || getPriorityCategoryAlarms() != STATE_UNSET || getPriorityCategoryMedia() != STATE_UNSET || getPriorityCategorySystem() != STATE_UNSET || getVisualEffectFullScreenIntent() != STATE_UNSET || getVisualEffectLights() != STATE_UNSET || getVisualEffectPeek() != STATE_UNSET || getVisualEffectStatusBar() != STATE_UNSET || getVisualEffectBadge() != STATE_UNSET || getVisualEffectAmbient() != STATE_UNSET || getVisualEffectNotificationList() != STATE_UNSET; } /** * @hide */ Loading
packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java +2 −3 Original line number Diff line number Diff line Loading @@ -117,8 +117,8 @@ public class ZenModeControllerImpl extends CurrentUserTracker @Override public boolean areNotificationsHiddenInShade() { if (mZenMode != Global.ZEN_MODE_OFF) { return (mConfig.suppressedVisualEffects & NotificationManager.Policy .SUPPRESSED_EFFECT_NOTIFICATION_LIST) != 0; return (mConsolidatedNotificationPolicy.suppressedVisualEffects & NotificationManager.Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST) != 0; } return false; } Loading Loading @@ -260,7 +260,6 @@ public class ZenModeControllerImpl extends CurrentUserTracker } } @VisibleForTesting protected void updateZenModeConfig() { final ZenModeConfig config = mNoMan.getZenModeConfig(); Loading