From 8c4397fedfa752a79273fad42375fb90833221e1 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Thu, 4 Feb 2021 12:28:58 -0800 Subject: [PATCH] Add progressbar to UdfpsView Note that the progress bar should live in UdfpsView instead of UdfpsAnimationView (at least for now), since it needs to be shown even while the finger is down. Bug: 177965281 Test: atest com.android.systemui.biometrics Change-Id: I297bcdee7cfd19bb91312c617774dd4725e610ee --- .../res/drawable/udfps_progress_bar.xml | 44 ++++++++++++++ packages/SystemUI/res/layout/udfps_view.xml | 15 ++++- packages/SystemUI/res/values/dimens.xml | 3 + packages/SystemUI/res/values/styles.xml | 8 +++ .../biometrics/UdfpsAnimationEnroll.java | 13 +--- .../biometrics/UdfpsAnimationView.java | 12 ---- .../systemui/biometrics/UdfpsController.java | 5 ++ .../biometrics/UdfpsEnrollHelper.java | 48 +++++++++++++++ .../systemui/biometrics/UdfpsProgressBar.java | 59 +++++++++++++++++++ .../systemui/biometrics/UdfpsView.java | 24 +++++++- 10 files changed, 206 insertions(+), 25 deletions(-) create mode 100644 packages/SystemUI/res/drawable/udfps_progress_bar.xml create mode 100644 packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollHelper.java create mode 100644 packages/SystemUI/src/com/android/systemui/biometrics/UdfpsProgressBar.java diff --git a/packages/SystemUI/res/drawable/udfps_progress_bar.xml b/packages/SystemUI/res/drawable/udfps_progress_bar.xml new file mode 100644 index 0000000000000..e5389f3b99ef5 --- /dev/null +++ b/packages/SystemUI/res/drawable/udfps_progress_bar.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/layout/udfps_view.xml b/packages/SystemUI/res/layout/udfps_view.xml index c0788051efed4..6ae306e172098 100644 --- a/packages/SystemUI/res/layout/udfps_view.xml +++ b/packages/SystemUI/res/layout/udfps_view.xml @@ -20,4 +20,17 @@ android:id="@+id/udfps_view" android:layout_width="match_parent" android:layout_height="match_parent" - systemui:sensorTouchAreaCoefficient="0.5"/> + systemui:sensorTouchAreaCoefficient="0.5"> + + + + + diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 1f179f4d06215..cfac445a40c6e 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -1117,6 +1117,9 @@ 60dp + + 12dp + 0dp 4dp diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 4b04eebfddf06..d522037167808 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -752,4 +752,12 @@ 14sp @*android:string/config_headlineFontFamily + + diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationEnroll.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationEnroll.java index e07c84034b31f..5290986b2a1c5 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationEnroll.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationEnroll.java @@ -38,6 +38,7 @@ public class UdfpsAnimationEnroll extends UdfpsAnimation { private static final String TAG = "UdfpsAnimationEnroll"; private static final float SHADOW_RADIUS = 5.f; + private static final float PROGRESS_BAR_RADIUS = 140.f; @Nullable private RectF mSensorRect; @NonNull private final Paint mSensorPaint; @@ -81,12 +82,12 @@ public class UdfpsAnimationEnroll extends UdfpsAnimation { @Override public int getPaddingX() { - return (int) Math.ceil(SHADOW_RADIUS); + return (int) Math.ceil(PROGRESS_BAR_RADIUS); } @Override public int getPaddingY() { - return (int) Math.ceil(SHADOW_RADIUS); + return (int) Math.ceil(PROGRESS_BAR_RADIUS); } @Override @@ -104,12 +105,4 @@ public class UdfpsAnimationEnroll extends UdfpsAnimation { public int getOpacity() { return 0; } - - public void onEnrollmentProgress(int remaining) { - Log.d(TAG, "Remaining: " + remaining); - } - - public void onEnrollmentHelp() { - Log.d(TAG, "onEnrollmentHelp"); - } } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationView.java index 4e3419e1fab3b..41ea4d66f5750 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationView.java @@ -103,18 +103,6 @@ public class UdfpsAnimationView extends View implements DozeReceiver, postInvalidate(); } - void onEnrollmentProgress(int remaining) { - if (mUdfpsAnimation instanceof UdfpsAnimationEnroll) { - ((UdfpsAnimationEnroll) mUdfpsAnimation).onEnrollmentProgress(remaining); - } - } - - void onEnrollmentHelp() { - if (mUdfpsAnimation instanceof UdfpsAnimationEnroll) { - ((UdfpsAnimationEnroll) mUdfpsAnimation).onEnrollmentHelp(); - } - } - public int getPaddingX() { if (mUdfpsAnimation == null) { return 0; diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index c088400f4057c..edf046864a7cf 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -84,6 +84,7 @@ public class UdfpsController implements DozeReceiver, HbmCallback { private boolean mIsOverlayRequested; // Reason the overlay has been requested. See IUdfpsOverlayController for definitions. private int mRequestReason; + @Nullable UdfpsEnrollHelper mEnrollHelper; // The fingerprint AOD trigger doesn't provide an ACTION_UP/ACTION_CANCEL event to tell us when // to turn off high brightness mode. To get around this limitation, the state of the AOD @@ -95,6 +96,9 @@ public class UdfpsController implements DozeReceiver, HbmCallback { public class UdfpsOverlayController extends IUdfpsOverlayController.Stub { @Override public void showUdfpsOverlay(int sensorId, int reason) { + if (reason == IUdfpsOverlayController.REASON_ENROLL) { + mEnrollHelper = new UdfpsEnrollHelper(); + } UdfpsController.this.showOverlay(reason); } @@ -297,6 +301,7 @@ public class UdfpsController implements DozeReceiver, HbmCallback { Log.v(TAG, "showUdfpsOverlay | adding window"); final UdfpsAnimation animation = getUdfpsAnimationForReason(reason); mView.setUdfpsAnimation(animation); + mView.setEnrollHelper(mEnrollHelper); mWindowManager.addView(mView, computeLayoutParams(animation)); mView.setOnTouchListener(mOnTouchListener); mIsOverlayShowing = true; diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollHelper.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollHelper.java new file mode 100644 index 0000000000000..ac6a2121eaaea --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollHelper.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.biometrics; + +import androidx.annotation.NonNull; + +/** + * Helps keep track of enrollment state and animates the progress bar accordingly. + */ +public class UdfpsEnrollHelper { + private static final String TAG = "UdfpsEnrollHelper"; + + + private int mTotalSteps = -1; + private int mCurrentProgress = 0; + + void onEnrollmentProgress(int remaining, @NonNull UdfpsProgressBar progressBar) { + if (mTotalSteps == -1) { + mTotalSteps = remaining; + } + + mCurrentProgress = progressBar.getMax() * Math.max(0, mTotalSteps + 1 - remaining) + / (mTotalSteps + 1); + progressBar.setProgress(mCurrentProgress, true /* animate */); + } + + void updateProgress(@NonNull UdfpsProgressBar progressBar) { + progressBar.setProgress(mCurrentProgress); + } + + void onEnrollmentHelp() { + + } +} diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsProgressBar.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsProgressBar.java new file mode 100644 index 0000000000000..84e2fab7bf6b2 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsProgressBar.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.biometrics; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.ProgressBar; + +import com.android.systemui.R; + +/** + * A (determinate) progress bar in the form of a ring. The progress bar goes clockwise starting + * from the 12 o'clock position. This view maintain equal width and height using a strategy similar + * to "centerInside" for ImageView. + */ +public class UdfpsProgressBar extends ProgressBar { + + public UdfpsProgressBar(Context context) { + this(context, null); + } + + public UdfpsProgressBar(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public UdfpsProgressBar(Context context, AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, R.style.UdfpsProgressBarStyle); + } + + public UdfpsProgressBar(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + @Override + protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + final int measuredHeight = getMeasuredHeight(); + final int measuredWidth = getMeasuredWidth(); + + final int length = Math.min(measuredHeight, measuredWidth); + setMeasuredDimension(length, length); + } +} \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.java index 7e378d3c568e3..b21e1b5ebb15f 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.java @@ -56,6 +56,8 @@ public class UdfpsView extends FrameLayout implements DozeReceiver, UdfpsIllumin @NonNull private final RectF mSensorRect; @NonNull private final Paint mDebugTextPaint; + @Nullable private UdfpsProgressBar mProgressBar; + // Used to obtain the sensor location. @NonNull private FingerprintSensorPropertiesInternal mSensorProps; @@ -64,6 +66,7 @@ public class UdfpsView extends FrameLayout implements DozeReceiver, UdfpsIllumin private boolean mIlluminationRequested; private int mStatusBarState; private boolean mNotificationShadeExpanded; + @Nullable private UdfpsEnrollHelper mEnrollHelper; public UdfpsView(Context context, AttributeSet attrs) { super(context, attrs); @@ -110,6 +113,18 @@ public class UdfpsView extends FrameLayout implements DozeReceiver, UdfpsIllumin void setUdfpsAnimation(@Nullable UdfpsAnimation animation) { mAnimationView.setAnimation(animation); + if (animation instanceof UdfpsAnimationEnroll) { + mProgressBar.setVisibility(View.VISIBLE); + } else { + mProgressBar.setVisibility(View.GONE); + } + } + + void setEnrollHelper(@Nullable UdfpsEnrollHelper enrollHelper) { + mEnrollHelper = enrollHelper; + if (mEnrollHelper != null) { + mEnrollHelper.updateProgress(mProgressBar); + } } @Override @@ -137,6 +152,11 @@ public class UdfpsView extends FrameLayout implements DozeReceiver, UdfpsIllumin mAnimationView.onExpansionChanged(expansion, expanded); } + @Override + protected void onFinishInflate() { + mProgressBar = findViewById(R.id.progress_bar); + } + @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); @@ -233,10 +253,10 @@ public class UdfpsView extends FrameLayout implements DozeReceiver, UdfpsIllumin } void onEnrollmentProgress(int remaining) { - mAnimationView.onEnrollmentProgress(remaining); + mEnrollHelper.onEnrollmentProgress(remaining, mProgressBar); } void onEnrollmentHelp() { - mAnimationView.onEnrollmentHelp(); + } }