From 95ca345b238bc83742f460ea131d822a7c4b2355 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Tue, 12 Jan 2021 17:08:28 -0800 Subject: [PATCH] Update FingerprintEnrollEnrolling for UDFPS SysUI is now responsible for showing the fingerprint icon and circle (when finger is not down). This changes makes slight tweak so the progress indicator is not covered by SysUI. Fixes a few corner cases when onConfigurationChange occurs Bug: 177026664 Bug: 177275693 Test: No effect on existing devices Change-Id: Id06eab00861878a867804a27f4778f1e3fbd174e --- res/layout/udfps_enroll_layout.xml | 8 ++- .../FingerprintEnrollEnrolling.java | 64 +++++++++++-------- .../fingerprint/UdfpsEnrollLayout.java | 21 +++--- 3 files changed, 54 insertions(+), 39 deletions(-) diff --git a/res/layout/udfps_enroll_layout.xml b/res/layout/udfps_enroll_layout.xml index 51c788b3bae..0c432d3ed4a 100644 --- a/res/layout/udfps_enroll_layout.xml +++ b/res/layout/udfps_enroll_layout.xml @@ -87,10 +87,12 @@ android:layout_height="0dp" android:layout_weight="1" /> - + android:minHeight="@dimen/fingerprint_progress_bar_min_size" + android:progress="0" + android:layout_gravity="center"/> diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java index b33113b74be..3015b947c08 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java @@ -18,6 +18,7 @@ package com.android.settings.biometrics.fingerprint; import android.animation.Animator; import android.animation.ObjectAnimator; +import android.annotation.Nullable; import android.app.Dialog; import android.app.settings.SettingsEnums; import android.content.DialogInterface; @@ -102,8 +103,8 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { private Interpolator mFastOutLinearInInterpolator; private int mIconTouchCount; private boolean mAnimationCancelled; - private AnimatedVectorDrawable mIconAnimationDrawable; - private AnimatedVectorDrawable mIconBackgroundBlinksDrawable; + @Nullable private AnimatedVectorDrawable mIconAnimationDrawable; + @Nullable private AnimatedVectorDrawable mIconBackgroundBlinksDrawable; private boolean mRestoring; private Vibrator mVibrator; @@ -181,34 +182,34 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { ); final LayerDrawable fingerprintDrawable = (LayerDrawable) mProgressBar.getBackground(); - mIconAnimationDrawable = (AnimatedVectorDrawable) - fingerprintDrawable.findDrawableByLayerId(R.id.fingerprint_animation); - mIconBackgroundBlinksDrawable = (AnimatedVectorDrawable) - fingerprintDrawable.findDrawableByLayerId(R.id.fingerprint_background); - mIconAnimationDrawable.registerAnimationCallback(mIconAnimationCallback); + if (fingerprintDrawable != null) { + mIconAnimationDrawable = (AnimatedVectorDrawable) + fingerprintDrawable.findDrawableByLayerId(R.id.fingerprint_animation); + mIconBackgroundBlinksDrawable = (AnimatedVectorDrawable) + fingerprintDrawable.findDrawableByLayerId(R.id.fingerprint_background); + mIconAnimationDrawable.registerAnimationCallback(mIconAnimationCallback); + } + mFastOutSlowInInterpolator = AnimationUtils.loadInterpolator( this, android.R.interpolator.fast_out_slow_in); mLinearOutSlowInInterpolator = AnimationUtils.loadInterpolator( this, android.R.interpolator.linear_out_slow_in); mFastOutLinearInInterpolator = AnimationUtils.loadInterpolator( this, android.R.interpolator.fast_out_linear_in); - mProgressBar.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { - mIconTouchCount++; - if (mIconTouchCount == ICON_TOUCH_COUNT_SHOW_UNTIL_DIALOG_SHOWN) { - showIconTouchDialog(); - } else { - mProgressBar.postDelayed(mShowDialogRunnable, - ICON_TOUCH_DURATION_UNTIL_DIALOG_SHOWN); - } - } else if (event.getActionMasked() == MotionEvent.ACTION_CANCEL - || event.getActionMasked() == MotionEvent.ACTION_UP) { - mProgressBar.removeCallbacks(mShowDialogRunnable); + mProgressBar.setOnTouchListener((v, event) -> { + if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { + mIconTouchCount++; + if (mIconTouchCount == ICON_TOUCH_COUNT_SHOW_UNTIL_DIALOG_SHOWN) { + showIconTouchDialog(); + } else { + mProgressBar.postDelayed(mShowDialogRunnable, + ICON_TOUCH_DURATION_UNTIL_DIALOG_SHOWN); } - return true; + } else if (event.getActionMasked() == MotionEvent.ACTION_CANCEL + || event.getActionMasked() == MotionEvent.ACTION_UP) { + mProgressBar.removeCallbacks(mShowDialogRunnable); } + return true; }); mRestoring = savedInstanceState != null; } @@ -220,7 +221,12 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { @Override protected boolean shouldStartAutomatically() { - return !mCanAssumeUdfps; + if (mCanAssumeUdfps) { + // Continue enrollment if restoring (e.g. configuration changed). Otherwise, wait + // for the entry animation to complete before starting. + return mRestoring; + } + return true; } @Override @@ -230,6 +236,9 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { updateDescription(); if (mRestoring) { startIconAnimation(); + if (mCanAssumeUdfps) { + mProgressBar.setVisibility(View.VISIBLE); + } } } @@ -239,6 +248,7 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { if (mCanAssumeUdfps) { startEnrollment(); + updateProgress(false /* animate */); mProgressBar.setVisibility(View.VISIBLE); } @@ -247,7 +257,9 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { } private void startIconAnimation() { - mIconAnimationDrawable.start(); + if (mIconAnimationDrawable != null) { + mIconAnimationDrawable.start(); + } } private void stopIconAnimation() { @@ -277,7 +289,9 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { } private void animateFlash() { - mIconBackgroundBlinksDrawable.start(); + if (mIconBackgroundBlinksDrawable != null) { + mIconBackgroundBlinksDrawable.start(); + } } protected Intent getFinishIntent() { diff --git a/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollLayout.java b/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollLayout.java index ca27e840b8b..19079d8dfa4 100644 --- a/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollLayout.java +++ b/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollLayout.java @@ -17,11 +17,9 @@ package com.android.settings.biometrics.fingerprint; import android.content.Context; -import android.graphics.Rect; import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.util.AttributeSet; -import android.util.Log; import android.view.View; import android.view.WindowInsets; import android.view.WindowManager; @@ -34,11 +32,17 @@ public class UdfpsEnrollLayout extends LinearLayout { private static final String TAG = "UdfpsEnrollLayout"; private final FingerprintSensorPropertiesInternal mSensorProps; + private final int mSensorDiameter; + private final int mAnimationDiameter; public UdfpsEnrollLayout(Context context, AttributeSet attrs) { super(context, attrs); mSensorProps = context.getSystemService(FingerprintManager.class) .getSensorPropertiesInternal().get(0); + mSensorDiameter = mSensorProps.sensorRadius * 2; + // Multiply the progress bar size slightly so that the progress bar is outside the UDFPS + // affordance, which is shown by SystemUI + mAnimationDiameter = (int) (mSensorDiameter * 2); } @Override @@ -55,22 +59,17 @@ public class UdfpsEnrollLayout extends LinearLayout { // The translationY is the amount of extra height that should be added to the spacer // above the animation final int spaceHeight = mSensorProps.sensorLocationY - statusbarHeight - - mSensorProps.sensorRadius - animation.getTop(); + - (mAnimationDiameter / 2) - animation.getTop(); animation.setTranslationY(spaceHeight); } - - @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); final View animation = findViewById(R.id.fingerprint_progress_bar); - final int sensorDiameter = mSensorProps.sensorRadius * 2; - // Multiply it slightly so that the progress bar is outside the UDFPS affordance, and that - // the animation is within the UDFPS affordance. - final int animationDiameter = (int) (sensorDiameter * 1); - animation.measure(MeasureSpec.makeMeasureSpec(animationDiameter, MeasureSpec.EXACTLY), - MeasureSpec.makeMeasureSpec(animationDiameter, MeasureSpec.EXACTLY)); + + animation.measure(MeasureSpec.makeMeasureSpec(mAnimationDiameter, MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(mAnimationDiameter, MeasureSpec.EXACTLY)); } }