Ensure light reveal scrim is fully revealed once we're unlocked.

We've had some difficult to reproduce bugs where the
lightreveal remains visible in the shade while
unlocked. These are likely related to bugs in the
keyguard state code, which we intend to refactor in
U.

In the meantime, the scrim should never be anything
but fully revealed once the keyguard going away
transition ends.

Fixes: 229778554
Test: manually force all lightreveal animations to end at 0.5f, then unlock
Test: can't add test to centralsurfacestest because start() is not called
Change-Id: I6bd65738635a2f966227014a4920f8e8367b91e6
This commit is contained in:
Josh Tsuji
2022-05-02 16:09:07 -04:00
parent 9750b0ca46
commit 0671bf432c
2 changed files with 29 additions and 1 deletions

View File

@@ -80,6 +80,7 @@ class AuthRippleController @Inject constructor(
@VisibleForTesting
internal var startLightRevealScrimOnKeyguardFadingAway = false
var lightRevealScrimAnimator: ValueAnimator? = null
var fingerprintSensorLocation: PointF? = null
private var faceSensorLocation: PointF? = null
private var circleReveal: LightRevealEffect? = null
@@ -163,7 +164,8 @@ class AuthRippleController @Inject constructor(
if (keyguardStateController.isKeyguardFadingAway) {
val lightRevealScrim = centralSurfaces.lightRevealScrim
if (startLightRevealScrimOnKeyguardFadingAway && lightRevealScrim != null) {
ValueAnimator.ofFloat(.1f, 1f).apply {
lightRevealScrimAnimator?.cancel()
lightRevealScrimAnimator = ValueAnimator.ofFloat(.1f, 1f).apply {
interpolator = Interpolators.LINEAR_OUT_SLOW_IN
duration = RIPPLE_ANIMATION_DURATION
startDelay = keyguardStateController.keyguardFadingAwayDelay
@@ -183,6 +185,8 @@ class AuthRippleController @Inject constructor(
if (lightRevealScrim.revealEffect == circleReveal) {
lightRevealScrim.revealEffect = LiftReveal
}
lightRevealScrimAnimator = null
}
})
start()
@@ -192,6 +196,13 @@ class AuthRippleController @Inject constructor(
}
}
/**
* Whether we're animating the light reveal scrim from a call to [onKeyguardFadingAwayChanged].
*/
fun isAnimatingLightRevealScrim(): Boolean {
return lightRevealScrimAnimator?.isRunning ?: false
}
override fun onStartedGoingToSleep() {
// reset the light reveal start in case we were pending an unlock
startLightRevealScrimOnKeyguardFadingAway = false

View File

@@ -1022,6 +1022,23 @@ public class CentralSurfacesImpl extends CoreStartable implements
public void onUnlockedChanged() {
logStateToEventlog();
}
@Override
public void onKeyguardGoingAwayChanged() {
// The light reveal scrim should always be fully revealed by the time the keyguard
// is done going away. Double check that this is true.
if (!mKeyguardStateController.isKeyguardGoingAway()) {
if (mLightRevealScrim.getRevealAmount() != 1f) {
Log.e(TAG, "Keyguard is done going away, but someone left the light reveal "
+ "scrim at reveal amount: " + mLightRevealScrim.getRevealAmount());
}
// If the auth ripple is still playing, let it finish.
if (!mAuthRippleController.isAnimatingLightRevealScrim()) {
mLightRevealScrim.setRevealAmount(1f);
}
}
}
});
startKeyguard();