Interstitial frame for grace period of face auth
Delay bouncer for a few millis if face auth is happening to avoid overlaping animations. Fixes: 130327140 Test: manual Test: atest KeyguardBouncerTest Change-Id: I6873605ba3e8d54af86325d81b10cc6aec131cf2
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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<Runnable> 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());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user