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

Commit b0d01823 authored by Chandru S's avatar Chandru S Committed by Android (Google) Code Review
Browse files

Merge changes If4e2ba62,Iefd7e8e8 into tm-qpr-dev

* changes:
  Move private methods together below overriden public methods.
  Refactor deeply nested rim animator into three cases for scanning, success, not successful
parents 00c35a05 2b784144
Loading
Loading
Loading
Loading
+135 −104
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui
import android.animation.Animator
import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.animation.AnimatorListenerAdapter
import android.animation.AnimatorSet
import android.animation.AnimatorSet
import android.animation.TimeInterpolator
import android.animation.ValueAnimator
import android.animation.ValueAnimator
import android.content.Context
import android.content.Context
import android.graphics.Canvas
import android.graphics.Canvas
@@ -95,32 +96,6 @@ class FaceScanningOverlay(
        }
        }
    }
    }


    private fun drawFaceScanningRim(canvas: Canvas) {
        val rimPath = Path(protectionPath)
        scalePath(rimPath, rimProgress)
        rimPaint.style = Paint.Style.FILL
        val rimPaintAlpha = rimPaint.alpha
        rimPaint.color = ColorUtils.blendARGB(
            faceScanningAnimColor,
            Color.WHITE,
            statusBarStateController.dozeAmount
        )
        rimPaint.alpha = rimPaintAlpha
        canvas.drawPath(rimPath, rimPaint)
    }

    private fun drawCameraProtection(canvas: Canvas) {
        val scaledProtectionPath = Path(protectionPath)
        scalePath(scaledProtectionPath, cameraProtectionProgress)
        paint.style = Paint.Style.FILL
        paint.color = cameraProtectionColor
        canvas.drawPath(scaledProtectionPath, paint)
    }

    override fun updateVisOnUpdateCutout(): Boolean {
        return false // instead, we always update the visibility whenever face scanning starts/ends
    }

    override fun enableShowProtection(show: Boolean) {
    override fun enableShowProtection(show: Boolean) {
        val showScanningAnimNow = keyguardUpdateMonitor.isFaceDetectionRunning && show
        val showScanningAnimNow = keyguardUpdateMonitor.isFaceDetectionRunning && show
        if (showScanningAnimNow == showScanningAnim) {
        if (showScanningAnimNow == showScanningAnim) {
@@ -163,26 +138,117 @@ class FaceScanningOverlay(
        }
        }


        rimAnimator?.cancel()
        rimAnimator?.cancel()
        rimAnimator = AnimatorSet().apply {
        rimAnimator = if (showScanningAnim) {
            createFaceScanningRimAnimator()
        } else if (faceAuthSucceeded) {
            createFaceSuccessRimAnimator()
        } else {
            createFaceNotSuccessRimAnimator()
        }
        rimAnimator?.apply {
            addListener(object : AnimatorListenerAdapter() {
                override fun onAnimationEnd(animation: Animator) {
                    rimAnimator = null
                    if (!showScanningAnim) {
                        requestLayout()
                    }
                }
            })
        }
        rimAnimator?.start()
    }

    override fun updateVisOnUpdateCutout(): Boolean {
        return false // instead, we always update the visibility whenever face scanning starts/ends
    }

    override fun updateProtectionBoundingPath() {
        super.updateProtectionBoundingPath()
        rimRect.set(protectionRect)
        rimRect.scale(rimProgress)
    }

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        if (mBounds.isEmpty()) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec)
            return
        }
        if (showScanningAnim) {
        if (showScanningAnim) {
                // animate in camera protection, rim, and then pulse in/out
            // Make sure that our measured height encompasses the extra space for the animation
                playSequentially(
            mTotalBounds.union(mBoundingRect)
            mTotalBounds.union(
                rimRect.left.toInt(),
                rimRect.top.toInt(),
                rimRect.right.toInt(),
                rimRect.bottom.toInt())
            setMeasuredDimension(
                resolveSizeAndState(mTotalBounds.width(), widthMeasureSpec, 0),
                resolveSizeAndState(mTotalBounds.height(), heightMeasureSpec, 0))
        } else {
            setMeasuredDimension(
                resolveSizeAndState(mBoundingRect.width(), widthMeasureSpec, 0),
                resolveSizeAndState(mBoundingRect.height(), heightMeasureSpec, 0))
        }
    }

    private fun drawFaceScanningRim(canvas: Canvas) {
        val rimPath = Path(protectionPath)
        scalePath(rimPath, rimProgress)
        rimPaint.style = Paint.Style.FILL
        val rimPaintAlpha = rimPaint.alpha
        rimPaint.color = ColorUtils.blendARGB(
            faceScanningAnimColor,
            Color.WHITE,
            statusBarStateController.dozeAmount
        )
        rimPaint.alpha = rimPaintAlpha
        canvas.drawPath(rimPath, rimPaint)
    }

    private fun drawCameraProtection(canvas: Canvas) {
        val scaledProtectionPath = Path(protectionPath)
        scalePath(scaledProtectionPath, cameraProtectionProgress)
        paint.style = Paint.Style.FILL
        paint.color = cameraProtectionColor
        canvas.drawPath(scaledProtectionPath, paint)
    }

    private fun createFaceSuccessRimAnimator(): AnimatorSet {
        val rimSuccessAnimator = AnimatorSet()
        rimSuccessAnimator.playTogether(
            createRimDisappearAnimator(
                PULSE_RADIUS_SUCCESS,
                PULSE_SUCCESS_DISAPPEAR_DURATION,
                Interpolators.STANDARD_DECELERATE
            ),
            createSuccessOpacityAnimator(),
        )
        return AnimatorSet().apply {
            playTogether(rimSuccessAnimator, cameraProtectionAnimator)
        }
    }

    private fun createFaceNotSuccessRimAnimator(): AnimatorSet {
        return AnimatorSet().apply {
            playTogether(
                createRimDisappearAnimator(
                    SHOW_CAMERA_PROTECTION_SCALE,
                    PULSE_ERROR_DISAPPEAR_DURATION,
                    Interpolators.STANDARD
                ),
                cameraProtectionAnimator,
                cameraProtectionAnimator,
                    createRimAppearAnimator(),
                    createPulseAnimator()
            )
            )
            } else {
        }
                val rimDisappearAnimator = ValueAnimator.ofFloat(
    }
                        rimProgress,

                        if (faceAuthSucceeded) PULSE_RADIUS_SUCCESS
    private fun createRimDisappearAnimator(
                        else SHOW_CAMERA_PROTECTION_SCALE
        endValue: Float,
                ).apply {
        animDuration: Long,
                    duration =
        timeInterpolator: TimeInterpolator
                            if (faceAuthSucceeded) PULSE_SUCCESS_DISAPPEAR_DURATION
    ): ValueAnimator {
                            else PULSE_ERROR_DISAPPEAR_DURATION
        return ValueAnimator.ofFloat(rimProgress, endValue).apply {
                    interpolator =
            duration = animDuration
                            if (faceAuthSucceeded) Interpolators.STANDARD_DECELERATE
            interpolator = timeInterpolator
                            else Interpolators.STANDARD
            addUpdateListener(this@FaceScanningOverlay::updateRimProgress)
            addUpdateListener(this@FaceScanningOverlay::updateRimProgress)
            addListener(object : AnimatorListenerAdapter() {
            addListener(object : AnimatorListenerAdapter() {
                override fun onAnimationEnd(animation: Animator) {
                override fun onAnimationEnd(animation: Animator) {
@@ -191,8 +257,10 @@ class FaceScanningOverlay(
                }
                }
            })
            })
        }
        }
                if (faceAuthSucceeded) {
    }
                    val successOpacityAnimator = ValueAnimator.ofInt(255, 0).apply {

    private fun createSuccessOpacityAnimator(): ValueAnimator {
        return ValueAnimator.ofInt(255, 0).apply {
            duration = PULSE_SUCCESS_DISAPPEAR_DURATION
            duration = PULSE_SUCCESS_DISAPPEAR_DURATION
            interpolator = Interpolators.LINEAR
            interpolator = Interpolators.LINEAR
            addUpdateListener(this@FaceScanningOverlay::updateRimAlpha)
            addUpdateListener(this@FaceScanningOverlay::updateRimAlpha)
@@ -203,23 +271,15 @@ class FaceScanningOverlay(
                }
                }
            })
            })
        }
        }
                    val rimSuccessAnimator = AnimatorSet()
                    rimSuccessAnimator.playTogether(rimDisappearAnimator, successOpacityAnimator)
                    playTogether(rimSuccessAnimator, cameraProtectionAnimator)
                } else {
                    playTogether(rimDisappearAnimator, cameraProtectionAnimator)
                }
    }
    }


            addListener(object : AnimatorListenerAdapter() {
    private fun createFaceScanningRimAnimator(): AnimatorSet {
                override fun onAnimationEnd(animation: Animator) {
        return AnimatorSet().apply {
                    rimAnimator = null
            playSequentially(
                    if (!showScanningAnim) {
                cameraProtectionAnimator,
                        requestLayout()
                createRimAppearAnimator(),
                    }
                createPulseAnimator()
                }
            )
            })
            start()
        }
        }
    }
    }


