diff options
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; +        } +    }  } |