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
This commit is contained in:
Beverly
2022-05-06 20:00:48 +00:00
parent 5ecc0793a1
commit e32d485a5f
3 changed files with 36 additions and 21 deletions

View File

@@ -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 =

View File

@@ -121,7 +121,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
mView.onDozeAmountChanged(
animation.getAnimatedFraction(),
(float) animation.getAnimatedValue(),
/* animatingBetweenAodAndLockScreen */ false);
UdfpsKeyguardView.ANIMATION_UNLOCKED_SCREEN_OFF);
}
});
}
@@ -394,7 +394,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
mUnlockedScreenOffDozeAnimator.start();
} else {
mView.onDozeAmountChanged(linear, eased,
/* animatingBetweenAodAndLockScreen */ true);
UdfpsKeyguardView.ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN);
}
mLastDozeAmount = linear;
@@ -404,7 +404,6 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
@Override
public void onStateChanged(int statusBarState) {
mStatusBarState = statusBarState;
mView.setStatusBarState(statusBarState);
updateAlpha();
updatePauseAuth();
}

View File

@@ -168,7 +168,8 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
mController.onViewAttached();
verify(mView, atLeast(1)).setPauseAuth(true);
verify(mView).onDozeAmountChanged(dozeAmount, dozeAmount, true);
verify(mView).onDozeAmountChanged(dozeAmount, dozeAmount,
UdfpsKeyguardView.ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN);
}
@Test
@@ -195,7 +196,8 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
final float eased = .65f;
mStatusBarStateListener.onDozeAmountChanged(linear, eased);
verify(mView).onDozeAmountChanged(linear, eased, true);
verify(mView).onDozeAmountChanged(linear, eased,
UdfpsKeyguardView.ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN);
}
@Test