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

Commit 67d6dff7 authored by lbill's avatar lbill
Browse files

Refine SkipDialog title and desc by device configs

1. Wrap isFaceSupportedInSUW() in Settings Utils
2. Wrap getCombinedScreenLockOptions in Settings Utils
3. Add EXTRA_KEY_FOR_SUW to judge if in SUW flow
4. Refactor SetupSkipDialog by hasFace, hasFingerprint,
   isSuw, isFaceSupported conditions
5. Clean up the mapping logic of SetupSkipDialog
6. Replace bools with @LockPatternUtils.CredentialType
7. Refine the logic for isFaceSupported
   ---------------------------------------
   Config |SuwSupportFace|!SuwSupportFace|
    isSuw |    true      |      false    |
   !isSuw |   hasFace    |     hasFace   |

Bug: 263070591
Bug: 279389803
Bug: 279195215
Test: adb shell am start -a android.settings.BIOMETRIC_ENROLL
Test: SUW(workprofile), post-SUW
Test: m RunSettingsRoboTests ROBOTEST_FILTER=com.android.settings.password
Test: m RunSettingsRoboTests ROBOTEST_FILTER=SetupSkipDialogTest
Change-Id: Ie7af4299695dc3983b4190929b4dd659c301c082
parent 5801e98d
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -991,6 +991,8 @@
    <string name="setup_fingerprint_enroll_enrolling_skip_title">Skip fingerprint setup?</string>
    <!-- Content of the dialog shown when the user tries to skip fingerprint setup, asking them to confirm the action [CHAR LIMIT=NONE] -->
    <string name="setup_fingerprint_enroll_enrolling_skip_message">You\u2019ve chosen to use your fingerprint as one way to unlock your phone. If you skip now, you\u2019ll need to set this up later. Setup takes only a minute or so.</string>
    <!-- Title of dialog shown when the user tries to skip for setup screen lock, warning them of potential consequences of not doing so [CHAR LIMIT=48]-->
    <string name="lock_screen_skip_setup_title">Skip setup for <xliff:g id="options" example="PIN • Face • Fingerprint">%s</xliff:g>?</string>
    <!-- Title of dialog shown when the user tries to skip setting up a PIN, warning them of potential consequences of not doing so [CHAR LIMIT=48]-->
    <string name="lock_screen_pin_skip_title">Skip PIN setup?</string>
    <!-- Title of dialog shown when the user tries to skip setting up a PIN, warning them of potential consequences of not doing so [CHAR LIMIT=90]-->
+48 −0
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@ import android.hardware.face.FaceManager;
import android.hardware.face.FaceSensorPropertiesInternal;
import android.os.Bundle;
import android.os.storage.StorageManager;
import android.text.BidiFormatter;
import android.text.SpannableStringBuilder;
import android.util.FeatureFlagUtils;
import android.util.Log;
import android.view.Surface;
@@ -38,6 +40,7 @@ import androidx.fragment.app.FragmentActivity;

import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.VerifyCredentialResponse;
import com.android.settings.R;
import com.android.settings.SetupWizardUtils;
import com.android.settings.biometrics.face.FaceEnrollIntroduction;
import com.android.settings.biometrics.fingerprint.FingerprintEnrollFindSensor;
@@ -45,6 +48,7 @@ import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroduction
import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollFindSensor;
import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollIntroduction;
import com.android.settings.biometrics2.ui.view.FingerprintEnrollmentActivity;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.password.ChooseLockGeneric;
import com.android.settings.password.ChooseLockSettingsHelper;
import com.android.settings.password.SetupChooseLockGeneric;
@@ -60,6 +64,9 @@ import java.lang.annotation.RetentionPolicy;
public class BiometricUtils {
    private static final String TAG = "BiometricUtils";

    /** The character ' • ' to separate the setup choose options */
    public static final String SEPARATOR = " \u2022 ";

