diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5badbb28e30..0f7651ad940 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1013,13 +1013,15 @@
Touch the sensor
- Touch & hold the fingerprint icon
+ How to set up your fingerprint
It\u2019s on the back of your phone. Use your index finger.
- The fingerprint sensor is on your screen
+ The fingerprint sensor is on your screen. You\u2019ll capture your fingerprint on the next screen.
+
+ Start
- The fingerprint sensor is on your screen. Move your finger across the screen to find the sensor.
+ Move your finger across the screen to find the sensor. Touch & hold the fingerprint sensor.
Illustration with device and fingerprint sensor location
@@ -1033,7 +1035,9 @@
Put your finger on the sensor and lift after you feel a vibration
- Keep your finger on the icon until you feel a vibration
+ Keep your finger on the sensor until you feel a vibration
+
+ Touch & hold the fingerprint sensor
Lift, then touch again
@@ -1043,7 +1047,11 @@
Keep lifting your finger to add the different parts of your fingerprint
- Touch & hold each time the icon moves. This helps capture your full fingerprint.
+ Touch & hold each time the fingerprint icon moves. This helps capture your full fingerprint.
+
+ This helps capture your full fingerprint
+
+ Enrolling fingerprint %d percent
Fingerprint added
diff --git a/src/com/android/settings/biometrics/BiometricEnrollBase.java b/src/com/android/settings/biometrics/BiometricEnrollBase.java
index 22420d0f3b5..03e18d75641 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollBase.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollBase.java
@@ -170,20 +170,28 @@ public abstract class BiometricEnrollBase extends InstrumentedActivity {
layoutTitle.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE);
}
getLayout().setHeaderText(title);
+ getLayout().getHeaderTextView().setContentDescription(title);
setTitle(title);
}
}
protected void setHeaderText(int resId) {
setHeaderText(resId, false /* force */);
+ getLayout().getHeaderTextView().setContentDescription(getText(resId));
}
protected void setHeaderText(CharSequence title) {
getLayout().setHeaderText(title);
+ getLayout().getHeaderTextView().setContentDescription(title);
}
protected void setDescriptionText(int resId) {
- getLayout().setDescriptionText(resId);
+ CharSequence previousDescription = getLayout().getDescriptionText();
+ CharSequence description = getString(resId);
+ // Prevent a11y for re-reading the same string
+ if (!TextUtils.equals(previousDescription, description)) {
+ getLayout().setDescriptionText(resId);
+ }
}
protected void setDescriptionText(CharSequence descriptionText) {
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
index 6bdd3f7ddd1..9b19ef796c0 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
@@ -37,6 +37,8 @@ import android.text.TextUtils;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityManager;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
import android.widget.ProgressBar;
@@ -111,6 +113,8 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
private boolean mRestoring;
private Vibrator mVibrator;
private boolean mIsSetupWizard;
+ private AccessibilityManager mAccessibilityManager;
+ private boolean mIsAccessibilityEnabled;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -121,6 +125,9 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
fingerprintManager.getSensorPropertiesInternal();
mCanAssumeUdfps = props.size() == 1 && props.get(0).isAnyUdfpsType();
+ mAccessibilityManager = getSystemService(AccessibilityManager.class);
+ mIsAccessibilityEnabled = mAccessibilityManager.isEnabled();
+
if (mCanAssumeUdfps) {
if (BiometricUtils.isReverseLandscape(getApplicationContext())) {
setContentView(R.layout.udfps_enroll_enrolling_land);
@@ -134,8 +141,8 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
}
mIsSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent());
- if (mCanAssumeUdfps && !mIsSetupWizard) {
- setHeaderText(R.string.security_settings_udfps_enroll_find_sensor_title);
+ if (mCanAssumeUdfps) {
+ updateTitleAndDescription();
} else {
setHeaderText(R.string.security_settings_fingerprint_enroll_repeat_title);
}
@@ -282,7 +289,18 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
private void updateTitleAndDescription() {
if (mSidecar == null || mSidecar.getEnrollmentSteps() == -1) {
if (mCanAssumeUdfps) {
+ // setHeaderText(R.string.security_settings_fingerprint_enroll_udfps_title);
+ // Don't use BiometricEnrollBase#setHeaderText, since that invokes setTitle,
+ // which gets announced for a11y upon entering the page. For UDFPS, we want to
+ // announce a different string for a11y upon entering the page.
+ getLayout().setHeaderText(
+ R.string.security_settings_fingerprint_enroll_udfps_title);
setDescriptionText(R.string.security_settings_udfps_enroll_start_message);
+
+ final CharSequence description = getString(
+ R.string.security_settings_udfps_enroll_a11y);
+ getLayout().getHeaderTextView().setContentDescription(description);
+ setTitle(description);
} else {
setDescriptionText(R.string.security_settings_fingerprint_enroll_start_message);
}
@@ -295,8 +313,12 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
setDescriptionText(R.string.security_settings_udfps_enroll_start_message);
} else {
if (mCanAssumeUdfps) {
- setHeaderText(R.string.security_settings_udfps_enroll_repeat_title_touch_icon);
- setDescriptionText(R.string.security_settings_udfps_enroll_repeat_message);
+ setHeaderText(R.string.security_settings_fingerprint_enroll_repeat_title);
+ if (mIsAccessibilityEnabled) {
+ setDescriptionText(R.string.security_settings_udfps_enroll_repeat_a11y_message);
+ } else {
+ setDescriptionText(R.string.security_settings_udfps_enroll_repeat_message);
+ }
} else {
setDescriptionText(R.string.security_settings_fingerprint_enroll_repeat_message);
}
@@ -339,6 +361,18 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
if (!mCanAssumeUdfps) {
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);
+ }
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java
index aee2c9adf80..012f486cac2 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java
@@ -62,7 +62,7 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
mFooterBarMixin.setSecondaryButton(
new FooterButton.Builder(this)
- .setText(R.string.skip_label)
+ .setText(R.string.security_settings_fingerprint_enroll_enrolling_skip)
.setListener(this::onSkipButtonClick)
.setButtonType(FooterButton.ButtonType.SKIP)
.setTheme(R.style.SudGlifButton_Secondary)
@@ -72,8 +72,14 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
if (mCanAssumeUdfps) {
setHeaderText(R.string.security_settings_udfps_enroll_find_sensor_title);
setDescriptionText(R.string.security_settings_udfps_enroll_find_sensor_message);
- final CharSequence description = getString(R.string.security_settings_udfps_enroll_find_sensor_a11y);
- getLayout().getDescriptionTextView().setContentDescription(description);
+ mFooterBarMixin.setPrimaryButton(
+ new FooterButton.Builder(this)
+ .setText(R.string.security_settings_udfps_enroll_find_sensor_start_button)
+ .setListener(this::onStartButtonClick)
+ .setButtonType(FooterButton.ButtonType.NEXT)
+ .setTheme(R.style.SudGlifButton_Primary)
+ .build()
+ );
} else {
setHeaderText(R.string.security_settings_fingerprint_enroll_find_sensor_title);
setDescriptionText(R.string.security_settings_fingerprint_enroll_find_sensor_message);
@@ -148,6 +154,11 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
}
private void startLookingForFingerprint() {
+ if (mCanAssumeUdfps) {
+ // UDFPS devices use this screen as an educational screen. Users should tap the
+ // "Start" button to move to the next screen to begin enrollment.
+ return;
+ }
mSidecar = (FingerprintEnrollSidecar) getSupportFragmentManager().findFragmentByTag(
FingerprintEnrollEnrolling.TAG_SIDECAR);
if (mSidecar == null) {
@@ -201,6 +212,10 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
}
}
+ private void onStartButtonClick(View view) {
+ startActivityForResult(getFingerprintEnrollingIntent(), ENROLL_REQUEST);
+ }
+
protected void onSkipButtonClick(View view) {
stopLookingForFingerprint();
setResult(RESULT_SKIP);