Merge "Suppress HUNs according to group alert behavior" into oc-dev
am: 8bc45cb78f
Change-Id: I86f65c9f8ae331d5b3cc4a35af6a48aa2b04dce1
This commit is contained in:
@@ -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.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user