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

Commit 54f904f2 authored by Juan Sebastian Martinez's avatar Juan Sebastian Martinez Committed by Automerger Merge Worker
Browse files

Merge "Using performHapticFeedback on BiometricUnlockController" into udc-qpr-dev am: bb33d7cb

parents d13e8898 bb33d7cb
Loading
Loading
Loading
Loading
+26 −5
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone;

import static android.app.StatusBarManager.SESSION_KEYGUARD;

import static com.android.systemui.flags.Flags.ONE_WAY_HAPTICS_API_MIGRATION;
import static com.android.systemui.keyguard.WakefulnessLifecycle.UNKNOWN_LAST_WAKE_TIME;

import android.annotation.IntDef;
@@ -30,6 +31,7 @@ import android.metrics.LogMaker;
import android.os.Handler;
import android.os.PowerManager;
import android.os.Trace;
import android.view.HapticFeedbackConstants;

import androidx.annotation.Nullable;

@@ -51,6 +53,7 @@ import com.android.systemui.biometrics.AuthController;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.keyguard.ScreenLifecycle;
import com.android.systemui.keyguard.WakefulnessLifecycle;
@@ -177,6 +180,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
    private long mLastFpFailureUptimeMillis;
    private int mNumConsecutiveFpFailures;

    private final FeatureFlags mFeatureFlags;

    private static final class PendingAuthenticated {
        public final int userId;
        public final BiometricSourceType biometricSourceType;
@@ -280,7 +285,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
            LatencyTracker latencyTracker,
            ScreenOffAnimationController screenOffAnimationController,
            VibratorHelper vibrator,
            SystemClock systemClock
            SystemClock systemClock,
            FeatureFlags featureFlags
    ) {
        mPowerManager = powerManager;
        mUpdateMonitor = keyguardUpdateMonitor;
@@ -308,6 +314,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
        mVibratorHelper = vibrator;
        mLogger = biometricUnlockLogger;
        mSystemClock = systemClock;
        mFeatureFlags = featureFlags;

        dumpManager.registerDumpable(getClass().getName(), this);
    }
@@ -750,9 +757,16 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
            mLogger.d("Skip auth success haptic. Power button was recently pressed.");
            return;
        }
        if (mFeatureFlags.isEnabled(ONE_WAY_HAPTICS_API_MIGRATION)) {
            mVibratorHelper.performHapticFeedback(
                    mKeyguardViewController.getViewRootImpl().getView(),
                    HapticFeedbackConstants.CONFIRM
            );
        } else {
            mVibratorHelper.vibrateAuthSuccess(
                    getClass().getSimpleName() + ", type =" + type + "device-entry::success");
        }
    }

    private boolean lastWakeupFromPowerButtonWithinHapticThreshold() {
        final boolean lastWakeupFromPowerButton = mWakefulnessLifecycle.getLastWakeReason()
@@ -764,9 +778,16 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
    }

    private void vibrateError(BiometricSourceType type) {
        if (mFeatureFlags.isEnabled(ONE_WAY_HAPTICS_API_MIGRATION)) {
            mVibratorHelper.performHapticFeedback(
                    mKeyguardViewController.getViewRootImpl().getView(),
                    HapticFeedbackConstants.REJECT
            );
        } else {
            mVibratorHelper.vibrateAuthError(
                    getClass().getSimpleName() + ", type =" + type + "device-entry::error");
        }
    }

    private void cleanup() {
        releaseBiometricWakeLock();
+80 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.statusbar.phone;

import static com.android.systemui.flags.Flags.ONE_WAY_HAPTICS_API_MIGRATION;
import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK;

import static com.google.common.truth.Truth.assertThat;
@@ -39,6 +40,8 @@ import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.testing.TestableResources;
import android.view.HapticFeedbackConstants;
import android.view.ViewRootImpl;

import com.android.internal.logging.MetricsLogger;
import com.android.internal.util.LatencyTracker;
@@ -47,6 +50,7 @@ import com.android.keyguard.logging.BiometricUnlockLogger;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.biometrics.AuthController;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FakeFeatureFlags;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.keyguard.ScreenLifecycle;
import com.android.systemui.keyguard.WakefulnessLifecycle;
@@ -118,8 +122,11 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
    private VibratorHelper mVibratorHelper;
    @Mock
    private BiometricUnlockLogger mLogger;
    @Mock
    private ViewRootImpl mViewRootImpl;
    private final FakeSystemClock mSystemClock = new FakeSystemClock();
    private BiometricUnlockController mBiometricUnlockController;
    private final FakeFeatureFlags mFeatureFlags = new FakeFeatureFlags();

    @Before
    public void setUp() {
@@ -142,11 +149,14 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
                mNotificationMediaManager, mWakefulnessLifecycle, mScreenLifecycle,
                mAuthController, mStatusBarStateController,
                mSessionTracker, mLatencyTracker, mScreenOffAnimationController, mVibratorHelper,
                mSystemClock
                mSystemClock,
                mFeatureFlags
        );
        mBiometricUnlockController.setKeyguardViewController(mStatusBarKeyguardViewManager);
        mBiometricUnlockController.addListener(mBiometricUnlockEventsListener);
        when(mUpdateMonitor.getStrongAuthTracker()).thenReturn(mStrongAuthTracker);
        when(mStatusBarKeyguardViewManager.getViewRootImpl()).thenReturn(mViewRootImpl);
        mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, false);
    }

    @Test
