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

Commit 244bcaed authored by Lucas Silva's avatar Lucas Silva
Browse files

Don't listen to UDFPS if communal hub is showing

When the communal hub is showing, we should not listen to UDFPS as there
are visual widget elements above the sensor. When communal exits, we
should re-enable the sensor. This also ensures that if the alternate
bouncer is shown above the communal hub, we also re-enable the sensor.

Fixes: 385762852
Test: atest KeyguardUpdateMonitorTest
Flag: com.android.systemui.glanceable_hub_v2
Change-Id: I1bdb81672857c61245a6df430127af363b961bc0
parent d559273f
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ data class KeyguardFingerprintListenModel(
    var systemUser: Boolean = false,
    var udfps: Boolean = false,
    var userDoesNotHaveTrust: Boolean = false,
    var communalShowing: Boolean = false,
) : KeyguardListenModel() {

    /** List of [String] to be used as a [Row] with [DumpsysTableLogger]. */
@@ -81,6 +82,7 @@ data class KeyguardFingerprintListenModel(
            systemUser.toString(),
            udfps.toString(),
            userDoesNotHaveTrust.toString(),
            communalShowing.toString(),
        )
    }

@@ -122,6 +124,7 @@ data class KeyguardFingerprintListenModel(
                systemUser = model.systemUser
                udfps = model.udfps
                userDoesNotHaveTrust = model.userDoesNotHaveTrust
                communalShowing = model.communalShowing
            }
        }

@@ -170,6 +173,7 @@ data class KeyguardFingerprintListenModel(
                "systemUser",
                "underDisplayFingerprint",
                "userDoesNotHaveTrust",
                "communalShowing",
            )
    }
}
+29 −3
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STR
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW;
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT;
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN;
import static com.android.systemui.Flags.glanceableHubV2;
import static com.android.systemui.Flags.simPinBouncerReset;
import static com.android.systemui.Flags.simPinUseSlotId;
import static com.android.systemui.statusbar.policy.DevicePostureController.DEVICE_POSTURE_OPENED;
@@ -128,6 +129,7 @@ import com.android.systemui.biometrics.AuthController;
import com.android.systemui.biometrics.FingerprintInteractiveToAuthProvider;
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
@@ -294,6 +296,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
    private final Provider<JavaAdapter> mJavaAdapter;
    private final Provider<SceneInteractor> mSceneInteractor;
    private final Provider<AlternateBouncerInteractor> mAlternateBouncerInteractor;
    private final CommunalSceneInteractor mCommunalSceneInteractor;
    private final AuthController mAuthController;
    private final UiEventLogger mUiEventLogger;
    private final Set<String> mAllowFingerprintOnOccludingActivitiesFromPackage;
@@ -404,6 +407,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
    protected int mFingerprintRunningState = BIOMETRIC_STATE_STOPPED;
    private boolean mFingerprintDetectRunning;
    private boolean mIsDreaming;
    private boolean mCommunalShowing;
    private int mActiveMobileDataSubscription = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
    private final FingerprintInteractiveToAuthProvider mFingerprintInteractiveToAuthProvider;

@@ -2201,7 +2205,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
            IActivityTaskManager activityTaskManagerService,
            Provider<AlternateBouncerInteractor> alternateBouncerInteractor,
            Provider<JavaAdapter> javaAdapter,
            Provider<SceneInteractor> sceneInteractor) {
            Provider<SceneInteractor> sceneInteractor,
            CommunalSceneInteractor communalSceneInteractor) {
        mContext = context;
        mSubscriptionManager = subscriptionManager;
        mUserTracker = userTracker;
@@ -2250,6 +2255,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
        mAlternateBouncerInteractor = alternateBouncerInteractor;
        mJavaAdapter = javaAdapter;
        mSceneInteractor = sceneInteractor;
        mCommunalSceneInteractor = communalSceneInteractor;

        mHandler = new Handler(mainLooper) {
            @Override
@@ -2531,6 +2537,13 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
            );
        }

        if (glanceableHubV2()) {
            mJavaAdapter.get().alwaysCollectFlow(
                    mCommunalSceneInteractor.isCommunalVisible(),
                    this::onCommunalShowingChanged
            );
        }

        // start() can be invoked in the middle of user switching, so check for this state and issue
        // the call manually as that important event was missed.
        if (mUserTracker.isUserSwitching()) {
@@ -2832,6 +2845,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
                extraReason + "-dismissKeyguard", true);
    }

    /**
     * Sets whether the communal hub is showing.
     */
    @VisibleForTesting
    void onCommunalShowingChanged(boolean showing) {
        mCommunalShowing = showing;
        updateFingerprintListeningState(BIOMETRIC_ACTION_UPDATE);
    }

    /**
     * Whether the alternate bouncer is showing.
     */
@@ -2994,11 +3016,14 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
        final boolean strongerAuthRequired = !isUnlockingWithFingerprintAllowed();
        final boolean shouldListenBouncerState =
                !strongerAuthRequired || !isPrimaryBouncerShowingOrWillBeShowing();
        final boolean isUdfpsAuthRequiredOnCommunal =
                !mCommunalShowing || isAlternateBouncerShowing();

        final boolean shouldListenUdfpsState = !isUdfps
                || (!userCanSkipBouncer
                && !strongerAuthRequired
                && userDoesNotHaveTrust);
                && userDoesNotHaveTrust
                && (!glanceableHubV2() || isUdfpsAuthRequiredOnCommunal));


        boolean shouldListen = shouldListenKeyguardState && shouldListenUserState
