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

Commit 4d5063ff authored by Bill Lin's avatar Bill Lin Committed by Android (Google) Code Review
Browse files

Merge "Refine SkipDialog title and desc by device configs" into udc-dev

parents 53bf6b1d 67d6dff7
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