diff options
| author | 2023-02-03 18:34:55 +0000 | |
|---|---|---|
| committer | 2023-02-03 18:34:55 +0000 | |
| commit | f9957304f9f64675ef0e0fa587724757b5e227b2 (patch) | |
| tree | be358328e605ce1012ea1b9ea0b27ce6e4f68424 | |
| parent | bf7ec45bc97244fa1696aa4c6cc56e32e116fb71 (diff) | |
| parent | 7c08fd4a9a9d59bf8cb9d87d8be53a55a79aaa65 (diff) | |
Merge "Some wake-ups can be considered unlock-intents" into tm-qpr-dev
11 files changed, 217 insertions, 90 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index ce4a7357cc4f..05c12972ee2a 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -9921,6 +9921,17 @@ public final class Settings { "active_unlock_on_unlock_intent_when_biometric_enrolled"; /** + * If active unlock triggers on unlock intents, then also request active unlock on + * these wake-up reasons. See PowerManager.WakeReason for value mappings. + * WakeReasons should be separated by a pipe. For example: "0|3" or "0". If this + * setting should be disabled, then this should be set to an empty string. A null value + * will use the system default value (WAKE_REASON_UNFOLD_DEVICE). + * @hide + */ + public static final String ACTIVE_UNLOCK_WAKEUPS_CONSIDERED_UNLOCK_INTENTS = + "active_unlock_wakeups_considered_unlock_intents"; + + /** * Whether the assist gesture should be enabled. * * @hide diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java index 211030a90c47..c537d96b4193 100644 --- a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java +++ b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java @@ -130,6 +130,7 @@ public class SecureSettings { Settings.Secure.ACTIVE_UNLOCK_ON_FACE_ERRORS, Settings.Secure.ACTIVE_UNLOCK_ON_FACE_ACQUIRE_INFO, Settings.Secure.ACTIVE_UNLOCK_ON_UNLOCK_INTENT_WHEN_BIOMETRIC_ENROLLED, + Settings.Secure.ACTIVE_UNLOCK_WAKEUPS_CONSIDERED_UNLOCK_INTENTS, Settings.Secure.VR_DISPLAY_MODE, Settings.Secure.NOTIFICATION_BADGING, Settings.Secure.NOTIFICATION_DISMISS_RTL, diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java index 0539f09e20d3..8a67a0d81677 100644 --- a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java +++ b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java @@ -189,6 +189,8 @@ public class SecureSettingsValidators { VALIDATORS.put(Secure.ACTIVE_UNLOCK_ON_FACE_ACQUIRE_INFO, ANY_STRING_VALIDATOR); VALIDATORS.put(Secure.ACTIVE_UNLOCK_ON_UNLOCK_INTENT_WHEN_BIOMETRIC_ENROLLED, ANY_STRING_VALIDATOR); + VALIDATORS.put(Secure.ACTIVE_UNLOCK_WAKEUPS_CONSIDERED_UNLOCK_INTENTS, + ANY_STRING_VALIDATOR); VALIDATORS.put(Secure.ASSIST_GESTURE_ENABLED, BOOLEAN_VALIDATOR); VALIDATORS.put(Secure.ASSIST_GESTURE_SILENCE_ALERTS_ENABLED, BOOLEAN_VALIDATOR); VALIDATORS.put(Secure.ASSIST_GESTURE_WAKE_ENABLED, BOOLEAN_VALIDATOR); diff --git a/packages/SystemUI/src/com/android/keyguard/ActiveUnlockConfig.kt b/packages/SystemUI/src/com/android/keyguard/ActiveUnlockConfig.kt index 38fa35453418..54ae84f97b17 100644 --- a/packages/SystemUI/src/com/android/keyguard/ActiveUnlockConfig.kt +++ b/packages/SystemUI/src/com/android/keyguard/ActiveUnlockConfig.kt @@ -16,18 +16,20 @@ package com.android.keyguard -import android.annotation.IntDef import android.content.ContentResolver import android.database.ContentObserver import android.hardware.biometrics.BiometricFaceConstants.FACE_ERROR_TIMEOUT import android.net.Uri import android.os.Handler +import android.os.PowerManager +import android.os.PowerManager.WAKE_REASON_UNFOLD_DEVICE import android.os.UserHandle import android.provider.Settings.Secure.ACTIVE_UNLOCK_ON_BIOMETRIC_FAIL import android.provider.Settings.Secure.ACTIVE_UNLOCK_ON_FACE_ACQUIRE_INFO import android.provider.Settings.Secure.ACTIVE_UNLOCK_ON_FACE_ERRORS import android.provider.Settings.Secure.ACTIVE_UNLOCK_ON_UNLOCK_INTENT import android.provider.Settings.Secure.ACTIVE_UNLOCK_ON_UNLOCK_INTENT_WHEN_BIOMETRIC_ENROLLED +import android.provider.Settings.Secure.ACTIVE_UNLOCK_WAKEUPS_CONSIDERED_UNLOCK_INTENTS import android.provider.Settings.Secure.ACTIVE_UNLOCK_ON_WAKE import android.util.Log import com.android.keyguard.KeyguardUpdateMonitor.getCurrentUser @@ -52,23 +54,26 @@ class ActiveUnlockConfig @Inject constructor( companion object { const val TAG = "ActiveUnlockConfig" - - const val BIOMETRIC_TYPE_NONE = 0 - const val BIOMETRIC_TYPE_ANY_FACE = 1 - const val BIOMETRIC_TYPE_ANY_FINGERPRINT = 2 - const val BIOMETRIC_TYPE_UNDER_DISPLAY_FINGERPRINT = 3 } - @Retention(AnnotationRetention.SOURCE) - @IntDef(BIOMETRIC_TYPE_NONE, BIOMETRIC_TYPE_ANY_FACE, BIOMETRIC_TYPE_ANY_FINGERPRINT, - BIOMETRIC_TYPE_UNDER_DISPLAY_FINGERPRINT) - annotation class BiometricType - /** * Indicates the origin for an active unlock request. */ - enum class ACTIVE_UNLOCK_REQUEST_ORIGIN { - WAKE, UNLOCK_INTENT, BIOMETRIC_FAIL, ASSISTANT + enum class ActiveUnlockRequestOrigin { + WAKE, + UNLOCK_INTENT, + BIOMETRIC_FAIL, + ASSISTANT, + } + + /** + * Biometric type options. + */ + enum class BiometricType(val intValue: Int) { + NONE(0), + ANY_FACE(1), + ANY_FINGERPRINT(2), + UNDER_DISPLAY_FINGERPRINT(3), } var keyguardUpdateMonitor: KeyguardUpdateMonitor? = null @@ -76,9 +81,10 @@ class ActiveUnlockConfig @Inject constructor( private var requestActiveUnlockOnUnlockIntent = false private var requestActiveUnlockOnBioFail = false - private var faceErrorsToTriggerBiometricFailOn = mutableSetOf(FACE_ERROR_TIMEOUT) + private var faceErrorsToTriggerBiometricFailOn = mutableSetOf<Int>() private var faceAcquireInfoToTriggerBiometricFailOn = mutableSetOf<Int>() - private var onUnlockIntentWhenBiometricEnrolled = mutableSetOf<Int>(BIOMETRIC_TYPE_NONE) + private var onUnlockIntentWhenBiometricEnrolled = mutableSetOf<Int>() + private var wakeupsConsideredUnlockIntents = mutableSetOf<Int>() private val settingsObserver = object : ContentObserver(handler) { private val wakeUri = secureSettings.getUriFor(ACTIVE_UNLOCK_ON_WAKE) @@ -89,16 +95,19 @@ class ActiveUnlockConfig @Inject constructor( secureSettings.getUriFor(ACTIVE_UNLOCK_ON_FACE_ACQUIRE_INFO) private val unlockIntentWhenBiometricEnrolledUri = secureSettings.getUriFor(ACTIVE_UNLOCK_ON_UNLOCK_INTENT_WHEN_BIOMETRIC_ENROLLED) + private val wakeupsConsideredUnlockIntentsUri = + secureSettings.getUriFor(ACTIVE_UNLOCK_WAKEUPS_CONSIDERED_UNLOCK_INTENTS) fun register() { registerUri( listOf( - wakeUri, - unlockIntentUri, - bioFailUri, - faceErrorsUri, - faceAcquireInfoUri, - unlockIntentWhenBiometricEnrolledUri + wakeUri, + unlockIntentUri, + bioFailUri, + faceErrorsUri, + faceAcquireInfoUri, + unlockIntentWhenBiometricEnrolledUri, + wakeupsConsideredUnlockIntentsUri, ) ) @@ -153,7 +162,7 @@ class ActiveUnlockConfig @Inject constructor( secureSettings.getStringForUser(ACTIVE_UNLOCK_ON_FACE_ACQUIRE_INFO, getCurrentUser()), faceAcquireInfoToTriggerBiometricFailOn, - setOf<Int>()) + emptySet()) } if (selfChange || uris.contains(unlockIntentWhenBiometricEnrolledUri)) { @@ -162,7 +171,16 @@ class ActiveUnlockConfig @Inject constructor( ACTIVE_UNLOCK_ON_UNLOCK_INTENT_WHEN_BIOMETRIC_ENROLLED, getCurrentUser()), onUnlockIntentWhenBiometricEnrolled, - setOf(BIOMETRIC_TYPE_NONE)) + setOf(BiometricType.NONE.intValue)) + } + + if (selfChange || uris.contains(wakeupsConsideredUnlockIntentsUri)) { + processStringArray( + secureSettings.getStringForUser( + ACTIVE_UNLOCK_WAKEUPS_CONSIDERED_UNLOCK_INTENTS, + getCurrentUser()), + wakeupsConsideredUnlockIntents, + setOf(WAKE_REASON_UNFOLD_DEVICE)) } } @@ -181,10 +199,12 @@ class ActiveUnlockConfig @Inject constructor( out.clear() stringSetting?.let { for (code: String in stringSetting.split("|")) { - try { - out.add(code.toInt()) - } catch (e: NumberFormatException) { - Log.e(TAG, "Passed an invalid setting=$code") + if (code.isNotEmpty()) { + try { + out.add(code.toInt()) + } catch (e: NumberFormatException) { + Log.e(TAG, "Passed an invalid setting=$code") + } } } } ?: out.addAll(default) @@ -221,22 +241,30 @@ class ActiveUnlockConfig @Inject constructor( } /** + * Whether the PowerManager wake reason is considered an unlock intent and should use origin + * [ActiveUnlockRequestOrigin.UNLOCK_INTENT] instead of [ActiveUnlockRequestOrigin.WAKE]. + */ + fun isWakeupConsideredUnlockIntent(pmWakeReason: Int): Boolean { + return wakeupsConsideredUnlockIntents.contains(pmWakeReason) + } + + /** * Whether to trigger active unlock based on where the request is coming from and * the current settings. */ - fun shouldAllowActiveUnlockFromOrigin(requestOrigin: ACTIVE_UNLOCK_REQUEST_ORIGIN): Boolean { + fun shouldAllowActiveUnlockFromOrigin(requestOrigin: ActiveUnlockRequestOrigin): Boolean { return when (requestOrigin) { - ACTIVE_UNLOCK_REQUEST_ORIGIN.WAKE -> requestActiveUnlockOnWakeup + ActiveUnlockRequestOrigin.WAKE -> requestActiveUnlockOnWakeup - ACTIVE_UNLOCK_REQUEST_ORIGIN.UNLOCK_INTENT -> + ActiveUnlockRequestOrigin.UNLOCK_INTENT -> requestActiveUnlockOnUnlockIntent || requestActiveUnlockOnWakeup || (shouldRequestActiveUnlockOnUnlockIntentFromBiometricEnrollment()) - ACTIVE_UNLOCK_REQUEST_ORIGIN.BIOMETRIC_FAIL -> + ActiveUnlockRequestOrigin.BIOMETRIC_FAIL -> requestActiveUnlockOnBioFail || requestActiveUnlockOnUnlockIntent || requestActiveUnlockOnWakeup - ACTIVE_UNLOCK_REQUEST_ORIGIN.ASSISTANT -> isActiveUnlockEnabled() + ActiveUnlockRequestOrigin.ASSISTANT -> isActiveUnlockEnabled() } } @@ -252,18 +280,18 @@ class ActiveUnlockConfig @Inject constructor( val udfpsEnrolled = it.isUdfpsEnrolled if (!anyFaceEnrolled && !anyFingerprintEnrolled) { - return onUnlockIntentWhenBiometricEnrolled.contains(BIOMETRIC_TYPE_NONE) + return onUnlockIntentWhenBiometricEnrolled.contains(BiometricType.NONE.intValue) } if (!anyFaceEnrolled && anyFingerprintEnrolled) { return onUnlockIntentWhenBiometricEnrolled.contains( - BIOMETRIC_TYPE_ANY_FINGERPRINT) || + BiometricType.ANY_FINGERPRINT.intValue) || (udfpsEnrolled && onUnlockIntentWhenBiometricEnrolled.contains( - BIOMETRIC_TYPE_UNDER_DISPLAY_FINGERPRINT)) + BiometricType.UNDER_DISPLAY_FINGERPRINT.intValue)) } if (!anyFingerprintEnrolled && anyFaceEnrolled) { - return onUnlockIntentWhenBiometricEnrolled.contains(BIOMETRIC_TYPE_ANY_FACE) + return onUnlockIntentWhenBiometricEnrolled.contains(BiometricType.ANY_FACE.intValue) } } @@ -275,11 +303,15 @@ class ActiveUnlockConfig @Inject constructor( pw.println(" requestActiveUnlockOnWakeup=$requestActiveUnlockOnWakeup") pw.println(" requestActiveUnlockOnUnlockIntent=$requestActiveUnlockOnUnlockIntent") pw.println(" requestActiveUnlockOnBioFail=$requestActiveUnlockOnBioFail") - pw.println(" requestActiveUnlockOnUnlockIntentWhenBiometricEnrolled=" + - "$onUnlockIntentWhenBiometricEnrolled") + pw.println(" requestActiveUnlockOnUnlockIntentWhenBiometricEnrolled=${ + onUnlockIntentWhenBiometricEnrolled.map { BiometricType.values()[it] } + }") pw.println(" requestActiveUnlockOnFaceError=$faceErrorsToTriggerBiometricFailOn") pw.println(" requestActiveUnlockOnFaceAcquireInfo=" + "$faceAcquireInfoToTriggerBiometricFailOn") + pw.println(" activeUnlockWakeupsConsideredUnlockIntents=${ + wakeupsConsideredUnlockIntents.map { PowerManager.wakeReasonToString(it) } + }") pw.println("Current state:") keyguardUpdateMonitor?.let { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java index 57bfe5421049..9fcacce311d1 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java @@ -237,7 +237,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard } if (mUpdateMonitor.isFaceEnrolled()) { mUpdateMonitor.requestActiveUnlock( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.UNLOCK_INTENT, + ActiveUnlockConfig.ActiveUnlockRequestOrigin.UNLOCK_INTENT, "swipeUpOnBouncer"); } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index c68f295f06ba..2455e79581de 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -1534,7 +1534,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab FACE_AUTH_UPDATED_ASSISTANT_VISIBILITY_CHANGED); if (mAssistantVisible) { requestActiveUnlock( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.ASSISTANT, + ActiveUnlockConfig.ActiveUnlockRequestOrigin.ASSISTANT, "assistant", false); } @@ -1664,7 +1664,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab @Override public void onAuthenticationFailed() { requestActiveUnlockDismissKeyguard( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.BIOMETRIC_FAIL, + ActiveUnlockConfig.ActiveUnlockRequestOrigin.BIOMETRIC_FAIL, "fingerprintFailure"); handleFingerprintAuthFailed(); } @@ -1733,7 +1733,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab : mPrimaryBouncerFullyShown ? "bouncer" : "udfpsFpDown"; requestActiveUnlock( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.BIOMETRIC_FAIL, + ActiveUnlockConfig.ActiveUnlockRequestOrigin.BIOMETRIC_FAIL, "faceFailure-" + reason); handleFaceAuthFailed(); @@ -1760,7 +1760,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab if (mActiveUnlockConfig.shouldRequestActiveUnlockOnFaceError(errMsgId)) { requestActiveUnlock( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.BIOMETRIC_FAIL, + ActiveUnlockConfig.ActiveUnlockRequestOrigin.BIOMETRIC_FAIL, "faceError-" + errMsgId); } } @@ -1772,7 +1772,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab if (mActiveUnlockConfig.shouldRequestActiveUnlockOnFaceAcquireInfo( acquireInfo)) { requestActiveUnlock( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.BIOMETRIC_FAIL, + ActiveUnlockConfig.ActiveUnlockRequestOrigin.BIOMETRIC_FAIL, "faceAcquireInfo-" + acquireInfo); } } @@ -1912,8 +1912,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab FACE_AUTH_UPDATED_STARTED_WAKING_UP.setExtraInfo(pmWakeReason); updateFaceListeningState(BIOMETRIC_ACTION_UPDATE, FACE_AUTH_UPDATED_STARTED_WAKING_UP); - requestActiveUnlock(ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.WAKE, "wakingUp - " - + PowerManager.wakeReasonToString(pmWakeReason)); + requestActiveUnlock( + mActiveUnlockConfig.isWakeupConsideredUnlockIntent(pmWakeReason) + ? ActiveUnlockConfig.ActiveUnlockRequestOrigin.UNLOCK_INTENT + : ActiveUnlockConfig.ActiveUnlockRequestOrigin.WAKE, + "wakingUp - " + PowerManager.wakeReasonToString(pmWakeReason)); } else { mLogger.logSkipUpdateFaceListeningOnWakeup(pmWakeReason); } @@ -2477,7 +2480,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab mAuthInterruptActive = active; updateFaceListeningState(BIOMETRIC_ACTION_UPDATE, FACE_AUTH_TRIGGERED_ON_REACH_GESTURE_ON_AOD); - requestActiveUnlock(ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.WAKE, "onReach"); + requestActiveUnlock(ActiveUnlockConfig.ActiveUnlockRequestOrigin.WAKE, "onReach"); } /** @@ -2547,7 +2550,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab * Attempts to trigger active unlock from trust agent. */ private void requestActiveUnlock( - @NonNull ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN requestOrigin, + @NonNull ActiveUnlockConfig.ActiveUnlockRequestOrigin requestOrigin, String reason, boolean dismissKeyguard ) { @@ -2558,7 +2561,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab final boolean allowRequest = mActiveUnlockConfig.shouldAllowActiveUnlockFromOrigin(requestOrigin); - if (requestOrigin == ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.WAKE + if (requestOrigin == ActiveUnlockConfig.ActiveUnlockRequestOrigin.WAKE && !allowRequest && mActiveUnlockConfig.isActiveUnlockEnabled()) { // instead of requesting the active unlock, initiate the unlock initiateActiveUnlock(reason); @@ -2577,7 +2580,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab * Only dismisses the keyguard under certain conditions. */ public void requestActiveUnlock( - @NonNull ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN requestOrigin, + @NonNull ActiveUnlockConfig.ActiveUnlockRequestOrigin requestOrigin, String extraReason ) { final boolean canFaceBypass = isFaceEnrolled() && mKeyguardBypassController != null @@ -2594,7 +2597,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab * Attempts to trigger active unlock from trust agent with a request to dismiss the keyguard. */ public void requestActiveUnlockDismissKeyguard( - @NonNull ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN requestOrigin, + @NonNull ActiveUnlockConfig.ActiveUnlockRequestOrigin requestOrigin, String extraReason ) { requestActiveUnlock( @@ -2611,7 +2614,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab updateFaceListeningState(BIOMETRIC_ACTION_START, FACE_AUTH_TRIGGERED_ALTERNATE_BIOMETRIC_BOUNCER_SHOWN); requestActiveUnlock( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.UNLOCK_INTENT, + ActiveUnlockConfig.ActiveUnlockRequestOrigin.UNLOCK_INTENT, "udfpsBouncer"); } } @@ -3416,7 +3419,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab if (wasPrimaryBouncerFullyShown != mPrimaryBouncerFullyShown) { if (mPrimaryBouncerFullyShown) { requestActiveUnlock( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.UNLOCK_INTENT, + ActiveUnlockConfig.ActiveUnlockRequestOrigin.UNLOCK_INTENT, "bouncerFullyShown"); } for (int i = 0; i < mCallbacks.size(); i++) { diff --git a/packages/SystemUI/src/com/android/keyguard/logging/KeyguardUpdateMonitorLogger.kt b/packages/SystemUI/src/com/android/keyguard/logging/KeyguardUpdateMonitorLogger.kt index 201a1d950748..c414c088529c 100644 --- a/packages/SystemUI/src/com/android/keyguard/logging/KeyguardUpdateMonitorLogger.kt +++ b/packages/SystemUI/src/com/android/keyguard/logging/KeyguardUpdateMonitorLogger.kt @@ -372,7 +372,7 @@ class KeyguardUpdateMonitorLogger @Inject constructor( } fun logUserRequestedUnlock( - requestOrigin: ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN, + requestOrigin: ActiveUnlockConfig.ActiveUnlockRequestOrigin, reason: String?, dismissKeyguard: Boolean ) { diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index 6c04eb7c4400..995aa49008e7 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -4125,7 +4125,7 @@ public final class NotificationPanelViewController implements Dumpable { if (didFaceAuthRun) { mUpdateMonitor.requestActiveUnlock( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.UNLOCK_INTENT, + ActiveUnlockConfig.ActiveUnlockRequestOrigin.UNLOCK_INTENT, "lockScreenEmptySpaceTap"); } else { mLockscreenGestureLogger.write(MetricsEvent.ACTION_LS_HINT, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt index 4550cb2987ea..8ee2c6f2c399 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt @@ -76,7 +76,7 @@ class KeyguardLiftController @Inject constructor( FaceAuthApiRequestReason.PICK_UP_GESTURE_TRIGGERED ) keyguardUpdateMonitor.requestActiveUnlock( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.WAKE, + ActiveUnlockConfig.ActiveUnlockRequestOrigin.WAKE, "KeyguardLiftController") } } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/ActiveUnlockConfigTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/ActiveUnlockConfigTest.kt index 39cc34bb7e26..e8d50ca4bc76 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/ActiveUnlockConfigTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/ActiveUnlockConfigTest.kt @@ -21,6 +21,8 @@ import android.database.ContentObserver import android.hardware.biometrics.BiometricFaceConstants import android.net.Uri import android.os.Handler +import android.os.PowerManager +import android.os.PowerManager.WAKE_REASON_BIOMETRIC import android.os.UserHandle import android.provider.Settings import androidx.test.filters.SmallTest @@ -48,6 +50,8 @@ class ActiveUnlockConfigTest : SysuiTestCase() { private val fakeFaceErrorsUri = Uri.Builder().appendPath("face-errors").build() private val fakeFaceAcquiredUri = Uri.Builder().appendPath("face-acquired").build() private val fakeUnlockIntentBioEnroll = Uri.Builder().appendPath("unlock-intent-bio").build() + private val fakeWakeupsConsideredUnlockIntents = + Uri.Builder().appendPath("wakeups-considered-unlock-intent").build() @Mock private lateinit var secureSettings: SecureSettings @@ -82,6 +86,9 @@ class ActiveUnlockConfigTest : SysuiTestCase() { `when`(secureSettings.getUriFor( Settings.Secure.ACTIVE_UNLOCK_ON_UNLOCK_INTENT_WHEN_BIOMETRIC_ENROLLED)) .thenReturn(fakeUnlockIntentBioEnroll) + `when`(secureSettings.getUriFor( + Settings.Secure.ACTIVE_UNLOCK_WAKEUPS_CONSIDERED_UNLOCK_INTENTS)) + .thenReturn(fakeWakeupsConsideredUnlockIntents) activeUnlockConfig = ActiveUnlockConfig( handler, @@ -92,18 +99,18 @@ class ActiveUnlockConfigTest : SysuiTestCase() { } @Test - fun testRegsitersForSettingsChanges() { + fun registersForSettingsChanges() { verifyRegisterSettingObserver() } @Test - fun testOnWakeupSettingChanged() { + fun onWakeupSettingChanged() { verifyRegisterSettingObserver() // GIVEN no active unlock settings enabled assertFalse( activeUnlockConfig.shouldAllowActiveUnlockFromOrigin( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.WAKE) + ActiveUnlockConfig.ActiveUnlockRequestOrigin.WAKE) ) // WHEN unlock on wake is allowed @@ -114,26 +121,26 @@ class ActiveUnlockConfigTest : SysuiTestCase() { // THEN active unlock triggers allowed on: wake, unlock-intent, and biometric failure assertTrue( activeUnlockConfig.shouldAllowActiveUnlockFromOrigin( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.WAKE) + ActiveUnlockConfig.ActiveUnlockRequestOrigin.WAKE) ) assertTrue( activeUnlockConfig.shouldAllowActiveUnlockFromOrigin( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.UNLOCK_INTENT) + ActiveUnlockConfig.ActiveUnlockRequestOrigin.UNLOCK_INTENT) ) assertTrue( activeUnlockConfig.shouldAllowActiveUnlockFromOrigin( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.BIOMETRIC_FAIL) + ActiveUnlockConfig.ActiveUnlockRequestOrigin.BIOMETRIC_FAIL) ) } @Test - fun testOnUnlockIntentSettingChanged() { + fun onUnlockIntentSettingChanged() { verifyRegisterSettingObserver() // GIVEN no active unlock settings enabled assertFalse( activeUnlockConfig.shouldAllowActiveUnlockFromOrigin( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.UNLOCK_INTENT) + ActiveUnlockConfig.ActiveUnlockRequestOrigin.UNLOCK_INTENT) ) // WHEN unlock on biometric failed is allowed @@ -143,15 +150,15 @@ class ActiveUnlockConfigTest : SysuiTestCase() { // THEN active unlock triggers allowed on: biometric failure ONLY assertFalse(activeUnlockConfig.shouldAllowActiveUnlockFromOrigin( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.WAKE)) + ActiveUnlockConfig.ActiveUnlockRequestOrigin.WAKE)) assertTrue(activeUnlockConfig.shouldAllowActiveUnlockFromOrigin( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.UNLOCK_INTENT)) + ActiveUnlockConfig.ActiveUnlockRequestOrigin.UNLOCK_INTENT)) assertTrue(activeUnlockConfig.shouldAllowActiveUnlockFromOrigin( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.BIOMETRIC_FAIL)) + ActiveUnlockConfig.ActiveUnlockRequestOrigin.BIOMETRIC_FAIL)) } @Test - fun testOnBioFailSettingChanged() { + fun onBioFailSettingChanged() { verifyRegisterSettingObserver() // GIVEN no active unlock settings enabled and triggering unlock intent on biometric @@ -161,7 +168,7 @@ class ActiveUnlockConfigTest : SysuiTestCase() { 0)).thenReturn("") updateSetting(fakeUnlockIntentBioEnroll) assertFalse(activeUnlockConfig.shouldAllowActiveUnlockFromOrigin( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.BIOMETRIC_FAIL)) + ActiveUnlockConfig.ActiveUnlockRequestOrigin.BIOMETRIC_FAIL)) // WHEN unlock on biometric failed is allowed `when`(secureSettings.getIntForUser(Settings.Secure.ACTIVE_UNLOCK_ON_BIOMETRIC_FAIL, @@ -170,15 +177,15 @@ class ActiveUnlockConfigTest : SysuiTestCase() { // THEN active unlock triggers allowed on: biometric failure ONLY assertFalse(activeUnlockConfig.shouldAllowActiveUnlockFromOrigin( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.WAKE)) + ActiveUnlockConfig.ActiveUnlockRequestOrigin.WAKE)) assertFalse(activeUnlockConfig.shouldAllowActiveUnlockFromOrigin( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.UNLOCK_INTENT)) + ActiveUnlockConfig.ActiveUnlockRequestOrigin.UNLOCK_INTENT)) assertTrue(activeUnlockConfig.shouldAllowActiveUnlockFromOrigin( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.BIOMETRIC_FAIL)) + ActiveUnlockConfig.ActiveUnlockRequestOrigin.BIOMETRIC_FAIL)) } @Test - fun testFaceErrorSettingsChanged() { + fun faceErrorSettingsChanged() { verifyRegisterSettingObserver() // GIVEN unlock on biometric fail @@ -200,7 +207,7 @@ class ActiveUnlockConfigTest : SysuiTestCase() { } @Test - fun testFaceAcquiredSettingsChanged() { + fun faceAcquiredSettingsChanged() { verifyRegisterSettingObserver() // GIVEN unlock on biometric fail @@ -228,7 +235,7 @@ class ActiveUnlockConfigTest : SysuiTestCase() { } @Test - fun testTriggerOnUnlockIntentWhenBiometricEnrolledNone() { + fun triggerOnUnlockIntentWhenBiometricEnrolledNone() { verifyRegisterSettingObserver() // GIVEN unlock on biometric fail @@ -244,16 +251,16 @@ class ActiveUnlockConfigTest : SysuiTestCase() { // WHEN unlock intent is allowed when NO biometrics are enrolled (0) `when`(secureSettings.getStringForUser( Settings.Secure.ACTIVE_UNLOCK_ON_UNLOCK_INTENT_WHEN_BIOMETRIC_ENROLLED, - 0)).thenReturn("${ActiveUnlockConfig.BIOMETRIC_TYPE_NONE}") + 0)).thenReturn("${ActiveUnlockConfig.BiometricType.NONE.intValue}") updateSetting(fakeUnlockIntentBioEnroll) // THEN active unlock triggers allowed on unlock intent assertTrue(activeUnlockConfig.shouldAllowActiveUnlockFromOrigin( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.UNLOCK_INTENT)) + ActiveUnlockConfig.ActiveUnlockRequestOrigin.UNLOCK_INTENT)) } @Test - fun testTriggerOnUnlockIntentWhenBiometricEnrolledFingerprintOrFaceOnly() { + fun triggerOnUnlockIntentWhenBiometricEnrolledFingerprintOrFaceOnly() { verifyRegisterSettingObserver() // GIVEN unlock on biometric fail @@ -263,7 +270,7 @@ class ActiveUnlockConfigTest : SysuiTestCase() { // GIVEN fingerprint and face are both enrolled activeUnlockConfig.keyguardUpdateMonitor = keyguardUpdateMonitor - `when`(keyguardUpdateMonitor.isFaceEnrolled()).thenReturn(true) + `when`(keyguardUpdateMonitor.isFaceEnrolled).thenReturn(true) `when`(keyguardUpdateMonitor.getCachedIsUnlockWithFingerprintPossible(0)).thenReturn(true) // WHEN unlock intent is allowed when ONLY fingerprint is enrolled or NO biometircs @@ -271,29 +278,99 @@ class ActiveUnlockConfigTest : SysuiTestCase() { `when`(secureSettings.getStringForUser( Settings.Secure.ACTIVE_UNLOCK_ON_UNLOCK_INTENT_WHEN_BIOMETRIC_ENROLLED, 0)).thenReturn( - "${ActiveUnlockConfig.BIOMETRIC_TYPE_ANY_FACE}" + - "|${ActiveUnlockConfig.BIOMETRIC_TYPE_ANY_FINGERPRINT}") + "${ActiveUnlockConfig.BiometricType.ANY_FACE.intValue}" + + "|${ActiveUnlockConfig.BiometricType.ANY_FINGERPRINT.intValue}") updateSetting(fakeUnlockIntentBioEnroll) // THEN active unlock triggers NOT allowed on unlock intent assertFalse(activeUnlockConfig.shouldAllowActiveUnlockFromOrigin( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.UNLOCK_INTENT)) + ActiveUnlockConfig.ActiveUnlockRequestOrigin.UNLOCK_INTENT)) // WHEN fingerprint ONLY enrolled - `when`(keyguardUpdateMonitor.isFaceEnrolled()).thenReturn(false) + `when`(keyguardUpdateMonitor.isFaceEnrolled).thenReturn(false) `when`(keyguardUpdateMonitor.getCachedIsUnlockWithFingerprintPossible(0)).thenReturn(true) // THEN active unlock triggers allowed on unlock intent assertTrue(activeUnlockConfig.shouldAllowActiveUnlockFromOrigin( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.UNLOCK_INTENT)) + ActiveUnlockConfig.ActiveUnlockRequestOrigin.UNLOCK_INTENT)) // WHEN face ONLY enrolled - `when`(keyguardUpdateMonitor.isFaceEnrolled()).thenReturn(true) + `when`(keyguardUpdateMonitor.isFaceEnrolled).thenReturn(true) `when`(keyguardUpdateMonitor.getCachedIsUnlockWithFingerprintPossible(0)).thenReturn(false) // THEN active unlock triggers allowed on unlock intent assertTrue(activeUnlockConfig.shouldAllowActiveUnlockFromOrigin( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.UNLOCK_INTENT)) + ActiveUnlockConfig.ActiveUnlockRequestOrigin.UNLOCK_INTENT)) + } + + @Test + fun isWakeupConsideredUnlockIntent_singleValue() { + verifyRegisterSettingObserver() + + // GIVEN lift is considered an unlock intent + `when`(secureSettings.getStringForUser( + Settings.Secure.ACTIVE_UNLOCK_WAKEUPS_CONSIDERED_UNLOCK_INTENTS, + 0)).thenReturn(PowerManager.WAKE_REASON_LIFT.toString()) + updateSetting(fakeWakeupsConsideredUnlockIntents) + + // THEN only WAKE_REASON_LIFT is considered an unlock intent + for (wakeReason in 0..WAKE_REASON_BIOMETRIC) { + if (wakeReason == PowerManager.WAKE_REASON_LIFT) { + assertTrue(activeUnlockConfig.isWakeupConsideredUnlockIntent(wakeReason)) + } else { + assertFalse(activeUnlockConfig.isWakeupConsideredUnlockIntent(wakeReason)) + } + } + } + + @Test + fun isWakeupConsideredUnlockIntent_multiValue() { + verifyRegisterSettingObserver() + + // GIVEN lift and tap are considered an unlock intent + `when`(secureSettings.getStringForUser( + Settings.Secure.ACTIVE_UNLOCK_WAKEUPS_CONSIDERED_UNLOCK_INTENTS, + 0)).thenReturn( + PowerManager.WAKE_REASON_LIFT.toString() + + "|" + + PowerManager.WAKE_REASON_TAP.toString() + ) + updateSetting(fakeWakeupsConsideredUnlockIntents) + + // THEN WAKE_REASON_LIFT and WAKE_REASON TAP are considered an unlock intent + for (wakeReason in 0..WAKE_REASON_BIOMETRIC) { + if (wakeReason == PowerManager.WAKE_REASON_LIFT || + wakeReason == PowerManager.WAKE_REASON_TAP) { + assertTrue(activeUnlockConfig.isWakeupConsideredUnlockIntent(wakeReason)) + } else { + assertFalse(activeUnlockConfig.isWakeupConsideredUnlockIntent(wakeReason)) + } + } + assertTrue(activeUnlockConfig.isWakeupConsideredUnlockIntent(PowerManager.WAKE_REASON_LIFT)) + assertTrue(activeUnlockConfig.isWakeupConsideredUnlockIntent(PowerManager.WAKE_REASON_TAP)) + assertFalse(activeUnlockConfig.isWakeupConsideredUnlockIntent( + PowerManager.WAKE_REASON_UNFOLD_DEVICE)) + } + + @Test + fun isWakeupConsideredUnlockIntent_emptyValues() { + verifyRegisterSettingObserver() + + // GIVEN lift and tap are considered an unlock intent + `when`(secureSettings.getStringForUser( + Settings.Secure.ACTIVE_UNLOCK_WAKEUPS_CONSIDERED_UNLOCK_INTENTS, + 0)).thenReturn(" ") + updateSetting(fakeWakeupsConsideredUnlockIntents) + + // THEN no wake up gestures are considered an unlock intent + for (wakeReason in 0..WAKE_REASON_BIOMETRIC) { + assertFalse(activeUnlockConfig.isWakeupConsideredUnlockIntent(wakeReason)) + } + assertFalse(activeUnlockConfig.isWakeupConsideredUnlockIntent( + PowerManager.WAKE_REASON_LIFT)) + assertFalse(activeUnlockConfig.isWakeupConsideredUnlockIntent(PowerManager.WAKE_REASON_TAP)) + assertFalse(activeUnlockConfig.isWakeupConsideredUnlockIntent( + PowerManager.WAKE_REASON_UNFOLD_DEVICE)) } private fun updateSetting(uri: Uri) { @@ -312,6 +389,7 @@ class ActiveUnlockConfigTest : SysuiTestCase() { verifyRegisterSettingObserver(fakeFaceErrorsUri) verifyRegisterSettingObserver(fakeFaceAcquiredUri) verifyRegisterSettingObserver(fakeUnlockIntentBioEnroll) + verifyRegisterSettingObserver(fakeWakeupsConsideredUnlockIntents) } private fun verifyRegisterSettingObserver(uri: Uri) { diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index d1650b776052..e85df569612d 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -2183,7 +2183,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { // GIVEN active unlock triggers on biometric failures when(mActiveUnlockConfig.shouldAllowActiveUnlockFromOrigin( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.BIOMETRIC_FAIL)) + ActiveUnlockConfig.ActiveUnlockRequestOrigin.BIOMETRIC_FAIL)) .thenReturn(true); // WHEN fingerprint fails @@ -2206,7 +2206,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { // GIVEN active unlock triggers on biometric failures when(mActiveUnlockConfig.shouldAllowActiveUnlockFromOrigin( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.BIOMETRIC_FAIL)) + ActiveUnlockConfig.ActiveUnlockRequestOrigin.BIOMETRIC_FAIL)) .thenReturn(true); // WHEN face fails & bypass is not allowed @@ -2230,7 +2230,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { // GIVEN active unlock triggers on biometric failures when(mActiveUnlockConfig.shouldAllowActiveUnlockFromOrigin( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.BIOMETRIC_FAIL)) + ActiveUnlockConfig.ActiveUnlockRequestOrigin.BIOMETRIC_FAIL)) .thenReturn(true); // WHEN face fails & bypass is not allowed @@ -2252,7 +2252,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { // GIVEN active unlock triggers on biometric failures when(mActiveUnlockConfig.shouldAllowActiveUnlockFromOrigin( - ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.BIOMETRIC_FAIL)) + ActiveUnlockConfig.ActiveUnlockRequestOrigin.BIOMETRIC_FAIL)) .thenReturn(true); // WHEN face fails & on the bouncer |