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

Commit e36157d8 authored by Beverly's avatar Beverly
Browse files

Update isDefaultDisplayOffState whenever the display changes

Previously, this would require a display change event to occur
after the first face auth event was being processed before
it would start working.

Test: atest DisplayStateInteractorImplTest DisplayRepositoryTest
Fixes: 333084165
Flag: None
Change-Id: I4942cb009ba26e3347d53137250cf2925e965581
parent 9541c14a
Loading
Loading
Loading
Loading
+3 −11
Original line number Diff line number Diff line
@@ -32,7 +32,6 @@ import android.hardware.face.FaceManager
import android.hardware.face.FaceSensorProperties
import android.hardware.face.FaceSensorPropertiesInternal
import android.os.CancellationSignal
import android.view.Display
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.internal.logging.InstanceId.fakeInstanceId
@@ -54,7 +53,6 @@ import com.android.systemui.deviceentry.shared.model.FaceAuthenticationStatus
import com.android.systemui.deviceentry.shared.model.FaceDetectionStatus
import com.android.systemui.deviceentry.shared.model.HelpFaceAuthenticationStatus
import com.android.systemui.deviceentry.shared.model.SuccessFaceAuthenticationStatus
import com.android.systemui.display.data.repository.display
import com.android.systemui.display.data.repository.displayRepository
import com.android.systemui.dump.DumpManager
import com.android.systemui.flags.FakeFeatureFlags
@@ -697,9 +695,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
            )
            runCurrent()

            displayRepository.emit(setOf(display(0, 0, Display.DEFAULT_DISPLAY, Display.STATE_OFF)))
            displayRepository.emitDisplayChangeEvent(Display.DEFAULT_DISPLAY)

            displayRepository.setDefaultDisplayOff(true)
            runCurrent()

            assertThat(canFaceAuthRun()).isTrue()
@@ -717,10 +713,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
                )
                runCurrent()

                displayRepository.emit(
                    setOf(display(0, 0, Display.DEFAULT_DISPLAY, Display.STATE_OFF))
                )
                displayRepository.emitDisplayChangeEvent(Display.DEFAULT_DISPLAY)
                displayRepository.setDefaultDisplayOff(true)
            }
        }

