From 6a9ede7507984fdb57aa7d35bd743c49c84e1066 Mon Sep 17 00:00:00 2001 From: Chandru Date: Fri, 21 Oct 2022 10:41:33 +0000 Subject: [PATCH 1/2] Extract duplicated code into methods in FaceScanningOverlay Bug: 254814998 Test: NA Test: verified manually, camera protection ring and face scanning overlay drawn correctly on keyguard. Change-Id: If0bef65653394169a05b5633f8706a7707900c52 --- .../android/systemui/FaceScanningOverlay.kt | 83 ++++++++++--------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt b/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt index f64089177d1f0..afc507a52b362 100644 --- a/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt +++ b/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt @@ -151,19 +151,12 @@ class FaceScanningOverlay( if (showScanningAnim) Interpolators.STANDARD_ACCELERATE else if (faceAuthSucceeded) Interpolators.STANDARD else Interpolators.STANDARD_DECELERATE - addUpdateListener(ValueAnimator.AnimatorUpdateListener { - animation: ValueAnimator -> - cameraProtectionProgress = animation.animatedValue as Float - invalidate() - }) + addUpdateListener(this@FaceScanningOverlay::updateCameraProtectionProgress) addListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { cameraProtectionAnimator = null if (!showScanningAnim) { - visibility = View.INVISIBLE - hideOverlayRunnable?.run() - hideOverlayRunnable = null - requestLayout() + hide() } } }) @@ -172,19 +165,10 @@ class FaceScanningOverlay( rimAnimator?.cancel() rimAnimator = AnimatorSet().apply { if (showScanningAnim) { - val rimAppearAnimator = ValueAnimator.ofFloat(SHOW_CAMERA_PROTECTION_SCALE, - PULSE_RADIUS_OUT).apply { - duration = PULSE_APPEAR_DURATION - interpolator = Interpolators.STANDARD_DECELERATE - addUpdateListener(ValueAnimator.AnimatorUpdateListener { - animation: ValueAnimator -> - rimProgress = animation.animatedValue as Float - invalidate() - }) - } - // animate in camera protection, rim, and then pulse in/out - playSequentially(cameraProtectionAnimator, rimAppearAnimator, + playSequentially( + cameraProtectionAnimator, + createRimAppearAnimator(), createPulseAnimator(), createPulseAnimator(), createPulseAnimator(), createPulseAnimator(), createPulseAnimator(), createPulseAnimator()) @@ -200,11 +184,7 @@ class FaceScanningOverlay( interpolator = if (faceAuthSucceeded) Interpolators.STANDARD_DECELERATE else Interpolators.STANDARD - addUpdateListener(ValueAnimator.AnimatorUpdateListener { - animation: ValueAnimator -> - rimProgress = animation.animatedValue as Float - invalidate() - }) + addUpdateListener(this@FaceScanningOverlay::updateRimProgress) addListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { rimProgress = HIDDEN_RIM_SCALE @@ -216,11 +196,7 @@ class FaceScanningOverlay( val successOpacityAnimator = ValueAnimator.ofInt(255, 0).apply { duration = PULSE_SUCCESS_DISAPPEAR_DURATION interpolator = Interpolators.LINEAR - addUpdateListener(ValueAnimator.AnimatorUpdateListener { - animation: ValueAnimator -> - rimPaint.alpha = animation.animatedValue as Int - invalidate() - }) + addUpdateListener(this@FaceScanningOverlay::updateRimAlpha) addListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { rimPaint.alpha = 255 @@ -248,27 +224,52 @@ class FaceScanningOverlay( } } + private fun createRimAppearAnimator(): ValueAnimator { + return ValueAnimator.ofFloat( + SHOW_CAMERA_PROTECTION_SCALE, + PULSE_RADIUS_OUT + ).apply { + duration = PULSE_APPEAR_DURATION + interpolator = Interpolators.STANDARD_DECELERATE + addUpdateListener(this@FaceScanningOverlay::updateRimProgress) + } + } + + private fun hide() { + visibility = INVISIBLE + hideOverlayRunnable?.run() + hideOverlayRunnable = null + requestLayout() + } + + private fun updateRimProgress(animator: ValueAnimator) { + rimProgress = animator.animatedValue as Float + invalidate() + } + + private fun updateCameraProtectionProgress(animator: ValueAnimator) { + cameraProtectionProgress = animator.animatedValue as Float + invalidate() + } + + private fun updateRimAlpha(animator: ValueAnimator) { + rimPaint.alpha = animator.animatedValue as Int + invalidate() + } + fun createPulseAnimator(): AnimatorSet { return AnimatorSet().apply { val pulseInwards = ValueAnimator.ofFloat( PULSE_RADIUS_OUT, PULSE_RADIUS_IN).apply { duration = PULSE_DURATION_INWARDS interpolator = Interpolators.STANDARD - addUpdateListener(ValueAnimator.AnimatorUpdateListener { - animation: ValueAnimator -> - rimProgress = animation.animatedValue as Float - invalidate() - }) + addUpdateListener(this@FaceScanningOverlay::updateRimProgress) } val pulseOutwards = ValueAnimator.ofFloat( PULSE_RADIUS_IN, PULSE_RADIUS_OUT).apply { duration = PULSE_DURATION_OUTWARDS interpolator = Interpolators.STANDARD - addUpdateListener(ValueAnimator.AnimatorUpdateListener { - animation: ValueAnimator -> - rimProgress = animation.animatedValue as Float - invalidate() - }) + addUpdateListener(this@FaceScanningOverlay::updateRimProgress) } playSequentially(pulseInwards, pulseOutwards) } From 98818a8e8b7bd34952fabb5b78eb5bdd25355060 Mon Sep 17 00:00:00 2001 From: Chandru Date: Fri, 21 Oct 2022 10:44:31 +0000 Subject: [PATCH 2/2] Use single animator with reverse repeats for the face scanning pulse Bug: 254814998 Test: verified manually, face scanning animation pulses 6 times on keyguard. Change-Id: I7be92814ef4840f141365c9e1081d0e08b5b4762 --- .../android/systemui/FaceScanningOverlay.kt | 31 +++++++------------ 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt b/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt index afc507a52b362..e69adbd8b6346 100644 --- a/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt +++ b/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt @@ -169,9 +169,8 @@ class FaceScanningOverlay( playSequentially( cameraProtectionAnimator, createRimAppearAnimator(), - createPulseAnimator(), createPulseAnimator(), - createPulseAnimator(), createPulseAnimator(), - createPulseAnimator(), createPulseAnimator()) + createPulseAnimator() + ) } else { val rimDisappearAnimator = ValueAnimator.ofFloat( rimProgress, @@ -257,21 +256,14 @@ class FaceScanningOverlay( invalidate() } - fun createPulseAnimator(): AnimatorSet { - return AnimatorSet().apply { - val pulseInwards = ValueAnimator.ofFloat( - PULSE_RADIUS_OUT, PULSE_RADIUS_IN).apply { - duration = PULSE_DURATION_INWARDS - interpolator = Interpolators.STANDARD - addUpdateListener(this@FaceScanningOverlay::updateRimProgress) - } - val pulseOutwards = ValueAnimator.ofFloat( - PULSE_RADIUS_IN, PULSE_RADIUS_OUT).apply { - duration = PULSE_DURATION_OUTWARDS - interpolator = Interpolators.STANDARD - addUpdateListener(this@FaceScanningOverlay::updateRimProgress) - } - playSequentially(pulseInwards, pulseOutwards) + private fun createPulseAnimator(): ValueAnimator { + return ValueAnimator.ofFloat( + PULSE_RADIUS_OUT, PULSE_RADIUS_IN).apply { + duration = HALF_PULSE_DURATION + interpolator = Interpolators.STANDARD + repeatCount = 11 // Pulse inwards and outwards, reversing direction, 6 times + repeatMode = ValueAnimator.REVERSE + addUpdateListener(this@FaceScanningOverlay::updateRimProgress) } } @@ -363,8 +355,7 @@ class FaceScanningOverlay( private const val CAMERA_PROTECTION_APPEAR_DURATION = 250L private const val PULSE_APPEAR_DURATION = 250L // without start delay - private const val PULSE_DURATION_INWARDS = 500L - private const val PULSE_DURATION_OUTWARDS = 500L + private const val HALF_PULSE_DURATION = 500L private const val PULSE_SUCCESS_DISAPPEAR_DURATION = 400L private const val CAMERA_PROTECTION_SUCCESS_DISAPPEAR_DURATION = 500L // without start delay