From 869e99687401a11cab27051092be4ba172315c8e Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Wed, 19 May 2021 12:03:30 -0700 Subject: [PATCH 1/2] Update UDFPS fingerprint enrollment 1) Update UDFPS FindSensor to more of an EDU flow 2) Update UDFPS enrolling page to announce strings properly Bug: 187460696 Test: manual Change-Id: I30a77bd6bba911afb82e158d5e9f35b644ec880d --- res/values/strings.xml | 16 +++++++---- .../biometrics/BiometricEnrollBase.java | 10 ++++++- .../FingerprintEnrollEnrolling.java | 28 ++++++++++++++++--- .../FingerprintEnrollFindSensor.java | 21 ++++++++++++-- 4 files changed, 62 insertions(+), 13 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index b3dd343ab1d..3c9856a7dad 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1009,13 +1009,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 @@ -1029,7 +1031,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 @@ -1039,7 +1043,9 @@ 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 Fingerprint added diff --git a/src/com/android/settings/biometrics/BiometricEnrollBase.java b/src/com/android/settings/biometrics/BiometricEnrollBase.java index 67148d141ba..f7af1939296 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollBase.java +++ b/src/com/android/settings/biometrics/BiometricEnrollBase.java @@ -175,20 +175,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..d987c05d521 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java @@ -37,6 +37,7 @@ import android.text.TextUtils; import android.util.Log; import android.view.MotionEvent; import android.view.View; +import android.view.accessibility.AccessibilityManager; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; import android.widget.ProgressBar; @@ -111,6 +112,7 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { private boolean mRestoring; private Vibrator mVibrator; private boolean mIsSetupWizard; + private boolean mIsAccessibilityEnabled; @Override protected void onCreate(Bundle savedInstanceState) { @@ -121,6 +123,9 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { fingerprintManager.getSensorPropertiesInternal(); mCanAssumeUdfps = props.size() == 1 && props.get(0).isAnyUdfpsType(); + final AccessibilityManager am = getSystemService(AccessibilityManager.class); + mIsAccessibilityEnabled = am.isEnabled(); + if (mCanAssumeUdfps) { if (BiometricUtils.isReverseLandscape(getApplicationContext())) { setContentView(R.layout.udfps_enroll_enrolling_land); @@ -134,8 +139,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 +287,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 +311,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); } diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java index c7500e8e300..7c64175c786 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); From e25713054abf6a5db0774a93f9913f8965e4ddf9 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Wed, 19 May 2021 15:53:20 -0700 Subject: [PATCH 2/2] Announce UDPFS enrollment percentage Bug: 187460696 Test: manual Change-Id: I5989a67e1fa1ed078677a69b2d841d5f1f1ee691 --- res/values/strings.xml | 2 ++ .../FingerprintEnrollEnrolling.java | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 3c9856a7dad..e25deb35d69 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1046,6 +1046,8 @@ 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/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java index d987c05d521..9b19ef796c0 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java @@ -37,6 +37,7 @@ 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; @@ -112,6 +113,7 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { private boolean mRestoring; private Vibrator mVibrator; private boolean mIsSetupWizard; + private AccessibilityManager mAccessibilityManager; private boolean mIsAccessibilityEnabled; @Override @@ -123,8 +125,8 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { fingerprintManager.getSensorPropertiesInternal(); mCanAssumeUdfps = props.size() == 1 && props.get(0).isAnyUdfpsType(); - final AccessibilityManager am = getSystemService(AccessibilityManager.class); - mIsAccessibilityEnabled = am.isEnabled(); + mAccessibilityManager = getSystemService(AccessibilityManager.class); + mIsAccessibilityEnabled = mAccessibilityManager.isEnabled(); if (mCanAssumeUdfps) { if (BiometricUtils.isReverseLandscape(getApplicationContext())) { @@ -359,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); + } } }