From 3edacaabdc6129d643b0d9fa21661422083b907d Mon Sep 17 00:00:00 2001 From: Joe Bolinger Date: Wed, 25 Aug 2021 15:54:45 -0700 Subject: Add visual feedback on UDFPS enrollment help. Fix: 191700407 Test: manual (enroll and verify progress bar turns red when help message is displayed) Change-Id: Ifda20133f1ee90c9e1612e9066c19efbb6ffc9cd --- packages/SystemUI/res/values/colors.xml | 3 +- .../systemui/biometrics/UdfpsEnrollDrawable.java | 4 ++ .../systemui/biometrics/UdfpsEnrollHelper.java | 5 +- .../biometrics/UdfpsEnrollProgressBarDrawable.java | 59 +++++++++++++++++++++- .../systemui/biometrics/UdfpsEnrollView.java | 4 ++ .../biometrics/UdfpsEnrollViewController.java | 5 ++ 6 files changed, 76 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index bbbaf65f861b..4bbfd8ff97de 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -187,7 +187,8 @@ #000000 #cc4285f4 - #ff669DF6 + #ff669DF6 + #ffEE675C #ccffffff diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollDrawable.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollDrawable.java index ea69b1d626ae..b5273abd868d 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollDrawable.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollDrawable.java @@ -143,6 +143,10 @@ public class UdfpsEnrollDrawable extends UdfpsDrawable { mProgressDrawable.onLastStepAcquired(); } + void onEnrollmentHelp() { + mProgressDrawable.onEnrollmentHelp(); + } + @Override public void draw(@NonNull Canvas canvas) { mProgressDrawable.draw(canvas); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollHelper.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollHelper.java index 6a918a6c8d39..19148e383005 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollHelper.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollHelper.java @@ -50,6 +50,7 @@ public class UdfpsEnrollHelper { interface Listener { void onEnrollmentProgress(int remaining, int totalSteps); void onLastStepAcquired(); + void onEnrollmentHelp(); } @NonNull private final Context mContext; @@ -138,7 +139,9 @@ public class UdfpsEnrollHelper { } void onEnrollmentHelp() { - + if (mListener != null) { + mListener.onEnrollmentHelp(); + } } void setListener(Listener listener) { diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollProgressBarDrawable.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollProgressBarDrawable.java index 4195009937c2..9c486b9ac1b4 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollProgressBarDrawable.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollProgressBarDrawable.java @@ -16,7 +16,9 @@ package com.android.systemui.biometrics; +import android.animation.ArgbEvaluator; import android.animation.ValueAnimator; +import android.annotation.ColorInt; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; @@ -46,6 +48,11 @@ public class UdfpsEnrollProgressBarDrawable extends Drawable { @NonNull private final Paint mProgressPaint; @Nullable private ValueAnimator mProgressAnimator; + @Nullable private ValueAnimator mProgressShowingHelpAnimator; + @Nullable private ValueAnimator mProgressHidingHelpAnimator; + @ColorInt private final int mProgressColor; + @ColorInt private final int mProgressHelpColor; + private final int mShortAnimationDuration; private float mProgress; private int mRotation; // After last step, rotate the progress bar once private boolean mLastStepAcquired; @@ -55,6 +62,11 @@ public class UdfpsEnrollProgressBarDrawable extends Drawable { mContext = context; mParent = parent; + mShortAnimationDuration = context.getResources() + .getInteger(com.android.internal.R.integer.config_shortAnimTime); + mProgressColor = context.getColor(R.color.udfps_enroll_progress); + mProgressHelpColor = context.getColor(R.color.udfps_enroll_progress_help); + mBackgroundCirclePaint = new Paint(); mBackgroundCirclePaint.setStrokeWidth(Utils.dpToPixels(context, PROGRESS_BAR_THICKNESS_DP)); mBackgroundCirclePaint.setColor(context.getColor(R.color.white_disabled)); @@ -74,7 +86,7 @@ public class UdfpsEnrollProgressBarDrawable extends Drawable { // Progress should not be color extracted mProgressPaint = new Paint(); mProgressPaint.setStrokeWidth(Utils.dpToPixels(context, PROGRESS_BAR_THICKNESS_DP)); - mProgressPaint.setColor(context.getColor(R.color.udfps_enroll_progress)); + mProgressPaint.setColor(mProgressColor); mProgressPaint.setAntiAlias(true); mProgressPaint.setStyle(Paint.Style.STROKE); mProgressPaint.setStrokeCap(Paint.Cap.ROUND); @@ -92,7 +104,9 @@ public class UdfpsEnrollProgressBarDrawable extends Drawable { return; } - long animationDuration = 150; + long animationDuration = mShortAnimationDuration; + + hideEnrollmentHelp(); if (progress == 1.f) { animationDuration = 400; @@ -128,6 +142,47 @@ public class UdfpsEnrollProgressBarDrawable extends Drawable { mLastStepAcquired = true; } + void onEnrollmentHelp() { + if (mProgressShowingHelpAnimator != null || mProgressAnimator == null) { + return; // already showing or at 0% (no progress bar visible) + } + + if (mProgressHidingHelpAnimator != null && mProgressHidingHelpAnimator.isRunning()) { + mProgressHidingHelpAnimator.cancel(); + } + mProgressHidingHelpAnimator = null; + + mProgressShowingHelpAnimator = getProgressColorAnimator( + mProgressPaint.getColor(), mProgressHelpColor); + mProgressShowingHelpAnimator.start(); + } + + private void hideEnrollmentHelp() { + if (mProgressHidingHelpAnimator != null || mProgressShowingHelpAnimator == null) { + return; // already hidden or help never shown + } + + if (mProgressShowingHelpAnimator != null && mProgressShowingHelpAnimator.isRunning()) { + mProgressShowingHelpAnimator.cancel(); + } + mProgressShowingHelpAnimator = null; + + mProgressHidingHelpAnimator = getProgressColorAnimator( + mProgressPaint.getColor(), mProgressColor); + mProgressHidingHelpAnimator.start(); + } + + private ValueAnimator getProgressColorAnimator(@ColorInt int from, @ColorInt int to) { + final ValueAnimator animator = ValueAnimator.ofObject( + ArgbEvaluator.getInstance(), from, to); + animator.setDuration(mShortAnimationDuration); + animator.addUpdateListener(animation -> { + mProgressPaint.setColor((int) animation.getAnimatedValue()); + mParent.invalidateSelf(); + }); + return animator; + } + @Override public void draw(@NonNull Canvas canvas) { canvas.save(); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollView.java index 2cdf49d6fc3c..56d5b317029f 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollView.java @@ -64,4 +64,8 @@ public class UdfpsEnrollView extends UdfpsAnimationView { void onLastStepAcquired() { mHandler.post(mFingerprintDrawable::onLastStepAcquired); } + + void onEnrollmentHelp() { + mHandler.post(mFingerprintDrawable::onEnrollmentHelp); + } } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollViewController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollViewController.java index 3dab010d917c..61534a5a83d1 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollViewController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollViewController.java @@ -42,6 +42,11 @@ public class UdfpsEnrollViewController extends UdfpsAnimationViewController