Add an error dialog in FingerprintEnrollFindSensor

When a device stands for a while during the fingerprint enrollment, the
fingerprint icon will disappear without any warning message. This
change is trying to show a dialog to inform users.

Fixes: 180633056
Test: visual verified
1) Settings -> Security -> Fingerprint
2) Navigate to "Touch & hold the fingerprint icon" page
3) Let device stand for a while and see if there's a dialog shown

Change-Id: I69c8fb73f2a7406e4a379396e2624fb523e162a8
This commit is contained in:
Mill Chen
2021-03-30 21:49:11 +08:00
parent dc96037cea
commit 4606a292ac
3 changed files with 95 additions and 64 deletions

View File

@@ -46,7 +46,6 @@ import androidx.appcompat.app.AlertDialog;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.biometrics.BiometricEnrollSidecar; import com.android.settings.biometrics.BiometricEnrollSidecar;
import com.android.settings.biometrics.BiometricErrorDialog;
import com.android.settings.biometrics.BiometricUtils; import com.android.settings.biometrics.BiometricUtils;
import com.android.settings.biometrics.BiometricsEnrollEnrolling; import com.android.settings.biometrics.BiometricsEnrollEnrolling;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
@@ -111,32 +110,6 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
private boolean mRestoring; private boolean mRestoring;
private Vibrator mVibrator; private Vibrator mVibrator;
public static class FingerprintErrorDialog extends BiometricErrorDialog {
static FingerprintErrorDialog newInstance(CharSequence msg, int msgId) {
FingerprintErrorDialog dialog = new FingerprintErrorDialog();
Bundle args = new Bundle();
args.putCharSequence(KEY_ERROR_MSG, msg);
args.putInt(KEY_ERROR_ID, msgId);
dialog.setArguments(args);
return dialog;
}
@Override
public int getMetricsCategory() {
return SettingsEnums.DIALOG_FINGERPINT_ERROR;
}
@Override
public int getTitleResId() {
return R.string.security_settings_fingerprint_enroll_error_dialog_title;
}
@Override
public int getOkButtonTextResId() {
return R.string.security_settings_fingerprint_enroll_dialog_ok;
}
}
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@@ -339,19 +312,7 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
@Override @Override
public void onEnrollmentError(int errMsgId, CharSequence errString) { public void onEnrollmentError(int errMsgId, CharSequence errString) {
int msgId; FingerprintErrorDialog.showErrorDialog(this, errMsgId);
switch (errMsgId) {
case FingerprintManager.FINGERPRINT_ERROR_TIMEOUT:
// This message happens when the underlying crypto layer decides to revoke the
// enrollment auth token.
msgId = R.string.security_settings_fingerprint_enroll_error_timeout_dialog_message;
break;
default:
// There's nothing specific to tell the user about. Ask them to try again.
msgId = R.string.security_settings_fingerprint_enroll_error_generic_dialog_message;
break;
}
showErrorDialog(getText(msgId), errMsgId);
stopIconAnimation(); stopIconAnimation();
if (!mCanAssumeUdfps) { if (!mCanAssumeUdfps) {
mErrorText.removeCallbacks(mTouchAgainRunnable); mErrorText.removeCallbacks(mTouchAgainRunnable);
@@ -398,11 +359,6 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
return PROGRESS_BAR_MAX * progress / (steps + 1); return PROGRESS_BAR_MAX * progress / (steps + 1);
} }
private void showErrorDialog(CharSequence msg, int msgId) {
BiometricErrorDialog dlg = FingerprintErrorDialog.newInstance(msg, msgId);
dlg.show(getSupportFragmentManager(), FingerprintErrorDialog.class.getName());
}
private void showIconTouchDialog() { private void showIconTouchDialog() {
mIconTouchCount = 0; mIconTouchCount = 0;
new IconTouchDialog().show(getSupportFragmentManager(), null /* tag */); new IconTouchDialog().show(getSupportFragmentManager(), null /* tag */);

View File

@@ -28,7 +28,7 @@ import androidx.annotation.Nullable;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.biometrics.BiometricEnrollBase; import com.android.settings.biometrics.BiometricEnrollBase;
import com.android.settings.biometrics.BiometricEnrollSidecar.Listener; import com.android.settings.biometrics.BiometricEnrollSidecar;
import com.android.settings.biometrics.BiometricUtils; import com.android.settings.biometrics.BiometricUtils;
import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.password.ChooseLockSettingsHelper;
@@ -40,7 +40,8 @@ import java.util.List;
/** /**
* Activity explaining the fingerprint sensor location for fingerprint enrollment. * Activity explaining the fingerprint sensor location for fingerprint enrollment.
*/ */
public class FingerprintEnrollFindSensor extends BiometricEnrollBase { public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
BiometricEnrollSidecar.Listener {
@Nullable @Nullable
private FingerprintFindSensorAnimation mAnimation; private FingerprintFindSensorAnimation mAnimation;
@@ -139,25 +140,27 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase {
.add(mSidecar, FingerprintEnrollEnrolling.TAG_SIDECAR) .add(mSidecar, FingerprintEnrollEnrolling.TAG_SIDECAR)
.commitAllowingStateLoss(); .commitAllowingStateLoss();
} }
mSidecar.setListener(new Listener() { mSidecar.setListener(this);
@Override }
public void onEnrollmentProgressChange(int steps, int remaining) {
mNextClicked = true;
proceedToEnrolling(true /* cancelEnrollment */);
}
@Override @Override
public void onEnrollmentHelp(int helpMsgId, CharSequence helpString) { public void onEnrollmentProgressChange(int steps, int remaining) {
} mNextClicked = true;
proceedToEnrolling(true /* cancelEnrollment */);
}
@Override @Override
public void onEnrollmentError(int errMsgId, CharSequence errString) { public void onEnrollmentHelp(int helpMsgId, CharSequence helpString) {
if (mNextClicked && errMsgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED) { }
mNextClicked = false;
proceedToEnrolling(false /* cancelEnrollment */); @Override
} public void onEnrollmentError(int errMsgId, CharSequence errString) {
} if (mNextClicked && errMsgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED) {
}); mNextClicked = false;
proceedToEnrolling(false /* cancelEnrollment */);
} else {
FingerprintErrorDialog.showErrorDialog(this, errMsgId);
}
} }
@Override @Override

View File

@@ -0,0 +1,72 @@
/*
* Copyright 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.settings.biometrics.fingerprint;
import android.app.settings.SettingsEnums;
import android.hardware.fingerprint.FingerprintManager;
import android.os.Bundle;
import com.android.settings.R;
import com.android.settings.biometrics.BiometricEnrollBase;
import com.android.settings.biometrics.BiometricErrorDialog;
/**
* Fingerprint error dialog, will be shown when an error occurs during fingerprint enrollment.
*/
public class FingerprintErrorDialog extends BiometricErrorDialog {
public static void showErrorDialog(BiometricEnrollBase host, int errMsgId) {
final CharSequence errMsg = host.getText(getErrorMessage(errMsgId));
final FingerprintErrorDialog dialog = newInstance(errMsg, errMsgId);
dialog.show(host.getSupportFragmentManager(), FingerprintErrorDialog.class.getName());
}
private static int getErrorMessage(int errMsgId) {
switch (errMsgId) {
case FingerprintManager.FINGERPRINT_ERROR_TIMEOUT:
// This message happens when the underlying crypto layer decides to revoke the
// enrollment auth token.
return R.string.security_settings_fingerprint_enroll_error_timeout_dialog_message;
default:
// There's nothing specific to tell the user about. Ask them to try again.
return R.string.security_settings_fingerprint_enroll_error_generic_dialog_message;
}
}
private static FingerprintErrorDialog newInstance(CharSequence msg, int msgId) {
FingerprintErrorDialog dialog = new FingerprintErrorDialog();
Bundle args = new Bundle();
args.putCharSequence(KEY_ERROR_MSG, msg);
args.putInt(KEY_ERROR_ID, msgId);
dialog.setArguments(args);
return dialog;
}
@Override
public int getTitleResId() {
return R.string.security_settings_fingerprint_enroll_error_dialog_title;
}
@Override
public int getOkButtonTextResId() {
return R.string.security_settings_fingerprint_enroll_dialog_ok;
}
@Override
public int getMetricsCategory() {
return SettingsEnums.DIALOG_FINGERPINT_ERROR;
}
}