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
This commit is contained in:
44
packages/SystemUI/res/drawable/udfps_progress_bar.xml
Normal file
44
packages/SystemUI/res/drawable/udfps_progress_bar.xml
Normal file
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
~ 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.
|
||||
-->
|
||||
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@android:id/background">
|
||||
<shape
|
||||
android:innerRadiusRatio="2.2"
|
||||
android:shape="ring"
|
||||
android:thickness="@dimen/udfps_enroll_progress_thickness"
|
||||
android:useLevel="false"
|
||||
android:tint="?android:colorControlNormal">
|
||||
<solid android:color="@*android:color/white_disabled_material" />
|
||||
</shape>
|
||||
</item>
|
||||
<item android:id="@android:id/progress">
|
||||
<rotate
|
||||
android:fromDegrees="270"
|
||||
android:pivotX="50%"
|
||||
android:pivotY="50%"
|
||||
android:toDegrees="270">
|
||||
<shape
|
||||
android:innerRadiusRatio="2.2"
|
||||
android:shape="ring"
|
||||
android:thickness="@dimen/udfps_enroll_progress_thickness"
|
||||
android:tint="?android:attr/colorControlActivated">
|
||||
<solid android:color="@android:color/white" />
|
||||
</shape>
|
||||
</rotate>
|
||||
</item>
|
||||
</layer-list>
|
||||
@@ -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">
|
||||
|
||||
<!-- Enrollment progress bar-->
|
||||
<com.android.systemui.biometrics.UdfpsProgressBar
|
||||
android:id="@+id/progress_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:max="100"
|
||||
android:padding="@dimen/udfps_enroll_progress_thickness"
|
||||
android:progress="0"
|
||||
android:layout_gravity="center"
|
||||
android:visibility="gone"/>
|
||||
|
||||
</com.android.systemui.biometrics.UdfpsView>
|
||||
|
||||
@@ -1117,6 +1117,9 @@
|
||||
<!-- Y translation for credential contents when animating in -->
|
||||
<dimen name="biometric_dialog_credential_translation_offset">60dp</dimen>
|
||||
|
||||
<!-- UDFPS enrollment progress bar thickness -->
|
||||
<dimen name="udfps_enroll_progress_thickness">12dp</dimen>
|
||||
|
||||
<!-- Wireless Charging Animation values -->
|
||||
<dimen name="wireless_charging_dots_radius_start">0dp</dimen>
|
||||
<dimen name="wireless_charging_dots_radius_end">4dp</dimen>
|
||||
|
||||
@@ -752,4 +752,12 @@
|
||||
<item name="android:textSize">14sp</item>
|
||||
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
|
||||
</style>
|
||||
|
||||
<style name="UdfpsProgressBarStyle"
|
||||
parent="android:style/Widget.Material.ProgressBar.Horizontal">
|
||||
<item name="android:indeterminate">false</item>
|
||||
<item name="android:max">10000</item>
|
||||
<item name="android:mirrorForRtl">false</item>
|
||||
<item name="android:progressDrawable">@drawable/udfps_progress_bar</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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() {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user