7/n: Add enrollment animation
Fixes: 112005540 Test: Tested with ag/4749121 Change-Id: I7d51187f7b8b7a6c2c34c984740b76bc9fd89262
This commit is contained in:
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.android.settings.biometrics.face;
|
||||
|
||||
import android.animation.TimeAnimator;
|
||||
import android.content.Context;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.ColorFilter;
|
||||
@@ -26,16 +28,43 @@ import android.graphics.PorterDuffXfermode;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.Drawable;
|
||||
|
||||
/**
|
||||
* A drawable containing the circle cutout.
|
||||
*/
|
||||
public class FaceEnrollAnimationDrawable extends Drawable {
|
||||
import com.android.settings.biometrics.BiometricEnrollSidecar;
|
||||
|
||||
/**
|
||||
* A drawable containing the circle cutout as well as the animations.
|
||||
*/
|
||||
public class FaceEnrollAnimationDrawable extends Drawable
|
||||
implements BiometricEnrollSidecar.Listener {
|
||||
|
||||
// Tune this parameter so the UI looks nice - and so that we don't have to draw the animations
|
||||
// outside our bounds. A fraction of each rotating dot should be overlapping the camera preview.
|
||||
private static final int BORDER_BOUNDS = 20;
|
||||
|
||||
private final Context mContext;
|
||||
private final ParticleCollection.Listener mListener;
|
||||
private Rect mBounds;
|
||||
private final Paint mSquarePaint;
|
||||
private final Paint mCircleCutoutPaint;
|
||||
|
||||
public FaceEnrollAnimationDrawable() {
|
||||
private ParticleCollection mParticleCollection;
|
||||
|
||||
private TimeAnimator mTimeAnimator;
|
||||
|
||||
private final ParticleCollection.Listener mAnimationListener
|
||||
= new ParticleCollection.Listener() {
|
||||
@Override
|
||||
public void onEnrolled() {
|
||||
if (mTimeAnimator != null && mTimeAnimator.isStarted()) {
|
||||
mTimeAnimator.end();
|
||||
mListener.onEnrolled();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public FaceEnrollAnimationDrawable(Context context, ParticleCollection.Listener listener) {
|
||||
mContext = context;
|
||||
mListener = listener;
|
||||
|
||||
mSquarePaint = new Paint();
|
||||
mSquarePaint.setColor(Color.WHITE);
|
||||
mSquarePaint.setAntiAlias(true);
|
||||
@@ -46,9 +75,35 @@ public class FaceEnrollAnimationDrawable extends Drawable {
|
||||
mCircleCutoutPaint.setAntiAlias(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnrollmentHelp(int helpMsgId, CharSequence helpString) {
|
||||
mParticleCollection.onEnrollmentHelp(helpMsgId, helpString);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnrollmentError(int errMsgId, CharSequence errString) {
|
||||
mParticleCollection.onEnrollmentError(errMsgId, errString);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnrollmentProgressChange(int steps, int remaining) {
|
||||
mParticleCollection.onEnrollmentProgressChange(steps, remaining);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onBoundsChange(Rect bounds) {
|
||||
mBounds = bounds;
|
||||
mParticleCollection =
|
||||
new ParticleCollection(mContext, mAnimationListener, bounds, BORDER_BOUNDS);
|
||||
|
||||
if (mTimeAnimator == null) {
|
||||
mTimeAnimator = new TimeAnimator();
|
||||
mTimeAnimator.setTimeListener((animation, totalTimeMs, deltaTimeMs) -> {
|
||||
mParticleCollection.update(totalTimeMs, deltaTimeMs);
|
||||
FaceEnrollAnimationDrawable.this.invalidateSelf();
|
||||
});
|
||||
mTimeAnimator.start();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -63,7 +118,10 @@ public class FaceEnrollAnimationDrawable extends Drawable {
|
||||
|
||||
// Clear a circle in the middle for the camera preview
|
||||
canvas.drawCircle(mBounds.exactCenterX(), mBounds.exactCenterY(),
|
||||
mBounds.height() / 2, mCircleCutoutPaint);
|
||||
mBounds.height() / 2 - BORDER_BOUNDS, mCircleCutoutPaint);
|
||||
|
||||
// Draw the animation
|
||||
mParticleCollection.draw(canvas);
|
||||
|
||||
canvas.restore();
|
||||
}
|
||||
|
Reference in New Issue
Block a user