Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f41d78cf authored by Lyn's avatar Lyn Committed by Lyn Han
Browse files

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
parent 3a5aa465
Loading
Loading
Loading
Loading
+26 −5
Original line number Diff line number Diff line
@@ -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
    }
}
+4 −2
Original line number Diff line number Diff line
@@ -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
+10 −9
Original line number Diff line number Diff line
@@ -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
+4 −0
Original line number Diff line number Diff line
@@ -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()
    }
+5 −2
Original line number Diff line number Diff line
@@ -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(
Loading