Loading packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt +2 −0 Original line number Original line Diff line number Diff line Loading @@ -40,6 +40,7 @@ import com.android.systemui.bouncer.ui.viewmodel.PinBouncerViewModel import com.android.systemui.bouncer.ui.viewmodel.bouncerViewModel import com.android.systemui.bouncer.ui.viewmodel.bouncerViewModel import com.android.systemui.classifier.domain.interactor.falsingInteractor import com.android.systemui.classifier.domain.interactor.falsingInteractor import com.android.systemui.classifier.falsingCollector import com.android.systemui.classifier.falsingCollector import com.android.systemui.classifier.falsingManager import com.android.systemui.communal.domain.interactor.communalInteractor import com.android.systemui.communal.domain.interactor.communalInteractor import com.android.systemui.coroutines.collectLastValue import com.android.systemui.coroutines.collectLastValue import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository Loading Loading @@ -265,6 +266,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { displayId = displayTracker.defaultDisplayId, displayId = displayTracker.defaultDisplayId, sceneLogger = mock(), sceneLogger = mock(), falsingCollector = kosmos.falsingCollector, falsingCollector = kosmos.falsingCollector, falsingManager = kosmos.falsingManager, powerInteractor = powerInteractor, powerInteractor = powerInteractor, bouncerInteractor = bouncerInteractor, bouncerInteractor = bouncerInteractor, simBouncerInteractor = dagger.Lazy { kosmos.simBouncerInteractor }, simBouncerInteractor = dagger.Lazy { kosmos.simBouncerInteractor }, Loading packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt +16 −0 Original line number Original line Diff line number Diff line Loading @@ -32,6 +32,7 @@ import com.android.systemui.authentication.shared.model.AuthenticationMethodMode import com.android.systemui.bouncer.domain.interactor.bouncerInteractor import com.android.systemui.bouncer.domain.interactor.bouncerInteractor import com.android.systemui.bouncer.domain.interactor.simBouncerInteractor import com.android.systemui.bouncer.domain.interactor.simBouncerInteractor import com.android.systemui.classifier.FalsingCollector import com.android.systemui.classifier.FalsingCollector import com.android.systemui.classifier.falsingManager import com.android.systemui.coroutines.collectLastValue import com.android.systemui.coroutines.collectLastValue import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor Loading Loading @@ -115,6 +116,7 @@ class SceneContainerStartableTest : SysuiTestCase() { displayId = Display.DEFAULT_DISPLAY, displayId = Display.DEFAULT_DISPLAY, sceneLogger = mock(), sceneLogger = mock(), falsingCollector = falsingCollector, falsingCollector = falsingCollector, falsingManager = kosmos.falsingManager, powerInteractor = powerInteractor, powerInteractor = powerInteractor, bouncerInteractor = bouncerInteractor, bouncerInteractor = bouncerInteractor, simBouncerInteractor = { kosmos.simBouncerInteractor }, simBouncerInteractor = { kosmos.simBouncerInteractor }, Loading Loading @@ -970,6 +972,20 @@ class SceneContainerStartableTest : SysuiTestCase() { ) ) } } @Test fun respondToFalsingDetections() = testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene) val transitionStateFlow = prepareState() underTest.start() emulateSceneTransition(transitionStateFlow, toScene = SceneKey.Bouncer) assertThat(currentScene).isNotEqualTo(SceneKey.Lockscreen) kosmos.falsingManager.sendFalsingBelief() assertThat(currentScene).isEqualTo(SceneKey.Lockscreen) } private fun TestScope.emulateSceneTransition( private fun TestScope.emulateSceneTransition( transitionStateFlow: MutableStateFlow<ObservableTransitionState>, transitionStateFlow: MutableStateFlow<ObservableTransitionState>, toScene: SceneKey, toScene: SceneKey, Loading packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt +18 −0 Original line number Original line Diff line number Diff line Loading @@ -26,6 +26,7 @@ import com.android.systemui.bouncer.domain.interactor.BouncerInteractor import com.android.systemui.bouncer.domain.interactor.SimBouncerInteractor import com.android.systemui.bouncer.domain.interactor.SimBouncerInteractor import com.android.systemui.classifier.FalsingCollector import com.android.systemui.classifier.FalsingCollector import com.android.systemui.classifier.FalsingCollectorActual import com.android.systemui.classifier.FalsingCollectorActual import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.DisplayId import com.android.systemui.dagger.qualifiers.DisplayId Loading @@ -34,6 +35,8 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.model.SceneContainerPlugin import com.android.systemui.model.SceneContainerPlugin import com.android.systemui.model.SysUiState import com.android.systemui.model.SysUiState import com.android.systemui.model.updateFlags import com.android.systemui.model.updateFlags import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.FalsingManager.FalsingBeliefListener import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.flag.SceneContainerFlags import com.android.systemui.scene.shared.flag.SceneContainerFlags Loading @@ -53,6 +56,7 @@ import java.io.PrintWriter import javax.inject.Inject import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChanged Loading Loading @@ -82,6 +86,7 @@ constructor( @DisplayId private val displayId: Int, @DisplayId private val displayId: Int, private val sceneLogger: SceneLogger, private val sceneLogger: SceneLogger, @FalsingCollectorActual private val falsingCollector: FalsingCollector, @FalsingCollectorActual private val falsingCollector: FalsingCollector, private val falsingManager: FalsingManager, private val powerInteractor: PowerInteractor, private val powerInteractor: PowerInteractor, private val simBouncerInteractor: Lazy<SimBouncerInteractor>, private val simBouncerInteractor: Lazy<SimBouncerInteractor>, private val authenticationInteractor: Lazy<AuthenticationInteractor>, private val authenticationInteractor: Lazy<AuthenticationInteractor>, Loading @@ -98,6 +103,7 @@ constructor( automaticallySwitchScenes() automaticallySwitchScenes() hydrateSystemUiState() hydrateSystemUiState() collectFalsingSignals() collectFalsingSignals() respondToFalsingDetections() hydrateWindowFocus() hydrateWindowFocus() hydrateInteractionState() hydrateInteractionState() } else { } else { Loading Loading @@ -376,6 +382,18 @@ constructor( } } } } /** Switches to the lockscreen when falsing is detected. */ private fun respondToFalsingDetections() { applicationScope.launch { conflatedCallbackFlow { val listener = FalsingBeliefListener { trySend(Unit) } falsingManager.addFalsingBeliefListener(listener) awaitClose { falsingManager.removeFalsingBeliefListener(listener) } } .collect { switchToScene(SceneKey.Lockscreen, "Falsing detected.") } } } /** Keeps the focus state of the window view up-to-date. */ /** Keeps the focus state of the window view up-to-date. */ private fun hydrateWindowFocus() { private fun hydrateWindowFocus() { applicationScope.launch { applicationScope.launch { Loading packages/SystemUI/tests/utils/src/com/android/systemui/classifier/FalsingManagerFake.java +9 −0 Original line number Original line Diff line number Diff line Loading @@ -201,4 +201,13 @@ public class FalsingManagerFake implements FalsingManager { public List<FalsingTapListener> getTapListeners() { public List<FalsingTapListener> getTapListeners() { return mTapListeners; return mTapListeners; } } /** * Calls every registered {@link FalsingBeliefListener} as if false touch occurred. */ public void sendFalsingBelief() { for (FalsingBeliefListener listener : mFalsingBeliefListeners) { listener.onFalse(); } } } } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt +2 −0 Original line number Original line Diff line number Diff line Loading @@ -40,6 +40,7 @@ import com.android.systemui.bouncer.ui.viewmodel.PinBouncerViewModel import com.android.systemui.bouncer.ui.viewmodel.bouncerViewModel import com.android.systemui.bouncer.ui.viewmodel.bouncerViewModel import com.android.systemui.classifier.domain.interactor.falsingInteractor import com.android.systemui.classifier.domain.interactor.falsingInteractor import com.android.systemui.classifier.falsingCollector import com.android.systemui.classifier.falsingCollector import com.android.systemui.classifier.falsingManager import com.android.systemui.communal.domain.interactor.communalInteractor import com.android.systemui.communal.domain.interactor.communalInteractor import com.android.systemui.coroutines.collectLastValue import com.android.systemui.coroutines.collectLastValue import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository Loading Loading @@ -265,6 +266,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { displayId = displayTracker.defaultDisplayId, displayId = displayTracker.defaultDisplayId, sceneLogger = mock(), sceneLogger = mock(), falsingCollector = kosmos.falsingCollector, falsingCollector = kosmos.falsingCollector, falsingManager = kosmos.falsingManager, powerInteractor = powerInteractor, powerInteractor = powerInteractor, bouncerInteractor = bouncerInteractor, bouncerInteractor = bouncerInteractor, simBouncerInteractor = dagger.Lazy { kosmos.simBouncerInteractor }, simBouncerInteractor = dagger.Lazy { kosmos.simBouncerInteractor }, Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt +16 −0 Original line number Original line Diff line number Diff line Loading @@ -32,6 +32,7 @@ import com.android.systemui.authentication.shared.model.AuthenticationMethodMode import com.android.systemui.bouncer.domain.interactor.bouncerInteractor import com.android.systemui.bouncer.domain.interactor.bouncerInteractor import com.android.systemui.bouncer.domain.interactor.simBouncerInteractor import com.android.systemui.bouncer.domain.interactor.simBouncerInteractor import com.android.systemui.classifier.FalsingCollector import com.android.systemui.classifier.FalsingCollector import com.android.systemui.classifier.falsingManager import com.android.systemui.coroutines.collectLastValue import com.android.systemui.coroutines.collectLastValue import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor Loading Loading @@ -115,6 +116,7 @@ class SceneContainerStartableTest : SysuiTestCase() { displayId = Display.DEFAULT_DISPLAY, displayId = Display.DEFAULT_DISPLAY, sceneLogger = mock(), sceneLogger = mock(), falsingCollector = falsingCollector, falsingCollector = falsingCollector, falsingManager = kosmos.falsingManager, powerInteractor = powerInteractor, powerInteractor = powerInteractor, bouncerInteractor = bouncerInteractor, bouncerInteractor = bouncerInteractor, simBouncerInteractor = { kosmos.simBouncerInteractor }, simBouncerInteractor = { kosmos.simBouncerInteractor }, Loading Loading @@ -970,6 +972,20 @@ class SceneContainerStartableTest : SysuiTestCase() { ) ) } } @Test fun respondToFalsingDetections() = testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene) val transitionStateFlow = prepareState() underTest.start() emulateSceneTransition(transitionStateFlow, toScene = SceneKey.Bouncer) assertThat(currentScene).isNotEqualTo(SceneKey.Lockscreen) kosmos.falsingManager.sendFalsingBelief() assertThat(currentScene).isEqualTo(SceneKey.Lockscreen) } private fun TestScope.emulateSceneTransition( private fun TestScope.emulateSceneTransition( transitionStateFlow: MutableStateFlow<ObservableTransitionState>, transitionStateFlow: MutableStateFlow<ObservableTransitionState>, toScene: SceneKey, toScene: SceneKey, Loading
packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt +18 −0 Original line number Original line Diff line number Diff line Loading @@ -26,6 +26,7 @@ import com.android.systemui.bouncer.domain.interactor.BouncerInteractor import com.android.systemui.bouncer.domain.interactor.SimBouncerInteractor import com.android.systemui.bouncer.domain.interactor.SimBouncerInteractor import com.android.systemui.classifier.FalsingCollector import com.android.systemui.classifier.FalsingCollector import com.android.systemui.classifier.FalsingCollectorActual import com.android.systemui.classifier.FalsingCollectorActual import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.DisplayId import com.android.systemui.dagger.qualifiers.DisplayId Loading @@ -34,6 +35,8 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.model.SceneContainerPlugin import com.android.systemui.model.SceneContainerPlugin import com.android.systemui.model.SysUiState import com.android.systemui.model.SysUiState import com.android.systemui.model.updateFlags import com.android.systemui.model.updateFlags import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.FalsingManager.FalsingBeliefListener import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.flag.SceneContainerFlags import com.android.systemui.scene.shared.flag.SceneContainerFlags Loading @@ -53,6 +56,7 @@ import java.io.PrintWriter import javax.inject.Inject import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChanged Loading Loading @@ -82,6 +86,7 @@ constructor( @DisplayId private val displayId: Int, @DisplayId private val displayId: Int, private val sceneLogger: SceneLogger, private val sceneLogger: SceneLogger, @FalsingCollectorActual private val falsingCollector: FalsingCollector, @FalsingCollectorActual private val falsingCollector: FalsingCollector, private val falsingManager: FalsingManager, private val powerInteractor: PowerInteractor, private val powerInteractor: PowerInteractor, private val simBouncerInteractor: Lazy<SimBouncerInteractor>, private val simBouncerInteractor: Lazy<SimBouncerInteractor>, private val authenticationInteractor: Lazy<AuthenticationInteractor>, private val authenticationInteractor: Lazy<AuthenticationInteractor>, Loading @@ -98,6 +103,7 @@ constructor( automaticallySwitchScenes() automaticallySwitchScenes() hydrateSystemUiState() hydrateSystemUiState() collectFalsingSignals() collectFalsingSignals() respondToFalsingDetections() hydrateWindowFocus() hydrateWindowFocus() hydrateInteractionState() hydrateInteractionState() } else { } else { Loading Loading @@ -376,6 +382,18 @@ constructor( } } } } /** Switches to the lockscreen when falsing is detected. */ private fun respondToFalsingDetections() { applicationScope.launch { conflatedCallbackFlow { val listener = FalsingBeliefListener { trySend(Unit) } falsingManager.addFalsingBeliefListener(listener) awaitClose { falsingManager.removeFalsingBeliefListener(listener) } } .collect { switchToScene(SceneKey.Lockscreen, "Falsing detected.") } } } /** Keeps the focus state of the window view up-to-date. */ /** Keeps the focus state of the window view up-to-date. */ private fun hydrateWindowFocus() { private fun hydrateWindowFocus() { applicationScope.launch { applicationScope.launch { Loading
packages/SystemUI/tests/utils/src/com/android/systemui/classifier/FalsingManagerFake.java +9 −0 Original line number Original line Diff line number Diff line Loading @@ -201,4 +201,13 @@ public class FalsingManagerFake implements FalsingManager { public List<FalsingTapListener> getTapListeners() { public List<FalsingTapListener> getTapListeners() { return mTapListeners; return mTapListeners; } } /** * Calls every registered {@link FalsingBeliefListener} as if false touch occurred. */ public void sendFalsingBelief() { for (FalsingBeliefListener listener : mFalsingBeliefListeners) { listener.onFalse(); } } } }