Merge "Suppress HUNs according to group alert behavior" into oc-dev

am: 8bc45cb78f

Change-Id: I86f65c9f8ae331d5b3cc4a35af6a48aa2b04dce1
This commit is contained in:
Julia Reynolds
2017-05-30 16:49:52 +00:00
committed by android-build-merger
4 changed files with 107 additions and 12 deletions

View File

@@ -2639,6 +2639,20 @@ public class Notification implements Parcelable
return mGroupKey != null && (flags & FLAG_GROUP_SUMMARY) == 0; return mGroupKey != null && (flags & FLAG_GROUP_SUMMARY) == 0;
} }
/**
* @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. * Builder class for {@link Notification} objects.
* *

View File

@@ -759,6 +759,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mBatteryController = Dependency.get(BatteryController.class); mBatteryController = Dependency.get(BatteryController.class);
mAssistManager = Dependency.get(AssistManager.class); mAssistManager = Dependency.get(AssistManager.class);
mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class); mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class);
mSystemServicesProxy = SystemServicesProxy.getInstance(mContext);
mWindowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE); mWindowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
mDisplay = mWindowManager.getDefaultDisplay(); mDisplay = mWindowManager.getDefaultDisplay();
@@ -5192,6 +5193,7 @@ public class StatusBar extends SystemUI implements DemoMode,
protected KeyguardManager mKeyguardManager; protected KeyguardManager mKeyguardManager;
private LockPatternUtils mLockPatternUtils; private LockPatternUtils mLockPatternUtils;
private DeviceProvisionedController mDeviceProvisionedController; private DeviceProvisionedController mDeviceProvisionedController;
protected SystemServicesProxy mSystemServicesProxy;
// UI-specific methods // UI-specific methods
@@ -6816,6 +6818,7 @@ public class StatusBar extends SystemUI implements DemoMode,
protected boolean shouldPeek(Entry entry, StatusBarNotification sbn) { protected boolean shouldPeek(Entry entry, StatusBarNotification sbn) {
if (!mUseHeadsUp || isDeviceInVrMode()) { if (!mUseHeadsUp || isDeviceInVrMode()) {
if (DEBUG) Log.d(TAG, "No peeking: no huns or vr mode");
return false; return false;
} }
@@ -6824,8 +6827,7 @@ public class StatusBar extends SystemUI implements DemoMode,
return false; return false;
} }
boolean inUse = mPowerManager.isScreenOn() boolean inUse = mPowerManager.isScreenOn() && !mSystemServicesProxy.isDreaming();
&& !SystemServicesProxy.getInstance(mContext).isDreaming();
if (!inUse && !isDozing()) { if (!inUse && !isDozing()) {
if (DEBUG) { if (DEBUG) {
@@ -6868,6 +6870,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; return true;
} }

View File

@@ -16,13 +16,27 @@
package com.android.systemui.statusbar.phone; 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.any;
import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.app.Notification;
import android.metrics.LogMaker; 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.filters.SmallTest;
import android.support.test.metricshelper.MetricsAsserts; import android.support.test.metricshelper.MetricsAsserts;
import android.support.test.runner.AndroidJUnit4; 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.internal.logging.testing.FakeMetricsLogger;
import com.android.keyguard.KeyguardHostView.OnDismissAction; import com.android.keyguard.KeyguardHostView.OnDismissAction;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.recents.misc.SystemServicesProxy;
import com.android.systemui.statusbar.ActivatableNotificationView; import com.android.systemui.statusbar.ActivatableNotificationView;
import com.android.systemui.statusbar.KeyguardIndicationController; import com.android.systemui.statusbar.KeyguardIndicationController;
import com.android.systemui.statusbar.NotificationData; import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.statusbar.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
import org.junit.Before; import org.junit.Before;
@@ -52,19 +68,34 @@ public class StatusBarTest extends SysuiTestCase {
NotificationStackScrollLayout mStackScroller; NotificationStackScrollLayout mStackScroller;
StatusBar mStatusBar; StatusBar mStatusBar;
FakeMetricsLogger mMetricsLogger; FakeMetricsLogger mMetricsLogger;
HeadsUpManager mHeadsUpManager;
NotificationData mNotificationData;
PowerManager mPowerManager;
SystemServicesProxy mSystemServicesProxy;
private DisplayMetrics mDisplayMetrics = new DisplayMetrics(); private DisplayMetrics mDisplayMetrics = new DisplayMetrics();
@Before @Before
public void setup() { public void setup() throws Exception {
mStatusBarKeyguardViewManager = mock(StatusBarKeyguardViewManager.class); mStatusBarKeyguardViewManager = mock(StatusBarKeyguardViewManager.class);
mUnlockMethodCache = mock(UnlockMethodCache.class); mUnlockMethodCache = mock(UnlockMethodCache.class);
mKeyguardIndicationController = mock(KeyguardIndicationController.class); mKeyguardIndicationController = mock(KeyguardIndicationController.class);
mStackScroller = mock(NotificationStackScrollLayout.class); mStackScroller = mock(NotificationStackScrollLayout.class);
mMetricsLogger = new FakeMetricsLogger(); 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); mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache, mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
mKeyguardIndicationController, mStackScroller); mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
mNotificationData, mPowerManager, mSystemServicesProxy);
doAnswer(invocation -> { doAnswer(invocation -> {
OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0]; OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
@@ -210,14 +241,62 @@ public class StatusBarTest extends SysuiTestCase {
.setType(MetricsEvent.TYPE_ACTION)); .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 { static class TestableStatusBar extends StatusBar {
public TestableStatusBar(StatusBarKeyguardViewManager man, public TestableStatusBar(StatusBarKeyguardViewManager man,
UnlockMethodCache unlock, KeyguardIndicationController key, UnlockMethodCache unlock, KeyguardIndicationController key,
NotificationStackScrollLayout stack) { NotificationStackScrollLayout stack, HeadsUpManager hum, NotificationData nd,
PowerManager pm, SystemServicesProxy ssp) {
mStatusBarKeyguardViewManager = man; mStatusBarKeyguardViewManager = man;
mUnlockMethodCache = unlock; mUnlockMethodCache = unlock;
mKeyguardIndicationController = key; mKeyguardIndicationController = key;
mStackScroller = stack; mStackScroller = stack;
mHeadsUpManager = hum;
mNotificationData = nd;
mUseHeadsUp = true;
mPowerManager = pm;
mSystemServicesProxy = ssp;
} }
@Override @Override

View File

@@ -3759,13 +3759,7 @@ public class NotificationManagerService extends SystemService {
return true; return true;
} }
if (record.sbn.isGroup()) { if (record.sbn.isGroup()) {
if (notification.isGroupSummary() return notification.suppressAlertingDueToGrouping();
&& notification.getGroupAlertBehavior() == Notification.GROUP_ALERT_CHILDREN) {
return true;
} else if (notification.isGroupChild()
&& notification.getGroupAlertBehavior() == Notification.GROUP_ALERT_SUMMARY) {
return true;
}
} }
return false; return false;
} }