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

Commit 238b504e authored by Ale Nijamkin's avatar Ale Nijamkin Committed by Android (Google) Code Review
Browse files

Merge "[flexiglass] Respond to falsing detections." into main

parents 1c5039f8 9fcf4690
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line 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.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
@@ -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 },
+16 −0
Original line number Original line 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.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
@@ -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 },
@@ -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,
+18 −0
Original line number Original line 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.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
@@ -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
@@ -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
@@ -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>,
@@ -98,6 +103,7 @@ constructor(
            automaticallySwitchScenes()
            automaticallySwitchScenes()
            hydrateSystemUiState()
            hydrateSystemUiState()
            collectFalsingSignals()
            collectFalsingSignals()
            respondToFalsingDetections()
            hydrateWindowFocus()
            hydrateWindowFocus()
            hydrateInteractionState()
            hydrateInteractionState()
        } else {
        } 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. */
    /** Keeps the focus state of the window view up-to-date. */
    private fun hydrateWindowFocus() {
    private fun hydrateWindowFocus() {
        applicationScope.launch {
        applicationScope.launch {
+9 −0
Original line number Original line Diff line number Diff line
@@ -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();
        }
    }
}
}