diff options
| author | 2016-01-05 08:35:25 -0500 | |
|---|---|---|
| committer | 2016-01-05 12:49:09 -0500 | |
| commit | 617215874db9c208a74dc97f4133e6b6fc96271c (patch) | |
| tree | a55fd910152c1e8993924c678a16e6f731312ef1 | |
| parent | c831e36b60279ff704ba2bf230c651da8e2bf259 (diff) | |
DND visual interruptions: prevent screen on.
Bug: 25423508
Change-Id: Ie935a2051e1ae774fbeaf624f3599b2b1bb8666d
11 files changed, 81 insertions, 20 deletions
diff --git a/api/current.txt b/api/current.txt index 30d302093272..730e84e10399 100644 --- a/api/current.txt +++ b/api/current.txt @@ -5197,6 +5197,7 @@ package android.app { field public static final int SUPPRESSED_EFFECTS_UNSET = -1; // 0xffffffff field public static final int SUPPRESSED_EFFECT_LIGHTS = 1; // 0x1 field public static final int SUPPRESSED_EFFECT_PEEK = 2; // 0x2 + field public static final int SUPPRESSED_EFFECT_SCREEN_ON = 4; // 0x4 field public final int priorityCallSenders; field public final int priorityCategories; field public final int priorityMessageSenders; @@ -33560,6 +33561,7 @@ package android.service.notification { field public static final java.lang.String SERVICE_INTERFACE = "android.service.notification.NotificationListenerService"; field public static final int SUPPRESSED_EFFECT_LIGHTS = 1; // 0x1 field public static final int SUPPRESSED_EFFECT_PEEK = 2; // 0x2 + field public static final int SUPPRESSED_EFFECT_SCREEN_ON = 4; // 0x4 } public static class NotificationListenerService.Ranking { diff --git a/api/system-current.txt b/api/system-current.txt index d7393b738d14..6f5db729117e 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5317,6 +5317,7 @@ package android.app { field public static final int SUPPRESSED_EFFECTS_UNSET = -1; // 0xffffffff field public static final int SUPPRESSED_EFFECT_LIGHTS = 1; // 0x1 field public static final int SUPPRESSED_EFFECT_PEEK = 2; // 0x2 + field public static final int SUPPRESSED_EFFECT_SCREEN_ON = 4; // 0x4 field public final int priorityCallSenders; field public final int priorityCategories; field public final int priorityMessageSenders; @@ -35707,6 +35708,7 @@ package android.service.notification { field public static final java.lang.String SERVICE_INTERFACE = "android.service.notification.NotificationListenerService"; field public static final int SUPPRESSED_EFFECT_LIGHTS = 1; // 0x1 field public static final int SUPPRESSED_EFFECT_PEEK = 2; // 0x2 + field public static final int SUPPRESSED_EFFECT_SCREEN_ON = 4; // 0x4 field public static final int TRIM_FULL = 0; // 0x0 field public static final int TRIM_LIGHT = 1; // 0x1 } diff --git a/api/test-current.txt b/api/test-current.txt index 9058fe7d8b88..ac4ec6e532c6 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -5197,6 +5197,7 @@ package android.app { field public static final int SUPPRESSED_EFFECTS_UNSET = -1; // 0xffffffff field public static final int SUPPRESSED_EFFECT_LIGHTS = 1; // 0x1 field public static final int SUPPRESSED_EFFECT_PEEK = 2; // 0x2 + field public static final int SUPPRESSED_EFFECT_SCREEN_ON = 4; // 0x4 field public final int priorityCallSenders; field public final int priorityCategories; field public final int priorityMessageSenders; @@ -33563,6 +33564,7 @@ package android.service.notification { field public static final java.lang.String SERVICE_INTERFACE = "android.service.notification.NotificationListenerService"; field public static final int SUPPRESSED_EFFECT_LIGHTS = 1; // 0x1 field public static final int SUPPRESSED_EFFECT_PEEK = 2; // 0x2 + field public static final int SUPPRESSED_EFFECT_SCREEN_ON = 4; // 0x4 } public static class NotificationListenerService.Ranking { diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index 85d9831921ac..9a3c82036399 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -637,10 +637,12 @@ public class NotificationManager public static final int SUPPRESSED_EFFECTS_UNSET = -1; public static final int SUPPRESSED_EFFECT_LIGHTS = 1 << 0; public static final int SUPPRESSED_EFFECT_PEEK = 1 << 1; + public static final int SUPPRESSED_EFFECT_SCREEN_ON = 1 << 2; private static final int[] ALL_SUPPRESSED_EFFECTS = { SUPPRESSED_EFFECT_LIGHTS, SUPPRESSED_EFFECT_PEEK, + SUPPRESSED_EFFECT_SCREEN_ON, }; /** @@ -750,6 +752,7 @@ public class NotificationManager switch (effect) { case SUPPRESSED_EFFECT_LIGHTS: return "SUPPRESSED_EFFECT_LIGHTS"; case SUPPRESSED_EFFECT_PEEK: return "SUPPRESSED_EFFECT_PEEK"; + case SUPPRESSED_EFFECT_SCREEN_ON: return "SUPPRESSED_EFFECT_SCREEN_ON"; case SUPPRESSED_EFFECTS_UNSET: return "SUPPRESSED_EFFECTS_UNSET"; default: return "UNKNOWN_" + effect; } diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java index 6c99489d7709..b42d9eaf9cb5 100644 --- a/core/java/android/service/notification/NotificationListenerService.java +++ b/core/java/android/service/notification/NotificationListenerService.java @@ -123,6 +123,8 @@ public abstract class NotificationListenerService extends Service { NotificationManager.Policy.SUPPRESSED_EFFECT_LIGHTS; public static final int SUPPRESSED_EFFECT_PEEK = NotificationManager.Policy.SUPPRESSED_EFFECT_PEEK; + public static final int SUPPRESSED_EFFECT_SCREEN_ON = + NotificationManager.Policy.SUPPRESSED_EFFECT_SCREEN_ON; /** * The full trim of the StatusBarNotification including all its features. @@ -961,7 +963,8 @@ public abstract class NotificationListenerService extends Service { /** * Returns the type(s) of visual effects that should be suppressed for this notification. - * See {@link #SUPPRESSED_EFFECT_LIGHTS}, {@link #SUPPRESSED_EFFECT_PEEK}}. + * See {@link #SUPPRESSED_EFFECT_LIGHTS}, {@link #SUPPRESSED_EFFECT_PEEK}, + * {@link #SUPPRESSED_EFFECT_SCREEN_ON}. */ public int getSuppressedVisualEffects() { return mSuppressedVisualEffects; diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java index 541623d736f1..468884347fc5 100644 --- a/core/java/android/service/notification/ZenModeConfig.java +++ b/core/java/android/service/notification/ZenModeConfig.java @@ -79,6 +79,7 @@ public class ZenModeConfig implements Parcelable { private static final boolean DEFAULT_ALLOW_REPEAT_CALLERS = false; private static final boolean DEFAULT_ALLOW_PEEK = true; private static final boolean DEFAULT_ALLOW_LIGHTS = true; + private static final boolean DEFAULT_ALLOW_SCREEN_ON = true; private static final int XML_VERSION = 2; private static final String ZEN_TAG = "zen"; @@ -95,6 +96,7 @@ public class ZenModeConfig implements Parcelable { private static final String ALLOW_ATT_EVENTS = "events"; private static final String ALLOW_ATT_PEEK = "peek"; private static final String ALLOW_ATT_LIGHTS = "lights"; + private static final String ALLOW_ATT_SCREEN_ON = "screen_on"; private static final String CONDITION_TAG = "condition"; private static final String CONDITION_ATT_COMPONENT = "component"; @@ -128,6 +130,7 @@ public class ZenModeConfig implements Parcelable { public int user = UserHandle.USER_SYSTEM; public boolean allowPeek = DEFAULT_ALLOW_PEEK; public boolean allowLights = DEFAULT_ALLOW_LIGHTS; + public boolean allowScreenOn = DEFAULT_ALLOW_SCREEN_ON; public ZenRule manualRule; public ArrayMap<String, ZenRule> automaticRules = new ArrayMap<>(); @@ -156,6 +159,7 @@ public class ZenModeConfig implements Parcelable { } allowPeek = source.readInt() == 1; allowLights = source.readInt() == 1; + allowScreenOn = source.readInt() == 1; } @Override @@ -185,6 +189,7 @@ public class ZenModeConfig implements Parcelable { } dest.writeInt(allowPeek ? 1 : 0); dest.writeInt(allowLights ? 1 : 0); + dest.writeInt(allowScreenOn ? 1 : 0); } @Override @@ -200,6 +205,7 @@ public class ZenModeConfig implements Parcelable { .append(",allowEvents=").append(allowEvents) .append(",allowPeek=").append(allowPeek) .append(",allowLights=").append(allowLights) + .append(",allowScreenOn=").append(allowScreenOn) .append(",automaticRules=").append(automaticRules) .append(",manualRule=").append(manualRule) .append(']').toString(); @@ -240,6 +246,9 @@ public class ZenModeConfig implements Parcelable { if (allowLights != to.allowLights) { d.addLine("allowLights", allowLights, to.allowLights); } + if (allowScreenOn != to.allowScreenOn) { + d.addLine("allowScreenOn", allowScreenOn, to.allowScreenOn); + } final ArraySet<String> allRules = new ArraySet<>(); addKeys(allRules, automaticRules); addKeys(allRules, to.automaticRules); @@ -339,6 +348,7 @@ public class ZenModeConfig implements Parcelable { && other.allowEvents == allowEvents && other.allowPeek == allowPeek && other.allowLights == allowLights + && other.allowScreenOn == allowScreenOn && other.user == user && Objects.equals(other.automaticRules, automaticRules) && Objects.equals(other.manualRule, manualRule); @@ -348,7 +358,7 @@ public class ZenModeConfig implements Parcelable { public int hashCode() { return Objects.hash(allowCalls, allowRepeatCallers, allowMessages, allowCallsFrom, allowMessagesFrom, allowReminders, allowEvents, allowPeek, allowLights, - user, automaticRules, manualRule); + allowScreenOn, user, automaticRules, manualRule); } private static String toDayList(int[] days) { @@ -435,6 +445,8 @@ public class ZenModeConfig implements Parcelable { } rt.allowPeek = safeBoolean(parser, ALLOW_ATT_PEEK, DEFAULT_ALLOW_PEEK); rt.allowLights = safeBoolean(parser, ALLOW_ATT_LIGHTS, DEFAULT_ALLOW_LIGHTS); + rt.allowScreenOn = + safeBoolean(parser, ALLOW_ATT_SCREEN_ON, DEFAULT_ALLOW_SCREEN_ON); } else if (MANUAL_TAG.equals(tag)) { rt.manualRule = readRuleXml(parser); } else if (AUTOMATIC_TAG.equals(tag)) { @@ -465,6 +477,7 @@ public class ZenModeConfig implements Parcelable { out.attribute(null, ALLOW_ATT_MESSAGES_FROM, Integer.toString(allowMessagesFrom)); out.attribute(null, ALLOW_ATT_PEEK, Boolean.toString(allowPeek)); out.attribute(null, ALLOW_ATT_LIGHTS, Boolean.toString(allowLights)); + out.attribute(null, ALLOW_ATT_SCREEN_ON, Boolean.toString(allowScreenOn)); out.endTag(null, ALLOW_TAG); if (manualRule != null) { @@ -643,6 +656,9 @@ public class ZenModeConfig implements Parcelable { if (!allowLights) { suppressedVisualEffects |= Policy.SUPPRESSED_EFFECT_LIGHTS; } + if (!allowScreenOn) { + suppressedVisualEffects |= Policy.SUPPRESSED_EFFECT_SCREEN_ON; + } priorityCallSenders = sourceToPrioritySenders(allowCallsFrom, priorityCallSenders); priorityMessageSenders = sourceToPrioritySenders(allowMessagesFrom, priorityMessageSenders); return new Policy(priorityCategories, priorityCallSenders, priorityMessageSenders, @@ -681,6 +697,8 @@ public class ZenModeConfig implements Parcelable { if (policy.suppressedVisualEffects != Policy.SUPPRESSED_EFFECTS_UNSET) { allowPeek = (policy.suppressedVisualEffects & Policy.SUPPRESSED_EFFECT_PEEK) == 0; allowLights = (policy.suppressedVisualEffects & Policy.SUPPRESSED_EFFECT_LIGHTS) == 0; + allowScreenOn = + (policy.suppressedVisualEffects & Policy.SUPPRESSED_EFFECT_SCREEN_ON) == 0; } } diff --git a/core/java/com/android/internal/logging/MetricsLogger.java b/core/java/com/android/internal/logging/MetricsLogger.java index 5fc744899d5e..4b821abec6fb 100644 --- a/core/java/com/android/internal/logging/MetricsLogger.java +++ b/core/java/com/android/internal/logging/MetricsLogger.java @@ -37,6 +37,7 @@ public class MetricsLogger implements MetricsConstants { public static final int ACTION_DEFAULT_SMS_APP_CHANGED = 264; public static final int QS_COLOR_MATRIX = 265; public static final int QS_CUSTOM = 266; + public static final int ACTION_ZEN_ALLOW_SCREEN_ON = 267; /** * Logged when the user docks a window from recents by longpressing a task and dragging it to diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java index f7680a7d81b2..3cc1ab9b42ef 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java @@ -292,6 +292,15 @@ public class NotificationData { return false; } + public boolean shouldSuppressScreenOn(String key) { + if (mRankingMap != null) { + mRankingMap.getRanking(key, mTmpRanking); + return (mTmpRanking.getSuppressedVisualEffects() + & NotificationListenerService.SUPPRESSED_EFFECT_SCREEN_ON) != 0; + } + return false; + } + public int getImportance(String key) { if (mRankingMap != null) { mRankingMap.getRanking(key, mTmpRanking); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 80fcba60e895..80614d5e4438 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -1269,19 +1269,26 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } if (!isHeadsUped && notification.getNotification().fullScreenIntent != null) { - // Stop screensaver if the notification has a full-screen intent. - // (like an incoming phone call) - awakenDreams(); + if (mNotificationData.shouldSuppressScreenOn(notification.getKey())) { + if (DEBUG) { + Log.d(TAG, "No Fullscreen intent: suppressed by DND: " + notification.getKey()); + } + } else { + // Stop screensaver if the notification has a full-screen intent. + // (like an incoming phone call) + awakenDreams(); - // not immersive & a full-screen alert should be shown - if (DEBUG) Log.d(TAG, "Notification has fullScreenIntent; sending fullScreenIntent"); - try { - EventLog.writeEvent(EventLogTags.SYSUI_FULLSCREEN_NOTIFICATION, - notification.getKey()); - notification.getNotification().fullScreenIntent.send(); - shadeEntry.notifyFullScreenIntentLaunched(); - MetricsLogger.count(mContext, "note_fullscreen", 1); - } catch (PendingIntent.CanceledException e) { + // not immersive & a full-screen alert should be shown + if (DEBUG) + Log.d(TAG, "Notification has fullScreenIntent; sending fullScreenIntent"); + try { + EventLog.writeEvent(EventLogTags.SYSUI_FULLSCREEN_NOTIFICATION, + notification.getKey()); + notification.getNotification().fullScreenIntent.send(); + shadeEntry.notifyFullScreenIntentLaunched(); + MetricsLogger.count(mContext, "note_fullscreen", 1); + } catch (PendingIntent.CanceledException e) { + } } } addNotificationViews(shadeEntry, ranking); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 82c38af677ce..86570496e095 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -33,6 +33,7 @@ import static android.service.notification.NotificationListenerService.HINT_HOST import static android.service.notification.NotificationListenerService.Ranking.IMPORTANCE_HIGH; import static android.service.notification.NotificationListenerService.SUPPRESSED_EFFECT_LIGHTS; import static android.service.notification.NotificationListenerService.SUPPRESSED_EFFECT_PEEK; +import static android.service.notification.NotificationListenerService.SUPPRESSED_EFFECT_SCREEN_ON; import static android.service.notification.NotificationListenerService.TRIM_FULL; import static android.service.notification.NotificationListenerService.TRIM_LIGHT; import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT; @@ -2563,9 +2564,14 @@ public class NotificationManagerService extends SystemService { updateLightsLocked(); } if (buzz || beep || blink) { - EventLogTags.writeNotificationAlert(record.getKey(), - buzz ? 1 : 0, beep ? 1 : 0, blink ? 1 : 0); - mHandler.post(mBuzzBeepBlinked); + if (((record.getSuppressedVisualEffects() + & NotificationListenerService.SUPPRESSED_EFFECT_SCREEN_ON) != 0)) { + if (DBG) Slog.v(TAG, "Suppressed SystemUI from triggering screen on"); + } else { + EventLogTags.writeNotificationAlert(record.getKey(), + buzz ? 1 : 0, beep ? 1 : 0, blink ? 1 : 0); + mHandler.post(mBuzzBeepBlinked); + } } } @@ -2744,7 +2750,8 @@ public class NotificationManagerService extends SystemService { record.setIntercepted(mZenModeHelper.shouldIntercept(record)); if (record.isIntercepted()) { int suppressed = (mZenModeHelper.shouldSuppressLight() ? SUPPRESSED_EFFECT_LIGHTS : 0) - | (mZenModeHelper.shouldSuppressPeek() ? SUPPRESSED_EFFECT_PEEK : 0); + | (mZenModeHelper.shouldSuppressPeek() ? SUPPRESSED_EFFECT_PEEK : 0) + | (mZenModeHelper.shouldSuppressScreenOn() ? SUPPRESSED_EFFECT_SCREEN_ON : 0); record.setSuppressedVisualEffects(suppressed); } } diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java index 85c3cf88af19..276c6babce24 100644 --- a/services/core/java/com/android/server/notification/ZenModeHelper.java +++ b/services/core/java/com/android/server/notification/ZenModeHelper.java @@ -155,6 +155,12 @@ public class ZenModeHelper { } } + public boolean shouldSuppressScreenOn() { + synchronized (mConfig) { + return !mConfig.allowScreenOn; + } + } + public void addCallback(Callback callback) { mCallbacks.add(callback); } @@ -435,11 +441,12 @@ public class ZenModeHelper { return; } pw.printf("allow(calls=%s,callsFrom=%s,repeatCallers=%s,messages=%s,messagesFrom=%s," - + "events=%s,reminders=%s,lights=%s,peek=%s)\n", + + "events=%s,reminders=%s,lights=%s,peek=%s,screenOn=%s)\n", config.allowCalls, ZenModeConfig.sourceToString(config.allowCallsFrom), config.allowRepeatCallers, config.allowMessages, ZenModeConfig.sourceToString(config.allowMessagesFrom), - config.allowEvents, config.allowReminders, config.allowLights, config.allowPeek); + config.allowEvents, config.allowReminders, config.allowLights, config.allowPeek, + config.allowScreenOn); pw.print(prefix); pw.print(" manualRule="); pw.println(config.manualRule); if (config.automaticRules.isEmpty()) return; final int N = config.automaticRules.size(); |