diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 4993d14cd95..09ddde9e5fd 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2398,6 +2398,7 @@ + diff --git a/res/values/strings.xml b/res/values/strings.xml index c36024e487a..a87b27d5e6b 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -3501,6 +3501,18 @@ Also use password to unlock this device + + Verify pattern + + Verify PIN + + Verify password + + Enter your device pattern enrolled in normal mode to continue + + Enter your device PIN enrolled in normal mode to continue + + Enter your device password enrolled in normal mode to continue diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index 68b1a48a380..a2195df1b6b 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -708,9 +708,13 @@ public final class Utils extends com.android.settingslib.Utils { final int userId = bundle.getInt(Intent.EXTRA_USER_ID, UserHandle.myUserId()); if (userId == LockPatternUtils.USER_FRP) { return allowAnyUser ? userId : checkUserOwnsFrpCredential(context, userId); - } else { - return allowAnyUser ? userId : enforceSameOwner(context, userId); } + if (userId == LockPatternUtils.USER_REPAIR_MODE) { + enforceRepairModeActive(context); + // any users can exit repair mode + return userId; + } + return allowAnyUser ? userId : enforceSameOwner(context, userId); } /** @@ -729,6 +733,16 @@ public final class Utils extends com.android.settingslib.Utils { + " does not own frp credential."); } + /** + * Throws {@link SecurityException} if repair mode is not active on the device. + */ + private static void enforceRepairModeActive(Context context) { + if (LockPatternUtils.isRepairModeActive(context)) { + return; + } + throw new SecurityException("Repair mode is not active on the device."); + } + /** * Returns the given user id if it belongs to the current user. * diff --git a/src/com/android/settings/password/ChooseLockSettingsHelper.java b/src/com/android/settings/password/ChooseLockSettingsHelper.java index 943a937a32a..9533314c8a2 100644 --- a/src/com/android/settings/password/ChooseLockSettingsHelper.java +++ b/src/com/android/settings/password/ChooseLockSettingsHelper.java @@ -362,7 +362,8 @@ public final class ChooseLockSettingsHelper { } @NonNull public ChooseLockSettingsHelper build() { - if (!mAllowAnyUserId && mUserId != LockPatternUtils.USER_FRP) { + if (!mAllowAnyUserId && mUserId != LockPatternUtils.USER_FRP + && mUserId != LockPatternUtils.USER_REPAIR_MODE) { Utils.enforceSameOwner(mActivity, mUserId); } diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java index d409c0f9dfb..314ce053127 100644 --- a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java +++ b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java @@ -166,8 +166,12 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { mDetails = intent.getCharSequenceExtra(KeyguardManager.EXTRA_DESCRIPTION); String alternateButton = intent.getStringExtra( KeyguardManager.EXTRA_ALTERNATE_BUTTON_LABEL); - boolean frp = KeyguardManager.ACTION_CONFIRM_FRP_CREDENTIAL.equals(intent.getAction()); - boolean remoteValidation = + final boolean frp = + KeyguardManager.ACTION_CONFIRM_FRP_CREDENTIAL.equals(intent.getAction()); + final boolean repairMode = + KeyguardManager.ACTION_CONFIRM_REPAIR_MODE_DEVICE_CREDENTIAL + .equals(intent.getAction()); + final boolean remoteValidation = KeyguardManager.ACTION_CONFIRM_REMOTE_DEVICE_CREDENTIAL.equals(intent.getAction()); mTaskOverlay = isInternalActivity() && intent.getBooleanExtra(KeyguardManager.EXTRA_FORCE_TASK_OVERLAY, false); @@ -222,6 +226,14 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { .setExternal(true) .setUserId(LockPatternUtils.USER_FRP) .show(); + } else if (repairMode) { + final ChooseLockSettingsHelper.Builder builder = + new ChooseLockSettingsHelper.Builder(this); + launchedCDC = builder.setHeader(mTitle) + .setDescription(mDetails) + .setExternal(true) + .setUserId(LockPatternUtils.USER_REPAIR_MODE) + .show(); } else if (remoteValidation) { RemoteLockscreenValidationSession remoteLockscreenValidationSession = intent.getParcelableExtra( diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java index 5a123b89315..43d8440512b 100644 --- a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java +++ b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java @@ -106,6 +106,7 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr protected boolean mFrp; protected boolean mRemoteValidation; protected boolean mRequestWriteRepairModePassword; + protected boolean mRepairMode; protected CharSequence mAlternateButtonText; protected BiometricManager mBiometricManager; @Nullable protected RemoteLockscreenValidationSession mRemoteLockscreenValidationSession; @@ -181,6 +182,7 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr mUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras(), isInternalActivity()); mFrp = (mUserId == LockPatternUtils.USER_FRP); + mRepairMode = (mUserId == LockPatternUtils.USER_REPAIR_MODE); mUserManager = UserManager.get(getActivity()); mEffectiveUserId = mUserManager.getCredentialOwnerProfile(mUserId); mLockPatternUtils = new LockPatternUtils(getActivity()); @@ -269,7 +271,7 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr // verifyTiedProfileChallenge. In such case, we also wanna show the user message that // fingerprint is disabled due to device restart. protected boolean isStrongAuthRequired() { - return mFrp + return mFrp || mRepairMode || !mLockPatternUtils.isBiometricAllowedForUser(mEffectiveUserId) || !mUserManager.isUserUnlocked(mUserId); } diff --git a/src/com/android/settings/password/ConfirmLockPassword.java b/src/com/android/settings/password/ConfirmLockPassword.java index 1b535069f3c..c6022b5d3ce 100644 --- a/src/com/android/settings/password/ConfirmLockPassword.java +++ b/src/com/android/settings/password/ConfirmLockPassword.java @@ -284,6 +284,11 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { return mIsAlpha ? getString(R.string.lockpassword_confirm_your_password_header_frp) : getString(R.string.lockpassword_confirm_your_pin_header_frp); } + if (mRepairMode) { + return mIsAlpha + ? getString(R.string.lockpassword_confirm_repair_mode_password_header) + : getString(R.string.lockpassword_confirm_repair_mode_pin_header); + } if (mRemoteValidation) { return getString(R.string.lockpassword_remote_validation_header); } @@ -307,6 +312,11 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { return mIsAlpha ? getString(R.string.lockpassword_confirm_your_password_details_frp) : getString(R.string.lockpassword_confirm_your_pin_details_frp); } + if (mRepairMode) { + return mIsAlpha + ? getString(R.string.lockpassword_confirm_repair_mode_password_details) + : getString(R.string.lockpassword_confirm_repair_mode_pin_details); + } if (mRemoteValidation) { return getContext().getString(mIsAlpha ? R.string.lockpassword_remote_validation_password_details diff --git a/src/com/android/settings/password/ConfirmLockPattern.java b/src/com/android/settings/password/ConfirmLockPattern.java index 3951bde9bac..a2bcb5af510 100644 --- a/src/com/android/settings/password/ConfirmLockPattern.java +++ b/src/com/android/settings/password/ConfirmLockPattern.java @@ -179,7 +179,7 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity { // ability to disable the pattern in L. Remove this block after // ensuring it's safe to do so. (Note that ConfirmLockPassword // doesn't have this). - if (!mFrp && !mRemoteValidation + if (!mFrp && !mRemoteValidation && !mRepairMode && !mLockPatternUtils.isLockPatternEnabled(mEffectiveUserId)) { getActivity().setResult(Activity.RESULT_OK); getActivity().finish(); @@ -308,6 +308,9 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity { if (mFrp) { return getString(R.string.lockpassword_confirm_your_pattern_details_frp); } + if (mRepairMode) { + return getString(R.string.lockpassword_confirm_repair_mode_pattern_details); + } if (mRemoteValidation) { return getString( R.string.lockpassword_remote_validation_pattern_details); @@ -402,7 +405,12 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity { } private String getDefaultHeader() { - if (mFrp) return getString(R.string.lockpassword_confirm_your_pattern_header_frp); + if (mFrp) { + return getString(R.string.lockpassword_confirm_your_pattern_header_frp); + } + if (mRepairMode) { + return getString(R.string.lockpassword_confirm_repair_mode_pattern_header); + } if (mRemoteValidation) { return getString(R.string.lockpassword_remote_validation_header); }