summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/provider/Settings.java13
-rw-r--r--packages/SystemUI/res/values/config.xml3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java57
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java32
5 files changed, 99 insertions, 10 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index ecbd673a0981..2b9dff299b84 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -8011,6 +8011,16 @@ public final class Settings {
BOOLEAN_VALIDATOR;
/**
+ * Whether or not face unlock dismisses the keyguard.
+ * @hide
+ */
+ public static final String FACE_UNLOCK_DISMISSES_KEYGUARD =
+ "face_unlock_dismisses_keyguard";
+
+ private static final Validator FACE_UNLOCK_DISMISSES_KEYGUARD_VALIDATOR =
+ BOOLEAN_VALIDATOR;
+
+ /**
* Whether or not face unlock is allowed for apps (through BiometricPrompt).
* @hide
*/
@@ -8684,6 +8694,7 @@ public final class Settings {
NFC_PAYMENT_DEFAULT_COMPONENT,
AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
FACE_UNLOCK_KEYGUARD_ENABLED,
+ FACE_UNLOCK_DISMISSES_KEYGUARD,
FACE_UNLOCK_APP_ENABLED,
FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION,
ASSIST_GESTURE_ENABLED,
@@ -8845,6 +8856,8 @@ public final class Settings {
VALIDATORS.put(AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN_VALIDATOR);
VALIDATORS.put(FACE_UNLOCK_KEYGUARD_ENABLED, FACE_UNLOCK_KEYGUARD_ENABLED_VALIDATOR);
+ VALIDATORS.put(FACE_UNLOCK_DISMISSES_KEYGUARD,
+ FACE_UNLOCK_DISMISSES_KEYGUARD_VALIDATOR);
VALIDATORS.put(FACE_UNLOCK_APP_ENABLED, FACE_UNLOCK_APP_ENABLED_VALIDATOR);
VALIDATORS.put(FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION,
FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION_VALIDATOR);
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 1d566809b731..8835503e9bb9 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -40,6 +40,9 @@
<!-- Whether or not we show the number in the bar. -->
<bool name="config_statusBarShowNumber">false</bool>
+ <!-- If the lock screen should be dismissed after biometric auth. -->
+ <bool name="config_faceAuthDismissesKeyguard">false</bool>
+
<!-- Vibrator pattern for camera gesture launch. -->
<integer-array translatable="false" name="config_cameraLaunchGestureVibePattern">
<item>0</item>
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
index 2162ea70fe84..410eeae4e946 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
@@ -22,17 +22,21 @@ import android.os.Handler;
import android.os.PowerManager;
import android.os.SystemClock;
import android.os.Trace;
+import android.provider.Settings;
import android.util.Log;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.LatencyTracker;
import com.android.keyguard.KeyguardConstants;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.Dependency;
+import com.android.systemui.R;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.keyguard.ScreenLifecycle;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.statusbar.NotificationMediaManager;
+import com.android.systemui.tuner.TunerService;
import java.io.PrintWriter;
@@ -95,6 +99,17 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback {
*/
private static final float BIOMETRIC_COLLAPSE_SPEEDUP_FACTOR = 1.1f;
+ /**
+ * If face unlock dismisses the lock screen or keeps user on keyguard by default on this device.
+ */
+ private final boolean mFaceDismissesKeyguardByDefault;
+
+ /**
+ * If face unlock dismisses the lock screen or keeps user on keyguard for the current user.
+ */
+ @VisibleForTesting
+ protected boolean mFaceDismissesKeyguard;
+
private final NotificationMediaManager mMediaManager;
private final PowerManager mPowerManager;
private final Handler mHandler;
@@ -115,14 +130,42 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback {
private boolean mPendingShowBouncer;
private boolean mHasScreenTurnedOnSinceAuthenticating;
+ private final TunerService.Tunable mFaceDismissedKeyguardTunable = new TunerService.Tunable() {
+ @Override
+ public void onTuningChanged(String key, String newValue) {
+ int defaultValue = mFaceDismissesKeyguardByDefault ? 1 : 0;
+ mFaceDismissesKeyguard = Settings.Secure.getIntForUser(mContext.getContentResolver(),
+ Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD,
+ defaultValue, KeyguardUpdateMonitor.getCurrentUser()) != 0;
+ }
+ };
+
public BiometricUnlockController(Context context,
+ DozeScrimController dozeScrimController,
+ KeyguardViewMediator keyguardViewMediator,
+ ScrimController scrimController,
+ StatusBar statusBar,
+ UnlockMethodCache unlockMethodCache, Handler handler,
+ KeyguardUpdateMonitor keyguardUpdateMonitor,
+ TunerService tunerService) {
+ this(context, dozeScrimController, keyguardViewMediator, scrimController, statusBar,
+ unlockMethodCache, handler, keyguardUpdateMonitor, tunerService,
+ context.getResources()
+ .getInteger(com.android.internal.R.integer.config_wakeUpDelayDoze),
+ context.getResources().getBoolean(R.bool.config_faceAuthDismissesKeyguard));
+ }
+
+ @VisibleForTesting
+ protected BiometricUnlockController(Context context,
DozeScrimController dozeScrimController,
KeyguardViewMediator keyguardViewMediator,
ScrimController scrimController,
StatusBar statusBar,
UnlockMethodCache unlockMethodCache, Handler handler,
KeyguardUpdateMonitor keyguardUpdateMonitor,
- int wakeUpDelay) {
+ TunerService tunerService,
+ int wakeUpDelay,
+ boolean faceDismissesKeyguard) {
mContext = context;
mPowerManager = context.getSystemService(PowerManager.class);
mUpdateMonitor = keyguardUpdateMonitor;
@@ -138,6 +181,9 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback {
mUnlockMethodCache = unlockMethodCache;
mHandler = handler;
mWakeUpDelay = wakeUpDelay;
+ mFaceDismissesKeyguardByDefault = faceDismissesKeyguard;
+ tunerService.addTunable(mFaceDismissedKeyguardTunable,
+ Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD);
}
public void setStatusBarKeyguardViewManager(
@@ -344,27 +390,28 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback {
private int calculateMode(BiometricSourceType biometricSourceType) {
boolean unlockingAllowed = mUpdateMonitor.isUnlockingWithBiometricAllowed();
boolean deviceDreaming = mUpdateMonitor.isDreaming();
- boolean isFace = biometricSourceType == BiometricSourceType.FACE;
+ boolean faceStayingOnKeyguard = biometricSourceType == BiometricSourceType.FACE
+ && !mFaceDismissesKeyguard;
if (!mUpdateMonitor.isDeviceInteractive()) {
if (!mStatusBarKeyguardViewManager.isShowing()) {
return MODE_ONLY_WAKE;
} else if (mDozeScrimController.isPulsing() && unlockingAllowed) {
- return isFace ? MODE_NONE : MODE_WAKE_AND_UNLOCK_PULSING;
+ return faceStayingOnKeyguard ? MODE_NONE : MODE_WAKE_AND_UNLOCK_PULSING;
} else if (unlockingAllowed || !mUnlockMethodCache.isMethodSecure()) {
return MODE_WAKE_AND_UNLOCK;
} else {
return MODE_SHOW_BOUNCER;
}
}
- if (unlockingAllowed && deviceDreaming && !isFace) {
+ if (unlockingAllowed && deviceDreaming && !faceStayingOnKeyguard) {
return MODE_WAKE_AND_UNLOCK_FROM_DREAM;
}
if (mStatusBarKeyguardViewManager.isShowing()) {
if (mStatusBarKeyguardViewManager.isBouncerShowing() && unlockingAllowed) {
return MODE_DISMISS_BOUNCER;
} else if (unlockingAllowed) {
- return isFace ? MODE_ONLY_WAKE : MODE_UNLOCK;
+ return faceStayingOnKeyguard ? MODE_ONLY_WAKE : MODE_UNLOCK;
} else if (!mStatusBarKeyguardViewManager.isBouncerShowing()) {
return MODE_SHOW_BOUNCER;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 0ca4e730b8ec..183226507117 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -225,6 +225,7 @@ import com.android.systemui.statusbar.policy.UserInfoController;
import com.android.systemui.statusbar.policy.UserInfoControllerImpl;
import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.statusbar.policy.ZenModeController;
+import com.android.systemui.tuner.TunerService;
import com.android.systemui.util.InjectionInflationController;
import com.android.systemui.volume.VolumeComponent;
@@ -1208,8 +1209,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mBiometricUnlockController = new BiometricUnlockController(mContext,
mDozeScrimController, keyguardViewMediator,
mScrimController, this, UnlockMethodCache.getInstance(mContext),
- new Handler(), mKeyguardUpdateMonitor, mContext.getResources().getInteger(
- com.android.internal.R.integer.config_wakeUpDelayDoze));
+ new Handler(), mKeyguardUpdateMonitor, Dependency.get(TunerService.class));
mStatusBarKeyguardViewManager = keyguardViewMediator.registerStatusBar(this,
getBouncerContainer(), mNotificationPanel, mBiometricUnlockController);
mKeyguardIndicationController
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
index 7be4756c5a4d..057f752b5ad1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
@@ -36,6 +36,7 @@ import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.statusbar.NotificationMediaManager;
+import com.android.systemui.tuner.TunerService;
import org.junit.Before;
import org.junit.Test;
@@ -68,6 +69,8 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
private StatusBar mStatusBar;
@Mock
private UnlockMethodCache mUnlockMethodCache;
+ @Mock
+ private TunerService mTunerService;
private BiometricUnlockController mBiometricUnlockController;
@Before
@@ -79,9 +82,8 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
mDependency.injectTestDependency(NotificationMediaManager.class, mMediaManager);
mDependency.injectTestDependency(StatusBarWindowController.class,
mStatusBarWindowController);
- mBiometricUnlockController = new BiometricUnlockController(mContext, mDozeScrimController,
- mKeyguardViewMediator, mScrimController, mStatusBar, mUnlockMethodCache,
- new Handler(), mUpdateMonitor, 0 /* wakeUpDelay */);
+ mBiometricUnlockController = new TestableBiometricUnlockController(
+ false /* faceDismissesKeyguard */);
mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager);
}
@@ -136,6 +138,19 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
}
@Test
+ public void onBiometricAuthenticated_whenFace_dismissingKeyguard() {
+ mBiometricUnlockController = new TestableBiometricUnlockController(
+ true /* faceDismissesKeyguard */);
+ mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager);
+
+ when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true);
+ mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
+ BiometricSourceType.FACE);
+
+ verify(mStatusBarKeyguardViewManager).animateCollapsePanels(anyFloat());
+ }
+
+ @Test
public void onBiometricAuthenticated_whenFaceOnBouncer_dismissBouncer() {
when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true);
when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
@@ -156,4 +171,15 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
verify(mStatusBarKeyguardViewManager, never()).animateCollapsePanels(anyFloat());
}
+
+ private class TestableBiometricUnlockController extends BiometricUnlockController {
+
+ TestableBiometricUnlockController(boolean faceDismissesKeyguard) {
+ super(mContext, mDozeScrimController,
+ mKeyguardViewMediator, mScrimController, mStatusBar, mUnlockMethodCache,
+ new Handler(), mUpdateMonitor, mTunerService, 0 /* wakeUpDelay */,
+ faceDismissesKeyguard);
+ mFaceDismissesKeyguard = faceDismissesKeyguard;
+ }
+ }
}