Merge "Using performHapticFeedback on BiometricUnlockController" into udc-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
bb33d7cb25
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone;
|
|||||||
|
|
||||||
import static android.app.StatusBarManager.SESSION_KEYGUARD;
|
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 static com.android.systemui.keyguard.WakefulnessLifecycle.UNKNOWN_LAST_WAKE_TIME;
|
||||||
|
|
||||||
import android.annotation.IntDef;
|
import android.annotation.IntDef;
|
||||||
@@ -30,6 +31,7 @@ import android.metrics.LogMaker;
|
|||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
import android.os.Trace;
|
import android.os.Trace;
|
||||||
|
import android.view.HapticFeedbackConstants;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
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.SysUISingleton;
|
||||||
import com.android.systemui.dagger.qualifiers.Main;
|
import com.android.systemui.dagger.qualifiers.Main;
|
||||||
import com.android.systemui.dump.DumpManager;
|
import com.android.systemui.dump.DumpManager;
|
||||||
|
import com.android.systemui.flags.FeatureFlags;
|
||||||
import com.android.systemui.keyguard.KeyguardViewMediator;
|
import com.android.systemui.keyguard.KeyguardViewMediator;
|
||||||
import com.android.systemui.keyguard.ScreenLifecycle;
|
import com.android.systemui.keyguard.ScreenLifecycle;
|
||||||
import com.android.systemui.keyguard.WakefulnessLifecycle;
|
import com.android.systemui.keyguard.WakefulnessLifecycle;
|
||||||
@@ -177,6 +180,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
|
|||||||
private long mLastFpFailureUptimeMillis;
|
private long mLastFpFailureUptimeMillis;
|
||||||
private int mNumConsecutiveFpFailures;
|
private int mNumConsecutiveFpFailures;
|
||||||
|
|
||||||
|
private final FeatureFlags mFeatureFlags;
|
||||||
|
|
||||||
private static final class PendingAuthenticated {
|
private static final class PendingAuthenticated {
|
||||||
public final int userId;
|
public final int userId;
|
||||||
public final BiometricSourceType biometricSourceType;
|
public final BiometricSourceType biometricSourceType;
|
||||||
@@ -280,7 +285,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
|
|||||||
LatencyTracker latencyTracker,
|
LatencyTracker latencyTracker,
|
||||||
ScreenOffAnimationController screenOffAnimationController,
|
ScreenOffAnimationController screenOffAnimationController,
|
||||||
VibratorHelper vibrator,
|
VibratorHelper vibrator,
|
||||||
SystemClock systemClock
|
SystemClock systemClock,
|
||||||
|
FeatureFlags featureFlags
|
||||||
) {
|
) {
|
||||||
mPowerManager = powerManager;
|
mPowerManager = powerManager;
|
||||||
mUpdateMonitor = keyguardUpdateMonitor;
|
mUpdateMonitor = keyguardUpdateMonitor;
|
||||||
@@ -308,6 +314,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
|
|||||||
mVibratorHelper = vibrator;
|
mVibratorHelper = vibrator;
|
||||||
mLogger = biometricUnlockLogger;
|
mLogger = biometricUnlockLogger;
|
||||||
mSystemClock = systemClock;
|
mSystemClock = systemClock;
|
||||||
|
mFeatureFlags = featureFlags;
|
||||||
|
|
||||||
dumpManager.registerDumpable(getClass().getName(), this);
|
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.");
|
mLogger.d("Skip auth success haptic. Power button was recently pressed.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (mFeatureFlags.isEnabled(ONE_WAY_HAPTICS_API_MIGRATION)) {
|
||||||
|
mVibratorHelper.performHapticFeedback(
|
||||||
|
mKeyguardViewController.getViewRootImpl().getView(),
|
||||||
|
HapticFeedbackConstants.CONFIRM
|
||||||
|
);
|
||||||
|
} else {
|
||||||
mVibratorHelper.vibrateAuthSuccess(
|
mVibratorHelper.vibrateAuthSuccess(
|
||||||
getClass().getSimpleName() + ", type =" + type + "device-entry::success");
|
getClass().getSimpleName() + ", type =" + type + "device-entry::success");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private boolean lastWakeupFromPowerButtonWithinHapticThreshold() {
|
private boolean lastWakeupFromPowerButtonWithinHapticThreshold() {
|
||||||
final boolean lastWakeupFromPowerButton = mWakefulnessLifecycle.getLastWakeReason()
|
final boolean lastWakeupFromPowerButton = mWakefulnessLifecycle.getLastWakeReason()
|
||||||
@@ -764,9 +778,16 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void vibrateError(BiometricSourceType type) {
|
private void vibrateError(BiometricSourceType type) {
|
||||||
|
if (mFeatureFlags.isEnabled(ONE_WAY_HAPTICS_API_MIGRATION)) {
|
||||||
|
mVibratorHelper.performHapticFeedback(
|
||||||
|
mKeyguardViewController.getViewRootImpl().getView(),
|
||||||
|
HapticFeedbackConstants.REJECT
|
||||||
|
);
|
||||||
|
} else {
|
||||||
mVibratorHelper.vibrateAuthError(
|
mVibratorHelper.vibrateAuthError(
|
||||||
getClass().getSimpleName() + ", type =" + type + "device-entry::error");
|
getClass().getSimpleName() + ", type =" + type + "device-entry::error");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void cleanup() {
|
private void cleanup() {
|
||||||
releaseBiometricWakeLock();
|
releaseBiometricWakeLock();
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.systemui.statusbar.phone;
|
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.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
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.AndroidTestingRunner;
|
||||||
import android.testing.TestableLooper.RunWithLooper;
|
import android.testing.TestableLooper.RunWithLooper;
|
||||||
import android.testing.TestableResources;
|
import android.testing.TestableResources;
|
||||||
|
import android.view.HapticFeedbackConstants;
|
||||||
|
import android.view.ViewRootImpl;
|
||||||
|
|
||||||
import com.android.internal.logging.MetricsLogger;
|
import com.android.internal.logging.MetricsLogger;
|
||||||
import com.android.internal.util.LatencyTracker;
|
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.SysuiTestCase;
|
||||||
import com.android.systemui.biometrics.AuthController;
|
import com.android.systemui.biometrics.AuthController;
|
||||||
import com.android.systemui.dump.DumpManager;
|
import com.android.systemui.dump.DumpManager;
|
||||||
|
import com.android.systemui.flags.FakeFeatureFlags;
|
||||||
import com.android.systemui.keyguard.KeyguardViewMediator;
|
import com.android.systemui.keyguard.KeyguardViewMediator;
|
||||||
import com.android.systemui.keyguard.ScreenLifecycle;
|
import com.android.systemui.keyguard.ScreenLifecycle;
|
||||||
import com.android.systemui.keyguard.WakefulnessLifecycle;
|
import com.android.systemui.keyguard.WakefulnessLifecycle;
|
||||||
@@ -118,8 +122,11 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
|
|||||||
private VibratorHelper mVibratorHelper;
|
private VibratorHelper mVibratorHelper;
|
||||||
@Mock
|
@Mock
|
||||||
private BiometricUnlockLogger mLogger;
|
private BiometricUnlockLogger mLogger;
|
||||||
|
@Mock
|
||||||
|
private ViewRootImpl mViewRootImpl;
|
||||||
private final FakeSystemClock mSystemClock = new FakeSystemClock();
|
private final FakeSystemClock mSystemClock = new FakeSystemClock();
|
||||||
private BiometricUnlockController mBiometricUnlockController;
|
private BiometricUnlockController mBiometricUnlockController;
|
||||||
|
private final FakeFeatureFlags mFeatureFlags = new FakeFeatureFlags();
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
@@ -142,11 +149,14 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
|
|||||||
mNotificationMediaManager, mWakefulnessLifecycle, mScreenLifecycle,
|
mNotificationMediaManager, mWakefulnessLifecycle, mScreenLifecycle,
|
||||||
mAuthController, mStatusBarStateController,
|
mAuthController, mStatusBarStateController,
|
||||||
mSessionTracker, mLatencyTracker, mScreenOffAnimationController, mVibratorHelper,
|
mSessionTracker, mLatencyTracker, mScreenOffAnimationController, mVibratorHelper,
|
||||||
mSystemClock
|
mSystemClock,
|
||||||
|
mFeatureFlags
|
||||||
);
|
);
|
||||||
mBiometricUnlockController.setKeyguardViewController(mStatusBarKeyguardViewManager);
|
mBiometricUnlockController.setKeyguardViewController(mStatusBarKeyguardViewManager);
|
||||||
mBiometricUnlockController.addListener(mBiometricUnlockEventsListener);
|
mBiometricUnlockController.addListener(mBiometricUnlockEventsListener);
|
||||||
when(mUpdateMonitor.getStrongAuthTracker()).thenReturn(mStrongAuthTracker);
|
when(mUpdateMonitor.getStrongAuthTracker()).thenReturn(mStrongAuthTracker);
|
||||||
|
when(mStatusBarKeyguardViewManager.getViewRootImpl()).thenReturn(mViewRootImpl);
|
||||||
|
mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -483,6 +493,31 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
|
|||||||
verify(mVibratorHelper).vibrateAuthSuccess(anyString());
|
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
|
@Test
|
||||||
public void onSideFingerprintSuccess_recentGestureWakeUp_playHaptic() {
|
public void onSideFingerprintSuccess_recentGestureWakeUp_playHaptic() {
|
||||||
// GIVEN side fingerprint enrolled, wakeup just happened
|
// GIVEN side fingerprint enrolled, wakeup just happened
|
||||||
@@ -502,6 +537,30 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
|
|||||||
verify(mVibratorHelper).vibrateAuthSuccess(anyString());
|
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
|
@Test
|
||||||
public void onSideFingerprintFail_alwaysPlaysHaptic() {
|
public void onSideFingerprintFail_alwaysPlaysHaptic() {
|
||||||
// GIVEN side fingerprint enrolled, last wake reason was recent power button
|
// GIVEN side fingerprint enrolled, last wake reason was recent power button
|
||||||
@@ -517,6 +576,26 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
|
|||||||
verify(mVibratorHelper).vibrateAuthError(anyString());
|
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
|
@Test
|
||||||
public void onFingerprintDetect_showBouncer() {
|
public void onFingerprintDetect_showBouncer() {
|
||||||
// WHEN fingerprint detect occurs
|
// WHEN fingerprint detect occurs
|
||||||
|
|||||||
Reference in New Issue
Block a user