Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.kt +6 −7 Original line number Diff line number Diff line Loading @@ -14,8 +14,6 @@ * limitations under the License. */ @file:OptIn(ExperimentalCoroutinesApi::class) package com.android.systemui.statusbar.notification.collection.coordinator import android.app.NotificationManager Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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, Loading Loading @@ -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) } Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinatorTest.kt +92 −83 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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) Loading Loading @@ -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 Loading @@ -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() Loading Loading @@ -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() Loading Loading @@ -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) Loading @@ -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() Loading Loading @@ -646,7 +647,7 @@ class KeyguardCoordinatorTest : SysuiTestCase() { headsUpManager, keyguardNotifVisibilityProvider, keyguardRepository, keyguardTransitionRepository, kosmos.keyguardTransitionInteractor, KeyguardCoordinatorLogger(logcatLogBuffer()), testScope.backgroundScope, sectionHeaderVisibilityProvider, Loading Loading @@ -706,4 +707,12 @@ class KeyguardCoordinatorTest : SysuiTestCase() { ) } } companion object { @JvmStatic @Parameters(name = "{0}") fun getParams(): List<FlagsParameterization> { return FlagsParameterization.allCombinationsOf().andSceneContainer() } } } Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.kt +6 −7 Original line number Diff line number Diff line Loading @@ -14,8 +14,6 @@ * limitations under the License. */ @file:OptIn(ExperimentalCoroutinesApi::class) package com.android.systemui.statusbar.notification.collection.coordinator import android.app.NotificationManager Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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, Loading Loading @@ -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) } Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinatorTest.kt +92 −83 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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) Loading Loading @@ -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 Loading @@ -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() Loading Loading @@ -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() Loading Loading @@ -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) Loading @@ -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() Loading Loading @@ -646,7 +647,7 @@ class KeyguardCoordinatorTest : SysuiTestCase() { headsUpManager, keyguardNotifVisibilityProvider, keyguardRepository, keyguardTransitionRepository, kosmos.keyguardTransitionInteractor, KeyguardCoordinatorLogger(logcatLogBuffer()), testScope.backgroundScope, sectionHeaderVisibilityProvider, Loading Loading @@ -706,4 +707,12 @@ class KeyguardCoordinatorTest : SysuiTestCase() { ) } } companion object { @JvmStatic @Parameters(name = "{0}") fun getParams(): List<FlagsParameterization> { return FlagsParameterization.allCombinationsOf().andSceneContainer() } } }