Merge "Update light reveal + udfps icon vis" into sc-dev

This commit is contained in:
TreeHugger Robot
2021-04-05 18:28:21 +00:00
committed by Android (Google) Code Review
10 changed files with 150 additions and 56 deletions

View File

@@ -32,9 +32,10 @@ import android.widget.FrameLayout;
* - optionally can override dozeTimeTick to adjust views for burn-in mitigation * - optionally can override dozeTimeTick to adjust views for burn-in mitigation
*/ */
abstract class UdfpsAnimationView extends FrameLayout { abstract class UdfpsAnimationView extends FrameLayout {
// mAlpha takes into consideration the status bar expansion amount to fade out icon when
// the status bar is expanded
private int mAlpha; private int mAlpha;
private boolean mPauseAuth; boolean mPauseAuth;
public UdfpsAnimationView(Context context, @Nullable AttributeSet attrs) { public UdfpsAnimationView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs); super(context, attrs);
@@ -75,7 +76,7 @@ abstract class UdfpsAnimationView extends FrameLayout {
getDrawable().setAlpha(calculateAlpha()); getDrawable().setAlpha(calculateAlpha());
} }
protected final int calculateAlpha() { int calculateAlpha() {
return mPauseAuth ? mAlpha : 255; return mPauseAuth ? mAlpha : 255;
} }

View File

@@ -16,10 +16,6 @@
package com.android.systemui.biometrics; package com.android.systemui.biometrics;
import static com.android.systemui.statusbar.StatusBarState.FULLSCREEN_USER_SWITCHER;
import static com.android.systemui.statusbar.StatusBarState.KEYGUARD;
import static com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.graphics.PointF; import android.graphics.PointF;
import android.graphics.RectF; import android.graphics.RectF;
@@ -68,18 +64,13 @@ abstract class UdfpsAnimationViewController<T extends UdfpsAnimationView>
@Override @Override
protected void onViewAttached() { protected void onViewAttached() {
mStatusBarStateController.addCallback(mStateListener);
mStateListener.onStateChanged(mStatusBarStateController.getState());
mStatusBar.addExpansionChangedListener(mStatusBarExpansionChangedListener); mStatusBar.addExpansionChangedListener(mStatusBarExpansionChangedListener);
mDumpManger.registerDumpable(getDumpTag(), this); mDumpManger.registerDumpable(getDumpTag(), this);
} }
@Override @Override
protected void onViewDetached() { protected void onViewDetached() {
mStatusBarStateController.removeCallback(mStateListener);
mStatusBar.removeExpansionChangedListener(mStatusBarExpansionChangedListener); mStatusBar.removeExpansionChangedListener(mStatusBarExpansionChangedListener);
mDumpManger.unregisterDumpable(getDumpTag()); mDumpManger.unregisterDumpable(getDumpTag());
} }
@@ -106,9 +97,7 @@ abstract class UdfpsAnimationViewController<T extends UdfpsAnimationView>
* authentication. * authentication.
*/ */
boolean shouldPauseAuth() { boolean shouldPauseAuth() {
return (mNotificationShadeExpanded && mStatusBarState != KEYGUARD) return mNotificationShadeExpanded;
|| mStatusBarState == SHADE_LOCKED
|| mStatusBarState == FULLSCREEN_USER_SWITCHER;
} }
/** /**
@@ -188,13 +177,4 @@ abstract class UdfpsAnimationViewController<T extends UdfpsAnimationView>
updatePauseAuth(); updatePauseAuth();
} }
}; };
private final StatusBarStateController.StateListener mStateListener =
new StatusBarStateController.StateListener() {
@Override
public void onStateChanged(int newState) {
mStatusBarState = newState;
updatePauseAuth();
}
};
} }

View File

@@ -52,6 +52,7 @@ import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.doze.DozeReceiver; import com.android.systemui.doze.DozeReceiver;
import com.android.systemui.dump.DumpManager; import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
@@ -90,6 +91,7 @@ public class UdfpsController implements DozeReceiver, HbmCallback {
@NonNull private final DumpManager mDumpManager; @NonNull private final DumpManager mDumpManager;
@NonNull private final AuthRippleController mAuthRippleController; @NonNull private final AuthRippleController mAuthRippleController;
@NonNull private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; @NonNull private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@NonNull private final KeyguardViewMediator mKeyguardViewMediator;
// Currently the UdfpsController supports a single UDFPS sensor. If devices have multiple // Currently the UdfpsController supports a single UDFPS sensor. If devices have multiple
// sensors, this, in addition to a lot of the code here, will be updated. // sensors, this, in addition to a lot of the code here, will be updated.
@VisibleForTesting final FingerprintSensorPropertiesInternal mSensorProps; @VisibleForTesting final FingerprintSensorPropertiesInternal mSensorProps;
@@ -310,7 +312,8 @@ public class UdfpsController implements DozeReceiver, HbmCallback {
@NonNull StatusBarKeyguardViewManager statusBarKeyguardViewManager, @NonNull StatusBarKeyguardViewManager statusBarKeyguardViewManager,
@NonNull DumpManager dumpManager, @NonNull DumpManager dumpManager,
@NonNull AuthRippleController authRippleController, @NonNull AuthRippleController authRippleController,
@NonNull KeyguardUpdateMonitor keyguardUpdateMonitor) { @NonNull KeyguardUpdateMonitor keyguardUpdateMonitor,
@NonNull KeyguardViewMediator keyguardViewMediator) {
mContext = context; mContext = context;
mInflater = inflater; mInflater = inflater;
// The fingerprint manager is queried for UDFPS before this class is constructed, so the // The fingerprint manager is queried for UDFPS before this class is constructed, so the
@@ -324,6 +327,7 @@ public class UdfpsController implements DozeReceiver, HbmCallback {
mDumpManager = dumpManager; mDumpManager = dumpManager;
mAuthRippleController = authRippleController; mAuthRippleController = authRippleController;
mKeyguardUpdateMonitor = keyguardUpdateMonitor; mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mKeyguardViewMediator = keyguardViewMediator;
mSensorProps = findFirstUdfps(); mSensorProps = findFirstUdfps();
// At least one UDFPS sensor exists // At least one UDFPS sensor exists
@@ -491,7 +495,8 @@ public class UdfpsController implements DozeReceiver, HbmCallback {
mKeyguardViewManager, mKeyguardViewManager,
mKeyguardUpdateMonitor, mKeyguardUpdateMonitor,
mFgExecutor, mFgExecutor,
mDumpManager mDumpManager,
mKeyguardViewMediator
); );
case IUdfpsOverlayController.REASON_AUTH_BP: case IUdfpsOverlayController.REASON_AUTH_BP:
// note: empty controller, currently shows no visual affordance // note: empty controller, currently shows no visual affordance

View File

@@ -97,6 +97,11 @@ public class UdfpsKeyguardView extends UdfpsAnimationView {
} }
} }
@Override
int calculateAlpha() {
return mPauseAuth ? 0 : 255;
}
void onDozeAmountChanged(float linear, float eased) { void onDozeAmountChanged(float linear, float eased) {
mFingerprintDrawable.onDozeAmountChanged(linear, eased); mFingerprintDrawable.onDozeAmountChanged(linear, eased);
} }
@@ -153,6 +158,10 @@ public class UdfpsKeyguardView extends UdfpsAnimationView {
return mStatusBarState == StatusBarState.SHADE_LOCKED; return mStatusBarState == StatusBarState.SHADE_LOCKED;
} }
boolean isHome() {
return mStatusBarState == StatusBarState.SHADE;
}
/** /**
* Animates out the bg protection circle behind the fp icon to unhighlight the icon. * Animates out the bg protection circle behind the fp icon to unhighlight the icon.
*/ */

View File

@@ -16,6 +16,8 @@
package com.android.systemui.biometrics; package com.android.systemui.biometrics;
import static com.android.systemui.statusbar.StatusBarState.KEYGUARD;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.hardware.biometrics.BiometricSourceType; import android.hardware.biometrics.BiometricSourceType;
@@ -24,7 +26,9 @@ import androidx.annotation.Nullable;
import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.dump.DumpManager; import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.util.concurrency.DelayableExecutor; import com.android.systemui.util.concurrency.DelayableExecutor;
@@ -45,12 +49,15 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
@NonNull private final StatusBarKeyguardViewManager mKeyguardViewManager; @NonNull private final StatusBarKeyguardViewManager mKeyguardViewManager;
@NonNull private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; @NonNull private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@NonNull private final DelayableExecutor mExecutor; @NonNull private final DelayableExecutor mExecutor;
@NonNull private final KeyguardViewMediator mKeyguardViewMediator;
@Nullable private Runnable mCancelRunnable; @Nullable private Runnable mCancelRunnable;
private boolean mShowBouncer; private boolean mShowBouncer;
private boolean mQsExpanded; private boolean mQsExpanded;
private boolean mFaceDetectRunning; private boolean mFaceDetectRunning;
private boolean mHintShown; private boolean mHintShown;
private boolean mTransitioningFromHome;
private int mStatusBarState;
protected UdfpsKeyguardViewController( protected UdfpsKeyguardViewController(
@NonNull UdfpsKeyguardView view, @NonNull UdfpsKeyguardView view,
@@ -59,11 +66,13 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
@NonNull StatusBarKeyguardViewManager statusBarKeyguardViewManager, @NonNull StatusBarKeyguardViewManager statusBarKeyguardViewManager,
@NonNull KeyguardUpdateMonitor keyguardUpdateMonitor, @NonNull KeyguardUpdateMonitor keyguardUpdateMonitor,
@NonNull DelayableExecutor mainDelayableExecutor, @NonNull DelayableExecutor mainDelayableExecutor,
@NonNull DumpManager dumpManager) { @NonNull DumpManager dumpManager,
@NonNull KeyguardViewMediator keyguardViewMediator) {
super(view, statusBarStateController, statusBar, dumpManager); super(view, statusBarStateController, statusBar, dumpManager);
mKeyguardViewManager = statusBarKeyguardViewManager; mKeyguardViewManager = statusBarKeyguardViewManager;
mKeyguardUpdateMonitor = keyguardUpdateMonitor; mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mExecutor = mainDelayableExecutor; mExecutor = mainDelayableExecutor;
mKeyguardViewMediator = keyguardViewMediator;
} }
@Override @Override
@@ -94,6 +103,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
mStatusBarStateController.removeCallback(mStateListener); mStatusBarStateController.removeCallback(mStateListener);
mAlternateAuthInterceptor.hideAlternateAuthBouncer(); mAlternateAuthInterceptor.hideAlternateAuthBouncer();
mKeyguardViewManager.setAlternateAuthInterceptor(null); mKeyguardViewManager.setAlternateAuthInterceptor(null);
mTransitioningFromHome = false;
if (mCancelRunnable != null) { if (mCancelRunnable != null) {
mCancelRunnable.run(); mCancelRunnable.run();
@@ -106,17 +116,18 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
super.dump(fd, pw, args); super.dump(fd, pw, args);
pw.println("mShowBouncer=" + mShowBouncer); pw.println("mShowBouncer=" + mShowBouncer);
pw.println("mFaceDetectRunning=" + mFaceDetectRunning); pw.println("mFaceDetectRunning=" + mFaceDetectRunning);
pw.println("mTransitioningFromHomeToKeyguard=" + mTransitioningFromHome);
} }
/** /**
* Overrides non-bouncer show logic in shouldPauseAuth to still auth. * Overrides non-bouncer show logic in shouldPauseAuth to still auth.
*/ */
private void showBouncer(boolean forceShow) { private void showBouncer(boolean show) {
if (mShowBouncer == forceShow) { if (mShowBouncer == show) {
return; return;
} }
mShowBouncer = forceShow; mShowBouncer = show;
updatePauseAuth(); updatePauseAuth();
if (mShowBouncer) { if (mShowBouncer) {
mView.animateUdfpsBouncer(); mView.animateUdfpsBouncer();
@@ -128,18 +139,26 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
/** /**
* Returns true if the fingerprint manager is running but we want to temporarily pause * Returns true if the fingerprint manager is running but we want to temporarily pause
* authentication. On the keyguard, we may want to show udfps when the shade * authentication. On the keyguard, we may want to show udfps when the shade
* is expanded, so this can be overridden with the forceShow method. * is expanded, so this can be overridden with the showBouncer method.
*/ */
public boolean shouldPauseAuth() { public boolean shouldPauseAuth() {
if (mShowBouncer) { if (mShowBouncer) {
return false; return false;
} }
if (mStatusBarState != KEYGUARD) {
return true;
}
if (mTransitioningFromHome && mKeyguardViewMediator.isAnimatingScreenOff()) {
return true;
}
if (mQsExpanded) { if (mQsExpanded) {
return true; return true;
} }
return super.shouldPauseAuth(); return false;
} }
private void cancelDelayedHint() { private void cancelDelayedHint() {
@@ -176,12 +195,25 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
new StatusBarStateController.StateListener() { new StatusBarStateController.StateListener() {
@Override @Override
public void onDozeAmountChanged(float linear, float eased) { public void onDozeAmountChanged(float linear, float eased) {
mView.onDozeAmountChanged(linear, eased);
if (linear != 0) showBouncer(false); if (linear != 0) showBouncer(false);
mView.onDozeAmountChanged(linear, eased);
if (linear == 1f) {
// transition has finished
mTransitioningFromHome = false;
}
updatePauseAuth();
}
@Override
public void onStatePreChange(int oldState, int newState) {
mTransitioningFromHome = oldState == StatusBarState.SHADE
&& newState == StatusBarState.KEYGUARD;
updatePauseAuth();
} }
@Override @Override
public void onStateChanged(int statusBarState) { public void onStateChanged(int statusBarState) {
mStatusBarState = statusBarState;
mView.setStatusBarState(statusBarState); mView.setStatusBarState(statusBarState);
} }
}; };

View File

@@ -239,6 +239,7 @@ import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler; import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
import com.android.systemui.statusbar.policy.UserInfoControllerImpl; import com.android.systemui.statusbar.policy.UserInfoControllerImpl;
import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.volume.VolumeComponent; import com.android.systemui.volume.VolumeComponent;
import com.android.systemui.wmshell.BubblesManager; import com.android.systemui.wmshell.BubblesManager;
import com.android.wm.shell.bubbles.Bubbles; import com.android.wm.shell.bubbles.Bubbles;
@@ -791,6 +792,7 @@ public class StatusBar extends SystemUI implements DemoMode,
BrightnessSlider.Factory brightnessSliderFactory, BrightnessSlider.Factory brightnessSliderFactory,
WiredChargingRippleController chargingRippleAnimationController, WiredChargingRippleController chargingRippleAnimationController,
OngoingCallController ongoingCallController, OngoingCallController ongoingCallController,
TunerService tunerService,
FeatureFlags featureFlags) { FeatureFlags featureFlags) {
super(context); super(context);
mNotificationsController = notificationsController; mNotificationsController = notificationsController;
@@ -873,6 +875,15 @@ public class StatusBar extends SystemUI implements DemoMode,
mOngoingCallController = ongoingCallController; mOngoingCallController = ongoingCallController;
mFeatureFlags = featureFlags; mFeatureFlags = featureFlags;
tunerService.addTunable(
(key, newValue) -> {
if (key.equals(Settings.Secure.DOZE_ALWAYS_ON)) {
updateLightRevealScrimVisibility();
}
},
Settings.Secure.DOZE_ALWAYS_ON
);
mExpansionChangedListeners = new ArrayList<>(); mExpansionChangedListeners = new ArrayList<>();
mBubbleExpandListener = mBubbleExpandListener =
@@ -1216,15 +1227,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mLightRevealScrim = mNotificationShadeWindowView.findViewById(R.id.light_reveal_scrim); mLightRevealScrim = mNotificationShadeWindowView.findViewById(R.id.light_reveal_scrim);
mChargingRippleAnimationController.setViewHost(mNotificationShadeWindowView); mChargingRippleAnimationController.setViewHost(mNotificationShadeWindowView);
updateLightRevealScrimVisibility();
if (mFeatureFlags.useNewLockscreenAnimations()
&& (mDozeParameters.getAlwaysOn() || mDozeParameters.isQuickPickupEnabled())) {
mLightRevealScrim.setVisibility(View.VISIBLE);
mLightRevealScrim.setRevealEffect(LiftReveal.INSTANCE);
} else {
mLightRevealScrim.setVisibility(View.GONE);
}
mNotificationPanelViewController.initDependencies( mNotificationPanelViewController.initDependencies(
this, this,
@@ -4654,4 +4657,19 @@ public class StatusBar extends SystemUI implements DemoMode,
public void removeExpansionChangedListener(@NonNull ExpansionChangedListener listener) { public void removeExpansionChangedListener(@NonNull ExpansionChangedListener listener) {
mExpansionChangedListeners.remove(listener); mExpansionChangedListeners.remove(listener);
} }
private void updateLightRevealScrimVisibility() {
if (mLightRevealScrim == null) {
// status bar may not be inflated yet
return;
}
if (mFeatureFlags.useNewLockscreenAnimations()
&& (mDozeParameters.getAlwaysOn() || mDozeParameters.isQuickPickupEnabled())) {
mLightRevealScrim.setVisibility(View.VISIBLE);
mLightRevealScrim.setRevealEffect(LiftReveal.INSTANCE);
} else {
mLightRevealScrim.setVisibility(View.GONE);
}
}
} }

View File

@@ -100,6 +100,7 @@ import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler; import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
import com.android.systemui.statusbar.policy.UserInfoControllerImpl; import com.android.systemui.statusbar.policy.UserInfoControllerImpl;
import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.volume.VolumeComponent; import com.android.systemui.volume.VolumeComponent;
import com.android.systemui.wmshell.BubblesManager; import com.android.systemui.wmshell.BubblesManager;
import com.android.wm.shell.bubbles.Bubbles; import com.android.wm.shell.bubbles.Bubbles;
@@ -208,6 +209,7 @@ public interface StatusBarPhoneModule {
BrightnessSlider.Factory brightnessSliderFactory, BrightnessSlider.Factory brightnessSliderFactory,
WiredChargingRippleController chargingRippleAnimationController, WiredChargingRippleController chargingRippleAnimationController,
OngoingCallController ongoingCallController, OngoingCallController ongoingCallController,
TunerService tunerService,
FeatureFlags featureFlags) { FeatureFlags featureFlags) {
return new StatusBar( return new StatusBar(
context, context,
@@ -291,6 +293,7 @@ public interface StatusBarPhoneModule {
brightnessSliderFactory, brightnessSliderFactory,
chargingRippleAnimationController, chargingRippleAnimationController,
ongoingCallController, ongoingCallController,
tunerService,
featureFlags); featureFlags);
} }
} }

View File

@@ -47,6 +47,7 @@ import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.dump.DumpManager; import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
@@ -103,6 +104,8 @@ public class UdfpsControllerTest extends SysuiTestCase {
@Mock @Mock
private KeyguardUpdateMonitor mKeyguardUpdateMonitor; private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@Mock @Mock
private KeyguardViewMediator mKeyguardViewMediator;
@Mock
private IUdfpsOverlayControllerCallback mUdfpsOverlayControllerCallback; private IUdfpsOverlayControllerCallback mUdfpsOverlayControllerCallback;
private FakeExecutor mFgExecutor; private FakeExecutor mFgExecutor;
@@ -155,7 +158,8 @@ public class UdfpsControllerTest extends SysuiTestCase {
mStatusBarKeyguardViewManager, mStatusBarKeyguardViewManager,
mDumpManager, mDumpManager,
mAuthRippleController, mAuthRippleController,
mKeyguardUpdateMonitor); mKeyguardUpdateMonitor,
mKeyguardViewMediator);
verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture()); verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture());
mOverlayController = mOverlayCaptor.getValue(); mOverlayController = mOverlayCaptor.getValue();

View File

@@ -18,7 +18,7 @@ package com.android.systemui.biometrics;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -30,6 +30,7 @@ import androidx.test.filters.SmallTest;
import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.dump.DumpManager; import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBar;
@@ -44,7 +45,6 @@ import org.mockito.Captor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import java.util.List;
@SmallTest @SmallTest
@RunWith(AndroidTestingRunner.class) @RunWith(AndroidTestingRunner.class)
@@ -65,12 +65,13 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
private DelayableExecutor mExecutor; private DelayableExecutor mExecutor;
@Mock @Mock
private KeyguardUpdateMonitor mKeyguardUpdateMonitor; private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@Mock
private KeyguardViewMediator mKeyguardViewMediator;
private UdfpsKeyguardViewController mController; private UdfpsKeyguardViewController mController;
// Capture listeners so that they can be used to send events // Capture listeners so that they can be used to send events
@Captor private ArgumentCaptor<StatusBarStateController.StateListener> mStateListenerCaptor; @Captor private ArgumentCaptor<StatusBarStateController.StateListener> mStateListenerCaptor;
private StatusBarStateController.StateListener mParentStatusBarStateListener;
private StatusBarStateController.StateListener mStatusBarStateListener; private StatusBarStateController.StateListener mStatusBarStateListener;
@Captor private ArgumentCaptor<StatusBar.ExpansionChangedListener> mExpansionListenerCaptor; @Captor private ArgumentCaptor<StatusBar.ExpansionChangedListener> mExpansionListenerCaptor;
@@ -83,6 +84,7 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
when(mKeyguardViewMediator.isAnimatingScreenOff()).thenReturn(false);
mController = new UdfpsKeyguardViewController( mController = new UdfpsKeyguardViewController(
mView, mView,
mStatusBarStateController, mStatusBarStateController,
@@ -90,7 +92,8 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
mStatusBarKeyguardViewManager, mStatusBarKeyguardViewManager,
mKeyguardUpdateMonitor, mKeyguardUpdateMonitor,
mExecutor, mExecutor,
mDumpManager); mDumpManager,
mKeyguardViewMediator);
} }
@Test @Test
@@ -108,7 +111,7 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
@Test @Test
public void testViewControllerQueriesSBStateOnAttached() { public void testViewControllerQueriesSBStateOnAttached() {
mController.onViewAttached(); mController.onViewAttached();
verify(mStatusBarStateController, times(2)).getState(); verify(mStatusBarStateController).getState();
verify(mStatusBarStateController).getDozeAmount(); verify(mStatusBarStateController).getDozeAmount();
final float dozeAmount = .88f; final float dozeAmount = .88f;
@@ -117,7 +120,7 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
captureStatusBarStateListeners(); captureStatusBarStateListeners();
mController.onViewAttached(); mController.onViewAttached();
verify(mView).setPauseAuth(true); verify(mView, atLeast(1)).setPauseAuth(true);
verify(mView).onDozeAmountChanged(dozeAmount, dozeAmount); verify(mView).onDozeAmountChanged(dozeAmount, dozeAmount);
} }
@@ -128,7 +131,6 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
captureExpansionListener(); captureExpansionListener();
mController.onViewDetached(); mController.onViewDetached();
verify(mStatusBarStateController).removeCallback(mParentStatusBarStateListener);
verify(mStatusBarStateController).removeCallback(mStatusBarStateListener); verify(mStatusBarStateController).removeCallback(mStatusBarStateListener);
verify(mStatusBar).removeExpansionChangedListener(mExpansionListener); verify(mStatusBar).removeExpansionChangedListener(mExpansionListener);
} }
@@ -167,6 +169,47 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
assertTrue(mController.shouldPauseAuth()); assertTrue(mController.shouldPauseAuth());
} }
@Test
public void testShouldPauseAuthOnShade() {
mController.onViewAttached();
captureStatusBarStateListeners();
captureExpansionListener();
// WHEN not on keyguard yet (shade = home)
sendStatusBarStateChanged(StatusBarState.SHADE);
// THEN pause auth
assertTrue(mController.shouldPauseAuth());
}
@Test
public void testShouldPauseAuthAnimatingScreenOffFromShade() {
mController.onViewAttached();
captureStatusBarStateListeners();
captureExpansionListener();
// WHEN transitioning from home/shade => keyguard + animating screen off
mStatusBarStateListener.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD);
when(mKeyguardViewMediator.isAnimatingScreenOff()).thenReturn(true);
// THEN pause auth
assertTrue(mController.shouldPauseAuth());
}
@Test
public void testDoNotPauseAuthAnimatingScreenOffFromLS() {
mController.onViewAttached();
captureStatusBarStateListeners();
captureExpansionListener();
// WHEN animating screen off transition from LS => AOD
sendStatusBarStateChanged(StatusBarState.KEYGUARD);
when(mKeyguardViewMediator.isAnimatingScreenOff()).thenReturn(true);
// THEN don't pause auth
assertFalse(mController.shouldPauseAuth());
}
@Test @Test
public void testOverrideShouldPauseAuthOnShadeLocked() { public void testOverrideShouldPauseAuthOnShadeLocked() {
mController.onViewAttached(); mController.onViewAttached();
@@ -203,15 +246,11 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
private void sendStatusBarStateChanged(int statusBarState) { private void sendStatusBarStateChanged(int statusBarState) {
mStatusBarStateListener.onStateChanged(statusBarState); mStatusBarStateListener.onStateChanged(statusBarState);
mParentStatusBarStateListener.onStateChanged(statusBarState);
} }
private void captureStatusBarStateListeners() { private void captureStatusBarStateListeners() {
verify(mStatusBarStateController, times(2)).addCallback(mStateListenerCaptor.capture()); verify(mStatusBarStateController).addCallback(mStateListenerCaptor.capture());
List<StatusBarStateController.StateListener> stateListeners = mStatusBarStateListener = mStateListenerCaptor.getValue();
mStateListenerCaptor.getAllValues();
mParentStatusBarStateListener = stateListeners.get(0);
mStatusBarStateListener = stateListeners.get(1);
} }
private void captureExpansionListener() { private void captureExpansionListener() {

View File

@@ -143,6 +143,7 @@ import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler; import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
import com.android.systemui.statusbar.policy.UserInfoControllerImpl; import com.android.systemui.statusbar.policy.UserInfoControllerImpl;
import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.time.FakeSystemClock; import com.android.systemui.util.time.FakeSystemClock;
import com.android.systemui.volume.VolumeComponent; import com.android.systemui.volume.VolumeComponent;
@@ -265,6 +266,7 @@ public class StatusBarTest extends SysuiTestCase {
@Mock private BrightnessSlider.Factory mBrightnessSliderFactory; @Mock private BrightnessSlider.Factory mBrightnessSliderFactory;
@Mock private WiredChargingRippleController mWiredChargingRippleController; @Mock private WiredChargingRippleController mWiredChargingRippleController;
@Mock private OngoingCallController mOngoingCallController; @Mock private OngoingCallController mOngoingCallController;
@Mock private TunerService mTunerService;
@Mock private FeatureFlags mFeatureFlags; @Mock private FeatureFlags mFeatureFlags;
private ShadeController mShadeController; private ShadeController mShadeController;
private FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock()); private FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock());
@@ -430,6 +432,7 @@ public class StatusBarTest extends SysuiTestCase {
mBrightnessSliderFactory, mBrightnessSliderFactory,
mWiredChargingRippleController, mWiredChargingRippleController,
mOngoingCallController, mOngoingCallController,
mTunerService,
mFeatureFlags); mFeatureFlags);
when(mNotificationShadeWindowView.findViewById(R.id.lock_icon_container)).thenReturn( when(mNotificationShadeWindowView.findViewById(R.id.lock_icon_container)).thenReturn(