@@ -267,35 +327,6 @@ class FaceScanningOverlay(
        }
        }
    }
    }


    override fun updateProtectionBoundingPath() {
        super.updateProtectionBoundingPath()
        rimRect.set(protectionRect)
        rimRect.scale(rimProgress)
    }

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        if (mBounds.isEmpty()) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec)
            return
        }
        if (showScanningAnim) {
            // Make sure that our measured height encompasses the extra space for the animation
            mTotalBounds.union(mBoundingRect)
            mTotalBounds.union(
                    rimRect.left.toInt(),
                    rimRect.top.toInt(),
                    rimRect.right.toInt(),
                    rimRect.bottom.toInt())
            setMeasuredDimension(
                    resolveSizeAndState(mTotalBounds.width(), widthMeasureSpec, 0),
                    resolveSizeAndState(mTotalBounds.height(), heightMeasureSpec, 0))
        } else {
            setMeasuredDimension(
                    resolveSizeAndState(mBoundingRect.width(), widthMeasureSpec, 0),
                    resolveSizeAndState(mBoundingRect.height(), heightMeasureSpec, 0))
        }
    }

    private val keyguardUpdateMonitorCallback = object : KeyguardUpdateMonitorCallback() {
    private val keyguardUpdateMonitorCallback = object : KeyguardUpdateMonitorCallback() {
        override fun onBiometricAuthenticated(
        override fun onBiometricAuthenticated(
            userId: Int,
            userId: Int,