@@ -1161,8 +1154,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
        faceLockoutResetCallback.value.onLockoutReset(0)
        bouncerRepository.setAlternateVisible(true)
        keyguardRepository.setKeyguardShowing(true)
        displayRepository.emit(setOf(display(0, 0, Display.DEFAULT_DISPLAY, Display.STATE_ON)))
        displayRepository.emitDisplayChangeEvent(Display.DEFAULT_DISPLAY)
        displayRepository.setDefaultDisplayOff(false)
        keyguardTransitionRepository.sendTransitionSteps(
            from = KeyguardState.AOD,
            to = KeyguardState.LOCKSCREEN,
+1 −14
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.systemui.biometrics.domain.interactor

import android.content.Context
import android.content.res.Configuration
import android.view.Display
import com.android.systemui.biometrics.data.repository.DisplayStateRepository
import com.android.systemui.biometrics.shared.model.DisplayRotation
import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging
@@ -28,7 +27,6 @@ import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.display.data.repository.DisplayRepository
import com.android.systemui.unfold.compat.ScreenSizeFoldProvider
import com.android.systemui.unfold.updates.FoldProvider
import com.android.systemui.util.kotlin.sample
import java.util.concurrent.Executor
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
@@ -36,8 +34,6 @@ import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn

/** Aggregates display state information. */
@@ -129,16 +125,7 @@ constructor(
        screenSizeFoldProvider.onConfigurationChange(newConfig)
    }

    private val defaultDisplay =
        displayRepository.displays.map { displays ->
            displays.firstOrNull { it.displayId == Display.DEFAULT_DISPLAY }
        }

    override val isDefaultDisplayOff =
        displayRepository.displayChangeEvent
            .filter { it == Display.DEFAULT_DISPLAY }
            .sample(defaultDisplay)
            .map { it?.state == Display.STATE_OFF }
    override val isDefaultDisplayOff = displayRepository.defaultDisplayOff

    override val isLargeScreen: Flow<Boolean> = displayStateRepository.isLargeScreen

+9 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.filterIsInstance
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
@@ -67,6 +68,9 @@ interface DisplayRepository {
     */
    val pendingDisplay: Flow<PendingDisplay?>

    /** Whether the default display is currently off. */
    val defaultDisplayOff: Flow<Boolean>

    /** Represents a connected display that has not been enabled yet. */
    interface PendingDisplay {
        /** Id of the pending display. */
@@ -290,6 +294,11 @@ constructor(
            }
            .debugLog("pendingDisplay")

    override val defaultDisplayOff: Flow<Boolean> =
        displays
            .map { displays -> displays.firstOrNull { it.displayId == Display.DEFAULT_DISPLAY } }
            .map { it?.state == Display.STATE_OFF }

    private fun <T> Flow<T>.debugLog(flowName: String): Flow<T> {
        return if (DEBUG) {
            traceEach(flowName, logcat = true, traceEmissionCount = true)
+2 −7
Original line number Diff line number Diff line
package com.android.systemui.biometrics.domain.interactor

import android.view.Display
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.biometrics.data.repository.FakeDisplayStateRepository
import com.android.systemui.biometrics.shared.model.DisplayRotation
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.display.data.repository.FakeDisplayRepository
import com.android.systemui.display.data.repository.display
import com.android.systemui.unfold.compat.ScreenSizeFoldProvider
import com.android.systemui.unfold.updates.FoldProvider
import com.android.systemui.util.concurrency.FakeExecutor
@@ -101,14 +99,11 @@ class DisplayStateInteractorImplTest : SysuiTestCase() {
    fun isDefaultDisplayOffChanges() =
        testScope.runTest {
            val isDefaultDisplayOff by collectLastValue(interactor.isDefaultDisplayOff)
            runCurrent()

            displayRepository.emit(setOf(display(0, 0, Display.DEFAULT_DISPLAY, Display.STATE_OFF)))
            displayRepository.emitDisplayChangeEvent(Display.DEFAULT_DISPLAY)
            displayRepository.setDefaultDisplayOff(true)
            assertThat(isDefaultDisplayOff).isTrue()

            displayRepository.emit(setOf(display(0, 0, Display.DEFAULT_DISPLAY, Display.STATE_ON)))
            displayRepository.emitDisplayChangeEvent(Display.DEFAULT_DISPLAY)
            displayRepository.setDefaultDisplayOff(false)
            assertThat(isDefaultDisplayOff).isFalse()
        }
}
+37 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import android.view.Display
import android.view.Display.TYPE_EXTERNAL
import android.view.Display.TYPE_INTERNAL
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.FlowValue
@@ -427,6 +428,35 @@ class DisplayRepositoryTest : SysuiTestCase() {
            assertThat(display!!.type).isEqualTo(TYPE_EXTERNAL)
        }

    @Test
    fun defaultDisplayOff_changes() =
        testScope.runTest {
            val defaultDisplayOff by latestDefaultDisplayOffFlowValue()
            setDisplays(
                listOf(
                    display(
                        type = TYPE_INTERNAL,
                        id = Display.DEFAULT_DISPLAY,
                        state = Display.STATE_OFF
                    )
                )
            )
            displayListener.value.onDisplayChanged(Display.DEFAULT_DISPLAY)
            assertThat(defaultDisplayOff).isTrue()

            setDisplays(
                listOf(
                    display(
                        type = TYPE_INTERNAL,
                        id = Display.DEFAULT_DISPLAY,
                        state = Display.STATE_ON
                    )
                )
            )
            displayListener.value.onDisplayChanged(Display.DEFAULT_DISPLAY)
            assertThat(defaultDisplayOff).isFalse()
        }

    private fun Iterable<Display>.ids(): List<Int> = map { it.displayId }

    // Wrapper to capture the displayListener.
@@ -436,6 +466,13 @@ class DisplayRepositoryTest : SysuiTestCase() {
        return flowValue
    }

    // Wrapper to capture the displayListener.
    private fun TestScope.latestDefaultDisplayOffFlowValue(): FlowValue<Boolean?> {
        val flowValue = collectLastValue(displayRepository.defaultDisplayOff)
        captureAddedRemovedListener()
        return flowValue
    }

    private fun TestScope.lastPendingDisplay(): FlowValue<DisplayRepository.PendingDisplay?> {
        val flowValue = collectLastValue(displayRepository.pendingDisplay)
        captureAddedRemovedListener()
Loading