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

Commit 3cd3f468 authored by Juan Sebastian Martinez's avatar Juan Sebastian Martinez Committed by Automerger Merge Worker
Browse files

Merge "Using performHapticFeedback on BiometricUnlockController" into...

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

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/24168253



Change-Id: I3e15ce4c64e0cf1f3b3c6c42ee35e60c1241a5f1
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 1bf9b453 54f904f2
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(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