Implement SFPS guided enrollment for T6
Reduces perception of long enrollment process by introducing new enrollment layout and stages for SFPS. Also adds user feedback via new animated assets with dynamic colors, and all associated strings and a11y labels. Test: Observe new guided enrollment process on T6 Test: make RunSettingsRoboTests ROBOTEST_FILTER=FingerprintEnrollEnrollingTest Fixes: 232024488 Fixes: 233091341 Fixes: 241165082 Fixes: 242218240 Fixes: 243813773 Change-Id: I1fa0b9349545586919eceeb9d05f365c2f2ec491 Merged-In: I1fa0b9349545586919eceeb9d05f365c2f2ec491
This commit is contained in:
@@ -23,11 +23,16 @@ import android.animation.ObjectAnimator;
|
||||
import android.annotation.IntDef;
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.annotation.RawRes;
|
||||
import android.app.Dialog;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.content.res.Configuration;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.PorterDuffColorFilter;
|
||||
import android.graphics.drawable.Animatable2;
|
||||
import android.graphics.drawable.AnimatedVectorDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
@@ -65,6 +70,8 @@ import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
||||
import com.android.settingslib.display.DisplayDensityUtils;
|
||||
|
||||
import com.airbnb.lottie.LottieAnimationView;
|
||||
import com.airbnb.lottie.LottieProperty;
|
||||
import com.airbnb.lottie.model.KeyPath;
|
||||
import com.google.android.setupcompat.template.FooterBarMixin;
|
||||
import com.google.android.setupcompat.template.FooterButton;
|
||||
import com.google.android.setupcompat.util.WizardManagerHelper;
|
||||
@@ -94,11 +101,33 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
||||
private static final int STAGE_LEFT_EDGE = 3;
|
||||
private static final int STAGE_RIGHT_EDGE = 4;
|
||||
|
||||
@VisibleForTesting
|
||||
protected static final int SFPS_STAGE_NO_ANIMATION = 0;
|
||||
|
||||
@VisibleForTesting
|
||||
protected static final int SFPS_STAGE_CENTER = 1;
|
||||
|
||||
@VisibleForTesting
|
||||
protected static final int SFPS_STAGE_FINGERTIP = 2;
|
||||
|
||||
@VisibleForTesting
|
||||
protected static final int SFPS_STAGE_LEFT_EDGE = 3;
|
||||
|
||||
@VisibleForTesting
|
||||
protected static final int SFPS_STAGE_RIGHT_EDGE = 4;
|
||||
|
||||
@IntDef({STAGE_UNKNOWN, STAGE_CENTER, STAGE_GUIDED, STAGE_FINGERTIP, STAGE_LEFT_EDGE,
|
||||
STAGE_RIGHT_EDGE})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
private @interface EnrollStage {}
|
||||
|
||||
|
||||
@VisibleForTesting
|
||||
@IntDef({STAGE_UNKNOWN, SFPS_STAGE_NO_ANIMATION, SFPS_STAGE_CENTER, SFPS_STAGE_FINGERTIP,
|
||||
SFPS_STAGE_LEFT_EDGE, SFPS_STAGE_RIGHT_EDGE})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
protected @interface SfpsEnrollStage {}
|
||||
|
||||
/**
|
||||
* If we don't see progress during this time, we show an error message to remind the users that
|
||||
* they need to lift the finger and touch again.
|
||||
@@ -123,10 +152,9 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
||||
|
||||
private FingerprintManager mFingerprintManager;
|
||||
private boolean mCanAssumeUdfps;
|
||||
private boolean mCanAssumeSidefps;
|
||||
private boolean mCanAssumeSfps;
|
||||
@Nullable private ProgressBar mProgressBar;
|
||||
private ObjectAnimator mProgressAnim;
|
||||
private TextView mDescriptionText;
|
||||
private TextView mErrorText;
|
||||
private Interpolator mFastOutSlowInInterpolator;
|
||||
private Interpolator mLinearOutSlowInInterpolator;
|
||||
@@ -146,6 +174,11 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
||||
private boolean mHaveShownUdfpsTipLottie;
|
||||
private boolean mHaveShownUdfpsLeftEdgeLottie;
|
||||
private boolean mHaveShownUdfpsRightEdgeLottie;
|
||||
private boolean mHaveShownSfpsNoAnimationLottie;
|
||||
private boolean mHaveShownSfpsCenterLottie;
|
||||
private boolean mHaveShownSfpsTipLottie;
|
||||
private boolean mHaveShownSfpsLeftEdgeLottie;
|
||||
private boolean mHaveShownSfpsRightEdgeLottie;
|
||||
private boolean mShouldShowLottie;
|
||||
|
||||
private OrientationEventListener mOrientationEventListener;
|
||||
@@ -188,7 +221,7 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
||||
final List<FingerprintSensorPropertiesInternal> props =
|
||||
mFingerprintManager.getSensorPropertiesInternal();
|
||||
mCanAssumeUdfps = props != null && props.size() == 1 && props.get(0).isAnyUdfpsType();
|
||||
mCanAssumeSidefps = props != null && props.size() == 1 && props.get(0).isAnySidefpsType();
|
||||
mCanAssumeSfps = props != null && props.size() == 1 && props.get(0).isAnySidefpsType();
|
||||
|
||||
mAccessibilityManager = getSystemService(AccessibilityManager.class);
|
||||
mIsAccessibilityEnabled = mAccessibilityManager.isEnabled();
|
||||
@@ -226,13 +259,16 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
||||
break;
|
||||
}
|
||||
setDescriptionText(R.string.security_settings_udfps_enroll_start_message);
|
||||
} else if (mCanAssumeSfps) {
|
||||
setContentView(R.layout.sfps_enroll_enrolling);
|
||||
setDescriptionText(R.string.security_settings_fingerprint_enroll_start_message);
|
||||
} else {
|
||||
setContentView(R.layout.fingerprint_enroll_enrolling);
|
||||
setDescriptionText(R.string.security_settings_fingerprint_enroll_start_message);
|
||||
}
|
||||
|
||||
mIsSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent());
|
||||
if (mCanAssumeUdfps) {
|
||||
if (mCanAssumeUdfps || mCanAssumeSfps) {
|
||||
updateTitleAndDescription();
|
||||
} else {
|
||||
setHeaderText(R.string.security_settings_fingerprint_enroll_repeat_title);
|
||||
@@ -438,6 +474,9 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
||||
if (mCanAssumeUdfps) {
|
||||
updateTitleAndDescriptionForUdfps();
|
||||
return;
|
||||
} else if (mCanAssumeSfps) {
|
||||
updateTitleAndDescriptionForSfps();
|
||||
return;
|
||||
}
|
||||
|
||||
if (mSidecar == null || mSidecar.getEnrollmentSteps() == -1) {
|
||||
@@ -467,12 +506,10 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
||||
setHeaderText(R.string.security_settings_udfps_enroll_fingertip_title);
|
||||
if (!mHaveShownUdfpsTipLottie && mIllustrationLottie != null) {
|
||||
mHaveShownUdfpsTipLottie = true;
|
||||
setDescriptionText("");
|
||||
mIllustrationLottie.setAnimation(R.raw.udfps_tip_hint_lottie);
|
||||
mIllustrationLottie.setVisibility(View.VISIBLE);
|
||||
mIllustrationLottie.playAnimation();
|
||||
mIllustrationLottie.setContentDescription(
|
||||
getString(R.string.security_settings_udfps_tip_fingerprint_help));
|
||||
getString(R.string.security_settings_udfps_tip_fingerprint_help)
|
||||
);
|
||||
configureEnrollmentStage("", R.raw.udfps_tip_hint_lottie);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -480,12 +517,10 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
||||
setHeaderText(R.string.security_settings_udfps_enroll_left_edge_title);
|
||||
if (!mHaveShownUdfpsLeftEdgeLottie && mIllustrationLottie != null) {
|
||||
mHaveShownUdfpsLeftEdgeLottie = true;
|
||||
setDescriptionText("");
|
||||
mIllustrationLottie.setAnimation(R.raw.udfps_left_edge_hint_lottie);
|
||||
mIllustrationLottie.setVisibility(View.VISIBLE);
|
||||
mIllustrationLottie.playAnimation();
|
||||
mIllustrationLottie.setContentDescription(
|
||||
getString(R.string.security_settings_udfps_side_fingerprint_help));
|
||||
getString(R.string.security_settings_udfps_side_fingerprint_help)
|
||||
);
|
||||
configureEnrollmentStage("", R.raw.udfps_left_edge_hint_lottie);
|
||||
} else if (mIllustrationLottie == null) {
|
||||
if (isStageHalfCompleted()) {
|
||||
setDescriptionText(
|
||||
@@ -499,12 +534,11 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
||||
setHeaderText(R.string.security_settings_udfps_enroll_right_edge_title);
|
||||
if (!mHaveShownUdfpsRightEdgeLottie && mIllustrationLottie != null) {
|
||||
mHaveShownUdfpsRightEdgeLottie = true;
|
||||
setDescriptionText("");
|
||||
mIllustrationLottie.setAnimation(R.raw.udfps_right_edge_hint_lottie);
|
||||
mIllustrationLottie.setVisibility(View.VISIBLE);
|
||||
mIllustrationLottie.playAnimation();
|
||||
mIllustrationLottie.setContentDescription(
|
||||
getString(R.string.security_settings_udfps_side_fingerprint_help));
|
||||
getString(R.string.security_settings_udfps_side_fingerprint_help)
|
||||
);
|
||||
configureEnrollmentStage("", R.raw.udfps_right_edge_hint_lottie);
|
||||
|
||||
} else if (mIllustrationLottie == null) {
|
||||
if (isStageHalfCompleted()) {
|
||||
setDescriptionText(
|
||||
@@ -529,9 +563,98 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
||||
getLayout().getHeaderTextView().setContentDescription(description);
|
||||
setTitle(description);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Interrupt any existing talkback speech to prevent stacking talkback messages
|
||||
private void clearTalkback() {
|
||||
AccessibilityManager.getInstance(getApplicationContext()).interrupt();
|
||||
}
|
||||
|
||||
private void updateTitleAndDescriptionForSfps() {
|
||||
if (mIsAccessibilityEnabled) {
|
||||
clearTalkback();
|
||||
getLayout().getDescriptionTextView().setAccessibilityLiveRegion(
|
||||
View.ACCESSIBILITY_LIVE_REGION_POLITE);
|
||||
}
|
||||
switch (getCurrentSfpsStage()) {
|
||||
case SFPS_STAGE_NO_ANIMATION:
|
||||
setHeaderText(R.string.security_settings_fingerprint_enroll_repeat_title);
|
||||
if (!mHaveShownSfpsNoAnimationLottie && mIllustrationLottie != null) {
|
||||
mHaveShownSfpsNoAnimationLottie = true;
|
||||
mIllustrationLottie.setContentDescription(
|
||||
getString(
|
||||
R.string.security_settings_sfps_animation_a11y_label,
|
||||
0
|
||||
)
|
||||
);
|
||||
configureEnrollmentStage(
|
||||
getString(R.string.security_settings_sfps_enroll_start_message),
|
||||
R.raw.sfps_lottie_no_animation
|
||||
);
|
||||
}
|
||||
break;
|
||||
|
||||
case SFPS_STAGE_CENTER:
|
||||
setHeaderText(R.string.security_settings_sfps_enroll_finger_center_title);
|
||||
if (!mHaveShownSfpsCenterLottie && mIllustrationLottie != null) {
|
||||
mHaveShownSfpsCenterLottie = true;
|
||||
configureEnrollmentStage(
|
||||
getString(R.string.security_settings_sfps_enroll_start_message),
|
||||
R.raw.sfps_lottie_pad_center
|
||||
);
|
||||
}
|
||||
break;
|
||||
|
||||
case SFPS_STAGE_FINGERTIP:
|
||||
setHeaderText(R.string.security_settings_sfps_enroll_fingertip_title);
|
||||
if (!mHaveShownSfpsTipLottie && mIllustrationLottie != null) {
|
||||
mHaveShownSfpsTipLottie = true;
|
||||
configureEnrollmentStage("", R.raw.sfps_lottie_tip);
|
||||
}
|
||||
break;
|
||||
|
||||
case SFPS_STAGE_LEFT_EDGE:
|
||||
setHeaderText(R.string.security_settings_sfps_enroll_left_edge_title);
|
||||
if (!mHaveShownSfpsLeftEdgeLottie && mIllustrationLottie != null) {
|
||||
mHaveShownSfpsLeftEdgeLottie = true;
|
||||
configureEnrollmentStage("", R.raw.sfps_lottie_left_edge);
|
||||
}
|
||||
break;
|
||||
|
||||
case SFPS_STAGE_RIGHT_EDGE:
|
||||
setHeaderText(R.string.security_settings_sfps_enroll_right_edge_title);
|
||||
if (!mHaveShownSfpsRightEdgeLottie && mIllustrationLottie != null) {
|
||||
mHaveShownSfpsRightEdgeLottie = true;
|
||||
configureEnrollmentStage("", R.raw.sfps_lottie_right_edge);
|
||||
}
|
||||
break;
|
||||
|
||||
case STAGE_UNKNOWN:
|
||||
default:
|
||||
// Don't use BiometricEnrollBase#setHeaderText, since that invokes setTitle,
|
||||
// which gets announced for a11y upon entering the page. For SFPS, we want to
|
||||
// announce a different string for a11y upon entering the page.
|
||||
getLayout().setHeaderText(
|
||||
R.string.security_settings_sfps_enroll_find_sensor_title);
|
||||
setDescriptionText(R.string.security_settings_sfps_enroll_start_message);
|
||||
final CharSequence description = getString(
|
||||
R.string.security_settings_sfps_enroll_find_sensor_message);
|
||||
getLayout().getHeaderTextView().setContentDescription(description);
|
||||
setTitle(description);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void configureEnrollmentStage(CharSequence description, @RawRes int lottie) {
|
||||
setDescriptionText(description);
|
||||
mIllustrationLottie.setAnimation(lottie);
|
||||
mIllustrationLottie.setVisibility(View.VISIBLE);
|
||||
mIllustrationLottie.playAnimation();
|
||||
}
|
||||
|
||||
@EnrollStage
|
||||
private int getCurrentStage() {
|
||||
if (mSidecar == null || mSidecar.getEnrollmentSteps() == -1) {
|
||||
@@ -552,6 +675,26 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
||||
}
|
||||
}
|
||||
|
||||
@SfpsEnrollStage
|
||||
private int getCurrentSfpsStage() {
|
||||
if (mSidecar == null) {
|
||||
return STAGE_UNKNOWN;
|
||||
}
|
||||
|
||||
final int progressSteps = mSidecar.getEnrollmentSteps() - mSidecar.getEnrollmentRemaining();
|
||||
if (progressSteps < getStageThresholdSteps(0)) {
|
||||
return SFPS_STAGE_NO_ANIMATION;
|
||||
} else if (progressSteps < getStageThresholdSteps(1)) {
|
||||
return SFPS_STAGE_CENTER;
|
||||
} else if (progressSteps < getStageThresholdSteps(2)) {
|
||||
return SFPS_STAGE_FINGERTIP;
|
||||
} else if (progressSteps < getStageThresholdSteps(3)) {
|
||||
return SFPS_STAGE_LEFT_EDGE;
|
||||
} else {
|
||||
return SFPS_STAGE_RIGHT_EDGE;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isStageHalfCompleted() {
|
||||
// Prior to first enrollment step.
|
||||
if (mSidecar == null || mSidecar.getEnrollmentSteps() == -1) {
|
||||
@@ -574,7 +717,8 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
||||
return true;
|
||||
}
|
||||
|
||||
private int getStageThresholdSteps(int index) {
|
||||
@VisibleForTesting
|
||||
protected int getStageThresholdSteps(int index) {
|
||||
if (mSidecar == null || mSidecar.getEnrollmentSteps() == -1) {
|
||||
Log.w(TAG, "getStageThresholdSteps: Enrollment not started yet");
|
||||
return 1;
|
||||
@@ -586,7 +730,7 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
||||
@Override
|
||||
public void onEnrollmentHelp(int helpMsgId, CharSequence helpString) {
|
||||
if (!TextUtils.isEmpty(helpString)) {
|
||||
if (!mCanAssumeUdfps) {
|
||||
if (!(mCanAssumeUdfps || mCanAssumeSfps)) {
|
||||
mErrorText.removeCallbacks(mTouchAgainRunnable);
|
||||
}
|
||||
showError(helpString);
|
||||
@@ -598,27 +742,42 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
||||
onCancelEnrollment(errMsgId);
|
||||
}
|
||||
|
||||
private void announceEnrollmentProgress(CharSequence announcement) {
|
||||
AccessibilityEvent e = AccessibilityEvent.obtain();
|
||||
e.setEventType(AccessibilityEvent.TYPE_ANNOUNCEMENT);
|
||||
e.setClassName(getClass().getName());
|
||||
e.setPackageName(getPackageName());
|
||||
e.getText().add(announcement);
|
||||
mAccessibilityManager.sendAccessibilityEvent(e);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnrollmentProgressChange(int steps, int remaining) {
|
||||
updateProgress(true /* animate */);
|
||||
final int percent = (int) (((float) (steps - remaining) / (float) steps) * 100);
|
||||
if (mCanAssumeSfps) {
|
||||
if (mIsAccessibilityEnabled) {
|
||||
CharSequence announcement = getString(
|
||||
R.string.security_settings_sfps_enroll_progress_a11y_message, percent);
|
||||
announceEnrollmentProgress(announcement);
|
||||
mIllustrationLottie.setContentDescription(
|
||||
getString(
|
||||
R.string.security_settings_sfps_animation_a11y_label,
|
||||
percent)
|
||||
);
|
||||
}
|
||||
}
|
||||
updateTitleAndDescription();
|
||||
animateFlash();
|
||||
if (!mCanAssumeUdfps) {
|
||||
if (mCanAssumeUdfps) {
|
||||
if (mIsAccessibilityEnabled) {
|
||||
CharSequence announcement = getString(
|
||||
R.string.security_settings_udfps_enroll_progress_a11y_message, percent);
|
||||
announceEnrollmentProgress(announcement);
|
||||
}
|
||||
} else if (!mCanAssumeSfps) {
|
||||
mErrorText.removeCallbacks(mTouchAgainRunnable);
|
||||
mErrorText.postDelayed(mTouchAgainRunnable, HINT_TIMEOUT_DURATION);
|
||||
} else {
|
||||
|
||||
if (mIsAccessibilityEnabled) {
|
||||
final int percent = (int) (((float)(steps - remaining) / (float) steps) * 100);
|
||||
CharSequence cs = getString(
|
||||
R.string.security_settings_udfps_enroll_progress_a11y_message, percent);
|
||||
AccessibilityEvent e = AccessibilityEvent.obtain();
|
||||
e.setEventType(AccessibilityEvent.TYPE_ANNOUNCEMENT);
|
||||
e.setClassName(getClass().getName());
|
||||
e.setPackageName(getPackageName());
|
||||
e.getText().add(cs);
|
||||
mAccessibilityManager.sendAccessibilityEvent(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -661,10 +820,13 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
||||
}
|
||||
|
||||
private void showError(CharSequence error) {
|
||||
if (mCanAssumeUdfps || mCanAssumeSidefps) {
|
||||
if (mCanAssumeUdfps || mCanAssumeSfps) {
|
||||
setHeaderText(error);
|
||||
// Show nothing for subtitle when getting an error message.
|
||||
setDescriptionText("");
|
||||
if (mCanAssumeSfps) {
|
||||
applySfpsErrorDynamicColors(getApplicationContext(), mIllustrationLottie, true);
|
||||
}
|
||||
} else {
|
||||
mErrorText.setText(error);
|
||||
if (mErrorText.getVisibility() == View.INVISIBLE) {
|
||||
@@ -692,7 +854,10 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
||||
}
|
||||
|
||||
private void clearError() {
|
||||
if (!mCanAssumeUdfps && mErrorText.getVisibility() == View.VISIBLE) {
|
||||
if (mCanAssumeSfps) {
|
||||
applySfpsErrorDynamicColors(getApplicationContext(), mIllustrationLottie, false);
|
||||
}
|
||||
if ((!(mCanAssumeUdfps || mCanAssumeSfps)) && mErrorText.getVisibility() == View.VISIBLE) {
|
||||
mErrorText.animate()
|
||||
.alpha(0f)
|
||||
.translationY(getResources().getDimensionPixelSize(
|
||||
@@ -704,6 +869,44 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies dynamic colors corresponding to showing or clearing errors on the progress bar
|
||||
* and finger lottie for SFPS
|
||||
*/
|
||||
private void applySfpsErrorDynamicColors(Context context, LottieAnimationView composition,
|
||||
boolean isError) {
|
||||
applyProgressBarDynamicColor(context, isError);
|
||||
applyLottieDynamicColor(context, composition, isError);
|
||||
}
|
||||
|
||||
private void applyProgressBarDynamicColor(Context context, boolean isError) {
|
||||
if (mProgressBar != null) {
|
||||
int error_color = context.getColor(R.color.sfps_enrollment_progress_bar_error_color);
|
||||
int progress_bar_fill_color = context.getColor(
|
||||
R.color.sfps_enrollment_progress_bar_fill_color);
|
||||
ColorStateList fillColor = ColorStateList.valueOf(
|
||||
isError ? error_color : progress_bar_fill_color);
|
||||
mProgressBar.setProgressTintList(fillColor);
|
||||
mProgressBar.setProgressTintMode(PorterDuff.Mode.SRC_ATOP);
|
||||
mProgressBar.invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
private void applyLottieDynamicColor(Context context, LottieAnimationView composition,
|
||||
boolean isError) {
|
||||
if (composition != null) {
|
||||
int error_color = context.getColor(R.color.sfps_enrollment_fp_error_color);
|
||||
int fp_captured_color = context.getColor(R.color.sfps_enrollment_fp_captured_color);
|
||||
int color = isError ? error_color : fp_captured_color;
|
||||
composition.addValueCallback(
|
||||
new KeyPath(".blue100", "**"),
|
||||
LottieProperty.COLOR_FILTER,
|
||||
frameInfo -> new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP)
|
||||
);
|
||||
composition.invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
private void listenOrientationEvent() {
|
||||
mOrientationEventListener = new OrientationEventListener(this) {
|
||||
@Override
|
||||
@@ -803,20 +1006,24 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
||||
}
|
||||
|
||||
private void updateOrientation(int orientation) {
|
||||
switch(orientation) {
|
||||
case Configuration.ORIENTATION_LANDSCAPE: {
|
||||
mIllustrationLottie = null;
|
||||
break;
|
||||
}
|
||||
case Configuration.ORIENTATION_PORTRAIT: {
|
||||
if (mShouldShowLottie) {
|
||||
mIllustrationLottie = findViewById(R.id.illustration_lottie);
|
||||
if (mCanAssumeSfps && mShouldShowLottie) {
|
||||
mIllustrationLottie = findViewById(R.id.illustration_lottie);
|
||||
} else {
|
||||
switch(orientation) {
|
||||
case Configuration.ORIENTATION_LANDSCAPE: {
|
||||
mIllustrationLottie = null;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case Configuration.ORIENTATION_PORTRAIT: {
|
||||
if (mShouldShowLottie) {
|
||||
mIllustrationLottie = findViewById(R.id.illustration_lottie);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
Log.e(TAG, "Error unhandled configuration change");
|
||||
break;
|
||||
}
|
||||
default:
|
||||
Log.e(TAG, "Error unhandled configuration change");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -859,4 +1066,4 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
||||
return SettingsEnums.DIALOG_FINGERPRINT_ICON_TOUCH;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -58,7 +58,7 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
|
||||
private FingerprintEnrollSidecar mSidecar;
|
||||
private boolean mNextClicked;
|
||||
private boolean mCanAssumeUdfps;
|
||||
private boolean mCanAssumeSidefps;
|
||||
private boolean mCanAssumeSfps;
|
||||
|
||||
private OrientationEventListener mOrientationEventListener;
|
||||
private int mPreviousRotation = 0;
|
||||
@@ -71,7 +71,7 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
|
||||
final List<FingerprintSensorPropertiesInternal> props =
|
||||
fingerprintManager.getSensorPropertiesInternal();
|
||||
mCanAssumeUdfps = props != null && props.size() == 1 && props.get(0).isAnyUdfpsType();
|
||||
mCanAssumeSidefps = props != null && props.size() == 1 && props.get(0).isAnySidefpsType();
|
||||
mCanAssumeSfps = props != null && props.size() == 1 && props.get(0).isAnySidefpsType();
|
||||
setContentView(getContentView());
|
||||
mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
|
||||
mFooterBarMixin.setSecondaryButton(
|
||||
@@ -102,10 +102,9 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
|
||||
if (am.isEnabled()) {
|
||||
lottieAnimationView.setAnimation(R.raw.udfps_edu_a11y_lottie);
|
||||
}
|
||||
|
||||
} else if (mCanAssumeSidefps) {
|
||||
setHeaderText(R.string.security_settings_fingerprint_enroll_find_sensor_title);
|
||||
setDescriptionText(R.string.security_settings_fingerprint_enroll_find_sensor_message);
|
||||
} else if (mCanAssumeSfps) {
|
||||
setHeaderText(R.string.security_settings_sfps_enroll_find_sensor_title);
|
||||
setDescriptionText(R.string.security_settings_sfps_enroll_find_sensor_message);
|
||||
final LottieAnimationView lottieAnimationView = findViewById(R.id.illustration_lottie);
|
||||
final LottieAnimationView lottieAnimationViewPortrait =
|
||||
findViewById(R.id.illustration_lottie_portrait);
|
||||
@@ -201,7 +200,7 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
|
||||
protected int getContentView() {
|
||||
if (mCanAssumeUdfps) {
|
||||
return R.layout.udfps_enroll_find_sensor_layout;
|
||||
} else if (mCanAssumeSidefps) {
|
||||
} else if (mCanAssumeSfps) {
|
||||
return R.layout.sfps_enroll_find_sensor_layout;
|
||||
}
|
||||
return R.layout.fingerprint_enroll_find_sensor;
|
||||
@@ -374,7 +373,7 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
|
||||
}
|
||||
|
||||
private void listenOrientationEvent() {
|
||||
if (!mCanAssumeSidefps) {
|
||||
if (!mCanAssumeSfps) {
|
||||
// Do nothing if the device doesn't support SideFPS.
|
||||
return;
|
||||
}
|
||||
@@ -393,7 +392,7 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
|
||||
}
|
||||
|
||||
private void stopListenOrientationEvent() {
|
||||
if (!mCanAssumeSidefps) {
|
||||
if (!mCanAssumeSfps) {
|
||||
// Do nothing if the device doesn't support SideFPS.
|
||||
return;
|
||||
}
|
||||
|
@@ -49,15 +49,29 @@ public class FingerprintEnrollFinish extends BiometricEnrollBase {
|
||||
@VisibleForTesting
|
||||
static final String FINGERPRINT_SUGGESTION_ACTIVITY =
|
||||
"com.android.settings.SetupFingerprintSuggestionActivity";
|
||||
private FingerprintManager mFingerprintManager;
|
||||
private boolean mCanAssumeSfps;
|
||||
|
||||
private boolean mIsAddAnotherOrFinish;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.fingerprint_enroll_finish);
|
||||
mFingerprintManager = getSystemService(FingerprintManager.class);
|
||||
final List<FingerprintSensorPropertiesInternal> props =
|
||||
mFingerprintManager.getSensorPropertiesInternal();
|
||||
mCanAssumeSfps = props != null && props.size() == 1 && props.get(0).isAnySidefpsType();
|
||||
if (mCanAssumeSfps) {
|
||||
setContentView(R.layout.sfps_enroll_finish);
|
||||
} else {
|
||||
setContentView(R.layout.fingerprint_enroll_finish);
|
||||
}
|
||||
setHeaderText(R.string.security_settings_fingerprint_enroll_finish_title);
|
||||
setDescriptionText(R.string.security_settings_fingerprint_enroll_finish_v2_message);
|
||||
if (mCanAssumeSfps) {
|
||||
setDescriptionText(R.string.security_settings_sfps_enroll_finish);
|
||||
} else {
|
||||
setDescriptionText(R.string.security_settings_fingerprint_enroll_finish_v2_message);
|
||||
}
|
||||
|
||||
mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
|
||||
mFooterBarMixin.setSecondaryButton(
|
||||
|
Reference in New Issue
Block a user