    // Note: Theis IntDef must align SystemUI DevicePostureInt
    @IntDef(prefix = {"DEVICE_POSTURE_"}, value = {
            DEVICE_POSTURE_UNKNOWN,
@@ -496,4 +503,45 @@ public class BiometricUtils {
    public static boolean isLandscape(@NonNull Context context) {
        return context.getDisplay().getRotation() == Surface.ROTATION_90;
    }

    /**
     * Returns true if the device supports Face enrollment in SUW flow
     */
    public static boolean isFaceSupportedInSuw(Context context) {
        return FeatureFactory.getFactory(context).getFaceFeatureProvider().isSetupWizardSupported(
                context);
    }

    /**
     * Returns the combined screen lock options by device biometrics config
     * @param context the application context
     * @param screenLock the type of screen lock(PIN, Pattern, Password) in string
     * @param hasFingerprint device support fingerprint or not
     * @param isFaceSupported device support face or not
     * @return the options combined with screen lock, face, and fingerprint in String format.
     */
    public static String getCombinedScreenLockOptions(Context context,
            CharSequence screenLock, boolean hasFingerprint, boolean isFaceSupported) {
        final SpannableStringBuilder ssb = new SpannableStringBuilder();
        final BidiFormatter bidi = BidiFormatter.getInstance();
        // Assume the flow is "Screen Lock" + "Face" + "Fingerprint"
        ssb.append(bidi.unicodeWrap(screenLock));

        if (isFaceSupported) {
            ssb.append(bidi.unicodeWrap(SEPARATOR));
            ssb.append(bidi.unicodeWrap(
                    capitalize(context.getString(R.string.keywords_face_settings))));
        }

        if (hasFingerprint) {
            ssb.append(bidi.unicodeWrap(SEPARATOR));
            ssb.append(bidi.unicodeWrap(
                    capitalize(context.getString(R.string.security_settings_fingerprint))));
        }
        return ssb.toString();
    }

    private static String capitalize(final String input) {
        return Character.toUpperCase(input.charAt(0)) + input.substring(1);
    }
}
+10 −27
Original line number Diff line number Diff line
@@ -48,8 +48,6 @@ import android.os.UserHandle;
import android.os.UserManager;
import android.os.storage.StorageManager;
import android.service.persistentdata.PersistentDataBlockManager;
import android.text.BidiFormatter;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.util.EventLog;
import android.util.Log;
@@ -77,9 +75,9 @@ import com.android.settings.SetupWizardUtils;
import com.android.settings.Utils;
import com.android.settings.biometrics.BiometricEnrollActivity;
import com.android.settings.biometrics.BiometricEnrollBase;
import com.android.settings.biometrics.BiometricUtils;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.safetycenter.LockScreenSafetySource;
import com.android.settings.search.SearchFeatureProvider;
import com.android.settingslib.RestrictedPreference;
@@ -143,9 +141,6 @@ public class ChooseLockGeneric extends SettingsActivity {
         */
        public static final String EXTRA_CHOOSE_LOCK_GENERIC_EXTRAS = "choose_lock_generic_extras";

        /** The character ' • ' to separate the setup choose options */
        public static final String SEPARATOR = " \u2022 ";

        @VisibleForTesting
        static final int CONFIRM_EXISTING_REQUEST = 100;
        @VisibleForTesting
@@ -662,32 +657,20 @@ public class ChooseLockGeneric extends SettingsActivity {

        @VisibleForTesting
        String getBiometricsPreferenceTitle(@NonNull ScreenLockType secureType) {
            SpannableStringBuilder ssb = new SpannableStringBuilder();
            BidiFormatter bidi = BidiFormatter.getInstance();
            final boolean hasFingerprint = Utils.hasFingerprintHardware(getContext());
            final boolean hasFace = Utils.hasFaceHardware(getContext());
            final boolean isSuw = WizardManagerHelper.isAnySetupWizard(getIntent());
            final boolean isFaceSupported =
                    hasFace && (!isSuw || BiometricUtils.isFaceSupportedInSuw(getContext()));

            // Assume the flow is "Screen Lock" + "Face" + "Fingerprint"
            if (mController != null) {
                ssb.append(bidi.unicodeWrap(mController.getTitle(secureType)));
                return BiometricUtils.getCombinedScreenLockOptions(getContext(),
                        mController.getTitle(secureType), hasFingerprint, isFaceSupported);
            } else {
                Log.e(TAG, "ChooseLockGenericController is null!");
                return getResources().getString(R.string.error_title);
            }

            if (mFaceManager != null && mFaceManager.isHardwareDetected() && isFaceSupported()) {
                ssb.append(bidi.unicodeWrap(SEPARATOR));
                ssb.append(bidi.unicodeWrap(
                        getResources().getString(R.string.keywords_face_settings)));
            }
            if (mFingerprintManager != null && mFingerprintManager.isHardwareDetected()) {
                ssb.append(bidi.unicodeWrap(SEPARATOR));
                ssb.append(bidi.unicodeWrap(
                        getResources().getString(R.string.security_settings_fingerprint)));
            }
            return ssb.toString();
        }

        private boolean isFaceSupported() {
            return FeatureFactory.getFactory(getContext().getApplicationContext())
                    .getFaceFeatureProvider()
                    .isSetupWizardSupported(getContext().getApplicationContext());
        }

        private void setPreferenceTitle(ScreenLockType lock, @StringRes int title) {
+2 −0
Original line number Diff line number Diff line
@@ -64,6 +64,8 @@ public final class ChooseLockSettingsHelper {
    public static final String EXTRA_KEY_FOR_FACE = "for_face";
    // For the paths where multiple biometric sensors exist
    public static final String EXTRA_KEY_FOR_BIOMETRICS = "for_biometrics";
    // For the paths where setup biometrics in suw flow
    public static final String EXTRA_KEY_IS_SUW = "is_suw";
    public static final String EXTRA_KEY_FOREGROUND_ONLY = "foreground_only";
    public static final String EXTRA_KEY_REQUEST_GK_PW_HANDLE = "request_gk_pw_handle";
    // Gatekeeper password handle, which can subsequently be used to generate Gatekeeper
+7 −5
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.settings.password;
import static android.Manifest.permission.REQUEST_PASSWORD_COMPLEXITY;
import static android.app.admin.DevicePolicyManager.EXTRA_PASSWORD_COMPLEXITY;

import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_NONE;
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY;

import android.app.RemoteServiceException.MissingRequestPasswordComplexityPermissionException;
@@ -43,6 +44,7 @@ import com.android.settings.R;
import com.android.settings.SetupWizardUtils;
import com.android.settings.utils.SettingsDividerItemDecoration;

import com.google.android.setupcompat.util.WizardManagerHelper;
import com.google.android.setupdesign.GlifPreferenceLayout;
import com.google.android.setupdesign.util.ThemeHelper;

@@ -187,14 +189,14 @@ public class SetupChooseLockGeneric extends ChooseLockGeneric {
            final String key = preference.getKey();
            if (KEY_UNLOCK_SET_DO_LATER.equals(key)) {
                // show warning.
                final Intent intent = getActivity().getIntent();
                SetupSkipDialog dialog = SetupSkipDialog.newInstance(
                        getActivity().getIntent()
                                .getBooleanExtra(SetupSkipDialog.EXTRA_FRP_SUPPORTED, false),
                        /* isPatternMode= */ false,
                        /* isAlphaMode= */ false,
                        CREDENTIAL_TYPE_NONE,
                        intent.getBooleanExtra(SetupSkipDialog.EXTRA_FRP_SUPPORTED, false),
                        /* forFingerprint= */ false,
                        /* forFace= */ false,
                        /* forBiometrics= */ false
                        /* forBiometrics= */ false,
                        WizardManagerHelper.isAnySetupWizard(intent)
                );
                dialog.show(getFragmentManager());
                return true;
Loading