From 6951d3df6c0605fe29a3b3c600a2f837aa978029 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Mon, 10 Jun 2019 14:07:13 -0700 Subject: [PATCH] Cancel authentication when secure camera is launched on Keyguard To decrease potential latency in starting the secure camera, rather than waiting for keyguard to become occluded and canceling authentication, we pre-emptively cancel face auth on keyguard when double tap is activated. This saves hundreds of ms. Fixes: 134613755 Test: With added logging, observed that cancel is now invoked immediately when double tap for camera is triggered. Change-Id: I3740c55fb608cd1f8aa228768389f192cf18d557 --- .../android/keyguard/KeyguardUpdateMonitor.java | 17 ++++++++++++++++- .../systemui/statusbar/phone/StatusBar.java | 6 ++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 3c119a622b664..cdb72162407b1 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -212,6 +212,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private boolean mHasLockscreenWallpaper; private boolean mAssistantVisible; private boolean mKeyguardOccluded; + private boolean mSecureCameraLaunched; @VisibleForTesting protected boolean mTelephonyCapable; @@ -522,6 +523,14 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { updateBiometricListeningState(); } + /** + * Invoked when the secure camera is launched. + */ + public void onCameraLaunched() { + mSecureCameraLaunched = true; + updateBiometricListeningState(); + } + /** * @return a cached version of DreamManager.isDreaming() */ @@ -1654,7 +1663,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { return (mBouncer || mAuthInterruptActive || awakeKeyguard || shouldListenForFaceAssistant()) && !mSwitchingUser && !getUserCanSkipBouncer(user) && !isFaceDisabled(user) && !mKeyguardGoingAway && mFaceSettingEnabledForUser && !mLockIconPressed - && mUserManager.isUserUnlocked(user) && mIsPrimaryUser; + && mUserManager.isUserUnlocked(user) && mIsPrimaryUser + && !mSecureCameraLaunched; } /** @@ -2102,6 +2112,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { checkIsHandlerThread(); Log.d(TAG, "onKeyguardVisibilityChanged(" + showing + ")"); mKeyguardIsVisible = showing; + + if (showing) { + mSecureCameraLaunched = false; + } + for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { 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 382d694280947..97ab833572706 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -3770,6 +3770,12 @@ public class StatusBar extends SystemUI implements DemoMode, "com.android.systemui:CAMERA_GESTURE"); } vibrateForCameraGesture(); + + if (source == StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP) { + Log.v(TAG, "Camera launch"); + mKeyguardUpdateMonitor.onCameraLaunched(); + } + if (!mStatusBarKeyguardViewManager.isShowing()) { startActivityDismissingKeyguard(KeyguardBottomAreaView.INSECURE_CAMERA_INTENT, false /* onlyProvisioned */, true /* dismissShade */,