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

Commit 7d938ee7 authored by Matt Pietal's avatar Matt Pietal
Browse files

Make sure SIM PIN screen shows

It is possible to receive SIM events that alert the keyguard to show
the SIM PIN unlock screens. However, if these events are received
after keyguard has been told to dismiss but before it is actually
dismissed, this event gets ignored.

The fix: add a flag to look for this state. If we get the keyguard
dismissed event and the bouncer has not shown, bring back to the
keyguard.

Fixes: 192048149
Test: atest KeyguardViewMediatorTest
Change-Id: I43de785252827d78a86d075ee7ec0861778e3360
parent 1181f3e9
Loading
Loading
Loading
Loading
+24 −1
Original line number Diff line number Diff line
@@ -398,6 +398,12 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
     */
    private boolean mPendingLock;

    /**
     * When starting to go away, flag a need to show the PIN lock so the keyguard can be brought
     * back.
     */
    private boolean mPendingPinLock = false;

    /**
     * Whether a power button gesture (such as double tap for camera) has been detected. This is
     * delivered directly from {@link KeyguardService}, immediately upon the gesture being detected.
@@ -471,6 +477,19 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,

    KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() {

        @Override
        public void onKeyguardVisibilityChanged(boolean showing) {
            synchronized (KeyguardViewMediator.this) {
                if (!showing && mPendingPinLock) {
                    Log.i(TAG, "PIN lock requested, starting keyguard");

                    // Bring the keyguard back in order to show the PIN lock
                    mPendingPinLock = false;
                    doKeyguardLocked(null);
                }
            }
        }

        @Override
        public void onUserSwitching(int userId) {
            if (DEBUG) Log.d(TAG, String.format("onUserSwitching %d", userId));
@@ -591,6 +610,7 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
                                    + "showing; need to show keyguard so user can enter sim pin");
                            doKeyguardLocked(null);
                        } else {
                            mPendingPinLock = true;
                            resetStateLocked();
                        }
                    }
@@ -739,6 +759,9 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
        @Override
        public void onBouncerVisiblityChanged(boolean shown) {
            synchronized (KeyguardViewMediator.this) {
                if (shown) {
                    mPendingPinLock = false;
                }
                adjustStatusBarLocked(shown, false);
            }
        }
@@ -2783,7 +2806,7 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
        }
    }

    private void setShowingLocked(boolean showing) {
    void setShowingLocked(boolean showing) {
        setShowingLocked(showing, false /* forceCallbacks */);
    }

+28 −2
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -33,8 +34,9 @@ import android.app.admin.DevicePolicyManager;
import android.app.trust.TrustManager;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.telephony.TelephonyManager;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.testing.TestableLooper;

import androidx.test.filters.SmallTest;

@@ -65,7 +67,7 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

@RunWith(AndroidTestingRunner.class)
@RunWithLooper
@TestableLooper.RunWithLooper(setAsMainLooper = true)
@SmallTest
public class KeyguardViewMediatorTest extends SysuiTestCase {
    private KeyguardViewMediator mViewMediator;
@@ -124,6 +126,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
                mUnlockedScreenOffAnimationController,
                () -> mNotificationShadeDepthController);
        mViewMediator.start();
        mViewMediator.onSystemReady();
    }

    @Test
@@ -160,4 +163,27 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
        mViewMediator.onDozeAmountChanged(1f, 1f);
        assertFalse(mViewMediator.isAnimatingScreenOff());
    }

    @Test
    public void restoreBouncerWhenSimLockedAndKeyguardIsGoingAway() {
        // When showing and provisioned
        when(mUpdateMonitor.isDeviceProvisioned()).thenReturn(true);
        mViewMediator.setShowingLocked(true);

        // and a SIM becomes locked and requires a PIN
        mViewMediator.mUpdateCallback.onSimStateChanged(
                1 /* subId */,
                0 /* slotId */,
                TelephonyManager.SIM_STATE_PIN_REQUIRED);

        // and the keyguard goes away
        mViewMediator.setShowingLocked(false);
        when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
        mViewMediator.mUpdateCallback.onKeyguardVisibilityChanged(false);

        TestableLooper.get(this).processAllMessages();

        // then make sure it comes back
        verify(mStatusBarKeyguardViewManager, atLeast(1)).show(null);
    }
}