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

Commit f3126140 authored by Jay Aliomer's avatar Jay Aliomer
Browse files

Sticky huns dont get cleaned up properly

a remove runnable is scheduled for removing the hun if it needs to be
at the time where non-sticky huns in case the sticky can be removed.
however, if the window is missed, the sticky hun will be life extended
until the pipline runs again

Fixes: 220826525
Test: HeadsupCoordinatorTest
Change-Id: I35f8a19b2fcf234ba18ba082fe50dc5fb2b8430f
parent 53c123b4
Loading
Loading
Loading
Loading
+9 −10
Original line number Diff line number Diff line
@@ -72,10 +72,11 @@ class HeadsUpCoordinator @Inject constructor(
    private var mEndLifetimeExtension: OnEndLifetimeExtensionCallback? = null
    private lateinit var mNotifPipeline: NotifPipeline
    private var mNow: Long = -1
    // notifs we've extended the lifetime for
    private val mNotifsExtendingLifetime = ArraySet<NotificationEntry>()
    private val mPostedEntries = LinkedHashMap<String, PostedEntry>()

    // notifs we've extended the lifetime for with cancellation callbacks
    private val mNotifsExtendingLifetime = ArrayMap<NotificationEntry, Runnable?>()

    override fun attach(pipeline: NotifPipeline) {
        mNotifPipeline = pipeline
        mHeadsUpManager.addListener(mOnHeadsUpChangedListener)
@@ -460,23 +461,20 @@ class HeadsUpCoordinator @Inject constructor(
            }
            if (isSticky(entry)) {
                val removeAfterMillis = mHeadsUpManager.getEarliestRemovalTime(entry.key)
                mExecutor.executeDelayed({
                    val canStillRemove = mHeadsUpManager.canRemoveImmediately(entry.key)
                    if (mNotifsExtendingLifetime.contains(entry) && canStillRemove) {
                mNotifsExtendingLifetime[entry] = mExecutor.executeDelayed({
                    mHeadsUpManager.removeNotification(entry.key, /* releaseImmediately */ true)
                    }
                }, removeAfterMillis)
            } else {
                mExecutor.execute {
                    mHeadsUpManager.removeNotification(entry.key, /* releaseImmediately */ false)
                }
                mNotifsExtendingLifetime[entry] = null
            }
            mNotifsExtendingLifetime.add(entry)
            return true
        }

        override fun cancelLifetimeExtension(entry: NotificationEntry) {
            mNotifsExtendingLifetime.remove(entry)
            mNotifsExtendingLifetime.remove(entry)?.run()
        }
    }

@@ -543,7 +541,8 @@ class HeadsUpCoordinator @Inject constructor(
        mPostedEntries[entry.key]?.calculateShouldBeHeadsUpStrict ?: isAttemptingToShowHun(entry)

    private fun endNotifLifetimeExtensionIfExtended(entry: NotificationEntry) {
        if (mNotifsExtendingLifetime.remove(entry)) {
        if (mNotifsExtendingLifetime.contains(entry)) {
            mNotifsExtendingLifetime.remove(entry)?.run()
            mEndLifetimeExtension?.onEndLifetimeExtension(mLifetimeExtender, entry)
        }
    }
+31 −0
Original line number Diff line number Diff line
@@ -169,12 +169,42 @@ class HeadsUpCoordinatorTest : SysuiTestCase() {
        verify(mHeadsUpManager, times(1)).removeNotification(anyString(), eq(true))
    }

    @Test
    fun testCancelAndReAddStickyNotification() {
        whenever(mHeadsUpManager.isSticky(anyString())).thenReturn(true)
        addHUN(mEntry)
        whenever(mHeadsUpManager.canRemoveImmediately(anyString())).thenReturn(false, true, false)
        whenever(mHeadsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L)
        assertTrue(mNotifLifetimeExtender.maybeExtendLifetime(mEntry, 0))
        addHUN(mEntry)
        assertFalse(mNotifLifetimeExtender.maybeExtendLifetime(mEntry, 0))
        mExecutor.advanceClockToLast()
        mExecutor.runAllReady()
        assertTrue(mNotifLifetimeExtender.maybeExtendLifetime(mEntry, 0))
        verify(mHeadsUpManager, times(0)).removeNotification(anyString(), eq(false))
        verify(mHeadsUpManager, times(0)).removeNotification(anyString(), eq(true))
    }

    @Test
    fun hunNotRemovedWhenExtensionCancelled() {
        whenever(mHeadsUpManager.isSticky(anyString())).thenReturn(true)
        addHUN(mEntry)
        whenever(mHeadsUpManager.canRemoveImmediately(anyString())).thenReturn(false)
        whenever(mHeadsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L)
        assertTrue(mNotifLifetimeExtender.maybeExtendLifetime(mEntry, 0))
        mNotifLifetimeExtender.cancelLifetimeExtension(mEntry)
        mExecutor.advanceClockToLast()
        mExecutor.runAllReady()
        verify(mHeadsUpManager, times(0)).removeNotification(anyString(), any())
    }

    @Test
    fun testCancelUpdatedStickyNotification() {
        whenever(mHeadsUpManager.isSticky(anyString())).thenReturn(true)
        addHUN(mEntry)
        whenever(mHeadsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L, 500L)
        assertTrue(mNotifLifetimeExtender.maybeExtendLifetime(mEntry, 0))
        addHUN(mEntry)
        mExecutor.advanceClockToLast()
        mExecutor.runAllReady()
        verify(mHeadsUpManager, times(0)).removeNotification(anyString(), eq(false))
@@ -305,6 +335,7 @@ class HeadsUpCoordinatorTest : SysuiTestCase() {
        mHuns.add(entry)
        whenever(mHeadsUpManager.topEntry).thenReturn(entry)
        mOnHeadsUpChangedListener.onHeadsUpStateChanged(entry, true)
        mNotifLifetimeExtender.cancelLifetimeExtension(entry)
    }

    @Test