@@ -3029,7 +3054,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
                    mSwitchingUser,
                    mIsSystemUser,
                    isUdfps,
                    userDoesNotHaveTrust));
                    userDoesNotHaveTrust,
                    mCommunalShowing));

        return shouldListen;
    }
+52 −4
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import static com.android.keyguard.KeyguardUpdateMonitor.BIOMETRIC_STATE_CANCELL
import static com.android.keyguard.KeyguardUpdateMonitor.BIOMETRIC_STATE_STOPPED;
import static com.android.keyguard.KeyguardUpdateMonitor.DEFAULT_CANCEL_SIGNAL_TIMEOUT;
import static com.android.keyguard.KeyguardUpdateMonitor.HAL_POWER_PRESS_TIMEOUT;
import static com.android.systemui.Flags.FLAG_GLANCEABLE_HUB_V2;
import static com.android.systemui.statusbar.policy.DevicePostureController.DEVICE_POSTURE_OPENED;
import static com.android.systemui.statusbar.policy.DevicePostureController.DEVICE_POSTURE_UNKNOWN;

@@ -137,6 +138,7 @@ import com.android.systemui.biometrics.AuthController;
import com.android.systemui.biometrics.FingerprintInteractiveToAuthProvider;
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor;
import com.android.systemui.deviceentry.data.repository.FaceWakeUpTriggersConfig;
import com.android.systemui.deviceentry.data.repository.FaceWakeUpTriggersConfigImpl;
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor;
@@ -178,6 +180,9 @@ import org.mockito.MockitoAnnotations;
import org.mockito.MockitoSession;
import org.mockito.quality.Strictness;

import platform.test.runner.parameterized.ParameterizedAndroidJunit4;
import platform.test.runner.parameterized.Parameters;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -187,9 +192,6 @@ import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;

import platform.test.runner.parameterized.ParameterizedAndroidJunit4;
import platform.test.runner.parameterized.Parameters;

@SmallTest
@RunWith(ParameterizedAndroidJunit4.class)
@TestableLooper.RunWithLooper
@@ -302,6 +304,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
    private JavaAdapter mJavaAdapter;
    @Mock
    private SceneInteractor mSceneInteractor;
    @Mock
    private CommunalSceneInteractor mCommunalSceneInteractor;
    @Captor
    private ArgumentCaptor<FaceAuthenticationListener> mFaceAuthenticationListener;

@@ -1081,6 +1085,49 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
        assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(false)).isTrue();
    }

    @Test
    @EnableFlags(FLAG_GLANCEABLE_HUB_V2)
    public void udfpsStopsListeningWhenCommunalShowing() {
        // GIVEN keyguard showing
        mKeyguardUpdateMonitor.dispatchStartedWakingUp(PowerManager.WAKE_REASON_POWER_BUTTON);
        mKeyguardUpdateMonitor.setKeyguardShowing(true, false);

        assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(true)).isTrue();

        // WHEN communal is shown
        mKeyguardUpdateMonitor.onCommunalShowingChanged(true);

        // THEN shouldn't listen for fingerprint
        assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(true)).isFalse();

        // WHEN alternate bouncer shows on top of communal, we should listen for fingerprint
        mKeyguardUpdateMonitor.setAlternateBouncerVisibility(true);
        assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(true)).isTrue();

        // WHEN communal is hidden
        mKeyguardUpdateMonitor.onCommunalShowingChanged(false);
        mKeyguardUpdateMonitor.setAlternateBouncerVisibility(false);

        // THEN listen for fingerprint
        assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(true)).isTrue();
    }

    @Test
    @EnableFlags(FLAG_GLANCEABLE_HUB_V2)
    public void sfpsNotAffectedByCommunalShowing() {
        // GIVEN keyguard showing
        mKeyguardUpdateMonitor.dispatchStartedWakingUp(PowerManager.WAKE_REASON_POWER_BUTTON);
        mKeyguardUpdateMonitor.setKeyguardShowing(true, false);

        assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(false)).isTrue();

        // WHEN communal is shown
        mKeyguardUpdateMonitor.onCommunalShowingChanged(true);

        // THEN we should still listen for fingerprint if not UDFPS
        assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(false)).isTrue();
    }

    @Test
    public void testFingerprintPowerPressed_restartsFingerprintListeningStateWithDelay() {
        mKeyguardUpdateMonitor.mFingerprintAuthenticationCallback
@@ -2596,7 +2643,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
                    mTaskStackChangeListeners, mSelectedUserInteractor, mActivityTaskManager,
                    () -> mAlternateBouncerInteractor,
                    () -> mJavaAdapter,
                    () -> mSceneInteractor);
                    () -> mSceneInteractor,
                    mCommunalSceneInteractor);
            setAlternateBouncerVisibility(false);
            setPrimaryBouncerVisibility(false);
            setStrongAuthTracker(KeyguardUpdateMonitorTest.this.mStrongAuthTracker);