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

Commit beee8633 authored by Curtis Belmonte's avatar Curtis Belmonte
Browse files

Don't call setKeyguardGoingAway on background thread

Ensures that KeyguardUpdateMonitor#setKeyguardGoingAway(boolean) is
never called on a background thread by dispatching a message to be
handled by KeyguardUpdateMonitor on the main thread.

Test: Manually on Pixel 4 XL
Test: atest com.android.systemui.keyguard

Fixes: 159778563
Change-Id: I48512c0dffba6082f62e70d169f1374c36eead8b
parent 0cef70e5
Loading
Loading
Loading
Loading
+19 −1
Original line number Diff line number Diff line
@@ -177,6 +177,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
    private static final int MSG_TIMEZONE_UPDATE = 339;
    private static final int MSG_USER_STOPPED = 340;
    private static final int MSG_USER_REMOVED = 341;
    private static final int MSG_KEYGUARD_GOING_AWAY = 342;

    /** Biometric authentication state: Not listening. */
    private static final int BIOMETRIC_STATE_STOPPED = 0;
@@ -531,7 +532,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
    }

    /**
     * Updates KeyguardUpdateMonitor's internal state to know if keyguard is goingAway
     * Updates KeyguardUpdateMonitor's internal state to know if keyguard is going away.
     */
    public void setKeyguardGoingAway(boolean goingAway) {
        mKeyguardGoingAway = goingAway;
@@ -1521,6 +1522,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
        mUserTrustIsUsuallyManaged.delete(userId);
    }

    private void handleKeyguardGoingAway(boolean goingAway) {
        Assert.isMainThread();
        setKeyguardGoingAway(goingAway);
    }

    @VisibleForTesting
    protected void setStrongAuthTracker(@NonNull StrongAuthTracker tracker) {
        if (mStrongAuthTracker != null) {
@@ -1661,6 +1667,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
                    case MSG_TELEPHONY_CAPABLE:
                        updateTelephonyCapable((boolean) msg.obj);
                        break;
                    case MSG_KEYGUARD_GOING_AWAY:
                        handleKeyguardGoingAway((boolean) msg.obj);
                        break;
                    default:
                        super.handleMessage(msg);
                        break;
@@ -2802,6 +2811,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
        mHandler.sendMessage(mHandler.obtainMessage(MSG_DREAMING_STATE_CHANGED, 0, 0));
    }

    /**
     * Sends a message to update the keyguard going away state on the main thread.
     *
     * @param goingAway Whether the keyguard is going away.
     */
    public void dispatchKeyguardGoingAway(boolean goingAway) {
        mHandler.sendMessage(mHandler.obtainMessage(MSG_KEYGUARD_GOING_AWAY, goingAway));
    }

    public boolean isDeviceInteractive() {
        return mDeviceInteractive;
    }
+1 −1
Original line number Diff line number Diff line
@@ -876,7 +876,7 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable {
            // explicitly DO NOT want to call
            // mKeyguardViewControllerLazy.get().setKeyguardGoingAwayState(false)
            // here, since that will mess with the device lock state.
            mUpdateMonitor.setKeyguardGoingAway(false);
            mUpdateMonitor.dispatchKeyguardGoingAway(false);

            // Lock immediately based on setting if secure (user has a pin/pattern/password).
            // This also "locks" the device when not secure to provide easy access to the
+1 −1
Original line number Diff line number Diff line
@@ -95,7 +95,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
    @Test
    public void testOnGoingToSleep_UpdatesKeyguardGoingAway() {
        mViewMediator.onStartedGoingToSleep(OFF_BECAUSE_OF_USER);
        verify(mUpdateMonitor).setKeyguardGoingAway(false);
        verify(mUpdateMonitor).dispatchKeyguardGoingAway(false);
        verify(mStatusBarKeyguardViewManager, never()).setKeyguardGoingAwayState(anyBoolean());
    }