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);