From 243aa8e2e08858701bd82630762d3553abd1e1e8 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Thu, 16 Jul 2020 13:26:17 -0700 Subject: [PATCH] Add face enroll accessibility dialog When accessibility services such as talkback are enabled, and the user tries to start the non-accessibility enrollment flow, present a confirmation dialog. Fixes: 152633740 Test: Enable talkback, start enrollment 1) Accessibility flow --> no dialog, as expected 2) Non-accessibility flow --> new dialog shown Test: No talkback, start enrollment. No dialog shown in either case Change-Id: I0cd07a9d0012f6c9bea36e74365a6707755d3ab7 --- res/values/strings.xml | 6 ++ .../face/FaceEnrollAccessibilityDialog.java | 71 +++++++++++++++++++ .../biometrics/face/FaceEnrollEducation.java | 21 ++++-- 3 files changed, 93 insertions(+), 5 deletions(-) create mode 100644 src/com/android/settings/biometrics/face/FaceEnrollAccessibilityDialog.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 19e159886ef..2673aa7e7e7 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -730,6 +730,12 @@ Start + + If accessibility face unlock is turned off, some setup steps may not work properly with TalkBack. + + Go back + + Continue setup Use accessibility setup diff --git a/src/com/android/settings/biometrics/face/FaceEnrollAccessibilityDialog.java b/src/com/android/settings/biometrics/face/FaceEnrollAccessibilityDialog.java new file mode 100644 index 00000000000..70428704d4c --- /dev/null +++ b/src/com/android/settings/biometrics/face/FaceEnrollAccessibilityDialog.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2020 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.face; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.settings.SettingsEnums; +import android.os.Bundle; + +import com.android.settings.R; +import com.android.settings.core.instrumentation.InstrumentedDialogFragment; + +/** + * Confirmation dialog shown to users with accessibility enabled who are trying to start the + * non-accessibility enrollment flow. + */ +public class FaceEnrollAccessibilityDialog extends InstrumentedDialogFragment { + private AlertDialog.OnClickListener mPositiveButtonListener; + + /** + * @return new instance of the dialog + */ + public static FaceEnrollAccessibilityDialog newInstance() { + return new FaceEnrollAccessibilityDialog(); + } + + public void setPositiveButtonListener(AlertDialog.OnClickListener listener) { + mPositiveButtonListener = listener; + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + + final int titleResId = + R.string.security_settings_face_enroll_education_accessibility_dialog_message; + final int negativeButtonResId = + R.string.security_settings_face_enroll_education_accessibility_dialog_negative; + final int positiveButtonResId = + R.string.security_settings_face_enroll_education_accessibility_dialog_positive; + + builder.setMessage(titleResId) + .setNegativeButton(negativeButtonResId, (dialog, which) -> { + dialog.cancel(); + }) + .setPositiveButton(positiveButtonResId, (dialog, which) -> { + mPositiveButtonListener.onClick(dialog, which); + }); + + return builder.create(); + } + + @Override + public int getMetricsCategory() { + return SettingsEnums.FACE_ENROLL_INTRO; + } +} diff --git a/src/com/android/settings/biometrics/face/FaceEnrollEducation.java b/src/com/android/settings/biometrics/face/FaceEnrollEducation.java index 3b84c35e7d3..4c4fa1174f0 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollEducation.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollEducation.java @@ -55,6 +55,7 @@ public class FaceEnrollEducation extends BiometricEnrollBase { private Intent mResultIntent; private TextView mDescriptionText; private boolean mNextClicked; + private boolean mAccessibilityEnabled; private CompoundButton.OnCheckedChangeListener mSwitchDiversityListener = new CompoundButton.OnCheckedChangeListener() { @@ -123,13 +124,12 @@ public class FaceEnrollEducation extends BiometricEnrollBase { .setTheme(R.style.SudGlifButton_Primary) .build(); - boolean accessibilityEnabled = false; final AccessibilityManager accessibilityManager = getApplicationContext().getSystemService( AccessibilityManager.class); if (accessibilityManager != null) { // Add additional check for touch exploration. This prevents other accessibility // features such as Live Transcribe from defaulting to the accessibility setup. - accessibilityEnabled = accessibilityManager.isEnabled() + mAccessibilityEnabled = accessibilityManager.isEnabled() && accessibilityManager.isTouchExplorationEnabled(); } mFooterBarMixin.setPrimaryButton(footerButton); @@ -147,7 +147,7 @@ public class FaceEnrollEducation extends BiometricEnrollBase { mSwitchDiversity.getSwitch().toggle(); }); - if (accessibilityEnabled) { + if (mAccessibilityEnabled) { accessibilityButton.callOnClick(); } } @@ -194,9 +194,20 @@ public class FaceEnrollEducation extends BiometricEnrollBase { if (mResultIntent != null) { intent.putExtras(mResultIntent); } - mNextClicked = true; + intent.putExtra(EXTRA_KEY_REQUIRE_DIVERSITY, !mSwitchDiversity.isChecked()); - startActivityForResult(intent, BIOMETRIC_FIND_SENSOR_REQUEST); + + if (!mSwitchDiversity.isChecked() && mAccessibilityEnabled) { + FaceEnrollAccessibilityDialog dialog = FaceEnrollAccessibilityDialog.newInstance(); + dialog.setPositiveButtonListener((dialog1, which) -> { + startActivityForResult(intent, BIOMETRIC_FIND_SENSOR_REQUEST); + mNextClicked = true; + }); + dialog.show(getSupportFragmentManager(), FaceEnrollAccessibilityDialog.class.getName()); + } else { + startActivityForResult(intent, BIOMETRIC_FIND_SENSOR_REQUEST); + mNextClicked = true; + } } protected void onSkipButtonClick(View view) {