diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index a41a49799c2d3..85bc8f7c70a2b 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -102,7 +102,6 @@ import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dump.DumpManager; -import com.android.systemui.flags.FeatureFlags; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.shared.system.TaskStackChangeListeners; @@ -323,7 +322,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab private boolean mLockIconPressed; private int mActiveMobileDataSubscription = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private final Executor mBackgroundExecutor; - private int mLockScreenMode; /** * Short delay before restarting fingerprint authentication after a successful try. This should @@ -1736,11 +1734,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab DumpManager dumpManager, RingerModeTracker ringerModeTracker, @Background Executor backgroundExecutor, + @Main Executor mainExecutor, StatusBarStateController statusBarStateController, LockPatternUtils lockPatternUtils, AuthController authController, TelephonyListenerManager telephonyListenerManager, - FeatureFlags featureFlags, InteractionJankMonitor interactionJankMonitor, LatencyTracker latencyTracker) { mContext = context; @@ -1966,6 +1964,17 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab mBiometricManager.registerEnabledOnKeyguardCallback(mBiometricEnabledCallback); } + // in case authenticators aren't registered yet at this point: + mAuthController.addCallback(new AuthController.Callback() { + @Override + public void onAllAuthenticatorsRegistered() { + } + + @Override + public void onEnrollmentsChanged() { + mainExecutor.execute(() -> updateBiometricListeningState()); + } + }); updateBiometricListeningState(); if (mFpm != null) { mFpm.addLockoutResetCallback(mFingerprintLockoutResetCallback); @@ -2043,7 +2052,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab /** * @return if udfps is available on this device. will return true even if the user hasn't - * enrolled udfps. + * enrolled udfps. This may be false if called before onAllAuthenticatorsRegistered. */ public boolean isUdfpsAvailable() { return mAuthController.getUdfpsProps() != null @@ -2092,7 +2101,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab return; } - // TODO: Add support for multiple fingerprint sensors, b/173730729 updateUdfpsEnrolled(getCurrentUser()); final boolean shouldListenForFingerprint = shouldListenForFingerprint(isUdfpsEnrolled()); final boolean runningOrRestarting = mFingerprintRunningState == BIOMETRIC_STATE_RUNNING diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java index 3c80a186a4a77..8a0b5b8704e6a 100644 --- a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java @@ -695,11 +695,20 @@ public class LockIconViewController extends ViewController impleme private final AuthController.Callback mAuthControllerCallback = new AuthController.Callback() { @Override public void onAllAuthenticatorsRegistered() { - // must be called from the main thread since it may update the views - mExecutor.execute(() -> { - updateIsUdfpsEnrolled(); - updateConfiguration(); - }); + updateUdfpsConfig(); + } + + @Override + public void onEnrollmentsChanged() { + updateUdfpsConfig(); } }; + + private void updateUdfpsConfig() { + // must be called from the main thread since it may update the views + mExecutor.execute(() -> { + updateIsUdfpsEnrolled(); + updateConfiguration(); + }); + } } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java index 5472d6b6c67f7..7215736330ed4 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java @@ -142,6 +142,10 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, mUdfpsEnrolledForUser.put(userId, hasEnrollments); } } + + for (Callback cb : mCallbacks) { + cb.onEnrollmentsChanged(); + } } }; @@ -844,5 +848,11 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, * registered before this call, this callback will never be triggered. */ void onAllAuthenticatorsRegistered(); + + /** + * Called when UDFPS enrollments have changed. This is called after boot and on changes to + * enrollment. + */ + void onEnrollmentsChanged(); } } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt index 8b04bf59658a6..ec17d4e5cd036 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt @@ -292,10 +292,16 @@ class AuthRippleController @Inject constructor( } } - private val authControllerCallback = AuthController.Callback { - updateSensorLocation() - updateUdfpsDependentParams() - } + private val authControllerCallback = + object : AuthController.Callback { + override fun onAllAuthenticatorsRegistered() { + updateSensorLocation() + updateUdfpsDependentParams() + } + + override fun onEnrollmentsChanged() { + } + } private fun updateUdfpsDependentParams() { authController.udfpsProps?.let { diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java index 8f1486b0c7cbb..908397bd775c9 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java @@ -107,6 +107,11 @@ public class DozeScreenState implements DozeMachine.Part { public void onAllAuthenticatorsRegistered() { updateUdfpsController(); } + + @Override + public void onEnrollmentsChanged() { + updateUdfpsController(); + } }); } } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index e53b450a895eb..1ee6f70ec7fc6 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -87,7 +87,6 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.biometrics.AuthController; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dump.DumpManager; -import com.android.systemui.flags.FeatureFlags; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.phone.KeyguardBypassController; @@ -170,8 +169,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { @Mock private TelephonyListenerManager mTelephonyListenerManager; @Mock - private FeatureFlags mFeatureFlags; - @Mock private InteractionJankMonitor mInteractionJankMonitor; @Mock private LatencyTracker mLatencyTracker; @@ -179,6 +176,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { private ArgumentCaptor mStatusBarStateListenerCaptor; // Direct executor private Executor mBackgroundExecutor = Runnable::run; + private Executor mMainExecutor = Runnable::run; private TestableLooper mTestableLooper; private TestableKeyguardUpdateMonitor mKeyguardUpdateMonitor; private TestableContext mSpiedContext; @@ -881,6 +879,25 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { orderVerify.verify(callback).onRingerModeChanged(AudioManager.RINGER_MODE_VIBRATE); } + @Test + public void testRegisterAuthControllerCallback() { + assertThat(mKeyguardUpdateMonitor.isUdfpsEnrolled()).isFalse(); + + // verify AuthController.Callback is added: + ArgumentCaptor captor = ArgumentCaptor.forClass( + AuthController.Callback.class); + verify(mAuthController).addCallback(captor.capture()); + AuthController.Callback callback = captor.getValue(); + + // WHEN udfps is now enrolled + when(mAuthController.isUdfpsEnrolled(anyInt())).thenReturn(true); + callback.onEnrollmentsChanged(); + + // THEN isUdfspEnrolled is TRUE + assertThat(mKeyguardUpdateMonitor.isUdfpsEnrolled()).isTrue(); + } + + @Test public void testStartUdfpsServiceBeginsOnKeyguard() { // GIVEN @@ -1060,9 +1077,9 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { super(context, TestableLooper.get(KeyguardUpdateMonitorTest.this).getLooper(), mBroadcastDispatcher, mDumpManager, - mRingerModeTracker, mBackgroundExecutor, + mRingerModeTracker, mBackgroundExecutor, mMainExecutor, mStatusBarStateController, mLockPatternUtils, - mAuthController, mTelephonyListenerManager, mFeatureFlags, + mAuthController, mTelephonyListenerManager, mInteractionJankMonitor, mLatencyTracker); setStrongAuthTracker(KeyguardUpdateMonitorTest.this.mStrongAuthTracker); }