diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java index 47ad0c17c4146..ffb5e810fb293 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java @@ -22,12 +22,15 @@ import static com.android.systemui.Dependency.LEAK_REPORT_EMAIL_NAME; import android.annotation.Nullable; import android.app.AlarmManager; import android.content.Context; +import android.os.Handler; +import android.os.Looper; import android.util.Log; import android.view.ViewGroup; import com.android.internal.colorextraction.ColorExtractor.GradientColors; import com.android.internal.util.function.TriConsumer; import com.android.internal.widget.LockPatternUtils; +import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.ViewMediatorCallback; import com.android.systemui.assist.AssistManager; import com.android.systemui.classifier.FalsingManager; @@ -125,7 +128,8 @@ public class SystemUIFactory { DismissCallbackRegistry dismissCallbackRegistry, KeyguardBouncer.BouncerExpansionCallback expansionCallback) { return new KeyguardBouncer(context, callback, lockPatternUtils, container, - dismissCallbackRegistry, FalsingManager.getInstance(context), expansionCallback); + dismissCallbackRegistry, FalsingManager.getInstance(context), expansionCallback, + KeyguardUpdateMonitor.getInstance(context), new Handler(Looper.getMainLooper())); } public ScrimController createScrimController(ScrimView scrimBehind, ScrimView scrimInFront, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java index b00d874b44931..3c2881d14f916 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java @@ -54,6 +54,7 @@ import java.io.PrintWriter; public class KeyguardBouncer { private static final String TAG = "KeyguardBouncer"; + static final long BOUNCER_FACE_DELAY = 800; static final float ALPHA_EXPANSION_THRESHOLD = 0.95f; static final float EXPANSION_HIDDEN = 1f; static final float EXPANSION_VISIBLE = 0f; @@ -66,6 +67,7 @@ public class KeyguardBouncer { private final DismissCallbackRegistry mDismissCallbackRegistry; private final Handler mHandler; private final BouncerExpansionCallback mExpansionCallback; + private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { @Override @@ -93,16 +95,18 @@ public class KeyguardBouncer { public KeyguardBouncer(Context context, ViewMediatorCallback callback, LockPatternUtils lockPatternUtils, ViewGroup container, DismissCallbackRegistry dismissCallbackRegistry, FalsingManager falsingManager, - BouncerExpansionCallback expansionCallback) { + BouncerExpansionCallback expansionCallback, + KeyguardUpdateMonitor keyguardUpdateMonitor, Handler handler) { mContext = context; mCallback = callback; mLockPatternUtils = lockPatternUtils; mContainer = container; - KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback); + mKeyguardUpdateMonitor = keyguardUpdateMonitor; mFalsingManager = falsingManager; mDismissCallbackRegistry = dismissCallbackRegistry; mExpansionCallback = expansionCallback; - mHandler = new Handler(); + mHandler = handler; + mKeyguardUpdateMonitor.registerCallback(mUpdateMonitorCallback); } public void show(boolean resetSecuritySelection) { @@ -164,7 +168,11 @@ public class KeyguardBouncer { // Split up the work over multiple frames. DejankUtils.removeCallbacks(mResetRunnable); - DejankUtils.postAfterTraversal(mShowRunnable); + if (mKeyguardUpdateMonitor.isFaceDetectionRunning()) { + mHandler.postDelayed(mShowRunnable, BOUNCER_FACE_DELAY); + } else { + DejankUtils.postAfterTraversal(mShowRunnable); + } mCallback.onBouncerVisiblityChanged(true /* shown */); mExpansionCallback.onStartingToShow(); @@ -266,6 +274,7 @@ public class KeyguardBouncer { private void cancelShowRunnable() { DejankUtils.removeCallbacks(mShowRunnable); + mHandler.removeCallbacks(mShowRunnable); mShowingSoon = false; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java index 575ff16b8ed34..8fe0c706b1eaa 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; @@ -31,6 +32,7 @@ import static org.mockito.Mockito.when; import android.content.res.ColorStateList; import android.graphics.Color; +import android.os.Handler; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.view.ViewGroup; @@ -42,6 +44,7 @@ import androidx.test.filters.SmallTest; import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardHostView; import com.android.keyguard.KeyguardSecurityModel; +import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.ViewMediatorCallback; import com.android.systemui.DejankUtils; import com.android.systemui.SysuiTestCase; @@ -53,6 +56,7 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -75,6 +79,10 @@ public class KeyguardBouncerTest extends SysuiTestCase { private ViewTreeObserver mViewTreeObserver; @Mock private KeyguardBouncer.BouncerExpansionCallback mExpansionCallback; + @Mock + private KeyguardUpdateMonitor mKeyguardUpdateMonitor; + @Mock + private Handler mHandler; private KeyguardBouncer mBouncer; @@ -88,7 +96,7 @@ public class KeyguardBouncerTest extends SysuiTestCase { when(mKeyguardHostView.getHeight()).thenReturn(500); mBouncer = new KeyguardBouncer(getContext(), mViewMediatorCallback, mLockPatternUtils, container, mDismissCallbackRegistry, mFalsingManager, - mExpansionCallback) { + mExpansionCallback, mKeyguardUpdateMonitor, mHandler) { @Override protected void inflateView() { super.inflateView(); @@ -366,4 +374,22 @@ public class KeyguardBouncerTest extends SysuiTestCase { when(mKeyguardHostView.hasDismissActions()).thenReturn(true); Assert.assertTrue("Action should exist", mBouncer.willDismissWithAction()); } + + @Test + public void testShow_delaysIfFaceAuthIsRunning() { + when(mKeyguardUpdateMonitor.isFaceDetectionRunning()).thenReturn(true); + mBouncer.show(true /* reset */); + + ArgumentCaptor showRunnable = ArgumentCaptor.forClass(Runnable.class); + verify(mHandler).postDelayed(showRunnable.capture(), + eq(KeyguardBouncer.BOUNCER_FACE_DELAY)); + + mBouncer.hide(false /* destroyView */); + verify(mHandler).removeCallbacks(eq(showRunnable.getValue())); + } + + @Test + public void testRegisterUpdateMonitorCallback() { + verify(mKeyguardUpdateMonitor).registerCallback(any()); + } }