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

Commit 1cd7db47 authored by Matt Pietal's avatar Matt Pietal
Browse files

Ensure SIM bouncer shows

There are cases where the bouncer isn't quite ready
to show due to an initialization race condition.
Reattempt on delay.

Test: atest StatusBarKeyguardViewManagerTest
Bug: 351426938
Flag: com.android.systemui.sim_pin_race_condition_on_restart
Change-Id: I767c7f217001bcfb9c3de73decfd62bd6dbfc42f
parent f584cfc3
Loading
Loading
Loading
Loading
+25 −11
Original line number Diff line number Diff line
@@ -68,7 +68,6 @@ import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor;
import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor;
import com.android.systemui.dock.DockManager;
import com.android.systemui.dreams.DreamOverlayStateController;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.keyguard.KeyguardWmStateRefactor;
import com.android.systemui.keyguard.domain.interactor.KeyguardDismissActionInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardSurfaceBehindInteractor;
@@ -104,6 +103,7 @@ import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.unfold.FoldAodAnimationController;
import com.android.systemui.unfold.SysUIUnfoldComponent;
import com.android.systemui.user.domain.interactor.SelectedUserInteractor;
import com.android.systemui.util.concurrency.DelayableExecutor;
import com.android.systemui.util.kotlin.JavaAdapter;

import dagger.Lazy;
@@ -179,6 +179,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
    private float mFraction = -1f;
    private boolean mTracking = false;
    private boolean mBouncerShowingOverDream;
    private int mAttemptsToShowBouncer = 0;
    private DelayableExecutor mExecutor;

    private final PrimaryBouncerExpansionCallback mExpansionCallback =
            new PrimaryBouncerExpansionCallback() {
@@ -315,8 +317,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
    private boolean mLastScreenOffAnimationPlaying;
    private float mQsExpansion;

    private FeatureFlags mFlags;

    final Set<KeyguardViewManagerCallback> mCallbacks = new HashSet<>();
    private boolean mIsBackAnimationEnabled;
    private final UdfpsOverlayInteractor mUdfpsOverlayInteractor;
@@ -399,9 +399,11 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
            JavaAdapter javaAdapter,
            Lazy<SceneInteractor> sceneInteractorLazy,
            StatusBarKeyguardViewManagerInteractor statusBarKeyguardViewManagerInteractor,
            @Main DelayableExecutor executor,
            Lazy<DeviceEntryInteractor> deviceEntryInteractorLazy
    ) {
        mContext = context;
        mExecutor = executor;
        mViewMediatorCallback = callback;
        mLockPatternUtils = lockPatternUtils;
        mConfigurationController = configurationController;
@@ -711,13 +713,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
     * {@link #needsFullscreenBouncer()}.
     */
    protected void showBouncerOrKeyguard(boolean hideBouncerWhenShowing, boolean isFalsingReset) {
        boolean isDozing = mDozing;
        if (Flags.simPinRaceConditionOnRestart()) {
            KeyguardState toState = mKeyguardTransitionInteractor.getTransitionState().getValue()
                    .getTo();
            isDozing = mDozing || toState == KeyguardState.DOZING || toState == KeyguardState.AOD;
        }
        if (needsFullscreenBouncer() && !isDozing) {
        if (needsFullscreenBouncer() && !mDozing) {
            // The keyguard might be showing (already). So we need to hide it.
            if (!primaryBouncerIsShowing()) {
                if (SceneContainerFlag.isEnabled()) {
@@ -727,9 +723,22 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
                } else {
                    if (Flags.simPinRaceConditionOnRestart()) {
                        if (mPrimaryBouncerInteractor.show(/* isScrimmed= */ true)) {
                            mAttemptsToShowBouncer = 0;
                            mCentralSurfaces.hideKeyguard();
                        } else {
                            if (mAttemptsToShowBouncer > 6) {
                                mAttemptsToShowBouncer = 0;
                                Log.e(TAG, "Too many failed attempts to show bouncer, showing "
                                        + "keyguard instead");
                                mCentralSurfaces.showKeyguard();
                            } else {
                                Log.v(TAG, "Failed to show bouncer, attempt #: "
                                        + mAttemptsToShowBouncer++);
                                mExecutor.executeDelayed(() ->
                                        showBouncerOrKeyguard(hideBouncerWhenShowing,
                                            isFalsingReset),
                                        500);
                            }
                        }
                    } else {
                        mCentralSurfaces.hideKeyguard();
@@ -1874,6 +1883,11 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
                || mode == KeyguardSecurityModel.SecurityMode.SimPuk;
    }

    @VisibleForTesting
    void setAttemptsToShowBouncer(int attempts) {
        mAttemptsToShowBouncer = attempts;
    }

    /**
     * Delegate used to send show and hide events to an alternate authentication method instead of
     * the regular pin/pattern/password bouncer.
+8 −0
Original line number Diff line number Diff line
@@ -108,7 +108,9 @@ import com.android.systemui.statusbar.domain.interactor.StatusBarKeyguardViewMan
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.unfold.SysUIUnfoldComponent;
import com.android.systemui.user.domain.interactor.SelectedUserInteractor;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.kotlin.JavaAdapter;
import com.android.systemui.util.time.FakeSystemClock;

import com.google.common.truth.Truth;

@@ -175,6 +177,7 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {
            mBouncerExpansionCallback;
    private FakeKeyguardStateController mKeyguardStateController =
            spy(new FakeKeyguardStateController());
    private final FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock());

    @Mock
    private ViewRootImpl mViewRootImpl;
@@ -238,6 +241,7 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {
                        mock(JavaAdapter.class),
                        () -> mSceneInteractor,
                        mock(StatusBarKeyguardViewManagerInteractor.class),
                        mExecutor,
                        () -> mDeviceEntryInteractor) {
                    @Override
                    public ViewRootImpl getViewRootImpl() {
@@ -760,6 +764,7 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {
                        mock(JavaAdapter.class),
                        () -> mSceneInteractor,
                        mock(StatusBarKeyguardViewManagerInteractor.class),
                        mExecutor,
                        () -> mDeviceEntryInteractor) {
                    @Override
                    public ViewRootImpl getViewRootImpl() {
@@ -1084,6 +1089,9 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {
                .thenReturn(KeyguardState.LOCKSCREEN);

        reset(mCentralSurfaces);
        // Advance past reattempts
        mStatusBarKeyguardViewManager.setAttemptsToShowBouncer(10);

        mStatusBarKeyguardViewManager.showBouncerOrKeyguard(false, false);
        verify(mPrimaryBouncerInteractor).show(true);
        verify(mCentralSurfaces).showKeyguard();