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

Commit a55d5a27 authored by Andreas Miko's avatar Andreas Miko
Browse files

[Flexiglass] Fix KeyguardCoordinator and parametrize tests

There is a slight change in behavior where before the statement would
filter transitions TO GONE and finished GONE which is an rather unusual
pattern. Now it will also allow transitions FROM GONE. I verified this
change with @jeffdq.

Bug: 349784682
Flag: com.android.systemui.scene_container
Test: added unit tests
Change-Id: I6e16e8bbdc5ee7711464495e2207096158dfa143
parent 0fb96d50
Loading
Loading
Loading
Loading
+6 −7
Original line number Diff line number Diff line
@@ -14,8 +14,6 @@
 * limitations under the License.
 */

@file:OptIn(ExperimentalCoroutinesApi::class)

package com.android.systemui.statusbar.notification.collection.coordinator

import android.app.NotificationManager
@@ -27,9 +25,10 @@ import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dump.DumpManager
import com.android.systemui.keyguard.data.repository.KeyguardRepository
import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.expansionChanges
import com.android.systemui.statusbar.notification.collection.GroupEntry
@@ -58,7 +57,6 @@ import javax.inject.Inject
import kotlin.time.Duration.Companion.seconds
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.Job
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
@@ -89,7 +87,7 @@ constructor(
    private val headsUpManager: HeadsUpManager,
    private val keyguardNotificationVisibilityProvider: KeyguardNotificationVisibilityProvider,
    private val keyguardRepository: KeyguardRepository,
    private val keyguardTransitionRepository: KeyguardTransitionRepository,
    private val keyguardTransitionInteractor: KeyguardTransitionInteractor,
    private val logger: KeyguardCoordinatorLogger,
    @Application private val scope: CoroutineScope,
    private val sectionHeaderVisibilityProvider: SectionHeaderVisibilityProvider,
@@ -126,8 +124,9 @@ constructor(
    private suspend fun trackSeenNotifications() {
        // Whether or not keyguard is visible (or occluded).
        val isKeyguardPresent: Flow<Boolean> =
            keyguardTransitionRepository.transitions
                .map { step -> step.to != KeyguardState.GONE }
            keyguardTransitionInteractor
                .transitionValue(Scenes.Gone, stateWithoutSceneContainer = KeyguardState.GONE)
                .map { it == 0f }
                .distinctUntilChanged()
                .onEach { trackingUnseen -> logger.logTrackingUnseen(trackingUnseen) }

+92 −83
Original line number Diff line number Diff line
@@ -19,16 +19,23 @@ package com.android.systemui.statusbar.notification.collection.coordinator

import android.app.Notification
import android.os.UserHandle
import android.platform.test.flag.junit.FlagsParameterization
import android.provider.Settings
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.dump.DumpManager
import com.android.systemui.log.logcatLogBuffer
import com.android.systemui.flags.andSceneContainer
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionStep
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.log.logcatLogBuffer
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.scene.data.repository.Idle
import com.android.systemui.scene.data.repository.setTransition
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.notification.collection.GroupEntryBuilder
import com.android.systemui.statusbar.notification.collection.NotifPipeline
@@ -49,6 +56,8 @@ import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.withArgCaptor
import com.android.systemui.util.settings.FakeSettings
import com.google.common.truth.Truth.assertThat
import java.util.function.Consumer
import kotlin.time.Duration.Companion.seconds
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestCoroutineScheduler
@@ -62,22 +71,28 @@ import org.mockito.Mockito.anyString
import org.mockito.Mockito.clearInvocations
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
import java.util.function.Consumer
import kotlin.time.Duration.Companion.seconds
import org.mockito.Mockito.`when` as whenever
import platform.test.runner.parameterized.ParameterizedAndroidJunit4
import platform.test.runner.parameterized.Parameters

@SmallTest
@RunWith(AndroidJUnit4::class)
class KeyguardCoordinatorTest : SysuiTestCase() {
@RunWith(ParameterizedAndroidJunit4::class)
class KeyguardCoordinatorTest(flags: FlagsParameterization) : SysuiTestCase() {

    private val kosmos = Kosmos()

    private val headsUpManager: HeadsUpManager = mock()
    private val keyguardNotifVisibilityProvider: KeyguardNotificationVisibilityProvider = mock()
    private val keyguardRepository = FakeKeyguardRepository()
    private val keyguardTransitionRepository = FakeKeyguardTransitionRepository()
    private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
    private val notifPipeline: NotifPipeline = mock()
    private val sectionHeaderVisibilityProvider: SectionHeaderVisibilityProvider = mock()
    private val statusBarStateController: StatusBarStateController = mock()

    init {
        mSetFlagsRule.setFlagsParameterization(flags)
    }

    @Test
    fun testSetSectionHeadersVisibleInShade() = runKeyguardCoordinatorTest {
        clearInvocations(sectionHeaderVisibilityProvider)
@@ -147,10 +162,9 @@ class KeyguardCoordinatorTest : SysuiTestCase() {
        keyguardRepository.setKeyguardShowing(false)
        whenever(statusBarStateController.isExpanded).thenReturn(false)
        runKeyguardCoordinatorTest {
            keyguardTransitionRepository.sendTransitionSteps(
                    from = KeyguardState.LOCKSCREEN,
                    to = KeyguardState.GONE,
                    this.testScheduler,
            kosmos.setTransition(
                sceneTransition = Idle(Scenes.Gone),
                stateTransition = TransitionStep(KeyguardState.LOCKSCREEN, KeyguardState.GONE)
            )

            // WHEN: A notification is posted
@@ -163,24 +177,20 @@ class KeyguardCoordinatorTest : SysuiTestCase() {

            // WHEN: The keyguard is now showing
            keyguardRepository.setKeyguardShowing(true)
            keyguardTransitionRepository.sendTransitionSteps(
                    from = KeyguardState.GONE,
                    to = KeyguardState.AOD,
                    this.testScheduler,
            kosmos.setTransition(
                sceneTransition = Idle(Scenes.Lockscreen),
                stateTransition = TransitionStep(KeyguardState.GONE, KeyguardState.AOD)
            )
            testScheduler.runCurrent()

            // THEN: The notification is recognized as "seen" and is filtered out.
            assertThat(unseenFilter.shouldFilterOut(fakeEntry, 0L)).isTrue()

            // WHEN: The keyguard goes away
            keyguardRepository.setKeyguardShowing(false)
            keyguardTransitionRepository.sendTransitionSteps(
                    from = KeyguardState.AOD,
                    to = KeyguardState.GONE,
                    this.testScheduler,
            kosmos.setTransition(
                sceneTransition = Idle(Scenes.Gone),
                stateTransition = TransitionStep(KeyguardState.AOD, KeyguardState.GONE)
            )
            testScheduler.runCurrent()

            // THEN: The notification is shown regardless
            assertThat(unseenFilter.shouldFilterOut(fakeEntry, 0L)).isFalse()
@@ -356,21 +366,17 @@ class KeyguardCoordinatorTest : SysuiTestCase() {

            // WHEN: Keyguard is no longer showing
            keyguardRepository.setKeyguardShowing(false)
            keyguardTransitionRepository.sendTransitionSteps(
                    from = KeyguardState.LOCKSCREEN,
                    to = KeyguardState.GONE,
                    this.testScheduler,
            kosmos.setTransition(
                sceneTransition = Idle(Scenes.Gone),
                stateTransition = TransitionStep(KeyguardState.LOCKSCREEN, KeyguardState.GONE)
            )
            testScheduler.runCurrent()

            // WHEN: Keyguard is shown again
            keyguardRepository.setKeyguardShowing(true)
            keyguardTransitionRepository.sendTransitionSteps(
                    from = KeyguardState.GONE,
                    to = KeyguardState.AOD,
                    this.testScheduler,
            kosmos.setTransition(
                sceneTransition = Idle(Scenes.Lockscreen),
                stateTransition = TransitionStep(KeyguardState.GONE, KeyguardState.AOD)
            )
            testScheduler.runCurrent()

            // THEN: The notification is now recognized as "seen" and is filtered out.
            assertThat(unseenFilter.shouldFilterOut(fakeEntry, 0L)).isTrue()
@@ -413,10 +419,9 @@ class KeyguardCoordinatorTest : SysuiTestCase() {
        keyguardRepository.setKeyguardShowing(true)
        keyguardRepository.setIsDozing(false)
        runKeyguardCoordinatorTest {
            keyguardTransitionRepository.sendTransitionSteps(
                    from = KeyguardState.GONE,
                    to = KeyguardState.LOCKSCREEN,
                    this.testScheduler,
            kosmos.setTransition(
                sceneTransition = Idle(Scenes.Lockscreen),
                stateTransition = TransitionStep(KeyguardState.GONE, KeyguardState.LOCKSCREEN)
            )
            val firstEntry = NotificationEntryBuilder().setId(1).build()
            collectionListener.onEntryAdded(firstEntry)
@@ -437,21 +442,17 @@ class KeyguardCoordinatorTest : SysuiTestCase() {

            // WHEN: the keyguard is no longer showing
            keyguardRepository.setKeyguardShowing(false)
            keyguardTransitionRepository.sendTransitionSteps(
                    from = KeyguardState.LOCKSCREEN,
                    to = KeyguardState.GONE,
                    this.testScheduler,
            kosmos.setTransition(
                sceneTransition = Idle(Scenes.Gone),
                stateTransition = TransitionStep(KeyguardState.LOCKSCREEN, KeyguardState.GONE)
            )
            testScheduler.runCurrent()

            // WHEN: Keyguard is shown again
            keyguardRepository.setKeyguardShowing(true)
            keyguardTransitionRepository.sendTransitionSteps(
                    from = KeyguardState.GONE,
                    to = KeyguardState.LOCKSCREEN,
                    this.testScheduler,
            kosmos.setTransition(
                sceneTransition = Idle(Scenes.Lockscreen),
                stateTransition = TransitionStep(KeyguardState.GONE, KeyguardState.LOCKSCREEN)
            )
            testScheduler.runCurrent()

            // THEN: The first notification is considered seen and is filtered out.
            assertThat(unseenFilter.shouldFilterOut(firstEntry, 0L)).isTrue()
@@ -646,7 +647,7 @@ class KeyguardCoordinatorTest : SysuiTestCase() {
                headsUpManager,
                keyguardNotifVisibilityProvider,
                keyguardRepository,
                keyguardTransitionRepository,
                kosmos.keyguardTransitionInteractor,
                KeyguardCoordinatorLogger(logcatLogBuffer()),
                testScope.backgroundScope,
                sectionHeaderVisibilityProvider,
@@ -706,4 +707,12 @@ class KeyguardCoordinatorTest : SysuiTestCase() {
                )
            }
    }

    companion object {
        @JvmStatic
        @Parameters(name = "{0}")
        fun getParams(): List<FlagsParameterization> {
            return FlagsParameterization.allCombinationsOf().andSceneContainer()
        }
    }
}