summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollDrawable.java70
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollView.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollViewController.java1
3 files changed, 70 insertions, 5 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollDrawable.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollDrawable.java
index 2c48d0ad8b18..83ae865d7427 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollDrawable.java
@@ -16,6 +16,8 @@
package com.android.systemui.biometrics;
+import android.animation.AnimatorSet;
+import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
@@ -24,6 +26,9 @@ import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.os.Looper;
+import android.view.animation.AccelerateDecelerateInterpolator;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -38,17 +43,33 @@ public class UdfpsEnrollDrawable extends UdfpsDrawable {
static final float PROGRESS_BAR_RADIUS = 360.f;
+ private static final long ANIM_DURATION = 800;
+ // 1 + SCALE_MAX is the maximum that the moving target will animate to
+ private static final float SCALE_MAX = 0.25f;
+
@NonNull private final Drawable mMovingTargetFpIcon;
@NonNull private final Paint mSensorOutlinePaint;
@NonNull private final Paint mBlueFill;
@NonNull private final Paint mBlueStroke;
+ @NonNull private final Handler mHandler;
@Nullable private RectF mSensorRect;
@Nullable private UdfpsEnrollHelper mEnrollHelper;
+ // Moving target animator set
+ @Nullable AnimatorSet mAnimatorSet;
+ // Moving target location
+ float mCurrentX;
+ float mCurrentY;
+ // Moving target size
+ float mCurrentScale = 1.f;
+
+
UdfpsEnrollDrawable(@NonNull Context context) {
super(context);
+ mHandler = new Handler(Looper.getMainLooper());
+
mSensorOutlinePaint = new Paint(0 /* flags */);
mSensorOutlinePaint.setAntiAlias(true);
mSensorOutlinePaint.setColor(mContext.getColor(R.color.udfps_enroll_icon));
@@ -90,6 +111,46 @@ public class UdfpsEnrollDrawable extends UdfpsDrawable {
invalidateSelf();
}
+ void onEnrollmentProgress(int remaining, int totalSteps) {
+ if (mEnrollHelper.isCenterEnrollmentComplete()) {
+ mHandler.post(() -> {
+ if (mAnimatorSet != null && mAnimatorSet.isRunning()) {
+ mAnimatorSet.end();
+ }
+
+ final PointF point = mEnrollHelper.getNextGuidedEnrollmentPoint();
+
+ final ValueAnimator x = ValueAnimator.ofFloat(mCurrentX, point.x);
+ x.addUpdateListener(animation -> {
+ mCurrentX = (float) animation.getAnimatedValue();
+ invalidateSelf();
+ });
+
+ final ValueAnimator y = ValueAnimator.ofFloat(mCurrentY, point.y);
+ y.addUpdateListener(animation -> {
+ mCurrentY = (float) animation.getAnimatedValue();
+ invalidateSelf();
+ });
+
+ final ValueAnimator scale = ValueAnimator.ofFloat(0, (float) Math.PI);
+ scale.setDuration(ANIM_DURATION);
+ scale.addUpdateListener(animation -> {
+ // Grow then shrink
+ mCurrentScale = 1 +
+ SCALE_MAX * (float) Math.sin((float) animation.getAnimatedValue());
+ invalidateSelf();
+ });
+
+ mAnimatorSet = new AnimatorSet();
+
+ mAnimatorSet.setInterpolator(new AccelerateDecelerateInterpolator());
+ mAnimatorSet.setDuration(ANIM_DURATION);
+ mAnimatorSet.playTogether(x, y, scale);
+ mAnimatorSet.start();
+ });
+ }
+ }
+
@Override
public void draw(@NonNull Canvas canvas) {
if (isIlluminationShowing()) {
@@ -98,13 +159,12 @@ public class UdfpsEnrollDrawable extends UdfpsDrawable {
// Draw moving target
if (mEnrollHelper.isCenterEnrollmentComplete()) {
- mFingerprintDrawable.setAlpha(mAlpha == 255 ? 64 : mAlpha);
- mSensorOutlinePaint.setAlpha(mAlpha == 255 ? 64 : mAlpha);
-
canvas.save();
- final PointF point = mEnrollHelper.getNextGuidedEnrollmentPoint();
- canvas.translate(point.x, point.y);
+ canvas.translate(mCurrentX, mCurrentY);
+
if (mSensorRect != null) {
+ canvas.scale(mCurrentScale, mCurrentScale,
+ mSensorRect.centerX(), mSensorRect.centerY());
canvas.drawOval(mSensorRect, mBlueFill);
canvas.drawOval(mSensorRect, mBlueStroke);
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollView.java
index 75e8638e43df..3bf1864aca4c 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollView.java
@@ -60,4 +60,8 @@ public class UdfpsEnrollView extends UdfpsAnimationView {
void setEnrollHelper(UdfpsEnrollHelper enrollHelper) {
mFingerprintDrawable.setEnrollHelper(enrollHelper);
}
+
+ void onEnrollmentProgress(int remaining, int totalSteps) {
+ mFingerprintDrawable.onEnrollmentProgress(remaining, totalSteps);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollViewController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollViewController.java
index 1ebbfbf84814..c1f3fe0ffbfd 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollViewController.java
@@ -94,6 +94,7 @@ public class UdfpsEnrollViewController extends UdfpsAnimationViewController<Udfp
* Math.max(0, totalSteps + 1 - remaining) / (totalSteps + 1);
mProgressBar.setProgress(interpolatedProgress, true);
+ mView.onEnrollmentProgress(remaining, totalSteps);
}
};
}