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

Commit a790261f authored by Aaron Liu's avatar Aaron Liu
Browse files

Ensure that bouncer resume propagates a...

state change. When we are showing the sim puk, we want to hide and then
show the bouncer so that it goes through the same code path as the
regular bouncer. Otherwise, this view does not get properly
asynchronously inflated.

Additionally, move setvisible to the top of show collector. Before, we
would inflate the view before setting visibility to show....this seems
to cause a race condition when showing/hiding the bouncer.

Bug: 269522372
Test: Open sim puk from sim pin
Change-Id: I9e4bc66d61e10a8f1038b3f45268730e26d2ba31
parent 8eb68c7e
Loading
Loading
Loading
Loading
+7 −14
Original line number Original line Diff line number Diff line
@@ -21,8 +21,6 @@ import android.content.res.ColorStateList
import android.hardware.biometrics.BiometricSourceType
import android.hardware.biometrics.BiometricSourceType
import android.os.Handler
import android.os.Handler
import android.os.Trace
import android.os.Trace
import android.os.UserHandle
import android.os.UserManager
import android.util.Log
import android.util.Log
import android.view.View
import android.view.View
import com.android.keyguard.KeyguardConstants
import com.android.keyguard.KeyguardConstants
@@ -106,10 +104,9 @@ constructor(
    val panelExpansionAmount: Flow<Float> = repository.panelExpansionAmount
    val panelExpansionAmount: Flow<Float> = repository.panelExpansionAmount
    /** 0f = bouncer fully hidden. 1f = bouncer fully visible. */
    /** 0f = bouncer fully hidden. 1f = bouncer fully visible. */
    val bouncerExpansion: Flow<Float> =
    val bouncerExpansion: Flow<Float> =
        combine(
        combine(repository.panelExpansionAmount, repository.primaryBouncerShow) {
            repository.panelExpansionAmount,
            panelExpansion,
            repository.primaryBouncerShow
            primaryBouncerIsShowing ->
        ) { panelExpansion, primaryBouncerIsShowing ->
            if (primaryBouncerIsShowing) {
            if (primaryBouncerIsShowing) {
                1f - panelExpansion
                1f - panelExpansion
            } else {
            } else {
@@ -152,22 +149,18 @@ constructor(
            (isBouncerShowing() || repository.primaryBouncerShowingSoon.value) &&
            (isBouncerShowing() || repository.primaryBouncerShowingSoon.value) &&
                needsFullscreenBouncer()
                needsFullscreenBouncer()


        if (!resumeBouncer && isBouncerShowing()) {
            // If bouncer is visible, the bouncer is already showing.
            return
        }

        Trace.beginSection("KeyguardBouncer#show")
        Trace.beginSection("KeyguardBouncer#show")
        repository.setPrimaryScrimmed(isScrimmed)
        repository.setPrimaryScrimmed(isScrimmed)
        if (isScrimmed) {
        if (isScrimmed) {
            setPanelExpansion(KeyguardBouncerConstants.EXPANSION_VISIBLE)
            setPanelExpansion(KeyguardBouncerConstants.EXPANSION_VISIBLE)
        }
        }


        // In this special case, we want to hide the bouncer and show it again. We want to emit
        // show(true) again so that we can reinflate the new view.
        if (resumeBouncer) {
        if (resumeBouncer) {
            primaryBouncerView.delegate?.resume()
            repository.setPrimaryShow(false)
            // Bouncer is showing the next security screen and we just need to prompt a resume.
            return
        }
        }

        if (primaryBouncerView.delegate?.showNextSecurityScreenOrFinish() == true) {
        if (primaryBouncerView.delegate?.showNextSecurityScreenOrFinish() == true) {
            // Keyguard is done.
            // Keyguard is done.
            return
            return
+1 −1
Original line number Original line Diff line number Diff line
@@ -112,9 +112,9 @@ object KeyguardBouncerViewBinder {
                        viewModel.isShowing.collect { isShowing ->
                        viewModel.isShowing.collect { isShowing ->
                            if (isShowing) {
                            if (isShowing) {
                                // Reset Security Container entirely.
                                // Reset Security Container entirely.
                                view.visibility = View.VISIBLE
                                securityContainerController.reinflateViewFlipper {
                                securityContainerController.reinflateViewFlipper {
                                    // Reset Security Container entirely.
                                    // Reset Security Container entirely.
                                    view.visibility = View.VISIBLE
                                    securityContainerController.onBouncerVisibilityChanged(
                                    securityContainerController.onBouncerVisibilityChanged(
                                        /* isVisible= */ true
                                        /* isVisible= */ true
                                    )
                                    )
+12 −0
Original line number Original line Diff line number Diff line
@@ -48,6 +48,7 @@ import org.junit.runner.RunWith
import org.mockito.Answers
import org.mockito.Answers
import org.mockito.ArgumentCaptor
import org.mockito.ArgumentCaptor
import org.mockito.Mock
import org.mockito.Mock
import org.mockito.Mockito.anyInt
import org.mockito.Mockito.mock
import org.mockito.Mockito.mock
import org.mockito.Mockito.never
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
import org.mockito.Mockito.verify
@@ -123,6 +124,17 @@ class PrimaryBouncerInteractorTest : SysuiTestCase() {
        verify(mPrimaryBouncerCallbackInteractor, never()).dispatchStartingToShow()
        verify(mPrimaryBouncerCallbackInteractor, never()).dispatchStartingToShow()
    }
    }


    @Test
    fun testShow_isResumed() {
        whenever(repository.primaryBouncerShow.value).thenReturn(true)
        whenever(keyguardSecurityModel.getSecurityMode(anyInt()))
            .thenReturn(KeyguardSecurityModel.SecurityMode.SimPuk)

        underTest.show(true)
        verify(repository).setPrimaryShow(false)
        verify(repository).setPrimaryShow(true)
    }

    @Test
    @Test
    fun testHide() {
    fun testHide() {
        underTest.hide()
        underTest.hide()