@@ -483,6 +493,31 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
        verify(mVibratorHelper).vibrateAuthSuccess(anyString());
    }

    @Test
    public void onSideFingerprintSuccess_oldPowerButtonPress_playOneWayHaptic() {
        // GIVEN oneway haptics is enabled
        mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, true);
        // GIVEN side fingerprint enrolled, last wake reason was power button
        when(mAuthController.isSfpsEnrolled(anyInt())).thenReturn(true);
        when(mWakefulnessLifecycle.getLastWakeReason())
                .thenReturn(PowerManager.WAKE_REASON_POWER_BUTTON);

        // GIVEN last wake time was 500ms ago
        when(mWakefulnessLifecycle.getLastWakeTime()).thenReturn(mSystemClock.uptimeMillis());
        mSystemClock.advanceTime(500);

        // WHEN biometric fingerprint succeeds
        givenFingerprintModeUnlockCollapsing();
        mBiometricUnlockController.startWakeAndUnlock(BiometricSourceType.FINGERPRINT,
                true);

        // THEN vibrate the device
        verify(mVibratorHelper).performHapticFeedback(
                any(),
                eq(HapticFeedbackConstants.CONFIRM)
        );
    }

    @Test
    public void onSideFingerprintSuccess_recentGestureWakeUp_playHaptic() {
        // GIVEN side fingerprint enrolled, wakeup just happened
@@ -502,6 +537,30 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
        verify(mVibratorHelper).vibrateAuthSuccess(anyString());
    }

    @Test
    public void onSideFingerprintSuccess_recentGestureWakeUp_playOnewayHaptic() {
        //GIVEN oneway haptics is enabled
        mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, true);
        // GIVEN side fingerprint enrolled, wakeup just happened
        when(mAuthController.isSfpsEnrolled(anyInt())).thenReturn(true);
        when(mWakefulnessLifecycle.getLastWakeTime()).thenReturn(mSystemClock.uptimeMillis());

        // GIVEN last wake reason was from a gesture
        when(mWakefulnessLifecycle.getLastWakeReason())
                .thenReturn(PowerManager.WAKE_REASON_GESTURE);

        // WHEN biometric fingerprint succeeds
        givenFingerprintModeUnlockCollapsing();
        mBiometricUnlockController.startWakeAndUnlock(BiometricSourceType.FINGERPRINT,
                true);

        // THEN vibrate the device
        verify(mVibratorHelper).performHapticFeedback(
                any(),
                eq(HapticFeedbackConstants.CONFIRM)
        );
    }

    @Test
    public void onSideFingerprintFail_alwaysPlaysHaptic() {
        // GIVEN side fingerprint enrolled, last wake reason was recent power button
@@ -517,6 +576,26 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
        verify(mVibratorHelper).vibrateAuthError(anyString());
    }

    @Test
    public void onSideFingerprintFail_alwaysPlaysOneWayHaptic() {
        // GIVEN oneway haptics is enabled
        mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, true);
        // GIVEN side fingerprint enrolled, last wake reason was recent power button
        when(mAuthController.isSfpsEnrolled(anyInt())).thenReturn(true);
        when(mWakefulnessLifecycle.getLastWakeReason())
                .thenReturn(PowerManager.WAKE_REASON_POWER_BUTTON);
        when(mWakefulnessLifecycle.getLastWakeTime()).thenReturn(mSystemClock.uptimeMillis());

        // WHEN biometric fingerprint fails
        mBiometricUnlockController.onBiometricAuthFailed(BiometricSourceType.FINGERPRINT);

        // THEN always vibrate the device
        verify(mVibratorHelper).performHapticFeedback(
                any(),
                eq(HapticFeedbackConstants.REJECT)
        );
    }

    @Test
    public void onFingerprintDetect_showBouncer() {
        // WHEN fingerprint detect occurs