Merge "Update FingerprintEnrollEnrolling for UDFPS"
diff --git a/res/layout/udfps_enroll_layout.xml b/res/layout/udfps_enroll_layout.xml
index 51c788b..0c432d3 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" />
 
-    <include
-        layout="@layout/fingerprint_enroll_enrolling_content"
+    <com.android.settings.widget.RingProgressBar
+        android:id="@+id/fingerprint_progress_bar"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:layout_gravity="center" />
+        android:minHeight="@dimen/fingerprint_progress_bar_min_size"
+        android:progress="0"
+        android:layout_gravity="center"/>
 
 </com.android.settings.biometrics.fingerprint.UdfpsEnrollLayout>
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
index b33113b..3015b94 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
@@ -18,6 +18,7 @@
 
 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 @@
     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 @@
         );
 
         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 @@
 
     @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 @@
         updateDescription();
         if (mRestoring) {
             startIconAnimation();
+            if (mCanAssumeUdfps) {
+                mProgressBar.setVisibility(View.VISIBLE);
+            }
         }
     }
 
@@ -239,6 +248,7 @@
 
         if (mCanAssumeUdfps) {
             startEnrollment();
+            updateProgress(false /* animate */);
             mProgressBar.setVisibility(View.VISIBLE);
         }
 
@@ -247,7 +257,9 @@
     }
 
     private void startIconAnimation() {
-        mIconAnimationDrawable.start();
+        if (mIconAnimationDrawable != null) {
+            mIconAnimationDrawable.start();
+        }
     }
 
     private void stopIconAnimation() {
@@ -277,7 +289,9 @@
     }
 
     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 ca27e84..19079d8 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 @@
     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 @@
         // 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));
     }
 }