From e32d485a5f5d103e6053746c18341c195381c402 Mon Sep 17 00:00:00 2001 From: Beverly Date: Fri, 6 May 2022 20:00:48 +0000 Subject: [PATCH] Hide UDFPS background on transition Home => AOD There are two transitions that end up on AoD: 1. Lock screen => AoD 2. Home => AoD We need to track these two transitions separately. * When the device transitions from LS => AoD, the icon has a circle background protection and shows and full (not dashed) icon. * When the device transitions from Home => AoD, the icon can immediately start appearing at its AoD location, showing the AoD-dashed UDFPS icon, without any bg protection. Fixes: 229047979 Test: atest UdfpsKeyguardViewControllerTest Test: enable AoD & enroll UDFPS, press power button from HOME or app Test: enabled AoD & enroll UDFPS, screen timeout from HOME or app TesT: enable AoD & enroll UDFPS, pull down shade on HOME then press power button Change-Id: I10d54121f9da51bd41a5256f82c520935829f1a7 Change-Id: Ib6d82b484075eab8687ecb4c63babb335d34d163 --- .../biometrics/UdfpsKeyguardView.java | 46 ++++++++++++------- .../UdfpsKeyguardViewController.java | 5 +- .../UdfpsKeyguardViewControllerTest.java | 6 ++- 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java index 9139699af26a6..f28fedb9155bd 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java @@ -32,6 +32,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; +import androidx.annotation.IntDef; import androidx.annotation.Nullable; import androidx.asynclayoutinflater.view.AsyncLayoutInflater; @@ -44,6 +45,8 @@ import com.airbnb.lottie.LottieProperty; import com.airbnb.lottie.model.KeyPath; import java.io.PrintWriter; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; /** * View corresponding with udfps_keyguard_view.xml @@ -52,7 +55,6 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { private UdfpsDrawable mFingerprintDrawable; // placeholder private LottieAnimationView mAodFp; private LottieAnimationView mLockScreenFp; - private int mStatusBarState; // used when highlighting fp icon: private int mTextColorPrimary; @@ -70,7 +72,7 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { private float mBurnInOffsetY; private float mBurnInProgress; private float mInterpolatedDarkAmount; - private boolean mAnimatingBetweenAodAndLockscreen; // As opposed to Unlocked => AOD + private int mAnimationType = ANIMATION_NONE; private boolean mFullyInflated; public UdfpsKeyguardView(Context context, @Nullable AttributeSet attrs) { @@ -117,8 +119,10 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { return; } - final float darkAmountForAnimation = mAnimatingBetweenAodAndLockscreen - ? mInterpolatedDarkAmount : 1f /* animating from unlocked to AOD */; + // if we're animating from screen off, we can immediately place the icon in the + // AoD-burn in location, else we need to translate the icon from LS => AoD. + final float darkAmountForAnimation = mAnimationType == ANIMATION_UNLOCKED_SCREEN_OFF + ? 1f : mInterpolatedDarkAmount; mBurnInOffsetX = MathUtils.lerp(0f, getBurnInOffset(mMaxBurnInOffsetX * 2, true /* xAxis */) - mMaxBurnInOffsetX, darkAmountForAnimation); @@ -127,12 +131,12 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { - mMaxBurnInOffsetY, darkAmountForAnimation); mBurnInProgress = MathUtils.lerp(0f, getBurnInProgressOffset(), darkAmountForAnimation); - if (mAnimatingBetweenAodAndLockscreen && !mPauseAuth) { + if (mAnimationType == ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN && !mPauseAuth) { mLockScreenFp.setTranslationX(mBurnInOffsetX); mLockScreenFp.setTranslationY(mBurnInOffsetY); mBgProtection.setAlpha(1f - mInterpolatedDarkAmount); mLockScreenFp.setAlpha(1f - mInterpolatedDarkAmount); - } else if (mInterpolatedDarkAmount == 0f) { + } else if (darkAmountForAnimation == 0f) { mLockScreenFp.setTranslationX(0); mLockScreenFp.setTranslationY(0); mBgProtection.setAlpha(mAlpha / 255f); @@ -148,9 +152,15 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { mAodFp.setProgress(mBurnInProgress); mAodFp.setAlpha(mInterpolatedDarkAmount); - // done animating between AoD & LS - if (mInterpolatedDarkAmount == 1f || mInterpolatedDarkAmount == 0f) { - mAnimatingBetweenAodAndLockscreen = false; + // done animating + final boolean doneAnimatingBetweenAodAndLS = + mAnimationType == ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN + && (mInterpolatedDarkAmount == 0f || mInterpolatedDarkAmount == 1f); + final boolean doneAnimatingUnlockedScreenOff = + mAnimationType == ANIMATION_UNLOCKED_SCREEN_OFF + && (mInterpolatedDarkAmount == 1f); + if (doneAnimatingBetweenAodAndLS || doneAnimatingUnlockedScreenOff) { + mAnimationType = ANIMATION_NONE; } } @@ -158,10 +168,6 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { mUdfpsRequested = request; } - void setStatusBarState(int statusBarState) { - mStatusBarState = statusBarState; - } - void updateColor() { if (!mFullyInflated) { return; @@ -219,8 +225,16 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { return mAlpha; } - void onDozeAmountChanged(float linear, float eased, boolean animatingBetweenAodAndLockscreen) { - mAnimatingBetweenAodAndLockscreen = animatingBetweenAodAndLockscreen; + static final int ANIMATION_NONE = 0; + static final int ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN = 1; + static final int ANIMATION_UNLOCKED_SCREEN_OFF = 2; + + @Retention(RetentionPolicy.SOURCE) + @IntDef({ANIMATION_NONE, ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN, ANIMATION_UNLOCKED_SCREEN_OFF}) + private @interface AnimationType {} + + void onDozeAmountChanged(float linear, float eased, @AnimationType int animationType) { + mAnimationType = animationType; mInterpolatedDarkAmount = eased; updateAlpha(); } @@ -262,7 +276,7 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { pw.println(" mUnpausedAlpha=" + getUnpausedAlpha()); pw.println(" mUdfpsRequested=" + mUdfpsRequested); pw.println(" mInterpolatedDarkAmount=" + mInterpolatedDarkAmount); - pw.println(" mAnimatingBetweenAodAndLockscreen=" + mAnimatingBetweenAodAndLockscreen); + pw.println(" mAnimationType=" + mAnimationType); } private final AsyncLayoutInflater.OnInflateFinishedListener mLayoutInflaterFinishListener = diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java index 8b0f36fe1245e..ec4cf2fd8bd46 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java @@ -121,7 +121,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController