Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e32d485a authored by Beverly's avatar Beverly
Browse files

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
parent 5ecc0793
Loading
Loading
Loading
Loading
+30 −16
Original line number Diff line number Diff line
@@ -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 =
+2 −3
Original line number Diff line number Diff line
@@ -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();
        }
+4 −2
Original line number Diff line number Diff line
@@ -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