diff options
| author | 2019-03-07 14:54:05 -0800 | |
|---|---|---|
| committer | 2019-03-07 15:00:27 -0800 | |
| commit | c94963fd907a87634eef534dc979fca70a7d8dba (patch) | |
| tree | 9a7629899ddda6dd76586aa648fd983998e34df6 | |
| parent | 92ed8d72c31ad40e613139d1f0c7c10c9842508d (diff) | |
Setting to bypass lock screen upon face unlock
Test: atest BiometricsUnlockControllerTest
Test: adb shell settings put secure face_unlock_dismisses_keyguard 0
Test: adb shell settings put secure face_unlock_dismisses_keyguard 1
Bug: 111414690
Change-Id: Id3b112644017bcacf2529717e1ae4b019b00a822
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; + } + } } |