Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 243aa8e2 authored by Kevin Chyn's avatar Kevin Chyn
Browse files

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
parent f9cf7d32
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -730,6 +730,12 @@
    <string name="security_settings_face_enroll_education_message"></string>
    <!-- Button that takes the user to the enrollment activity [CHAR LIMIT=20] -->
    <string name="security_settings_face_enroll_education_start">Start</string>
    <!-- Confirmation dialog message shown when users with system accessibility features enabled try to start the non-accessibility version of enrollment [CHAR LIMIT=150] -->
    <string name="security_settings_face_enroll_education_accessibility_dialog_message">If accessibility face unlock is turned off, some setup steps may not work properly with TalkBack.</string>
    <!-- Negative button text for users who were shown the accessibility dialog [CHAR LIMIT=10] -->
    <string name="security_settings_face_enroll_education_accessibility_dialog_negative">Go back</string>
    <!-- Positive button text for users who were shown the accessibility dialog [CHAR LIMIT=20] -->
    <string name="security_settings_face_enroll_education_accessibility_dialog_positive">Continue setup</string>
    <!-- Button shown which shows accessibility toggles for face enrollment when clicked. [CHAR LIMIT=32] -->
    <string name="security_settings_face_enroll_introduction_accessibility">Use accessibility setup</string>
    <!-- Additional details shown when the accessibility toggle is expanded. [CHAR LIMIT=NONE]-->
+71 −0
Original line number Diff line number Diff line
/*
 * 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;
    }
}
+16 −5
Original line number Diff line number Diff line
@@ -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());

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