Loading packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +7 −3 Original line number Diff line number Diff line Loading @@ -83,6 +83,7 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.keyguard.domain.interactor.KeyguardFaceAuthInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor; import com.android.systemui.keyguard.ui.adapter.UdfpsKeyguardViewControllerAdapter; import com.android.systemui.keyguard.ui.viewmodel.UdfpsKeyguardViewModels; import com.android.systemui.log.SessionTracker; Loading Loading @@ -170,6 +171,7 @@ public class UdfpsController implements DozeReceiver, Dumpable { @NonNull private final SelectedUserInteractor mSelectedUserInteractor; @NonNull private final FpsUnlockTracker mFpsUnlockTracker; private final boolean mIgnoreRefreshRate; private final KeyguardTransitionInteractor mKeyguardTransitionInteractor; // 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. Loading Loading @@ -283,7 +285,7 @@ public class UdfpsController implements DozeReceiver, Dumpable { mPrimaryBouncerInteractor, mAlternateBouncerInteractor, mUdfpsKeyguardAccessibilityDelegate, mUdfpsKeyguardViewModels, mKeyguardTransitionInteractor, mSelectedUserInteractor ))); } Loading Loading @@ -649,7 +651,8 @@ public class UdfpsController implements DozeReceiver, Dumpable { @NonNull UdfpsKeyguardAccessibilityDelegate udfpsKeyguardAccessibilityDelegate, @NonNull Provider<UdfpsKeyguardViewModels> udfpsKeyguardViewModelsProvider, @NonNull SelectedUserInteractor selectedUserInteractor, @NonNull FpsUnlockTracker fpsUnlockTracker) { @NonNull FpsUnlockTracker fpsUnlockTracker, @NonNull KeyguardTransitionInteractor keyguardTransitionInteractor) { mContext = context; mExecution = execution; mVibrator = vibrator; Loading Loading @@ -695,6 +698,7 @@ public class UdfpsController implements DozeReceiver, Dumpable { mSelectedUserInteractor = selectedUserInteractor; mFpsUnlockTracker = fpsUnlockTracker; mFpsUnlockTracker.startTracking(); mKeyguardTransitionInteractor = keyguardTransitionInteractor; mTouchProcessor = singlePointerTouchProcessor; mSessionTracker = sessionTracker; Loading packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt +3 −4 Original line number Diff line number Diff line Loading @@ -51,8 +51,8 @@ import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor import com.android.systemui.dump.DumpManager import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags.REFACTOR_UDFPS_KEYGUARD_VIEWS import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.ui.adapter.UdfpsKeyguardViewControllerAdapter import com.android.systemui.keyguard.ui.viewmodel.UdfpsKeyguardViewModels import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.res.R import com.android.systemui.statusbar.LockscreenShadeTransitionController Loading @@ -63,7 +63,6 @@ import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.user.domain.interactor.SelectedUserInteractor import kotlinx.coroutines.ExperimentalCoroutinesApi import javax.inject.Provider private const val TAG = "UdfpsControllerOverlay" Loading Loading @@ -102,7 +101,7 @@ class UdfpsControllerOverlay @JvmOverloads constructor( private val alternateBouncerInteractor: AlternateBouncerInteractor, private val isDebuggable: Boolean = Build.IS_DEBUGGABLE, private val udfpsKeyguardAccessibilityDelegate: UdfpsKeyguardAccessibilityDelegate, private val udfpsKeyguardViewModels: Provider<UdfpsKeyguardViewModels>, private val transitionInteractor: KeyguardTransitionInteractor, private val selectedUserInteractor: SelectedUserInteractor, ) { /** The view, when [isShowing], or null. */ Loading Loading @@ -264,11 +263,11 @@ class UdfpsControllerOverlay @JvmOverloads constructor( dialogManager, controller, activityLaunchAnimator, featureFlags, primaryBouncerInteractor, alternateBouncerInteractor, udfpsKeyguardAccessibilityDelegate, selectedUserInteractor, transitionInteractor, ) } } Loading packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerLegacy.kt +35 −38 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.systemui.biometrics import android.animation.ValueAnimator import android.content.res.Configuration import android.util.MathUtils import android.view.View Loading @@ -27,17 +26,17 @@ import com.android.app.animation.Interpolators import com.android.keyguard.BouncerPanelExpansionCalculator.aboutToShowBouncerProgress import com.android.keyguard.KeyguardUpdateMonitor import com.android.systemui.animation.ActivityLaunchAnimator import com.android.systemui.biometrics.UdfpsKeyguardViewLegacy.ANIMATION_UNLOCKED_SCREEN_OFF import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor import com.android.systemui.dump.DumpManager import com.android.systemui.flags.FeatureFlags import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.ui.adapter.UdfpsKeyguardViewControllerAdapter import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.res.R import com.android.systemui.statusbar.LockscreenShadeTransitionController import com.android.systemui.statusbar.StatusBarState import com.android.systemui.statusbar.notification.stack.StackStateAnimator import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager.KeyguardViewManagerCallback import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager.OccludingAppBiometricUI Loading @@ -48,10 +47,14 @@ import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.user.domain.interactor.SelectedUserInteractor import java.io.PrintWriter import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.Job import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.launch /** Class that coordinates non-HBM animations during keyguard authentication. */ @ExperimentalCoroutinesApi open class UdfpsKeyguardViewControllerLegacy( private val view: UdfpsKeyguardViewLegacy, statusBarStateController: StatusBarStateController, Loading @@ -65,11 +68,11 @@ open class UdfpsKeyguardViewControllerLegacy( systemUIDialogManager: SystemUIDialogManager, private val udfpsController: UdfpsController, private val activityLaunchAnimator: ActivityLaunchAnimator, featureFlags: FeatureFlags, primaryBouncerInteractor: PrimaryBouncerInteractor, private val alternateBouncerInteractor: AlternateBouncerInteractor, private val udfpsKeyguardAccessibilityDelegate: UdfpsKeyguardAccessibilityDelegate, private val selectedUserInteractor: SelectedUserInteractor, private val transitionInteractor: KeyguardTransitionInteractor, ) : UdfpsAnimationViewController<UdfpsKeyguardViewLegacy>( view, Loading @@ -91,44 +94,10 @@ open class UdfpsKeyguardViewControllerLegacy( private var launchTransitionFadingAway = false private var isLaunchingActivity = false private var activityLaunchProgress = 0f private val unlockedScreenOffDozeAnimator = ValueAnimator.ofFloat(0f, 1f).apply { duration = StackStateAnimator.ANIMATION_DURATION_STANDARD.toLong() interpolator = Interpolators.ALPHA_IN addUpdateListener { animation -> view.onDozeAmountChanged( animation.animatedFraction, animation.animatedValue as Float, UdfpsKeyguardViewLegacy.ANIMATION_UNLOCKED_SCREEN_OFF ) } } private var inputBouncerExpansion = 0f private val stateListener: StatusBarStateController.StateListener = object : StatusBarStateController.StateListener { override fun onDozeAmountChanged(linear: Float, eased: Float) { if (lastDozeAmount < linear) { showUdfpsBouncer(false) } unlockedScreenOffDozeAnimator.cancel() val animatingFromUnlockedScreenOff = unlockedScreenOffAnimationController.isAnimationPlaying() if (animatingFromUnlockedScreenOff && linear != 0f) { // we manually animate the fade in of the UDFPS icon since the unlocked // screen off animation prevents the doze amounts to be incrementally eased in unlockedScreenOffDozeAnimator.start() } else { view.onDozeAmountChanged( linear, eased, UdfpsKeyguardViewLegacy.ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN ) } lastDozeAmount = linear updatePauseAuth() } override fun onStateChanged(statusBarState: Int) { this@UdfpsKeyguardViewControllerLegacy.statusBarState = statusBarState updateAlpha() Loading Loading @@ -222,6 +191,34 @@ open class UdfpsKeyguardViewControllerLegacy( repeatOnLifecycle(Lifecycle.State.CREATED) { listenForBouncerExpansion(this) listenForAlternateBouncerVisibility(this) listenForGoneToAodTransition(this) listenForLockscreenAodTransitions(this) } } } @VisibleForTesting suspend fun listenForGoneToAodTransition(scope: CoroutineScope): Job { return scope.launch { transitionInteractor.goneToAodTransition.collect { transitionStep -> view.onDozeAmountChanged( transitionStep.value, transitionStep.value, ANIMATION_UNLOCKED_SCREEN_OFF, ) } } } @VisibleForTesting suspend fun listenForLockscreenAodTransitions(scope: CoroutineScope): Job { return scope.launch { transitionInteractor.dozeAmountTransition.collect { transitionStep -> view.onDozeAmountChanged( transitionStep.value, transitionStep.value, UdfpsKeyguardViewLegacy.ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN, ) } } } Loading packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacy.java +10 −11 Original line number Diff line number Diff line Loading @@ -73,9 +73,6 @@ public class UdfpsKeyguardViewLegacy extends UdfpsAnimationView { // AOD anti-burn-in offsets private final int mMaxBurnInOffsetX; private final int mMaxBurnInOffsetY; private float mBurnInOffsetX; private float mBurnInOffsetY; private float mBurnInProgress; private float mInterpolatedDarkAmount; private int mAnimationType = ANIMATION_NONE; private boolean mFullyInflated; Loading Loading @@ -138,20 +135,22 @@ public class UdfpsKeyguardViewLegacy extends UdfpsAnimationView { // 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, final float burnInOffsetX = MathUtils.lerp(0f, getBurnInOffset(mMaxBurnInOffsetX * 2, true /* xAxis */) - mMaxBurnInOffsetX, darkAmountForAnimation); mBurnInOffsetY = MathUtils.lerp(0f, final float burnInOffsetY = MathUtils.lerp(0f, getBurnInOffset(mMaxBurnInOffsetY * 2, false /* xAxis */) - mMaxBurnInOffsetY, darkAmountForAnimation); mBurnInProgress = MathUtils.lerp(0f, getBurnInProgressOffset(), darkAmountForAnimation); final float burnInProgress = MathUtils.lerp(0f, getBurnInProgressOffset(), darkAmountForAnimation); if (mAnimationType == ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN && !mPauseAuth) { mLockScreenFp.setTranslationX(mBurnInOffsetX); mLockScreenFp.setTranslationY(mBurnInOffsetY); mLockScreenFp.setTranslationX(burnInOffsetX); mLockScreenFp.setTranslationY(burnInOffsetY); mBgProtection.setAlpha(1f - mInterpolatedDarkAmount); mLockScreenFp.setAlpha(1f - mInterpolatedDarkAmount); } else if (darkAmountForAnimation == 0f) { // we're on the lockscreen and should use mAlpha (changes based on shade expansion) mLockScreenFp.setTranslationX(0); mLockScreenFp.setTranslationY(0); mBgProtection.setAlpha(mAlpha / 255f); Loading @@ -162,9 +161,9 @@ public class UdfpsKeyguardViewLegacy extends UdfpsAnimationView { } mLockScreenFp.setProgress(1f - mInterpolatedDarkAmount); mAodFp.setTranslationX(mBurnInOffsetX); mAodFp.setTranslationY(mBurnInOffsetY); mAodFp.setProgress(mBurnInProgress); mAodFp.setTranslationX(burnInOffsetX); mAodFp.setTranslationY(burnInOffsetY); mAodFp.setProgress(burnInProgress); mAodFp.setAlpha(mInterpolatedDarkAmount); // done animating Loading packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt +3 −5 Original line number Diff line number Diff line Loading @@ -43,7 +43,7 @@ import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor import com.android.systemui.dump.DumpManager import com.android.systemui.flags.FeatureFlags import com.android.systemui.keyguard.ui.viewmodel.UdfpsKeyguardViewModels import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.res.R import com.android.systemui.statusbar.LockscreenShadeTransitionController Loading @@ -68,7 +68,6 @@ import org.mockito.Mock import org.mockito.Mockito.mock import org.mockito.Mockito.verify import org.mockito.junit.MockitoJUnit import javax.inject.Provider import org.mockito.Mockito.`when` as whenever private const val REQUEST_ID = 2L Loading Loading @@ -111,11 +110,10 @@ class UdfpsControllerOverlayTest : SysuiTestCase() { @Mock private lateinit var featureFlags: FeatureFlags @Mock private lateinit var primaryBouncerInteractor: PrimaryBouncerInteractor @Mock private lateinit var alternateBouncerInteractor: AlternateBouncerInteractor @Mock private lateinit var udfpsUtils: UdfpsUtils @Mock private lateinit var mSelectedUserInteractor: SelectedUserInteractor @Mock private lateinit var udfpsKeyguardAccessibilityDelegate: UdfpsKeyguardAccessibilityDelegate @Mock private lateinit var udfpsKeyguardViewModels: Provider<UdfpsKeyguardViewModels> @Mock private lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor @Captor private lateinit var layoutParamsCaptor: ArgumentCaptor<WindowManager.LayoutParams> private val onTouch = { _: View, _: MotionEvent, _: Boolean -> true } Loading Loading @@ -164,7 +162,7 @@ class UdfpsControllerOverlayTest : SysuiTestCase() { alternateBouncerInteractor, isDebuggable, udfpsKeyguardAccessibilityDelegate, udfpsKeyguardViewModels, keyguardTransitionInteractor, mSelectedUserInteractor, ) block() Loading Loading
packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +7 −3 Original line number Diff line number Diff line Loading @@ -83,6 +83,7 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.keyguard.domain.interactor.KeyguardFaceAuthInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor; import com.android.systemui.keyguard.ui.adapter.UdfpsKeyguardViewControllerAdapter; import com.android.systemui.keyguard.ui.viewmodel.UdfpsKeyguardViewModels; import com.android.systemui.log.SessionTracker; Loading Loading @@ -170,6 +171,7 @@ public class UdfpsController implements DozeReceiver, Dumpable { @NonNull private final SelectedUserInteractor mSelectedUserInteractor; @NonNull private final FpsUnlockTracker mFpsUnlockTracker; private final boolean mIgnoreRefreshRate; private final KeyguardTransitionInteractor mKeyguardTransitionInteractor; // 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. Loading Loading @@ -283,7 +285,7 @@ public class UdfpsController implements DozeReceiver, Dumpable { mPrimaryBouncerInteractor, mAlternateBouncerInteractor, mUdfpsKeyguardAccessibilityDelegate, mUdfpsKeyguardViewModels, mKeyguardTransitionInteractor, mSelectedUserInteractor ))); } Loading Loading @@ -649,7 +651,8 @@ public class UdfpsController implements DozeReceiver, Dumpable { @NonNull UdfpsKeyguardAccessibilityDelegate udfpsKeyguardAccessibilityDelegate, @NonNull Provider<UdfpsKeyguardViewModels> udfpsKeyguardViewModelsProvider, @NonNull SelectedUserInteractor selectedUserInteractor, @NonNull FpsUnlockTracker fpsUnlockTracker) { @NonNull FpsUnlockTracker fpsUnlockTracker, @NonNull KeyguardTransitionInteractor keyguardTransitionInteractor) { mContext = context; mExecution = execution; mVibrator = vibrator; Loading Loading @@ -695,6 +698,7 @@ public class UdfpsController implements DozeReceiver, Dumpable { mSelectedUserInteractor = selectedUserInteractor; mFpsUnlockTracker = fpsUnlockTracker; mFpsUnlockTracker.startTracking(); mKeyguardTransitionInteractor = keyguardTransitionInteractor; mTouchProcessor = singlePointerTouchProcessor; mSessionTracker = sessionTracker; Loading
packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt +3 −4 Original line number Diff line number Diff line Loading @@ -51,8 +51,8 @@ import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor import com.android.systemui.dump.DumpManager import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags.REFACTOR_UDFPS_KEYGUARD_VIEWS import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.ui.adapter.UdfpsKeyguardViewControllerAdapter import com.android.systemui.keyguard.ui.viewmodel.UdfpsKeyguardViewModels import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.res.R import com.android.systemui.statusbar.LockscreenShadeTransitionController Loading @@ -63,7 +63,6 @@ import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.user.domain.interactor.SelectedUserInteractor import kotlinx.coroutines.ExperimentalCoroutinesApi import javax.inject.Provider private const val TAG = "UdfpsControllerOverlay" Loading Loading @@ -102,7 +101,7 @@ class UdfpsControllerOverlay @JvmOverloads constructor( private val alternateBouncerInteractor: AlternateBouncerInteractor, private val isDebuggable: Boolean = Build.IS_DEBUGGABLE, private val udfpsKeyguardAccessibilityDelegate: UdfpsKeyguardAccessibilityDelegate, private val udfpsKeyguardViewModels: Provider<UdfpsKeyguardViewModels>, private val transitionInteractor: KeyguardTransitionInteractor, private val selectedUserInteractor: SelectedUserInteractor, ) { /** The view, when [isShowing], or null. */ Loading Loading @@ -264,11 +263,11 @@ class UdfpsControllerOverlay @JvmOverloads constructor( dialogManager, controller, activityLaunchAnimator, featureFlags, primaryBouncerInteractor, alternateBouncerInteractor, udfpsKeyguardAccessibilityDelegate, selectedUserInteractor, transitionInteractor, ) } } Loading
packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerLegacy.kt +35 −38 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.systemui.biometrics import android.animation.ValueAnimator import android.content.res.Configuration import android.util.MathUtils import android.view.View Loading @@ -27,17 +26,17 @@ import com.android.app.animation.Interpolators import com.android.keyguard.BouncerPanelExpansionCalculator.aboutToShowBouncerProgress import com.android.keyguard.KeyguardUpdateMonitor import com.android.systemui.animation.ActivityLaunchAnimator import com.android.systemui.biometrics.UdfpsKeyguardViewLegacy.ANIMATION_UNLOCKED_SCREEN_OFF import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor import com.android.systemui.dump.DumpManager import com.android.systemui.flags.FeatureFlags import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.ui.adapter.UdfpsKeyguardViewControllerAdapter import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.res.R import com.android.systemui.statusbar.LockscreenShadeTransitionController import com.android.systemui.statusbar.StatusBarState import com.android.systemui.statusbar.notification.stack.StackStateAnimator import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager.KeyguardViewManagerCallback import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager.OccludingAppBiometricUI Loading @@ -48,10 +47,14 @@ import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.user.domain.interactor.SelectedUserInteractor import java.io.PrintWriter import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.Job import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.launch /** Class that coordinates non-HBM animations during keyguard authentication. */ @ExperimentalCoroutinesApi open class UdfpsKeyguardViewControllerLegacy( private val view: UdfpsKeyguardViewLegacy, statusBarStateController: StatusBarStateController, Loading @@ -65,11 +68,11 @@ open class UdfpsKeyguardViewControllerLegacy( systemUIDialogManager: SystemUIDialogManager, private val udfpsController: UdfpsController, private val activityLaunchAnimator: ActivityLaunchAnimator, featureFlags: FeatureFlags, primaryBouncerInteractor: PrimaryBouncerInteractor, private val alternateBouncerInteractor: AlternateBouncerInteractor, private val udfpsKeyguardAccessibilityDelegate: UdfpsKeyguardAccessibilityDelegate, private val selectedUserInteractor: SelectedUserInteractor, private val transitionInteractor: KeyguardTransitionInteractor, ) : UdfpsAnimationViewController<UdfpsKeyguardViewLegacy>( view, Loading @@ -91,44 +94,10 @@ open class UdfpsKeyguardViewControllerLegacy( private var launchTransitionFadingAway = false private var isLaunchingActivity = false private var activityLaunchProgress = 0f private val unlockedScreenOffDozeAnimator = ValueAnimator.ofFloat(0f, 1f).apply { duration = StackStateAnimator.ANIMATION_DURATION_STANDARD.toLong() interpolator = Interpolators.ALPHA_IN addUpdateListener { animation -> view.onDozeAmountChanged( animation.animatedFraction, animation.animatedValue as Float, UdfpsKeyguardViewLegacy.ANIMATION_UNLOCKED_SCREEN_OFF ) } } private var inputBouncerExpansion = 0f private val stateListener: StatusBarStateController.StateListener = object : StatusBarStateController.StateListener { override fun onDozeAmountChanged(linear: Float, eased: Float) { if (lastDozeAmount < linear) { showUdfpsBouncer(false) } unlockedScreenOffDozeAnimator.cancel() val animatingFromUnlockedScreenOff = unlockedScreenOffAnimationController.isAnimationPlaying() if (animatingFromUnlockedScreenOff && linear != 0f) { // we manually animate the fade in of the UDFPS icon since the unlocked // screen off animation prevents the doze amounts to be incrementally eased in unlockedScreenOffDozeAnimator.start() } else { view.onDozeAmountChanged( linear, eased, UdfpsKeyguardViewLegacy.ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN ) } lastDozeAmount = linear updatePauseAuth() } override fun onStateChanged(statusBarState: Int) { this@UdfpsKeyguardViewControllerLegacy.statusBarState = statusBarState updateAlpha() Loading Loading @@ -222,6 +191,34 @@ open class UdfpsKeyguardViewControllerLegacy( repeatOnLifecycle(Lifecycle.State.CREATED) { listenForBouncerExpansion(this) listenForAlternateBouncerVisibility(this) listenForGoneToAodTransition(this) listenForLockscreenAodTransitions(this) } } } @VisibleForTesting suspend fun listenForGoneToAodTransition(scope: CoroutineScope): Job { return scope.launch { transitionInteractor.goneToAodTransition.collect { transitionStep -> view.onDozeAmountChanged( transitionStep.value, transitionStep.value, ANIMATION_UNLOCKED_SCREEN_OFF, ) } } } @VisibleForTesting suspend fun listenForLockscreenAodTransitions(scope: CoroutineScope): Job { return scope.launch { transitionInteractor.dozeAmountTransition.collect { transitionStep -> view.onDozeAmountChanged( transitionStep.value, transitionStep.value, UdfpsKeyguardViewLegacy.ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN, ) } } } Loading
packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacy.java +10 −11 Original line number Diff line number Diff line Loading @@ -73,9 +73,6 @@ public class UdfpsKeyguardViewLegacy extends UdfpsAnimationView { // AOD anti-burn-in offsets private final int mMaxBurnInOffsetX; private final int mMaxBurnInOffsetY; private float mBurnInOffsetX; private float mBurnInOffsetY; private float mBurnInProgress; private float mInterpolatedDarkAmount; private int mAnimationType = ANIMATION_NONE; private boolean mFullyInflated; Loading Loading @@ -138,20 +135,22 @@ public class UdfpsKeyguardViewLegacy extends UdfpsAnimationView { // 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, final float burnInOffsetX = MathUtils.lerp(0f, getBurnInOffset(mMaxBurnInOffsetX * 2, true /* xAxis */) - mMaxBurnInOffsetX, darkAmountForAnimation); mBurnInOffsetY = MathUtils.lerp(0f, final float burnInOffsetY = MathUtils.lerp(0f, getBurnInOffset(mMaxBurnInOffsetY * 2, false /* xAxis */) - mMaxBurnInOffsetY, darkAmountForAnimation); mBurnInProgress = MathUtils.lerp(0f, getBurnInProgressOffset(), darkAmountForAnimation); final float burnInProgress = MathUtils.lerp(0f, getBurnInProgressOffset(), darkAmountForAnimation); if (mAnimationType == ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN && !mPauseAuth) { mLockScreenFp.setTranslationX(mBurnInOffsetX); mLockScreenFp.setTranslationY(mBurnInOffsetY); mLockScreenFp.setTranslationX(burnInOffsetX); mLockScreenFp.setTranslationY(burnInOffsetY); mBgProtection.setAlpha(1f - mInterpolatedDarkAmount); mLockScreenFp.setAlpha(1f - mInterpolatedDarkAmount); } else if (darkAmountForAnimation == 0f) { // we're on the lockscreen and should use mAlpha (changes based on shade expansion) mLockScreenFp.setTranslationX(0); mLockScreenFp.setTranslationY(0); mBgProtection.setAlpha(mAlpha / 255f); Loading @@ -162,9 +161,9 @@ public class UdfpsKeyguardViewLegacy extends UdfpsAnimationView { } mLockScreenFp.setProgress(1f - mInterpolatedDarkAmount); mAodFp.setTranslationX(mBurnInOffsetX); mAodFp.setTranslationY(mBurnInOffsetY); mAodFp.setProgress(mBurnInProgress); mAodFp.setTranslationX(burnInOffsetX); mAodFp.setTranslationY(burnInOffsetY); mAodFp.setProgress(burnInProgress); mAodFp.setAlpha(mInterpolatedDarkAmount); // done animating Loading
packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt +3 −5 Original line number Diff line number Diff line Loading @@ -43,7 +43,7 @@ import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor import com.android.systemui.dump.DumpManager import com.android.systemui.flags.FeatureFlags import com.android.systemui.keyguard.ui.viewmodel.UdfpsKeyguardViewModels import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.res.R import com.android.systemui.statusbar.LockscreenShadeTransitionController Loading @@ -68,7 +68,6 @@ import org.mockito.Mock import org.mockito.Mockito.mock import org.mockito.Mockito.verify import org.mockito.junit.MockitoJUnit import javax.inject.Provider import org.mockito.Mockito.`when` as whenever private const val REQUEST_ID = 2L Loading Loading @@ -111,11 +110,10 @@ class UdfpsControllerOverlayTest : SysuiTestCase() { @Mock private lateinit var featureFlags: FeatureFlags @Mock private lateinit var primaryBouncerInteractor: PrimaryBouncerInteractor @Mock private lateinit var alternateBouncerInteractor: AlternateBouncerInteractor @Mock private lateinit var udfpsUtils: UdfpsUtils @Mock private lateinit var mSelectedUserInteractor: SelectedUserInteractor @Mock private lateinit var udfpsKeyguardAccessibilityDelegate: UdfpsKeyguardAccessibilityDelegate @Mock private lateinit var udfpsKeyguardViewModels: Provider<UdfpsKeyguardViewModels> @Mock private lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor @Captor private lateinit var layoutParamsCaptor: ArgumentCaptor<WindowManager.LayoutParams> private val onTouch = { _: View, _: MotionEvent, _: Boolean -> true } Loading Loading @@ -164,7 +162,7 @@ class UdfpsControllerOverlayTest : SysuiTestCase() { alternateBouncerInteractor, isDebuggable, udfpsKeyguardAccessibilityDelegate, udfpsKeyguardViewModels, keyguardTransitionInteractor, mSelectedUserInteractor, ) block() Loading