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
This commit is contained in:
@@ -991,6 +991,8 @@
|
|||||||
<string name="setup_fingerprint_enroll_enrolling_skip_title">Skip fingerprint setup?</string>
|
<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] -->
|
<!-- 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>
|
<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]-->
|
<!-- 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>
|
<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]-->
|
<!-- 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]-->
|
||||||
|
@@ -28,6 +28,8 @@ import android.hardware.face.FaceManager;
|
|||||||
import android.hardware.face.FaceSensorPropertiesInternal;
|
import android.hardware.face.FaceSensorPropertiesInternal;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.storage.StorageManager;
|
import android.os.storage.StorageManager;
|
||||||
|
import android.text.BidiFormatter;
|
||||||
|
import android.text.SpannableStringBuilder;
|
||||||
import android.util.FeatureFlagUtils;
|
import android.util.FeatureFlagUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.Surface;
|
import android.view.Surface;
|
||||||
@@ -38,6 +40,7 @@ import androidx.fragment.app.FragmentActivity;
|
|||||||
|
|
||||||
import com.android.internal.widget.LockPatternUtils;
|
import com.android.internal.widget.LockPatternUtils;
|
||||||
import com.android.internal.widget.VerifyCredentialResponse;
|
import com.android.internal.widget.VerifyCredentialResponse;
|
||||||
|
import com.android.settings.R;
|
||||||
import com.android.settings.SetupWizardUtils;
|
import com.android.settings.SetupWizardUtils;
|
||||||
import com.android.settings.biometrics.face.FaceEnrollIntroduction;
|
import com.android.settings.biometrics.face.FaceEnrollIntroduction;
|
||||||
import com.android.settings.biometrics.fingerprint.FingerprintEnrollFindSensor;
|
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.SetupFingerprintEnrollFindSensor;
|
||||||
import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollIntroduction;
|
import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollIntroduction;
|
||||||
import com.android.settings.biometrics2.ui.view.FingerprintEnrollmentActivity;
|
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.ChooseLockGeneric;
|
||||||
import com.android.settings.password.ChooseLockSettingsHelper;
|
import com.android.settings.password.ChooseLockSettingsHelper;
|
||||||
import com.android.settings.password.SetupChooseLockGeneric;
|
import com.android.settings.password.SetupChooseLockGeneric;
|
||||||
@@ -60,6 +64,9 @@ import java.lang.annotation.RetentionPolicy;
|
|||||||
public class BiometricUtils {
|
public class BiometricUtils {
|
||||||
private static final String TAG = "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
|
// Note: Theis IntDef must align SystemUI DevicePostureInt
|
||||||
@IntDef(prefix = {"DEVICE_POSTURE_"}, value = {
|
@IntDef(prefix = {"DEVICE_POSTURE_"}, value = {
|
||||||
DEVICE_POSTURE_UNKNOWN,
|
DEVICE_POSTURE_UNKNOWN,
|
||||||
@@ -496,4 +503,45 @@ public class BiometricUtils {
|
|||||||
public static boolean isLandscape(@NonNull Context context) {
|
public static boolean isLandscape(@NonNull Context context) {
|
||||||
return context.getDisplay().getRotation() == Surface.ROTATION_90;
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -48,8 +48,6 @@ import android.os.UserHandle;
|
|||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
import android.os.storage.StorageManager;
|
import android.os.storage.StorageManager;
|
||||||
import android.service.persistentdata.PersistentDataBlockManager;
|
import android.service.persistentdata.PersistentDataBlockManager;
|
||||||
import android.text.BidiFormatter;
|
|
||||||
import android.text.SpannableStringBuilder;
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.EventLog;
|
import android.util.EventLog;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@@ -77,9 +75,9 @@ import com.android.settings.SetupWizardUtils;
|
|||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
import com.android.settings.biometrics.BiometricEnrollActivity;
|
import com.android.settings.biometrics.BiometricEnrollActivity;
|
||||||
import com.android.settings.biometrics.BiometricEnrollBase;
|
import com.android.settings.biometrics.BiometricEnrollBase;
|
||||||
|
import com.android.settings.biometrics.BiometricUtils;
|
||||||
import com.android.settings.core.SubSettingLauncher;
|
import com.android.settings.core.SubSettingLauncher;
|
||||||
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
|
||||||
import com.android.settings.safetycenter.LockScreenSafetySource;
|
import com.android.settings.safetycenter.LockScreenSafetySource;
|
||||||
import com.android.settings.search.SearchFeatureProvider;
|
import com.android.settings.search.SearchFeatureProvider;
|
||||||
import com.android.settingslib.RestrictedPreference;
|
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";
|
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
|
@VisibleForTesting
|
||||||
static final int CONFIRM_EXISTING_REQUEST = 100;
|
static final int CONFIRM_EXISTING_REQUEST = 100;
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
@@ -662,32 +657,20 @@ public class ChooseLockGeneric extends SettingsActivity {
|
|||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
String getBiometricsPreferenceTitle(@NonNull ScreenLockType secureType) {
|
String getBiometricsPreferenceTitle(@NonNull ScreenLockType secureType) {
|
||||||
SpannableStringBuilder ssb = new SpannableStringBuilder();
|
final boolean hasFingerprint = Utils.hasFingerprintHardware(getContext());
|
||||||
BidiFormatter bidi = BidiFormatter.getInstance();
|
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"
|
// Assume the flow is "Screen Lock" + "Face" + "Fingerprint"
|
||||||
if (mController != null) {
|
if (mController != null) {
|
||||||
ssb.append(bidi.unicodeWrap(mController.getTitle(secureType)));
|
return BiometricUtils.getCombinedScreenLockOptions(getContext(),
|
||||||
|
mController.getTitle(secureType), hasFingerprint, isFaceSupported);
|
||||||
} else {
|
} else {
|
||||||
Log.e(TAG, "ChooseLockGenericController is null!");
|
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) {
|
private void setPreferenceTitle(ScreenLockType lock, @StringRes int title) {
|
||||||
|
@@ -64,6 +64,8 @@ public final class ChooseLockSettingsHelper {
|
|||||||
public static final String EXTRA_KEY_FOR_FACE = "for_face";
|
public static final String EXTRA_KEY_FOR_FACE = "for_face";
|
||||||
// For the paths where multiple biometric sensors exist
|
// For the paths where multiple biometric sensors exist
|
||||||
public static final String EXTRA_KEY_FOR_BIOMETRICS = "for_biometrics";
|
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_FOREGROUND_ONLY = "foreground_only";
|
||||||
public static final String EXTRA_KEY_REQUEST_GK_PW_HANDLE = "request_gk_pw_handle";
|
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
|
// Gatekeeper password handle, which can subsequently be used to generate Gatekeeper
|
||||||
|
@@ -19,6 +19,7 @@ package com.android.settings.password;
|
|||||||
import static android.Manifest.permission.REQUEST_PASSWORD_COMPLEXITY;
|
import static android.Manifest.permission.REQUEST_PASSWORD_COMPLEXITY;
|
||||||
import static android.app.admin.DevicePolicyManager.EXTRA_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 static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY;
|
||||||
|
|
||||||
import android.app.RemoteServiceException.MissingRequestPasswordComplexityPermissionException;
|
import android.app.RemoteServiceException.MissingRequestPasswordComplexityPermissionException;
|
||||||
@@ -43,6 +44,7 @@ import com.android.settings.R;
|
|||||||
import com.android.settings.SetupWizardUtils;
|
import com.android.settings.SetupWizardUtils;
|
||||||
import com.android.settings.utils.SettingsDividerItemDecoration;
|
import com.android.settings.utils.SettingsDividerItemDecoration;
|
||||||
|
|
||||||
|
import com.google.android.setupcompat.util.WizardManagerHelper;
|
||||||
import com.google.android.setupdesign.GlifPreferenceLayout;
|
import com.google.android.setupdesign.GlifPreferenceLayout;
|
||||||
import com.google.android.setupdesign.util.ThemeHelper;
|
import com.google.android.setupdesign.util.ThemeHelper;
|
||||||
|
|
||||||
@@ -187,14 +189,14 @@ public class SetupChooseLockGeneric extends ChooseLockGeneric {
|
|||||||
final String key = preference.getKey();
|
final String key = preference.getKey();
|
||||||
if (KEY_UNLOCK_SET_DO_LATER.equals(key)) {
|
if (KEY_UNLOCK_SET_DO_LATER.equals(key)) {
|
||||||
// show warning.
|
// show warning.
|
||||||
|
final Intent intent = getActivity().getIntent();
|
||||||
SetupSkipDialog dialog = SetupSkipDialog.newInstance(
|
SetupSkipDialog dialog = SetupSkipDialog.newInstance(
|
||||||
getActivity().getIntent()
|
CREDENTIAL_TYPE_NONE,
|
||||||
.getBooleanExtra(SetupSkipDialog.EXTRA_FRP_SUPPORTED, false),
|
intent.getBooleanExtra(SetupSkipDialog.EXTRA_FRP_SUPPORTED, false),
|
||||||
/* isPatternMode= */ false,
|
|
||||||
/* isAlphaMode= */ false,
|
|
||||||
/* forFingerprint= */ false,
|
/* forFingerprint= */ false,
|
||||||
/* forFace= */ false,
|
/* forFace= */ false,
|
||||||
/* forBiometrics= */ false
|
/* forBiometrics= */ false,
|
||||||
|
WizardManagerHelper.isAnySetupWizard(intent)
|
||||||
);
|
);
|
||||||
dialog.show(getFragmentManager());
|
dialog.show(getFragmentManager());
|
||||||
return true;
|
return true;
|
||||||
|
@@ -16,6 +16,9 @@
|
|||||||
|
|
||||||
package com.android.settings.password;
|
package com.android.settings.password;
|
||||||
|
|
||||||
|
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PASSWORD;
|
||||||
|
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PIN;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@@ -31,6 +34,8 @@ import com.android.settings.R;
|
|||||||
import com.android.settings.SetupRedactionInterstitial;
|
import com.android.settings.SetupRedactionInterstitial;
|
||||||
import com.android.settings.password.ChooseLockTypeDialogFragment.OnLockTypeSelectedListener;
|
import com.android.settings.password.ChooseLockTypeDialogFragment.OnLockTypeSelectedListener;
|
||||||
|
|
||||||
|
import com.google.android.setupcompat.util.WizardManagerHelper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setup Wizard's version of ChooseLockPassword screen. It inherits the logic and basic structure
|
* Setup Wizard's version of ChooseLockPassword screen. It inherits the logic and basic structure
|
||||||
* from ChooseLockPassword class, and should remain similar to that behaviorally. This class should
|
* from ChooseLockPassword class, and should remain similar to that behaviorally. This class should
|
||||||
@@ -113,12 +118,12 @@ public class SetupChooseLockPassword extends ChooseLockPassword {
|
|||||||
final boolean forBiometrics = intent
|
final boolean forBiometrics = intent
|
||||||
.getBooleanExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_BIOMETRICS, false);
|
.getBooleanExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_BIOMETRICS, false);
|
||||||
final SetupSkipDialog dialog = SetupSkipDialog.newInstance(
|
final SetupSkipDialog dialog = SetupSkipDialog.newInstance(
|
||||||
|
mIsAlphaMode ? CREDENTIAL_TYPE_PASSWORD : CREDENTIAL_TYPE_PIN,
|
||||||
frpSupported,
|
frpSupported,
|
||||||
/* isPatternMode= */ false,
|
|
||||||
mIsAlphaMode,
|
|
||||||
forFingerprint,
|
forFingerprint,
|
||||||
forFace,
|
forFace,
|
||||||
forBiometrics);
|
forBiometrics,
|
||||||
|
WizardManagerHelper.isAnySetupWizard(intent));
|
||||||
|
|
||||||
ConfirmDeviceCredentialUtils.hideImeImmediately(
|
ConfirmDeviceCredentialUtils.hideImeImmediately(
|
||||||
getActivity().getWindow().getDecorView());
|
getActivity().getWindow().getDecorView());
|
||||||
|
@@ -18,6 +18,8 @@ package com.android.settings.password;
|
|||||||
|
|
||||||
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
|
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
|
||||||
|
|
||||||
|
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PATTERN;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@@ -32,6 +34,8 @@ import androidx.fragment.app.Fragment;
|
|||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.SetupRedactionInterstitial;
|
import com.android.settings.SetupRedactionInterstitial;
|
||||||
|
|
||||||
|
import com.google.android.setupcompat.util.WizardManagerHelper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setup Wizard's version of ChooseLockPattern screen. It inherits the logic and basic structure
|
* Setup Wizard's version of ChooseLockPattern screen. It inherits the logic and basic structure
|
||||||
* from ChooseLockPattern class, and should remain similar to that behaviorally. This class should
|
* from ChooseLockPattern class, and should remain similar to that behaviorally. This class should
|
||||||
@@ -101,14 +105,13 @@ public class SetupChooseLockPattern extends ChooseLockPattern {
|
|||||||
.getBooleanExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE, false);
|
.getBooleanExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE, false);
|
||||||
final boolean forBiometrics = intent
|
final boolean forBiometrics = intent
|
||||||
.getBooleanExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_BIOMETRICS, false);
|
.getBooleanExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_BIOMETRICS, false);
|
||||||
|
|
||||||
final SetupSkipDialog dialog = SetupSkipDialog.newInstance(
|
final SetupSkipDialog dialog = SetupSkipDialog.newInstance(
|
||||||
|
CREDENTIAL_TYPE_PATTERN,
|
||||||
frpSupported,
|
frpSupported,
|
||||||
/* isPatternMode= */ true,
|
|
||||||
/* isAlphaMode= */ false,
|
|
||||||
forFingerprint,
|
forFingerprint,
|
||||||
forFace,
|
forFace,
|
||||||
forBiometrics);
|
forBiometrics,
|
||||||
|
WizardManagerHelper.isAnySetupWizard(intent));
|
||||||
dialog.show(getFragmentManager());
|
dialog.show(getFragmentManager());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@@ -16,6 +16,14 @@
|
|||||||
|
|
||||||
package com.android.settings.password;
|
package com.android.settings.password;
|
||||||
|
|
||||||
|
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PASSWORD;
|
||||||
|
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PATTERN;
|
||||||
|
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PIN;
|
||||||
|
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_FOR_BIOMETRICS;
|
||||||
|
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE;
|
||||||
|
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT;
|
||||||
|
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_IS_SUW;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
@@ -29,7 +37,10 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.annotation.StringRes;
|
import androidx.annotation.StringRes;
|
||||||
import androidx.fragment.app.FragmentManager;
|
import androidx.fragment.app.FragmentManager;
|
||||||
|
|
||||||
|
import com.android.internal.widget.LockPatternUtils;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.Utils;
|
||||||
|
import com.android.settings.biometrics.BiometricUtils;
|
||||||
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
||||||
|
|
||||||
public class SetupSkipDialog extends InstrumentedDialogFragment
|
public class SetupSkipDialog extends InstrumentedDialogFragment
|
||||||
@@ -38,24 +49,23 @@ public class SetupSkipDialog extends InstrumentedDialogFragment
|
|||||||
public static final String EXTRA_FRP_SUPPORTED = ":settings:frp_supported";
|
public static final String EXTRA_FRP_SUPPORTED = ":settings:frp_supported";
|
||||||
|
|
||||||
private static final String ARG_FRP_SUPPORTED = "frp_supported";
|
private static final String ARG_FRP_SUPPORTED = "frp_supported";
|
||||||
// The key indicates type of lock screen is pattern setup.
|
// The key indicates type of screen lock credential types(PIN/Pattern/Password)
|
||||||
private static final String ARG_LOCK_TYPE_PATTERN = "lock_type_pattern";
|
private static final String ARG_LOCK_CREDENTIAL_TYPE = "lock_credential_type";
|
||||||
// The key indicates type of lock screen setup is alphanumeric for password setup.
|
// The key indicates type of lock screen setup is alphanumeric for password setup.
|
||||||
private static final String ARG_LOCK_TYPE_ALPHANUMERIC = "lock_type_alphanumeric";
|
|
||||||
private static final String TAG_SKIP_DIALOG = "skip_dialog";
|
private static final String TAG_SKIP_DIALOG = "skip_dialog";
|
||||||
public static final int RESULT_SKIP = Activity.RESULT_FIRST_USER + 10;
|
public static final int RESULT_SKIP = Activity.RESULT_FIRST_USER + 10;
|
||||||
|
|
||||||
public static SetupSkipDialog newInstance(boolean isFrpSupported, boolean isPatternMode,
|
public static SetupSkipDialog newInstance(@LockPatternUtils.CredentialType int credentialType,
|
||||||
boolean isAlphanumericMode, boolean forFingerprint, boolean forFace,
|
boolean isFrpSupported, boolean forFingerprint, boolean forFace,
|
||||||
boolean forBiometrics) {
|
boolean forBiometrics, boolean isSuw) {
|
||||||
SetupSkipDialog dialog = new SetupSkipDialog();
|
SetupSkipDialog dialog = new SetupSkipDialog();
|
||||||
Bundle args = new Bundle();
|
Bundle args = new Bundle();
|
||||||
|
args.putInt(ARG_LOCK_CREDENTIAL_TYPE, credentialType);
|
||||||
args.putBoolean(ARG_FRP_SUPPORTED, isFrpSupported);
|
args.putBoolean(ARG_FRP_SUPPORTED, isFrpSupported);
|
||||||
args.putBoolean(ARG_LOCK_TYPE_PATTERN, isPatternMode);
|
args.putBoolean(EXTRA_KEY_FOR_FINGERPRINT, forFingerprint);
|
||||||
args.putBoolean(ARG_LOCK_TYPE_ALPHANUMERIC, isAlphanumericMode);
|
args.putBoolean(EXTRA_KEY_FOR_FACE, forFace);
|
||||||
args.putBoolean(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, forFingerprint);
|
args.putBoolean(EXTRA_KEY_FOR_BIOMETRICS, forBiometrics);
|
||||||
args.putBoolean(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE, forFace);
|
args.putBoolean(EXTRA_KEY_IS_SUW, isSuw);
|
||||||
args.putBoolean(ChooseLockSettingsHelper.EXTRA_KEY_FOR_BIOMETRICS, forBiometrics);
|
|
||||||
dialog.setArguments(args);
|
dialog.setArguments(args);
|
||||||
return dialog;
|
return dialog;
|
||||||
}
|
}
|
||||||
@@ -70,38 +80,52 @@ public class SetupSkipDialog extends InstrumentedDialogFragment
|
|||||||
return onCreateDialogBuilder().create();
|
return onCreateDialogBuilder().create();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
private AlertDialog.Builder getBiometricsBuilder(
|
||||||
public AlertDialog.Builder onCreateDialogBuilder() {
|
@LockPatternUtils.CredentialType int credentialType, boolean isSuw, boolean hasFace,
|
||||||
Bundle args = getArguments();
|
boolean hasFingerprint) {
|
||||||
final boolean forFace =
|
final boolean isFaceSupported = hasFace && (!isSuw || BiometricUtils.isFaceSupportedInSuw(
|
||||||
args.getBoolean(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE);
|
getContext()));
|
||||||
final boolean forFingerprint =
|
|
||||||
args.getBoolean(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT);
|
|
||||||
final boolean forBiometrics =
|
|
||||||
args.getBoolean(ChooseLockSettingsHelper.EXTRA_KEY_FOR_BIOMETRICS);
|
|
||||||
if (forFace || forFingerprint || forBiometrics) {
|
|
||||||
final boolean hasFace = forFace || forBiometrics;
|
|
||||||
final boolean hasFingerprint = forFingerprint || forBiometrics;
|
|
||||||
|
|
||||||
final int titleId;
|
|
||||||
final int msgResId;
|
final int msgResId;
|
||||||
if (args.getBoolean(ARG_LOCK_TYPE_PATTERN)) {
|
final int screenLockResId;
|
||||||
titleId = getPatternSkipTitleRes(hasFace, hasFingerprint);
|
switch (credentialType) {
|
||||||
msgResId = getPatternSkipMessageRes(hasFace, hasFingerprint);
|
case CREDENTIAL_TYPE_PATTERN:
|
||||||
} else if (args.getBoolean(ARG_LOCK_TYPE_ALPHANUMERIC)) {
|
screenLockResId = R.string.unlock_set_unlock_pattern_title;
|
||||||
titleId = getPasswordSkipTitleRes(hasFace, hasFingerprint);
|
msgResId = getPatternSkipMessageRes(hasFace && isFaceSupported, hasFingerprint);
|
||||||
msgResId = getPasswordSkipMessageRes(hasFace, hasFingerprint);
|
break;
|
||||||
} else {
|
case CREDENTIAL_TYPE_PASSWORD:
|
||||||
titleId = getPinSkipTitleRes(hasFace, hasFingerprint);
|
screenLockResId = R.string.unlock_set_unlock_password_title;
|
||||||
msgResId = getPinSkipMessageRes(hasFace, hasFingerprint);
|
msgResId = getPasswordSkipMessageRes(hasFace && isFaceSupported, hasFingerprint);
|
||||||
|
break;
|
||||||
|
case CREDENTIAL_TYPE_PIN:
|
||||||
|
default:
|
||||||
|
screenLockResId = R.string.unlock_set_unlock_pin_title;
|
||||||
|
msgResId = getPinSkipMessageRes(hasFace && isFaceSupported, hasFingerprint);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new AlertDialog.Builder(getContext())
|
return new AlertDialog.Builder(getContext())
|
||||||
.setPositiveButton(R.string.skip_lock_screen_dialog_button_label, this)
|
.setPositiveButton(R.string.skip_lock_screen_dialog_button_label, this)
|
||||||
.setNegativeButton(R.string.cancel_lock_screen_dialog_button_label, this)
|
.setNegativeButton(R.string.cancel_lock_screen_dialog_button_label, this)
|
||||||
.setTitle(titleId)
|
.setTitle(getSkipSetupTitle(screenLockResId, hasFingerprint,
|
||||||
|
hasFace && isFaceSupported))
|
||||||
.setMessage(msgResId);
|
.setMessage(msgResId);
|
||||||
} else {
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
public AlertDialog.Builder onCreateDialogBuilder() {
|
||||||
|
Bundle args = getArguments();
|
||||||
|
final boolean isSuw = args.getBoolean(EXTRA_KEY_IS_SUW);
|
||||||
|
final boolean forBiometrics = args.getBoolean(EXTRA_KEY_FOR_BIOMETRICS);
|
||||||
|
final boolean forFace = args.getBoolean(EXTRA_KEY_FOR_FACE);
|
||||||
|
final boolean forFingerprint = args.getBoolean(EXTRA_KEY_FOR_FINGERPRINT);
|
||||||
|
@LockPatternUtils.CredentialType
|
||||||
|
final int credentialType = args.getInt(ARG_LOCK_CREDENTIAL_TYPE);
|
||||||
|
|
||||||
|
if (forFace || forFingerprint || forBiometrics) {
|
||||||
|
final boolean hasFace = Utils.hasFaceHardware(getContext());
|
||||||
|
final boolean hasFingerprint = Utils.hasFingerprintHardware(getContext());
|
||||||
|
return getBiometricsBuilder(credentialType, isSuw, hasFace, hasFingerprint);
|
||||||
|
}
|
||||||
|
|
||||||
return new AlertDialog.Builder(getContext())
|
return new AlertDialog.Builder(getContext())
|
||||||
.setPositiveButton(R.string.skip_anyway_button_label, this)
|
.setPositiveButton(R.string.skip_anyway_button_label, this)
|
||||||
.setNegativeButton(R.string.go_back_button_label, this)
|
.setNegativeButton(R.string.go_back_button_label, this)
|
||||||
@@ -110,20 +134,6 @@ public class SetupSkipDialog extends InstrumentedDialogFragment
|
|||||||
R.string.lock_screen_intro_skip_dialog_text_frp :
|
R.string.lock_screen_intro_skip_dialog_text_frp :
|
||||||
R.string.lock_screen_intro_skip_dialog_text);
|
R.string.lock_screen_intro_skip_dialog_text);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@StringRes
|
|
||||||
private int getPatternSkipTitleRes(boolean hasFace, boolean hasFingerprint) {
|
|
||||||
if (hasFace && hasFingerprint) {
|
|
||||||
return R.string.lock_screen_pattern_skip_biometrics_title;
|
|
||||||
} else if (hasFace) {
|
|
||||||
return R.string.lock_screen_pattern_skip_face_title;
|
|
||||||
} else if (hasFingerprint) {
|
|
||||||
return R.string.lock_screen_pattern_skip_fingerprint_title;
|
|
||||||
} else {
|
|
||||||
return R.string.lock_screen_pattern_skip_title;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@StringRes
|
@StringRes
|
||||||
private int getPatternSkipMessageRes(boolean hasFace, boolean hasFingerprint) {
|
private int getPatternSkipMessageRes(boolean hasFace, boolean hasFingerprint) {
|
||||||
@@ -138,19 +148,6 @@ public class SetupSkipDialog extends InstrumentedDialogFragment
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@StringRes
|
|
||||||
private int getPasswordSkipTitleRes(boolean hasFace, boolean hasFingerprint) {
|
|
||||||
if (hasFace && hasFingerprint) {
|
|
||||||
return R.string.lock_screen_password_skip_biometrics_title;
|
|
||||||
} else if (hasFace) {
|
|
||||||
return R.string.lock_screen_password_skip_face_title;
|
|
||||||
} else if (hasFingerprint) {
|
|
||||||
return R.string.lock_screen_password_skip_fingerprint_title;
|
|
||||||
} else {
|
|
||||||
return R.string.lock_screen_password_skip_title;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@StringRes
|
@StringRes
|
||||||
private int getPasswordSkipMessageRes(boolean hasFace, boolean hasFingerprint) {
|
private int getPasswordSkipMessageRes(boolean hasFace, boolean hasFingerprint) {
|
||||||
if (hasFace && hasFingerprint) {
|
if (hasFace && hasFingerprint) {
|
||||||
@@ -164,19 +161,6 @@ public class SetupSkipDialog extends InstrumentedDialogFragment
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@StringRes
|
|
||||||
private int getPinSkipTitleRes(boolean hasFace, boolean hasFingerprint) {
|
|
||||||
if (hasFace && hasFingerprint) {
|
|
||||||
return R.string.lock_screen_pin_skip_biometrics_title;
|
|
||||||
} else if (hasFace) {
|
|
||||||
return R.string.lock_screen_pin_skip_face_title;
|
|
||||||
} else if (hasFingerprint) {
|
|
||||||
return R.string.lock_screen_pin_skip_fingerprint_title;
|
|
||||||
} else {
|
|
||||||
return R.string.lock_screen_pin_skip_title;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@StringRes
|
@StringRes
|
||||||
private int getPinSkipMessageRes(boolean hasFace, boolean hasFingerprint) {
|
private int getPinSkipMessageRes(boolean hasFace, boolean hasFingerprint) {
|
||||||
if (hasFace && hasFingerprint) {
|
if (hasFace && hasFingerprint) {
|
||||||
@@ -190,6 +174,13 @@ public class SetupSkipDialog extends InstrumentedDialogFragment
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getSkipSetupTitle(int screenTypeResId, boolean hasFingerprint,
|
||||||
|
boolean hasFace) {
|
||||||
|
return getString(R.string.lock_screen_skip_setup_title,
|
||||||
|
BiometricUtils.getCombinedScreenLockOptions(getContext(),
|
||||||
|
getString(screenTypeResId), hasFingerprint, hasFace));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onClick(DialogInterface dialog, int button) {
|
public void onClick(DialogInterface dialog, int button) {
|
||||||
Activity activity = getActivity();
|
Activity activity = getActivity();
|
||||||
|
@@ -79,6 +79,7 @@ import org.mockito.junit.MockitoJUnit;
|
|||||||
import org.mockito.junit.MockitoRule;
|
import org.mockito.junit.MockitoRule;
|
||||||
import org.robolectric.Robolectric;
|
import org.robolectric.Robolectric;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
|
import org.robolectric.android.controller.ActivityController;
|
||||||
import org.robolectric.annotation.Config;
|
import org.robolectric.annotation.Config;
|
||||||
import org.robolectric.shadows.ShadowApplication;
|
import org.robolectric.shadows.ShadowApplication;
|
||||||
import org.robolectric.shadows.ShadowPersistentDataBlockManager;
|
import org.robolectric.shadows.ShadowPersistentDataBlockManager;
|
||||||
@@ -98,6 +99,8 @@ public class ChooseLockGenericTest {
|
|||||||
|
|
||||||
@Rule
|
@Rule
|
||||||
public final MockitoRule mMockitoRule = MockitoJUnit.rule();
|
public final MockitoRule mMockitoRule = MockitoJUnit.rule();
|
||||||
|
|
||||||
|
private ActivityController<ChooseLockGeneric> mActivityController;
|
||||||
private FakeFeatureFactory mFakeFeatureFactory;
|
private FakeFeatureFactory mFakeFeatureFactory;
|
||||||
private ChooseLockGenericFragment mFragment;
|
private ChooseLockGenericFragment mFragment;
|
||||||
private ChooseLockGeneric mActivity;
|
private ChooseLockGeneric mActivity;
|
||||||
@@ -109,7 +112,8 @@ public class ChooseLockGenericTest {
|
|||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
|
mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||||
mActivity = Robolectric.buildActivity(ChooseLockGeneric.class)
|
mActivityController = Robolectric.buildActivity(ChooseLockGeneric.class);
|
||||||
|
mActivity = mActivityController
|
||||||
.create()
|
.create()
|
||||||
.start()
|
.start()
|
||||||
.postCreate(null)
|
.postCreate(null)
|
||||||
@@ -314,6 +318,20 @@ public class ChooseLockGenericTest {
|
|||||||
assertThat(mActivity.isFinishing()).isTrue();
|
assertThat(mActivity.isFinishing()).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void securedScreenLock_notChangingConfig_notWaitForConfirmation_onStopFinishSelf() {
|
||||||
|
Intent intent = new Intent().putExtra(
|
||||||
|
LockPatternUtils.PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_NUMERIC);
|
||||||
|
intent.putExtra("waiting_for_confirmation", true);
|
||||||
|
initActivity(intent);
|
||||||
|
|
||||||
|
mFragment.updatePreferencesOrFinish(false /* isRecreatingActivity */);
|
||||||
|
mActivityController.configurationChange();
|
||||||
|
mActivityController.stop();
|
||||||
|
|
||||||
|
assertThat(mActivity.isFinishing()).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onPreferenceTreeClick_fingerprintPassesMinComplexityInfoOntoNextActivity() {
|
public void onPreferenceTreeClick_fingerprintPassesMinComplexityInfoOntoNextActivity() {
|
||||||
Intent intent = new Intent(ACTION_SET_NEW_PASSWORD)
|
Intent intent = new Intent(ACTION_SET_NEW_PASSWORD)
|
||||||
@@ -534,10 +552,10 @@ public class ChooseLockGenericTest {
|
|||||||
assertThat(passwordIntent.getIntExtra(ChooseLockPassword.EXTRA_KEY_MIN_COMPLEXITY,
|
assertThat(passwordIntent.getIntExtra(ChooseLockPassword.EXTRA_KEY_MIN_COMPLEXITY,
|
||||||
PASSWORD_COMPLEXITY_NONE)).isEqualTo(PASSWORD_COMPLEXITY_LOW);
|
PASSWORD_COMPLEXITY_NONE)).isEqualTo(PASSWORD_COMPLEXITY_LOW);
|
||||||
|
|
||||||
final String supportFingerprint = mActivity.getResources().getString(
|
final String supportFingerprint = capitalize(mActivity.getResources().getString(
|
||||||
R.string.security_settings_fingerprint);
|
R.string.security_settings_fingerprint));
|
||||||
final String supportFace = mActivity.getResources().getString(
|
final String supportFace = capitalize(mActivity.getResources().getString(
|
||||||
R.string.keywords_face_settings);
|
R.string.keywords_face_settings));
|
||||||
|
|
||||||
assertThat(mFragment.getBiometricsPreferenceTitle(ScreenLockType.PIN)).contains(
|
assertThat(mFragment.getBiometricsPreferenceTitle(ScreenLockType.PIN)).contains(
|
||||||
supportFingerprint);
|
supportFingerprint);
|
||||||
@@ -563,4 +581,8 @@ public class ChooseLockGenericTest {
|
|||||||
.create().start().postCreate(null).resume().get();
|
.create().start().postCreate(null).resume().get();
|
||||||
mActivity.getSupportFragmentManager().beginTransaction().add(mFragment, null).commitNow();
|
mActivity.getSupportFragmentManager().beginTransaction().add(mFragment, null).commitNow();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String capitalize(final String input) {
|
||||||
|
return Character.toUpperCase(input.charAt(0)) + input.substring(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -21,6 +21,7 @@ import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_HIGH;
|
|||||||
|
|
||||||
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY;
|
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY;
|
||||||
|
|
||||||
|
import static com.google.android.setupcompat.util.WizardManagerHelper.EXTRA_IS_SETUP_FLOW;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
@@ -43,6 +44,7 @@ import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
|
|||||||
import com.android.settings.testutils.shadow.ShadowPasswordUtils;
|
import com.android.settings.testutils.shadow.ShadowPasswordUtils;
|
||||||
import com.android.settings.testutils.shadow.ShadowUserManager;
|
import com.android.settings.testutils.shadow.ShadowUserManager;
|
||||||
import com.android.settings.testutils.shadow.ShadowUtils;
|
import com.android.settings.testutils.shadow.ShadowUtils;
|
||||||
|
import com.android.settings.utils.ActivityControllerWrapper;
|
||||||
|
|
||||||
import com.google.android.setupdesign.GlifPreferenceLayout;
|
import com.google.android.setupdesign.GlifPreferenceLayout;
|
||||||
|
|
||||||
@@ -100,6 +102,7 @@ public class SetupChooseLockGenericTest {
|
|||||||
@Test
|
@Test
|
||||||
public void setupChooseLockGenericPasswordComplexityExtraWithoutPermission() {
|
public void setupChooseLockGenericPasswordComplexityExtraWithoutPermission() {
|
||||||
Intent intent = new Intent("com.android.settings.SETUP_LOCK_SCREEN");
|
Intent intent = new Intent("com.android.settings.SETUP_LOCK_SCREEN");
|
||||||
|
intent.putExtra(EXTRA_IS_SETUP_FLOW, true);
|
||||||
intent.putExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY, PASSWORD_COMPLEXITY_HIGH);
|
intent.putExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY, PASSWORD_COMPLEXITY_HIGH);
|
||||||
SetupChooseLockGeneric activity =
|
SetupChooseLockGeneric activity =
|
||||||
Robolectric.buildActivity(SetupChooseLockGeneric.class, intent).create().get();
|
Robolectric.buildActivity(SetupChooseLockGeneric.class, intent).create().get();
|
||||||
@@ -114,6 +117,7 @@ public class SetupChooseLockGenericTest {
|
|||||||
ShadowPasswordUtils.addGrantedPermission(REQUEST_PASSWORD_COMPLEXITY);
|
ShadowPasswordUtils.addGrantedPermission(REQUEST_PASSWORD_COMPLEXITY);
|
||||||
|
|
||||||
Intent intent = new Intent("com.android.settings.SETUP_LOCK_SCREEN");
|
Intent intent = new Intent("com.android.settings.SETUP_LOCK_SCREEN");
|
||||||
|
intent.putExtra(EXTRA_IS_SETUP_FLOW, true);
|
||||||
intent.putExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY, PASSWORD_COMPLEXITY_HIGH);
|
intent.putExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY, PASSWORD_COMPLEXITY_HIGH);
|
||||||
SetupChooseLockGeneric activity =
|
SetupChooseLockGeneric activity =
|
||||||
Robolectric.buildActivity(SetupChooseLockGeneric.class, intent).create().get();
|
Robolectric.buildActivity(SetupChooseLockGeneric.class, intent).create().get();
|
||||||
@@ -124,7 +128,8 @@ public class SetupChooseLockGenericTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void setupChooseLockGenericUsingDescriptionTextOfGlifLayout() {
|
public void setupChooseLockGenericUsingDescriptionTextOfGlifLayout() {
|
||||||
SetupChooseLockGenericFragment fragment = getFragmentOfSetupChooseLockGeneric(false);
|
SetupChooseLockGenericFragment fragment = getFragmentOfSetupChooseLockGeneric(true, true,
|
||||||
|
false);
|
||||||
GlifPreferenceLayout view = getViewOfSetupChooseLockGenericFragment(fragment);
|
GlifPreferenceLayout view = getViewOfSetupChooseLockGenericFragment(fragment);
|
||||||
assertThat(TextUtils.isEmpty(view.getDescriptionText())).isFalse();
|
assertThat(TextUtils.isEmpty(view.getDescriptionText())).isFalse();
|
||||||
assertThat(view.getDescriptionText().toString()).isEqualTo(fragment.loadDescriptionText());
|
assertThat(view.getDescriptionText().toString()).isEqualTo(fragment.loadDescriptionText());
|
||||||
@@ -132,47 +137,24 @@ public class SetupChooseLockGenericTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void setupChooseLockGenericUsingDescriptionTextOfGlifLayoutForBiometric() {
|
public void setupChooseLockGenericUsingDescriptionTextOfGlifLayoutForBiometric() {
|
||||||
SetupChooseLockGenericFragment fragment = getFragmentOfSetupChooseLockGeneric(true);
|
SetupChooseLockGenericFragment fragment = getFragmentOfSetupChooseLockGeneric(true, true,
|
||||||
|
true);
|
||||||
GlifPreferenceLayout view = getViewOfSetupChooseLockGenericFragment(fragment);
|
GlifPreferenceLayout view = getViewOfSetupChooseLockGenericFragment(fragment);
|
||||||
assertThat(TextUtils.isEmpty(view.getDescriptionText())).isFalse();
|
assertThat(TextUtils.isEmpty(view.getDescriptionText())).isFalse();
|
||||||
assertThat(view.getDescriptionText().toString()).isEqualTo(fragment.loadDescriptionText());
|
assertThat(view.getDescriptionText().toString()).isEqualTo(fragment.loadDescriptionText());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void updatePreferenceTextShowScreenLockAndFingerprint() {
|
|
||||||
when(mFakeFeatureFactory.mFaceFeatureProvider.isSetupWizardSupported(any())).thenReturn(
|
|
||||||
false);
|
|
||||||
SetupChooseLockGenericFragment fragment = getFragmentOfSetupChooseLockGeneric(true);
|
|
||||||
|
|
||||||
final String supportFingerprint = fragment.getResources().getString(
|
|
||||||
R.string.security_settings_fingerprint);
|
|
||||||
final String supportFace = fragment.getResources().getString(
|
|
||||||
R.string.keywords_face_settings);
|
|
||||||
|
|
||||||
assertThat(fragment.getBiometricsPreferenceTitle(ScreenLockType.PIN)).contains(
|
|
||||||
supportFingerprint);
|
|
||||||
assertThat(fragment.getBiometricsPreferenceTitle(ScreenLockType.PIN)).doesNotContain(
|
|
||||||
supportFace);
|
|
||||||
assertThat(fragment.getBiometricsPreferenceTitle(ScreenLockType.PATTERN)).contains(
|
|
||||||
supportFingerprint);
|
|
||||||
assertThat(fragment.getBiometricsPreferenceTitle(ScreenLockType.PATTERN)).doesNotContain(
|
|
||||||
supportFace);
|
|
||||||
assertThat(fragment.getBiometricsPreferenceTitle(ScreenLockType.PASSWORD)).contains(
|
|
||||||
supportFingerprint);
|
|
||||||
assertThat(fragment.getBiometricsPreferenceTitle(ScreenLockType.PASSWORD)).doesNotContain(
|
|
||||||
supportFace);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void updatePreferenceTextShowScreenLockAndShowFaceAndShowFingerprint() {
|
public void updatePreferenceTextShowScreenLockAndShowFaceAndShowFingerprint() {
|
||||||
when(mFakeFeatureFactory.mFaceFeatureProvider.isSetupWizardSupported(any())).thenReturn(
|
when(mFakeFeatureFactory.mFaceFeatureProvider.isSetupWizardSupported(any())).thenReturn(
|
||||||
true);
|
true);
|
||||||
SetupChooseLockGenericFragment fragment = getFragmentOfSetupChooseLockGeneric(true);
|
SetupChooseLockGenericFragment fragment = getFragmentOfSetupChooseLockGeneric(true, true,
|
||||||
|
true);
|
||||||
|
|
||||||
final String supportFingerprint = fragment.getResources().getString(
|
final String supportFingerprint = capitalize(fragment.getResources().getString(
|
||||||
R.string.security_settings_fingerprint);
|
R.string.security_settings_fingerprint));
|
||||||
final String supportFace = fragment.getResources().getString(
|
final String supportFace = capitalize(fragment.getResources().getString(
|
||||||
R.string.keywords_face_settings);
|
R.string.keywords_face_settings));
|
||||||
|
|
||||||
assertThat(fragment.getBiometricsPreferenceTitle(ScreenLockType.PIN)).contains(
|
assertThat(fragment.getBiometricsPreferenceTitle(ScreenLockType.PIN)).contains(
|
||||||
supportFingerprint);
|
supportFingerprint);
|
||||||
@@ -192,12 +174,13 @@ public class SetupChooseLockGenericTest {
|
|||||||
public void updatePreferenceTextShowScreenLockAndShowFingerprint() {
|
public void updatePreferenceTextShowScreenLockAndShowFingerprint() {
|
||||||
when(mFakeFeatureFactory.mFaceFeatureProvider.isSetupWizardSupported(any())).thenReturn(
|
when(mFakeFeatureFactory.mFaceFeatureProvider.isSetupWizardSupported(any())).thenReturn(
|
||||||
false);
|
false);
|
||||||
SetupChooseLockGenericFragment fragment = getFragmentOfSetupChooseLockGeneric(true);
|
SetupChooseLockGenericFragment fragment = getFragmentOfSetupChooseLockGeneric(false, false,
|
||||||
|
true);
|
||||||
|
|
||||||
final String supportFingerprint = fragment.getResources().getString(
|
final String supportFingerprint = capitalize(fragment.getResources().getString(
|
||||||
R.string.security_settings_fingerprint);
|
R.string.security_settings_fingerprint));
|
||||||
final String supportFace = fragment.getResources().getString(
|
final String supportFace = capitalize(fragment.getResources().getString(
|
||||||
R.string.keywords_face_settings);
|
R.string.keywords_face_settings));
|
||||||
|
|
||||||
assertThat(fragment.getBiometricsPreferenceTitle(ScreenLockType.PIN)).contains(
|
assertThat(fragment.getBiometricsPreferenceTitle(ScreenLockType.PIN)).contains(
|
||||||
supportFingerprint);
|
supportFingerprint);
|
||||||
@@ -213,16 +196,18 @@ public class SetupChooseLockGenericTest {
|
|||||||
supportFace);
|
supportFace);
|
||||||
}
|
}
|
||||||
|
|
||||||
private SetupChooseLockGenericFragment getFragmentOfSetupChooseLockGeneric(boolean biometric) {
|
private SetupChooseLockGenericFragment getFragmentOfSetupChooseLockGeneric(
|
||||||
|
boolean forFingerprint, boolean forFace, boolean forBiometric) {
|
||||||
ShadowPasswordUtils.addGrantedPermission(REQUEST_PASSWORD_COMPLEXITY);
|
ShadowPasswordUtils.addGrantedPermission(REQUEST_PASSWORD_COMPLEXITY);
|
||||||
Intent intent = new Intent("com.android.settings.SETUP_LOCK_SCREEN");
|
Intent intent = new Intent("com.android.settings.SETUP_LOCK_SCREEN");
|
||||||
intent.putExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY, PASSWORD_COMPLEXITY_HIGH);
|
intent.putExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY, PASSWORD_COMPLEXITY_HIGH);
|
||||||
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, biometric);
|
intent.putExtra(EXTRA_IS_SETUP_FLOW, true);
|
||||||
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE, biometric);
|
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, forFingerprint);
|
||||||
// TODO(b/275023433) This presents the activity from being made 'visible` is workaround
|
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE, forFace);
|
||||||
SetupChooseLockGeneric activity =
|
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_BIOMETRICS, forBiometric);
|
||||||
Robolectric.buildActivity(SetupChooseLockGeneric.class,
|
|
||||||
intent).create().start().postCreate(null).resume().get();
|
SetupChooseLockGeneric activity = (SetupChooseLockGeneric) ActivityControllerWrapper.setup(
|
||||||
|
Robolectric.buildActivity(SetupChooseLockGeneric.class, intent)).get();
|
||||||
|
|
||||||
List<Fragment> fragments = activity.getSupportFragmentManager().getFragments();
|
List<Fragment> fragments = activity.getSupportFragmentManager().getFragments();
|
||||||
assertThat(fragments).isNotNull();
|
assertThat(fragments).isNotNull();
|
||||||
@@ -238,4 +223,8 @@ public class SetupChooseLockGenericTest {
|
|||||||
|
|
||||||
return (GlifPreferenceLayout) fragment.getView();
|
return (GlifPreferenceLayout) fragment.getView();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String capitalize(final String input) {
|
||||||
|
return Character.toUpperCase(input.charAt(0)) + input.substring(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -30,7 +30,6 @@ import android.widget.Button;
|
|||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.utils.ActivityControllerWrapper;
|
|
||||||
import com.android.settings.password.ChooseLockGeneric.ChooseLockGenericFragment;
|
import com.android.settings.password.ChooseLockGeneric.ChooseLockGenericFragment;
|
||||||
import com.android.settings.password.ChooseLockPassword.ChooseLockPasswordFragment.Stage;
|
import com.android.settings.password.ChooseLockPassword.ChooseLockPasswordFragment.Stage;
|
||||||
import com.android.settings.password.ChooseLockPassword.IntentBuilder;
|
import com.android.settings.password.ChooseLockPassword.IntentBuilder;
|
||||||
@@ -40,6 +39,7 @@ import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
|
|||||||
import com.android.settings.testutils.shadow.ShadowDevicePolicyManager;
|
import com.android.settings.testutils.shadow.ShadowDevicePolicyManager;
|
||||||
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
|
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
|
||||||
import com.android.settings.testutils.shadow.ShadowUtils;
|
import com.android.settings.testutils.shadow.ShadowUtils;
|
||||||
|
import com.android.settings.utils.ActivityControllerWrapper;
|
||||||
import com.android.settings.widget.ScrollToParentEditText;
|
import com.android.settings.widget.ScrollToParentEditText;
|
||||||
|
|
||||||
import com.google.android.setupcompat.PartnerCustomizationLayout;
|
import com.google.android.setupcompat.PartnerCustomizationLayout;
|
||||||
@@ -93,7 +93,6 @@ public class SetupChooseLockPasswordTest {
|
|||||||
application,
|
application,
|
||||||
new IntentBuilder(application).build());
|
new IntentBuilder(application).build());
|
||||||
|
|
||||||
//ActivityController.of(new SetupChooseLockPassword(), intent).setup().get();
|
|
||||||
ActivityControllerWrapper.setup(
|
ActivityControllerWrapper.setup(
|
||||||
Robolectric.buildActivity(SetupChooseLockPassword.class, intent)).get();
|
Robolectric.buildActivity(SetupChooseLockPassword.class, intent)).get();
|
||||||
}
|
}
|
||||||
@@ -204,7 +203,6 @@ public class SetupChooseLockPasswordTest {
|
|||||||
intent.putExtra(ChooseLockGenericFragment.EXTRA_SHOW_OPTIONS_BUTTON, true);
|
intent.putExtra(ChooseLockGenericFragment.EXTRA_SHOW_OPTIONS_BUTTON, true);
|
||||||
return (SetupChooseLockPassword) ActivityControllerWrapper.setup(
|
return (SetupChooseLockPassword) ActivityControllerWrapper.setup(
|
||||||
Robolectric.buildActivity(SetupChooseLockPassword.class, intent)).get();
|
Robolectric.buildActivity(SetupChooseLockPassword.class, intent)).get();
|
||||||
//return ActivityController.of(new SetupChooseLockPassword(), intent).setup().get();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Implements(ChooseLockGenericController.class)
|
@Implements(ChooseLockGenericController.class)
|
||||||
|
@@ -38,10 +38,10 @@ import com.android.internal.widget.LockPatternUtils;
|
|||||||
import com.android.internal.widget.LockPatternView;
|
import com.android.internal.widget.LockPatternView;
|
||||||
import com.android.internal.widget.LockPatternView.Cell;
|
import com.android.internal.widget.LockPatternView.Cell;
|
||||||
import com.android.internal.widget.LockPatternView.DisplayMode;
|
import com.android.internal.widget.LockPatternView.DisplayMode;
|
||||||
import com.android.settings.password.ChooseLockPattern.ChooseLockPatternFragment;
|
|
||||||
import com.android.settings.password.ChooseLockPattern.IntentBuilder;
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.SetupRedactionInterstitial;
|
import com.android.settings.SetupRedactionInterstitial;
|
||||||
|
import com.android.settings.password.ChooseLockPattern.ChooseLockPatternFragment;
|
||||||
|
import com.android.settings.password.ChooseLockPattern.IntentBuilder;
|
||||||
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
|
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
|
||||||
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
|
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
|
||||||
import com.android.settings.testutils.shadow.ShadowUtils;
|
import com.android.settings.testutils.shadow.ShadowUtils;
|
||||||
@@ -84,7 +84,7 @@ public class SetupChooseLockPatternTest {
|
|||||||
new IntentBuilder(application)
|
new IntentBuilder(application)
|
||||||
.setUserId(UserHandle.myUserId())
|
.setUserId(UserHandle.myUserId())
|
||||||
.build());
|
.build());
|
||||||
//mActivity = ActivityController.of(new SetupChooseLockPattern(), intent).setup().get();
|
|
||||||
mActivity = (SetupChooseLockPattern) ActivityControllerWrapper.setup(
|
mActivity = (SetupChooseLockPattern) ActivityControllerWrapper.setup(
|
||||||
Robolectric.buildActivity(SetupChooseLockPattern.class, intent)).get();
|
Robolectric.buildActivity(SetupChooseLockPattern.class, intent)).get();
|
||||||
}
|
}
|
||||||
|
@@ -16,18 +16,34 @@
|
|||||||
|
|
||||||
package com.android.settings.password;
|
package com.android.settings.password;
|
||||||
|
|
||||||
|
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PASSWORD;
|
||||||
|
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PATTERN;
|
||||||
|
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PIN;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.hardware.face.FaceManager;
|
||||||
|
import android.hardware.fingerprint.FingerprintManager;
|
||||||
|
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.biometrics.BiometricUtils;
|
||||||
|
import com.android.settings.testutils.FakeFeatureFactory;
|
||||||
import com.android.settings.testutils.shadow.ShadowUtils;
|
import com.android.settings.testutils.shadow.ShadowUtils;
|
||||||
import com.android.settings.utils.ActivityControllerWrapper;
|
import com.android.settings.utils.ActivityControllerWrapper;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.junit.MockitoJUnit;
|
||||||
|
import org.mockito.junit.MockitoRule;
|
||||||
import org.robolectric.Robolectric;
|
import org.robolectric.Robolectric;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
import org.robolectric.annotation.Config;
|
import org.robolectric.annotation.Config;
|
||||||
@@ -39,12 +55,25 @@ import org.robolectric.shadows.ShadowApplication;
|
|||||||
@Config(shadows = {ShadowUtils.class, ShadowAlertDialog.class})
|
@Config(shadows = {ShadowUtils.class, ShadowAlertDialog.class})
|
||||||
public class SetupSkipDialogTest {
|
public class SetupSkipDialogTest {
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public final MockitoRule mMockitoRule = MockitoJUnit.rule();
|
||||||
|
@Mock
|
||||||
|
private FingerprintManager mFingerprintManager;
|
||||||
|
@Mock
|
||||||
|
private FaceManager mFaceManager;
|
||||||
private FragmentActivity mActivity;
|
private FragmentActivity mActivity;
|
||||||
|
private FakeFeatureFactory mFakeFeatureFactory;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
|
ShadowUtils.setFingerprintManager(mFingerprintManager);
|
||||||
|
ShadowUtils.setFaceManager(mFaceManager);
|
||||||
|
mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||||
mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
|
mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
|
||||||
Robolectric.buildActivity(FragmentActivity.class)).get();
|
Robolectric.buildActivity(FragmentActivity.class)).get();
|
||||||
|
|
||||||
|
when(mFakeFeatureFactory.mFaceFeatureProvider.isSetupWizardSupported(any())).thenReturn(
|
||||||
|
true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ShadowAlertDialog getShadowAlertDialog() {
|
private ShadowAlertDialog getShadowAlertDialog() {
|
||||||
@@ -55,10 +84,33 @@ public class SetupSkipDialogTest {
|
|||||||
return shadowAlertDialog;
|
return shadowAlertDialog;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getSkipSetupTitle(int credentialType, boolean hasFingerprint,
|
||||||
|
boolean hasFace) {
|
||||||
|
final int screenLockResId;
|
||||||
|
switch (credentialType) {
|
||||||
|
case CREDENTIAL_TYPE_PATTERN:
|
||||||
|
screenLockResId = R.string.unlock_set_unlock_pattern_title;
|
||||||
|
break;
|
||||||
|
case CREDENTIAL_TYPE_PASSWORD:
|
||||||
|
screenLockResId = R.string.unlock_set_unlock_password_title;
|
||||||
|
break;
|
||||||
|
case CREDENTIAL_TYPE_PIN:
|
||||||
|
default:
|
||||||
|
screenLockResId = R.string.unlock_set_unlock_pin_title;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return mActivity.getString(R.string.lock_screen_skip_setup_title,
|
||||||
|
BiometricUtils.getCombinedScreenLockOptions(mActivity,
|
||||||
|
mActivity.getString(screenLockResId), hasFingerprint, hasFace));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void frpMessages_areShownCorrectly_whenNotSupported() {
|
public void frpMessages_areShownCorrectly_whenNotSupported() {
|
||||||
|
when(mFaceManager.isHardwareDetected()).thenReturn(false);
|
||||||
|
when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
|
||||||
|
|
||||||
SetupSkipDialog setupSkipDialog =
|
SetupSkipDialog setupSkipDialog =
|
||||||
SetupSkipDialog.newInstance(false, false, false, false, false, false);
|
SetupSkipDialog.newInstance(CREDENTIAL_TYPE_PIN, false, false, false, false, true);
|
||||||
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
||||||
|
|
||||||
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
||||||
@@ -70,8 +122,11 @@ public class SetupSkipDialogTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void frpMessages_areShownCorrectly_whenSupported() {
|
public void frpMessages_areShownCorrectly_whenSupported() {
|
||||||
|
when(mFaceManager.isHardwareDetected()).thenReturn(false);
|
||||||
|
when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
|
||||||
|
|
||||||
SetupSkipDialog setupSkipDialog =
|
SetupSkipDialog setupSkipDialog =
|
||||||
SetupSkipDialog.newInstance(true, false, false, false, false, false);
|
SetupSkipDialog.newInstance(CREDENTIAL_TYPE_PIN, true, false, false, false, true);
|
||||||
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
||||||
|
|
||||||
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
||||||
@@ -83,117 +138,175 @@ public class SetupSkipDialogTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void dialogMessage_whenSkipPinSetupForFace_shouldShownCorrectly() {
|
public void dialogMessage_whenSkipPinSetupForFace_shouldShownCorrectly() {
|
||||||
SetupSkipDialog setupSkipDialog =
|
final boolean hasFace = true;
|
||||||
SetupSkipDialog.newInstance(true, false, false, false, true, false);
|
final boolean hasFingerprint = false;
|
||||||
|
|
||||||
|
when(mFaceManager.isHardwareDetected()).thenReturn(hasFace);
|
||||||
|
when(mFingerprintManager.isHardwareDetected()).thenReturn(hasFingerprint);
|
||||||
|
|
||||||
|
SetupSkipDialog setupSkipDialog = SetupSkipDialog.newInstance(CREDENTIAL_TYPE_PIN, false,
|
||||||
|
false, true, false, true);
|
||||||
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
||||||
|
|
||||||
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
||||||
assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
|
assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
|
||||||
mActivity.getString(R.string.lock_screen_pin_skip_face_title));
|
getSkipSetupTitle(CREDENTIAL_TYPE_PIN, hasFingerprint, hasFace));
|
||||||
assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
|
assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
|
||||||
mActivity.getString(R.string.lock_screen_pin_skip_face_message));
|
mActivity.getString(R.string.lock_screen_pin_skip_face_message));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void dialogMessage_whenSkipPasswordSetupForFace_shouldShownCorrectly() {
|
public void dialogMessage_whenSkipPasswordSetupForFace_shouldShownCorrectly() {
|
||||||
SetupSkipDialog setupSkipDialog =
|
final boolean hasFace = true;
|
||||||
SetupSkipDialog.newInstance(true, false, true, false, true, false);
|
final boolean hasFingerprint = false;
|
||||||
|
|
||||||
|
when(mFaceManager.isHardwareDetected()).thenReturn(hasFace);
|
||||||
|
when(mFingerprintManager.isHardwareDetected()).thenReturn(hasFingerprint);
|
||||||
|
|
||||||
|
SetupSkipDialog setupSkipDialog = SetupSkipDialog.newInstance(CREDENTIAL_TYPE_PASSWORD,
|
||||||
|
false, hasFingerprint, hasFace, false, true);
|
||||||
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
||||||
|
|
||||||
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
||||||
assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
|
assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
|
||||||
mActivity.getString(R.string.lock_screen_password_skip_face_title));
|
getSkipSetupTitle(CREDENTIAL_TYPE_PASSWORD, hasFingerprint, hasFace));
|
||||||
assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
|
assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
|
||||||
mActivity.getString(R.string.lock_screen_password_skip_face_message));
|
mActivity.getString(R.string.lock_screen_password_skip_face_message));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void dialogMessage_whenSkipPatternSetupForFace_shouldShownCorrectly() {
|
public void dialogMessage_whenSkipPatternSetupForFace_shouldShownCorrectly() {
|
||||||
|
final boolean hasFace = true;
|
||||||
|
final boolean hasFingerprint = false;
|
||||||
|
|
||||||
|
when(mFaceManager.isHardwareDetected()).thenReturn(hasFace);
|
||||||
|
when(mFingerprintManager.isHardwareDetected()).thenReturn(hasFingerprint);
|
||||||
|
|
||||||
SetupSkipDialog setupSkipDialog =
|
SetupSkipDialog setupSkipDialog =
|
||||||
SetupSkipDialog.newInstance(true, true, false, false, true, false);
|
SetupSkipDialog.newInstance(CREDENTIAL_TYPE_PATTERN, true, false, true, false,
|
||||||
|
true);
|
||||||
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
||||||
|
|
||||||
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
||||||
assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
|
assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
|
||||||
mActivity.getString(R.string.lock_screen_pattern_skip_face_title));
|
getSkipSetupTitle(CREDENTIAL_TYPE_PATTERN, hasFingerprint, hasFace));
|
||||||
assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
|
assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
|
||||||
mActivity.getString(R.string.lock_screen_pattern_skip_face_message));
|
mActivity.getString(R.string.lock_screen_pattern_skip_face_message));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void dialogMessage_whenSkipPinSetupForFingerprint_shouldShownCorrectly() {
|
public void dialogMessage_whenSkipPinSetupForFingerprint_shouldShownCorrectly() {
|
||||||
|
final boolean hasFace = false;
|
||||||
|
final boolean hasFingerprint = true;
|
||||||
|
|
||||||
|
when(mFaceManager.isHardwareDetected()).thenReturn(hasFace);
|
||||||
|
when(mFingerprintManager.isHardwareDetected()).thenReturn(hasFingerprint);
|
||||||
|
|
||||||
SetupSkipDialog setupSkipDialog =
|
SetupSkipDialog setupSkipDialog =
|
||||||
SetupSkipDialog.newInstance(true, false, false, true, false, false);
|
SetupSkipDialog.newInstance(CREDENTIAL_TYPE_PIN, true, true, false, false, true);
|
||||||
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
||||||
|
|
||||||
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
||||||
assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
|
assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
|
||||||
mActivity.getString(R.string.lock_screen_pin_skip_fingerprint_title));
|
getSkipSetupTitle(CREDENTIAL_TYPE_PIN, hasFingerprint, hasFace));
|
||||||
assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
|
assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
|
||||||
mActivity.getString(R.string.lock_screen_pin_skip_fingerprint_message));
|
mActivity.getString(R.string.lock_screen_pin_skip_fingerprint_message));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void dialogMessage_whenSkipPasswordSetupForFingerprint_shouldShownCorrectly() {
|
public void dialogMessage_whenSkipPasswordSetupForFingerprint_shouldShownCorrectly() {
|
||||||
|
final boolean hasFace = false;
|
||||||
|
final boolean hasFingerprint = true;
|
||||||
|
|
||||||
|
when(mFaceManager.isHardwareDetected()).thenReturn(hasFace);
|
||||||
|
when(mFingerprintManager.isHardwareDetected()).thenReturn(hasFingerprint);
|
||||||
|
|
||||||
SetupSkipDialog setupSkipDialog =
|
SetupSkipDialog setupSkipDialog =
|
||||||
SetupSkipDialog.newInstance(true, false, true, true, false, false);
|
SetupSkipDialog.newInstance(CREDENTIAL_TYPE_PASSWORD, true, true, false, false,
|
||||||
|
true);
|
||||||
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
||||||
|
|
||||||
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
||||||
assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
|
assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
|
||||||
mActivity.getString(R.string.lock_screen_password_skip_fingerprint_title));
|
getSkipSetupTitle(CREDENTIAL_TYPE_PASSWORD, hasFingerprint, hasFace));
|
||||||
assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
|
assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
|
||||||
mActivity.getString(R.string.lock_screen_password_skip_fingerprint_message));
|
mActivity.getString(R.string.lock_screen_password_skip_fingerprint_message));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void dialogMessage_whenSkipPatternSetupForFingerprint_shouldShownCorrectly() {
|
public void dialogMessage_whenSkipPatternSetupForFingerprint_shouldShownCorrectly() {
|
||||||
SetupSkipDialog setupSkipDialog =
|
final boolean hasFace = false;
|
||||||
SetupSkipDialog.newInstance(true, true, false, true, false, false);
|
final boolean hasFingerprint = true;
|
||||||
|
|
||||||
|
when(mFaceManager.isHardwareDetected()).thenReturn(hasFace);
|
||||||
|
when(mFingerprintManager.isHardwareDetected()).thenReturn(hasFingerprint);
|
||||||
|
|
||||||
|
SetupSkipDialog setupSkipDialog = SetupSkipDialog.newInstance(CREDENTIAL_TYPE_PATTERN, true,
|
||||||
|
true, false, false, true);
|
||||||
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
||||||
|
|
||||||
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
||||||
assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
|
assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
|
||||||
mActivity.getString(R.string.lock_screen_pattern_skip_fingerprint_title));
|
getSkipSetupTitle(CREDENTIAL_TYPE_PATTERN, hasFingerprint, hasFace));
|
||||||
assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
|
assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
|
||||||
mActivity.getString(R.string.lock_screen_pattern_skip_fingerprint_message));
|
mActivity.getString(R.string.lock_screen_pattern_skip_fingerprint_message));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void dialogMessage_whenSkipPinSetupForBiometrics_shouldShownCorrectly() {
|
public void dialogMessage_whenSkipPinSetupForBiometrics_shouldShownCorrectly() {
|
||||||
|
final boolean hasFace = true;
|
||||||
|
final boolean hasFingerprint = true;
|
||||||
|
|
||||||
|
when(mFaceManager.isHardwareDetected()).thenReturn(hasFace);
|
||||||
|
when(mFingerprintManager.isHardwareDetected()).thenReturn(hasFingerprint);
|
||||||
|
|
||||||
SetupSkipDialog setupSkipDialog =
|
SetupSkipDialog setupSkipDialog =
|
||||||
SetupSkipDialog.newInstance(true, false, false, false, false, true);
|
SetupSkipDialog.newInstance(CREDENTIAL_TYPE_PIN, true, false, false, true, true);
|
||||||
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
||||||
|
|
||||||
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
||||||
assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
|
assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
|
||||||
mActivity.getString(R.string.lock_screen_pin_skip_biometrics_title));
|
getSkipSetupTitle(CREDENTIAL_TYPE_PIN, hasFingerprint, hasFace));
|
||||||
assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
|
assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
|
||||||
mActivity.getString(R.string.lock_screen_pin_skip_biometrics_message));
|
mActivity.getString(R.string.lock_screen_pin_skip_biometrics_message));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void dialogMessage_whenSkipPasswordSetupForBiometrics_shouldShownCorrectly() {
|
public void dialogMessage_whenSkipPasswordSetupForBiometrics_shouldShownCorrectly() {
|
||||||
|
final boolean hasFace = true;
|
||||||
|
final boolean hasFingerprint = true;
|
||||||
|
|
||||||
|
when(mFaceManager.isHardwareDetected()).thenReturn(hasFace);
|
||||||
|
when(mFingerprintManager.isHardwareDetected()).thenReturn(hasFingerprint);
|
||||||
|
|
||||||
SetupSkipDialog setupSkipDialog =
|
SetupSkipDialog setupSkipDialog =
|
||||||
SetupSkipDialog.newInstance(true, false, true, false, false, true);
|
SetupSkipDialog.newInstance(CREDENTIAL_TYPE_PASSWORD, true, false, false, true,
|
||||||
|
true);
|
||||||
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
||||||
|
|
||||||
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
||||||
assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
|
assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
|
||||||
mActivity.getString(R.string.lock_screen_password_skip_biometrics_title));
|
getSkipSetupTitle(CREDENTIAL_TYPE_PASSWORD, hasFingerprint, hasFace));
|
||||||
assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
|
assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
|
||||||
mActivity.getString(R.string.lock_screen_password_skip_biometrics_message));
|
mActivity.getString(R.string.lock_screen_password_skip_biometrics_message));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void dialogMessage_whenSkipPatternSetupForBiometrics_shouldShownCorrectly() {
|
public void dialogMessage_whenSkipPatternSetupForBiometrics_shouldShownCorrectly() {
|
||||||
|
final boolean hasFace = true;
|
||||||
|
final boolean hasFingerprint = true;
|
||||||
|
|
||||||
|
when(mFaceManager.isHardwareDetected()).thenReturn(hasFace);
|
||||||
|
when(mFingerprintManager.isHardwareDetected()).thenReturn(hasFingerprint);
|
||||||
|
|
||||||
SetupSkipDialog setupSkipDialog =
|
SetupSkipDialog setupSkipDialog =
|
||||||
SetupSkipDialog.newInstance(true, true, false, false, false, true);
|
SetupSkipDialog.newInstance(CREDENTIAL_TYPE_PATTERN, true, false, false, true,
|
||||||
|
true);
|
||||||
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
setupSkipDialog.show(mActivity.getSupportFragmentManager());
|
||||||
|
|
||||||
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
|
||||||
assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
|
assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
|
||||||
mActivity.getString(R.string.lock_screen_pattern_skip_biometrics_title));
|
getSkipSetupTitle(CREDENTIAL_TYPE_PATTERN, hasFingerprint, hasFace));
|
||||||
assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
|
assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
|
||||||
mActivity.getString(R.string.lock_screen_pattern_skip_biometrics_message));
|
mActivity.getString(R.string.lock_screen_pattern_skip_biometrics_message));
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user