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

Commit 9fcf4690 authored by Alejandro Nijamkin's avatar Alejandro Nijamkin
Browse files

[flexiglass] Respond to falsing detections.

When falsing occurs, the FalsingManager invokes its
FalsingBeliefListeners.

This CL adds a FalsingBeliefListener for Flexiglass and changes to the
Lockscreen scene when falsing happens.

Fix: 326323853
Test: unit test added
Test: manually verified that triggering falsing while not on the
lockscreen (bouncer, shade) returns to the lockscreen. Did this by
issuing many small zig-zag swipes and observing the logcat messages from
FalsingManager to make sure I see it print "Triggering False Event
(Threshold: 0.9)"
Flag: ACONFIG com.android.systemui.scene_container DEVELOPMENT

Change-Id: Iad72fde6490809ebe8a7ccaf53449dc6e9b03403
parent c621479c
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import com.android.systemui.bouncer.ui.viewmodel.PinBouncerViewModel
import com.android.systemui.bouncer.ui.viewmodel.bouncerViewModel
import com.android.systemui.classifier.domain.interactor.falsingInteractor
import com.android.systemui.classifier.falsingCollector
import com.android.systemui.classifier.falsingManager
import com.android.systemui.communal.domain.interactor.communalInteractor
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
@@ -265,6 +266,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() {
                displayId = displayTracker.defaultDisplayId,
                sceneLogger = mock(),
                falsingCollector = kosmos.falsingCollector,
                falsingManager = kosmos.falsingManager,
                powerInteractor = powerInteractor,
                bouncerInteractor = bouncerInteractor,
                simBouncerInteractor = dagger.Lazy { kosmos.simBouncerInteractor },
+16 −0
Original line number Diff line number Diff line
@@ -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.simBouncerInteractor
import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.classifier.falsingManager
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
@@ -115,6 +116,7 @@ class SceneContainerStartableTest : SysuiTestCase() {
                displayId = Display.DEFAULT_DISPLAY,
                sceneLogger = mock(),
                falsingCollector = falsingCollector,
                falsingManager = kosmos.falsingManager,
                powerInteractor = powerInteractor,
                bouncerInteractor = bouncerInteractor,
                simBouncerInteractor = { kosmos.simBouncerInteractor },
@@ -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(
        transitionStateFlow: MutableStateFlow<ObservableTransitionState>,
        toScene: SceneKey,
+18 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import com.android.systemui.bouncer.domain.interactor.BouncerInteractor
import com.android.systemui.bouncer.domain.interactor.SimBouncerInteractor
import com.android.systemui.classifier.FalsingCollector
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.qualifiers.Application
import com.android.systemui.dagger.qualifiers.DisplayId
@@ -34,6 +35,8 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.model.SceneContainerPlugin
import com.android.systemui.model.SysUiState
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.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.shared.flag.SceneContainerFlags
@@ -53,6 +56,7 @@ import java.io.PrintWriter
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
@@ -82,6 +86,7 @@ constructor(
    @DisplayId private val displayId: Int,
    private val sceneLogger: SceneLogger,
    @FalsingCollectorActual private val falsingCollector: FalsingCollector,
    private val falsingManager: FalsingManager,
    private val powerInteractor: PowerInteractor,
    private val simBouncerInteractor: Lazy<SimBouncerInteractor>,
    private val authenticationInteractor: Lazy<AuthenticationInteractor>,
@@ -98,6 +103,7 @@ constructor(
            automaticallySwitchScenes()
            hydrateSystemUiState()
            collectFalsingSignals()
            respondToFalsingDetections()
            hydrateWindowFocus()
            hydrateInteractionState()
        } else {
@@ -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. */
    private fun hydrateWindowFocus() {
        applicationScope.launch {
+9 −0
Original line number Diff line number Diff line
@@ -201,4 +201,13 @@ public class FalsingManagerFake implements FalsingManager {
    public List<FalsingTapListener> getTapListeners() {
        return mTapListeners;
    }

    /**
     * Calls every registered {@link FalsingBeliefListener} as if false touch occurred.
     */
    public void sendFalsingBelief() {
        for (FalsingBeliefListener listener : mFalsingBeliefListeners) {
            listener.onFalse();
        }
    }
}