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

Commit ef503de1 authored by Matt Pietal's avatar Matt Pietal
Browse files

Fix bouncer inflation race condition

For the multi-user bouncer only, the user switcher
and the security screen are inflated separately but
need to reference each other. After the security
screen is reinflated, such as after a display settings
change, pass the new reference back to the user
switcher.

Fixes: 335347904
Test: atest KeyguardSecurityContainerControllerTest
Test: manual continuously switch users
Test: manual update display settings and go back to
bouncer
Flag: EXEMPT bugfix

Change-Id: Ibb1d61305513b88aa3b9f7c0dd3755b7013b917c
parent 3adb62b1
Loading
Loading
Loading
Loading
+9 −11
Original line number Diff line number Diff line
@@ -105,6 +105,7 @@ import org.mockito.Mockito.atLeastOnce
import org.mockito.Mockito.clearInvocations
import org.mockito.Mockito.mock
import org.mockito.Mockito.never
import org.mockito.Mockito.reset
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
@@ -542,6 +543,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
        // THEN the next security method of None will dismiss keyguard.
        verify(viewMediatorCallback, never()).keyguardDone(anyInt())
    }

    @Test
    fun showNextSecurityScreenOrFinish_SimPin_Swipe_userNotSetup() {
        // GIVEN the current security method is SimPin
@@ -635,14 +637,6 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
        verify(configurationController).addCallback(configurationListenerArgumentCaptor.capture())
        clearInvocations(viewFlipperController)
        configurationListenerArgumentCaptor.value.onDensityOrFontScaleChanged()
        verify(viewFlipperController).clearViews()
        verify(viewFlipperController)
            .asynchronouslyInflateView(
                eq(SecurityMode.PIN),
                any(),
                onViewInflatedCallbackArgumentCaptor.capture()
            )
        onViewInflatedCallbackArgumentCaptor.value.onViewInflated(inputViewController)
        verify(view).onDensityOrFontScaleChanged()
    }

@@ -771,7 +765,9 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
        underTest.reinflateViewFlipper(onViewInflatedCallback)
        verify(viewFlipperController).clearViews()
        verify(viewFlipperController)
            .asynchronouslyInflateView(any(), any(), eq(onViewInflatedCallback))
            .asynchronouslyInflateView(any(), any(), onViewInflatedCallbackArgumentCaptor.capture())
        onViewInflatedCallbackArgumentCaptor.value.onViewInflated(inputViewController)
        verify(view).updateSecurityViewFlipper()
    }

    @Test
@@ -935,8 +931,10 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
        underTest.onViewAttached()
        verify(userSwitcherController)
            .addUserSwitchCallback(capture(userSwitchCallbackArgumentCaptor))
        reset(primaryBouncerInteractor)
        userSwitchCallbackArgumentCaptor.value.onUserSwitched()
        verify(viewFlipperController).asynchronouslyInflateView(any(), any(), any())

        verify(primaryBouncerInteractor).setLastShownPrimarySecurityScreen(any())
    }

    @Test
+7 −2
Original line number Diff line number Diff line
@@ -647,7 +647,12 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
    @Override
    public void onFinishInflate() {
        super.onFinishInflate();
        updateSecurityViewFlipper();
    }

    protected void updateSecurityViewFlipper() {
        mSecurityViewFlipper = findViewById(R.id.view_flipper);
        setupViewMode();
    }

    @Override
@@ -1004,11 +1009,11 @@ public class KeyguardSecurityContainer extends ConstraintLayout {

            if (mUserSwitcherViewGroup == null) {
                inflateUserSwitcher();
            }
            updateSecurityViewLocation();
                setupUserSwitcher();
                mUserSwitcherController.addUserSwitchCallback(mUserSwitchCallback);
            }
            updateSecurityViewLocation();
        }

        @Override
        public void reset() {
+5 −13
Original line number Diff line number Diff line
@@ -164,11 +164,6 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
                    }
                    mCurrentUser = mSelectedUserInteractor.getSelectedUserId();
                    showPrimarySecurityScreen(false);
                    if (mCurrentSecurityMode != SimPin
                            && mCurrentSecurityMode != SimPuk) {
                        reinflateViewFlipper((l) -> {
                        });
                    }
                }
            };

@@ -375,8 +370,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard

                @Override
                public void onDensityOrFontScaleChanged() {
                    KeyguardSecurityContainerController.this
                            .onDensityOrFontScaleOrOrientationChanged();
                    mView.onDensityOrFontScaleChanged();
                }

                @Override
@@ -1227,11 +1221,6 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
        mView.reloadColors();
    }

    /** Handles density or font scale changes. */
    private void onDensityOrFontScaleOrOrientationChanged() {
        reinflateViewFlipper(controller -> mView.onDensityOrFontScaleChanged());
    }

    /**
     * Reinflate the view flipper child view.
     */
@@ -1239,7 +1228,10 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
            KeyguardSecurityViewFlipperController.OnViewInflatedCallback onViewInflatedListener) {
        mSecurityViewFlipperController.clearViews();
        mSecurityViewFlipperController.asynchronouslyInflateView(mCurrentSecurityMode,
                mKeyguardSecurityCallback, onViewInflatedListener);
                mKeyguardSecurityCallback, (controller) -> {
                mView.updateSecurityViewFlipper();
                onViewInflatedListener.onViewInflated(controller);
            });
    }

    /**