diff options
| author | 2017-05-30 16:57:53 +0000 | |
|---|---|---|
| committer | 2017-05-30 16:57:53 +0000 | |
| commit | a614d3c8eb46985e17e523b0c16f7faf8ef5274b (patch) | |
| tree | c8e3977c9edc3e3efdf116f8514175e54f9f4492 | |
| parent | f9e9fa440a8e684ca0b10e591927e1019c371e71 (diff) | |
| parent | 393efb57d7c0ccf9e734ede129ed8e31382c6a0d (diff) | |
Merge "Suppress HUNs according to group alert behavior" into oc-dev am: 8bc45cb78f
am: 393efb57d7
Change-Id: I3d701017ccd7006e146c163ff651ae4e639065c7
4 files changed, 107 insertions, 12 deletions
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 3ed174b2d46f..c626ae9630b8 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -2640,6 +2640,20 @@ public class Notification implements Parcelable } /** + * @hide + */ + public boolean suppressAlertingDueToGrouping() { + if (isGroupSummary() + && getGroupAlertBehavior() == Notification.GROUP_ALERT_CHILDREN) { + return true; + } else if (isGroupChild() + && getGroupAlertBehavior() == Notification.GROUP_ALERT_SUMMARY) { + return true; + } + return false; + } + + /** * Builder class for {@link Notification} objects. * * Provides a convenient way to set the various fields of a {@link Notification} and generate diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index d087ca0cf307..923993a601f7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -771,6 +771,7 @@ public class StatusBar extends SystemUI implements DemoMode, mBatteryController = Dependency.get(BatteryController.class); mAssistManager = Dependency.get(AssistManager.class); mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class); + mSystemServicesProxy = SystemServicesProxy.getInstance(mContext); mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); mDisplay = mWindowManager.getDefaultDisplay(); @@ -5258,6 +5259,7 @@ public class StatusBar extends SystemUI implements DemoMode, protected KeyguardManager mKeyguardManager; private LockPatternUtils mLockPatternUtils; private DeviceProvisionedController mDeviceProvisionedController; + protected SystemServicesProxy mSystemServicesProxy; // UI-specific methods @@ -6908,6 +6910,7 @@ public class StatusBar extends SystemUI implements DemoMode, protected boolean shouldPeek(Entry entry, StatusBarNotification sbn) { if (!mUseHeadsUp || isDeviceInVrMode()) { + if (DEBUG) Log.d(TAG, "No peeking: no huns or vr mode"); return false; } @@ -6916,8 +6919,7 @@ public class StatusBar extends SystemUI implements DemoMode, return false; } - boolean inUse = mPowerManager.isScreenOn() - && !SystemServicesProxy.getInstance(mContext).isDreaming(); + boolean inUse = mPowerManager.isScreenOn() && !mSystemServicesProxy.isDreaming(); if (!inUse && !isDozing()) { if (DEBUG) { @@ -6960,6 +6962,12 @@ public class StatusBar extends SystemUI implements DemoMode, } } + // Don't peek notifications that are suppressed due to group alert behavior + if (sbn.isGroup() && sbn.getNotification().suppressAlertingDueToGrouping()) { + if (DEBUG) Log.d(TAG, "No peeking: suppressed due to group alert behavior"); + return false; + } + return true; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java index bf6b3946d101..55ec3079bdbb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java @@ -16,13 +16,27 @@ package com.android.systemui.statusbar.phone; +import static android.app.NotificationManager.IMPORTANCE_HIGH; + +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; + import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyBoolean; +import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import android.app.Notification; import android.metrics.LogMaker; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.IPowerManager; +import android.os.Looper; +import android.os.PowerManager; +import android.os.UserHandle; +import android.service.notification.StatusBarNotification; import android.support.test.filters.SmallTest; import android.support.test.metricshelper.MetricsAsserts; import android.support.test.runner.AndroidJUnit4; @@ -33,9 +47,11 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.testing.FakeMetricsLogger; import com.android.keyguard.KeyguardHostView.OnDismissAction; import com.android.systemui.SysuiTestCase; +import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.statusbar.ActivatableNotificationView; import com.android.systemui.statusbar.KeyguardIndicationController; import com.android.systemui.statusbar.NotificationData; +import com.android.systemui.statusbar.policy.HeadsUpManager; import com.android.systemui.statusbar.stack.NotificationStackScrollLayout; import org.junit.Before; @@ -52,19 +68,34 @@ public class StatusBarTest extends SysuiTestCase { NotificationStackScrollLayout mStackScroller; StatusBar mStatusBar; FakeMetricsLogger mMetricsLogger; + HeadsUpManager mHeadsUpManager; + NotificationData mNotificationData; + PowerManager mPowerManager; + SystemServicesProxy mSystemServicesProxy; private DisplayMetrics mDisplayMetrics = new DisplayMetrics(); @Before - public void setup() { + public void setup() throws Exception { mStatusBarKeyguardViewManager = mock(StatusBarKeyguardViewManager.class); mUnlockMethodCache = mock(UnlockMethodCache.class); mKeyguardIndicationController = mock(KeyguardIndicationController.class); mStackScroller = mock(NotificationStackScrollLayout.class); mMetricsLogger = new FakeMetricsLogger(); + mHeadsUpManager = mock(HeadsUpManager.class); + mNotificationData = mock(NotificationData.class); + mSystemServicesProxy = mock(SystemServicesProxy.class); + IPowerManager powerManagerService = mock(IPowerManager.class); + HandlerThread handlerThread = new HandlerThread("TestThread"); + handlerThread.start(); + mPowerManager = new PowerManager(mContext, powerManagerService, + new Handler(handlerThread.getLooper())); + when(powerManagerService.isInteractive()).thenReturn(true); + mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger); mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache, - mKeyguardIndicationController, mStackScroller); + mKeyguardIndicationController, mStackScroller, mHeadsUpManager, + mNotificationData, mPowerManager, mSystemServicesProxy); doAnswer(invocation -> { OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0]; @@ -210,14 +241,62 @@ public class StatusBarTest extends SysuiTestCase { .setType(MetricsEvent.TYPE_ACTION)); } + @Test + public void testShouldPeek_nonSuppressedGroupSummary() { + when(mPowerManager.isScreenOn()).thenReturn(true); + when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false); + when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false); + when(mNotificationData.shouldFilterOut(any())).thenReturn(false); + when(mSystemServicesProxy.isDreaming()).thenReturn(false); + when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH); + + Notification n = new Notification.Builder(getContext(), "a") + .setGroup("a") + .setGroupSummary(true) + .setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY) + .build(); + StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n, + UserHandle.of(0), null, 0); + NotificationData.Entry entry = new NotificationData.Entry(sbn); + + assertTrue(mStatusBar.shouldPeek(entry, sbn)); + } + + @Test + public void testShouldPeek_suppressedGroupSummary() { + when(mPowerManager.isScreenOn()).thenReturn(true); + when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false); + when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false); + when(mNotificationData.shouldFilterOut(any())).thenReturn(false); + when(mSystemServicesProxy.isDreaming()).thenReturn(false); + when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH); + + Notification n = new Notification.Builder(getContext(), "a") + .setGroup("a") + .setGroupSummary(true) + .setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN) + .build(); + StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n, + UserHandle.of(0), null, 0); + NotificationData.Entry entry = new NotificationData.Entry(sbn); + + assertFalse(mStatusBar.shouldPeek(entry, sbn)); + } + static class TestableStatusBar extends StatusBar { public TestableStatusBar(StatusBarKeyguardViewManager man, UnlockMethodCache unlock, KeyguardIndicationController key, - NotificationStackScrollLayout stack) { + NotificationStackScrollLayout stack, HeadsUpManager hum, NotificationData nd, + PowerManager pm, SystemServicesProxy ssp) { mStatusBarKeyguardViewManager = man; mUnlockMethodCache = unlock; mKeyguardIndicationController = key; mStackScroller = stack; + mHeadsUpManager = hum; + mNotificationData = nd; + mUseHeadsUp = true; + mPowerManager = pm; + mSystemServicesProxy = ssp; } @Override diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 42ebbcf4e6a4..b630368367f5 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -3759,13 +3759,7 @@ public class NotificationManagerService extends SystemService { return true; } if (record.sbn.isGroup()) { - if (notification.isGroupSummary() - && notification.getGroupAlertBehavior() == Notification.GROUP_ALERT_CHILDREN) { - return true; - } else if (notification.isGroupChild() - && notification.getGroupAlertBehavior() == Notification.GROUP_ALERT_SUMMARY) { - return true; - } + return notification.suppressAlertingDueToGrouping(); } return false; } |