summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Lyn <lynhan@google.com> 2024-04-02 23:09:43 +0000
committer Lyn Han <lynhan@google.com> 2024-04-10 16:41:13 +0000
commitf41d78cf4d85950f9bb471a27bfb85dcffd4150c (patch)
tree96e68e50415d13233ce0caf1298e812bc5996a8b
parent3a5aa4653482f26ad5bddd325716bd134302c593 (diff)
Check cooldown setting for avalanche suppression
Fixes: 330584246 Test: adb shell device_config override systemui com.android.systemui.visual_interruptions_refactor true adb shell device_config override systemui com.android.systemui.notification_avalanche_suppression true Enable and disable cooldown via settings => turns suppression on and off Verify via logs: adb logcat | grep VisualInterruptionDecisionProvider Change-Id: Ib2bff7abce3392afe6c4de4025043f8785b8bb9b
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/CommonVisualInterruptionSuppressors.kt31
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImpl.kt6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImplTest.kt19
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderTestBase.kt4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderTestUtil.kt7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java4
7 files changed, 57 insertions, 20 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/CommonVisualInterruptionSuppressors.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/CommonVisualInterruptionSuppressors.kt
index c4d9ab7a47c2..9619acaed441 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/CommonVisualInterruptionSuppressors.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/CommonVisualInterruptionSuppressors.kt
@@ -27,6 +27,7 @@ import android.database.ContentObserver
import android.hardware.display.AmbientDisplayConfiguration
import android.os.Handler
import android.os.PowerManager
+import android.provider.Settings
import android.provider.Settings.Global.HEADS_UP_NOTIFICATIONS_ENABLED
import android.provider.Settings.Global.HEADS_UP_OFF
import com.android.systemui.dagger.qualifiers.Main
@@ -42,6 +43,7 @@ import com.android.systemui.statusbar.notification.interruption.VisualInterrupti
import com.android.systemui.statusbar.policy.BatteryController
import com.android.systemui.statusbar.policy.HeadsUpManager
import com.android.systemui.util.settings.GlobalSettings
+import com.android.systemui.util.settings.SystemSettings
import com.android.systemui.util.time.SystemClock
class PeekDisabledSuppressor(
@@ -231,6 +233,7 @@ class AlertKeyguardVisibilitySuppressor(
class AvalancheSuppressor(
private val avalancheProvider: AvalancheProvider,
private val systemClock: SystemClock,
+ private val systemSettings: SystemSettings,
) :
VisualInterruptionFilter(
types = setOf(PEEK, PULSE),
@@ -253,12 +256,23 @@ class AvalancheSuppressor(
}
override fun shouldSuppress(entry: NotificationEntry): Boolean {
- val timeSinceAvalanche = systemClock.currentTimeMillis() - avalancheProvider.startTime
- val isActive = timeSinceAvalanche < avalancheProvider.timeoutMs
+ if (!isCooldownEnabled()) {
+ reason = "FALSE avalanche cooldown setting DISABLED"
+ return false
+ }
+ val timeSinceAvalancheMs = systemClock.currentTimeMillis() - avalancheProvider.startTime
+ val timedOut = timeSinceAvalancheMs >= avalancheProvider.timeoutMs
+ if (timedOut) {
+ reason = "FALSE avalanche event TIMED OUT. " +
+ "${timeSinceAvalancheMs/1000} seconds since last avalanche"
+ return false
+ }
val state = calculateState(entry)
- val suppress = isActive && state == State.SUPPRESS
- reason = "avalanche suppress=$suppress isActive=$isActive state=$state"
- return suppress
+ if (state != State.SUPPRESS) {
+ reason = "FALSE avalanche IN ALLOWLIST: $state"
+ return false
+ }
+ return true
}
private fun calculateState(entry: NotificationEntry): State {
@@ -294,4 +308,11 @@ class AvalancheSuppressor(
}
return State.SUPPRESS
}
+
+ private fun isCooldownEnabled(): Boolean {
+ return systemSettings.getInt(
+ Settings.System.NOTIFICATION_COOLDOWN_ENABLED,
+ /* def */ 1
+ ) == 1
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImpl.kt
index 375b6e5cb6a3..e6d97c211dc5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImpl.kt
@@ -40,6 +40,7 @@ import com.android.systemui.statusbar.policy.HeadsUpManager
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.EventLog
import com.android.systemui.util.settings.GlobalSettings
+import com.android.systemui.util.settings.SystemSettings
import com.android.systemui.util.time.SystemClock
import javax.inject.Inject
@@ -61,7 +62,8 @@ constructor(
private val systemClock: SystemClock,
private val uiEventLogger: UiEventLogger,
private val userTracker: UserTracker,
- private val avalancheProvider: AvalancheProvider
+ private val avalancheProvider: AvalancheProvider,
+ private val systemSettings: SystemSettings
) : VisualInterruptionDecisionProvider {
init {
@@ -170,7 +172,7 @@ constructor(
addFilter(AlertKeyguardVisibilitySuppressor(keyguardNotificationVisibilityProvider))
if (NotificationAvalancheSuppression.isEnabled) {
- addFilter(AvalancheSuppressor(avalancheProvider, systemClock))
+ addFilter(AvalancheSuppressor(avalancheProvider, systemClock, systemSettings))
avalancheProvider.register()
}
started = true
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImplTest.kt
index 54108642385f..edab9d9f7fdf 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImplTest.kt
@@ -50,7 +50,8 @@ class VisualInterruptionDecisionProviderImplTest : VisualInterruptionDecisionPro
systemClock,
uiEventLogger,
userTracker,
- avalancheProvider
+ avalancheProvider,
+ systemSettings
)
}
@@ -82,7 +83,7 @@ class VisualInterruptionDecisionProviderImplTest : VisualInterruptionDecisionPro
fun testAvalancheFilter_duringAvalanche_allowConversationFromAfterEvent() {
avalancheProvider.startTime = whenAgo(10)
- withFilter(AvalancheSuppressor(avalancheProvider, systemClock)) {
+ withFilter(AvalancheSuppressor(avalancheProvider, systemClock, systemSettings)) {
ensurePeekState()
assertShouldHeadsUp(buildEntry {
importance = NotificationManager.IMPORTANCE_HIGH
@@ -97,7 +98,7 @@ class VisualInterruptionDecisionProviderImplTest : VisualInterruptionDecisionPro
fun testAvalancheFilter_duringAvalanche_suppressConversationFromBeforeEvent() {
avalancheProvider.startTime = whenAgo(10)
- withFilter(AvalancheSuppressor(avalancheProvider, systemClock)) {
+ withFilter(AvalancheSuppressor(avalancheProvider, systemClock, systemSettings)) {
ensurePeekState()
assertShouldNotHeadsUp(buildEntry {
importance = NotificationManager.IMPORTANCE_DEFAULT
@@ -112,7 +113,7 @@ class VisualInterruptionDecisionProviderImplTest : VisualInterruptionDecisionPro
fun testAvalancheFilter_duringAvalanche_allowHighPriorityConversation() {
avalancheProvider.startTime = whenAgo(10)
- withFilter(AvalancheSuppressor(avalancheProvider, systemClock)) {
+ withFilter(AvalancheSuppressor(avalancheProvider, systemClock, systemSettings)) {
ensurePeekState()
assertShouldHeadsUp(buildEntry {
importance = NotificationManager.IMPORTANCE_HIGH
@@ -125,7 +126,7 @@ class VisualInterruptionDecisionProviderImplTest : VisualInterruptionDecisionPro
fun testAvalancheFilter_duringAvalanche_allowCall() {
avalancheProvider.startTime = whenAgo(10)
- withFilter(AvalancheSuppressor(avalancheProvider, systemClock)) {
+ withFilter(AvalancheSuppressor(avalancheProvider, systemClock, systemSettings)) {
ensurePeekState()
assertShouldHeadsUp(buildEntry {
importance = NotificationManager.IMPORTANCE_HIGH
@@ -138,7 +139,7 @@ class VisualInterruptionDecisionProviderImplTest : VisualInterruptionDecisionPro
fun testAvalancheFilter_duringAvalanche_allowCategoryReminder() {
avalancheProvider.startTime = whenAgo(10)
- withFilter(AvalancheSuppressor(avalancheProvider, systemClock)) {
+ withFilter(AvalancheSuppressor(avalancheProvider, systemClock, systemSettings)) {
ensurePeekState()
assertShouldHeadsUp(buildEntry {
importance = NotificationManager.IMPORTANCE_HIGH
@@ -151,7 +152,7 @@ class VisualInterruptionDecisionProviderImplTest : VisualInterruptionDecisionPro
fun testAvalancheFilter_duringAvalanche_allowCategoryEvent() {
avalancheProvider.startTime = whenAgo(10)
- withFilter(AvalancheSuppressor(avalancheProvider, systemClock)) {
+ withFilter(AvalancheSuppressor(avalancheProvider, systemClock, systemSettings)) {
ensurePeekState()
assertShouldHeadsUp(buildEntry {
importance = NotificationManager.IMPORTANCE_HIGH
@@ -164,7 +165,7 @@ class VisualInterruptionDecisionProviderImplTest : VisualInterruptionDecisionPro
fun testAvalancheFilter_duringAvalanche_allowFsi() {
avalancheProvider.startTime = whenAgo(10)
- withFilter(AvalancheSuppressor(avalancheProvider, systemClock)) {
+ withFilter(AvalancheSuppressor(avalancheProvider, systemClock, systemSettings)) {
assertFsiNotSuppressed()
}
}
@@ -173,7 +174,7 @@ class VisualInterruptionDecisionProviderImplTest : VisualInterruptionDecisionPro
fun testAvalancheFilter_duringAvalanche_allowColorized() {
avalancheProvider.startTime = whenAgo(10)
- withFilter(AvalancheSuppressor(avalancheProvider, systemClock)) {
+ withFilter(AvalancheSuppressor(avalancheProvider, systemClock, systemSettings)) {
ensurePeekState()
assertShouldHeadsUp(buildEntry {
importance = NotificationManager.IMPORTANCE_HIGH
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderTestBase.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderTestBase.kt
index 24f670831193..3b979a7c1386 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderTestBase.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderTestBase.kt
@@ -77,6 +77,8 @@ import com.android.systemui.util.FakeEventLog
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.settings.FakeGlobalSettings
+import com.android.systemui.util.settings.FakeSettings
+import com.android.systemui.util.settings.SystemSettings
import com.android.systemui.util.time.FakeSystemClock
import com.android.systemui.utils.leaks.FakeBatteryController
import com.android.systemui.utils.leaks.FakeKeyguardStateController
@@ -126,6 +128,7 @@ abstract class VisualInterruptionDecisionProviderTestBase : SysuiTestCase() {
protected val uiEventLogger = UiEventLoggerFake()
protected val userTracker = FakeUserTracker()
protected val avalancheProvider: AvalancheProvider = mock()
+ lateinit var systemSettings: SystemSettings
protected abstract val provider: VisualInterruptionDecisionProvider
@@ -153,6 +156,7 @@ abstract class VisualInterruptionDecisionProviderTestBase : SysuiTestCase() {
deviceProvisionedController.currentUser = userId
userTracker.set(listOf(user), /* currentUserIndex = */ 0)
+ systemSettings = FakeSettings()
provider.start()
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderTestUtil.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderTestUtil.kt
index 620ad9c19bfa..60aaa646fced 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderTestUtil.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderTestUtil.kt
@@ -30,6 +30,7 @@ import com.android.systemui.statusbar.policy.HeadsUpManager
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.EventLog
import com.android.systemui.util.settings.GlobalSettings
+import com.android.systemui.util.settings.SystemSettings
import com.android.systemui.util.time.SystemClock
object VisualInterruptionDecisionProviderTestUtil {
@@ -51,7 +52,8 @@ object VisualInterruptionDecisionProviderTestUtil {
systemClock: SystemClock,
uiEventLogger: UiEventLogger,
userTracker: UserTracker,
- avalancheProvider: AvalancheProvider
+ avalancheProvider: AvalancheProvider,
+ systemSettings: SystemSettings
): VisualInterruptionDecisionProvider {
return if (VisualInterruptionRefactor.isEnabled) {
VisualInterruptionDecisionProviderImpl(
@@ -70,7 +72,8 @@ object VisualInterruptionDecisionProviderTestUtil {
systemClock,
uiEventLogger,
userTracker,
- avalancheProvider
+ avalancheProvider,
+ systemSettings
)
} else {
NotificationInterruptStateProviderWrapper(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java
index 2f153d8b7003..25e4728725e9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java
@@ -181,7 +181,9 @@ import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.concurrency.MessageRouterImpl;
import com.android.systemui.util.kotlin.JavaAdapter;
import com.android.systemui.util.settings.FakeGlobalSettings;
+import com.android.systemui.util.settings.FakeSettings;
import com.android.systemui.util.settings.GlobalSettings;
+import com.android.systemui.util.settings.SystemSettings;
import com.android.systemui.util.time.FakeSystemClock;
import com.android.systemui.util.time.SystemClock;
import com.android.systemui.volume.VolumeComponent;
@@ -325,6 +327,7 @@ public class CentralSurfacesImplTest extends SysuiTestCase {
private ShadeController mShadeController;
private final FakeSystemClock mFakeSystemClock = new FakeSystemClock();
private final FakeGlobalSettings mFakeGlobalSettings = new FakeGlobalSettings();
+ private final SystemSettings mSystemSettings = new FakeSettings();
private final FakeEventLog mFakeEventLog = new FakeEventLog();
private final FakeExecutor mMainExecutor = new FakeExecutor(mFakeSystemClock);
private final FakeExecutor mUiBgExecutor = new FakeExecutor(mFakeSystemClock);
@@ -375,7 +378,8 @@ public class CentralSurfacesImplTest extends SysuiTestCase {
mFakeSystemClock,
mock(UiEventLogger.class),
mUserTracker,
- mAvalancheProvider);
+ mAvalancheProvider,
+ mSystemSettings);
mVisualInterruptionDecisionProvider.start();
mContext.addMockSystemService(TrustManager.class, mock(TrustManager.class));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
index aabd4e9e79be..c24c86c8cb2a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
@@ -174,6 +174,7 @@ import com.android.systemui.user.domain.interactor.SelectedUserInteractor;
import com.android.systemui.user.domain.interactor.UserSwitcherInteractor;
import com.android.systemui.util.FakeEventLog;
import com.android.systemui.util.settings.FakeGlobalSettings;
+import com.android.systemui.util.settings.SystemSettings;
import com.android.systemui.util.time.SystemClock;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.WindowManagerShellWrapper;
@@ -554,7 +555,8 @@ public class BubblesTest extends SysuiTestCase {
mock(SystemClock.class),
mock(UiEventLogger.class),
mock(UserTracker.class),
- mock(AvalancheProvider.class)
+ mock(AvalancheProvider.class),
+ mock(SystemSettings.class)
);
interruptionDecisionProvider.start();