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

Commit 9c2969c7 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fix a crash when dismissing the last notification from the locked shade."

parents a7c80fad 7ae2e08b
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -18,11 +18,13 @@ package com.android.systemui.statusbar.notification.collection.coordinator

import android.service.notification.NotificationListenerService
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.statusbar.notification.collection.ListEntry
import com.android.systemui.statusbar.notification.collection.NotifPipeline
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener
import com.android.systemui.statusbar.notification.collection.render.NotifShadeEventSource
import java.util.concurrent.Executor
import javax.inject.Inject

/**
@@ -32,6 +34,7 @@ import javax.inject.Inject
// TODO(b/204468557): Move to @CoordinatorScope
@SysUISingleton
class ShadeEventCoordinator @Inject internal constructor(
    @Main private val mMainExecutor: Executor,
    private val mLogger: ShadeEventCoordinatorLogger
) : Coordinator, NotifShadeEventSource {
    private var mNotifRemovedByUserCallback: Runnable? = null
@@ -67,11 +70,13 @@ class ShadeEventCoordinator @Inject internal constructor(
    private fun onBeforeRenderList(entries: List<ListEntry>) {
        if (mEntryRemoved && entries.isEmpty()) {
            mLogger.logShadeEmptied()
            mShadeEmptiedCallback?.run()
            // TODO(b/206023518): This was bad. Do not copy this.
            mShadeEmptiedCallback?.let { mMainExecutor.execute(it) }
        }
        if (mEntryRemoved && mEntryRemovedByUser) {
            mLogger.logNotifRemovedByUser()
            mNotifRemovedByUserCallback?.run()
            // TODO(b/206023518): This was bad. Do not copy this.
            mNotifRemovedByUserCallback?.let { mMainExecutor.execute(it) }
        }
        mEntryRemoved = false
        mEntryRemovedByUser = false
+9 −1
Original line number Diff line number Diff line
@@ -31,9 +31,12 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito.any
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations.initMocks
import java.util.concurrent.Executor
import org.mockito.Mockito.`when` as whenever

@SmallTest
@RunWith(AndroidTestingRunner::class)
@@ -48,13 +51,18 @@ class ShadeEventCoordinatorTest : SysuiTestCase() {

    @Mock private lateinit var pipeline: NotifPipeline
    @Mock private lateinit var logger: ShadeEventCoordinatorLogger
    @Mock private lateinit var executor: Executor
    @Mock private lateinit var notifRemovedByUserCallback: Runnable
    @Mock private lateinit var shadeEmptiedCallback: Runnable

    @Before
    fun setUp() {
        initMocks(this)
        coordinator = ShadeEventCoordinator(logger)
        whenever(executor.execute(any())).then {
            (it.arguments[0] as Runnable).run()
            true
        }
        coordinator = ShadeEventCoordinator(executor, logger)
        coordinator.attach(pipeline)
        notifCollectionListener = withArgCaptor {
            verify(pipeline).addCollectionListener(capture())