From f01b99e725ee630683c274c8b60481cfcc7a9423 Mon Sep 17 00:00:00 2001 From: Rhed Jao Date: Thu, 18 May 2023 11:16:22 +0000 Subject: [PATCH] Passing the writing repair mode password flag to verify credential api Handles the ACTION_PREPARE_REPAIR_MODE_DEVICE_CREDENTIAL intent to prompt the user for device credentials. Passing the writing repair mode password flag to the verify credential api when the user is authenticating. Bug: 277561275 Test: am start -a android.app.action.PREPARE_REPAIR_MODE_DEVICE_CREDENTIAL Change-Id: Id018586b0ed535555c157b7516c9571b049978ad --- AndroidManifest.xml | 1 + .../password/ChooseLockSettingsHelper.java | 24 +++++++++++++++---- .../ConfirmDeviceCredentialActivity.java | 14 +++++++++++ .../ConfirmDeviceCredentialBaseFragment.java | 3 +++ .../password/ConfirmLockPassword.java | 4 +++- .../settings/password/ConfirmLockPattern.java | 4 +++- 6 files changed, 44 insertions(+), 6 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 2c3e7f3d12a..185d21ec7b2 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2397,6 +2397,7 @@ + diff --git a/src/com/android/settings/password/ChooseLockSettingsHelper.java b/src/com/android/settings/password/ChooseLockSettingsHelper.java index 216f7db1ac1..943a937a32a 100644 --- a/src/com/android/settings/password/ChooseLockSettingsHelper.java +++ b/src/com/android/settings/password/ChooseLockSettingsHelper.java @@ -71,6 +71,8 @@ public final class ChooseLockSettingsHelper { // Gatekeeper password handle, which can subsequently be used to generate Gatekeeper // HardwareAuthToken(s) via LockSettingsService#verifyGatekeeperPasswordHandle public static final String EXTRA_KEY_GK_PW_HANDLE = "gk_pw_handle"; + public static final String EXTRA_KEY_REQUEST_WRITE_REPAIR_MODE_PW = + "request_write_repair_mode_pw"; /** * When EXTRA_KEY_UNIFICATION_PROFILE_CREDENTIAL and EXTRA_KEY_UNIFICATION_PROFILE_ID are @@ -152,6 +154,7 @@ public final class ChooseLockSettingsHelper { @Nullable private RemoteLockscreenValidationSession mRemoteLockscreenValidationSession; @Nullable private ComponentName mRemoteLockscreenValidationServiceComponent; private boolean mRequestGatekeeperPasswordHandle; + private boolean mRequestWriteRepairModePassword; private boolean mTaskOverlay; public Builder(@NonNull Activity activity) { @@ -335,6 +338,17 @@ public final class ChooseLockSettingsHelper { return this; } + /** + * @param requestWriteRepairModePassword Set {@code true} to request that + * LockSettingsService writes the password data to the repair mode file after the user + * credential is verified successfully. + */ + @NonNull public Builder setRequestWriteRepairModePassword( + boolean requestWriteRepairModePassword) { + mRequestWriteRepairModePassword = requestWriteRepairModePassword; + return this; + } + /** * Support of ActivityResultLauncher. * @@ -385,7 +399,7 @@ public final class ChooseLockSettingsHelper { mBuilder.mRemoteLockscreenValidationSession, mBuilder.mRemoteLockscreenValidationServiceComponent, mBuilder.mAllowAnyUserId, mBuilder.mForegroundOnly, mBuilder.mRequestGatekeeperPasswordHandle, - mBuilder.mTaskOverlay); + mBuilder.mRequestWriteRepairModePassword, mBuilder.mTaskOverlay); } private boolean launchConfirmationActivity(int request, @Nullable CharSequence title, @@ -396,7 +410,7 @@ public final class ChooseLockSettingsHelper { @Nullable RemoteLockscreenValidationSession remoteLockscreenValidationSession, @Nullable ComponentName remoteLockscreenValidationServiceComponent, boolean allowAnyUser, boolean foregroundOnly, boolean requestGatekeeperPasswordHandle, - boolean taskOverlay) { + boolean requestWriteRepairModePassword, boolean taskOverlay) { Optional> activityClass = determineAppropriateActivityClass( returnCredentials, forceVerifyPath, userId, remoteLockscreenValidationSession); if (activityClass.isEmpty()) { @@ -407,7 +421,7 @@ public final class ChooseLockSettingsHelper { returnCredentials, external, forceVerifyPath, userId, alternateButton, checkboxLabel, remoteLockscreenValidation, remoteLockscreenValidationSession, remoteLockscreenValidationServiceComponent, allowAnyUser, foregroundOnly, - requestGatekeeperPasswordHandle, taskOverlay); + requestGatekeeperPasswordHandle, requestWriteRepairModePassword, taskOverlay); } private boolean launchConfirmationActivity(int request, CharSequence title, CharSequence header, @@ -418,7 +432,7 @@ public final class ChooseLockSettingsHelper { @Nullable RemoteLockscreenValidationSession remoteLockscreenValidationSession, @Nullable ComponentName remoteLockscreenValidationServiceComponent, boolean allowAnyUser, boolean foregroundOnly, boolean requestGatekeeperPasswordHandle, - boolean taskOverlay) { + boolean requestWriteRepairModePassword, boolean taskOverlay) { final Intent intent = new Intent(); intent.putExtra(ConfirmDeviceCredentialBaseFragment.TITLE_TEXT, title); intent.putExtra(ConfirmDeviceCredentialBaseFragment.HEADER_TEXT, header); @@ -442,6 +456,8 @@ public final class ChooseLockSettingsHelper { intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_ALLOW_ANY_USER, allowAnyUser); intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_REQUEST_GK_PW_HANDLE, requestGatekeeperPasswordHandle); + intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_REQUEST_WRITE_REPAIR_MODE_PW, + requestWriteRepairModePassword); intent.setClassName(SETTINGS_PACKAGE_NAME, activityClass.getName()); intent.putExtra(SettingsBaseActivity.EXTRA_PAGE_TRANSITION_TYPE, diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java index fabca6bb983..d409c0f9dfb 100644 --- a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java +++ b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java @@ -171,6 +171,9 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { KeyguardManager.ACTION_CONFIRM_REMOTE_DEVICE_CREDENTIAL.equals(intent.getAction()); mTaskOverlay = isInternalActivity() && intent.getBooleanExtra(KeyguardManager.EXTRA_FORCE_TASK_OVERLAY, false); + final boolean prepareRepairMode = + KeyguardManager.ACTION_PREPARE_REPAIR_MODE_DEVICE_CREDENTIAL.equals( + intent.getAction()); mUserId = UserHandle.myUserId(); if (isInternalActivity()) { @@ -244,6 +247,17 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { .setExternal(true) .show(); return; + } else if (prepareRepairMode) { + final ChooseLockSettingsHelper.Builder builder = + new ChooseLockSettingsHelper.Builder(this); + launchedCDC = builder.setHeader(mTitle) + .setDescription(mDetails) + .setExternal(true) + .setUserId(mUserId) + .setTaskOverlay(mTaskOverlay) + .setRequestWriteRepairModePassword(true) + .setForceVerifyPath(true) + .show(); } else if (isEffectiveUserManagedProfile && isInternalActivity()) { mCredentialMode = CREDENTIAL_MANAGED; if (isBiometricAllowed(effectiveUserId, mUserId)) { diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java index f4cfabc754c..5a123b89315 100644 --- a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java +++ b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java @@ -105,6 +105,7 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr protected final Handler mHandler = new Handler(); protected boolean mFrp; protected boolean mRemoteValidation; + protected boolean mRequestWriteRepairModePassword; protected CharSequence mAlternateButtonText; protected BiometricManager mBiometricManager; @Nullable protected RemoteLockscreenValidationSession mRemoteLockscreenValidationSession; @@ -130,6 +131,8 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr ChooseLockSettingsHelper.EXTRA_KEY_REQUEST_GK_PW_HANDLE, false); mForceVerifyPath = intent.getBooleanExtra( ChooseLockSettingsHelper.EXTRA_KEY_FORCE_VERIFY, false); + mRequestWriteRepairModePassword = intent.getBooleanExtra( + ChooseLockSettingsHelper.EXTRA_KEY_REQUEST_WRITE_REPAIR_MODE_PW, false); if (intent.getBooleanExtra(IS_REMOTE_LOCKSCREEN_VALIDATION, false)) { if (FeatureFlagUtils.isEnabled(getContext(), diff --git a/src/com/android/settings/password/ConfirmLockPassword.java b/src/com/android/settings/password/ConfirmLockPassword.java index 03b89f25051..1b535069f3c 100644 --- a/src/com/android/settings/password/ConfirmLockPassword.java +++ b/src/com/android/settings/password/ConfirmLockPassword.java @@ -496,7 +496,9 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { } } else if (mForceVerifyPath) { if (isInternalActivity()) { - startVerifyPassword(credential, intent, 0 /* flags */); + final int flags = mRequestWriteRepairModePassword + ? LockPatternUtils.VERIFY_FLAG_WRITE_REPAIR_MODE_PW : 0; + startVerifyPassword(credential, intent, flags); return; } } else { diff --git a/src/com/android/settings/password/ConfirmLockPattern.java b/src/com/android/settings/password/ConfirmLockPattern.java index 7db25fd830f..c10f865343f 100644 --- a/src/com/android/settings/password/ConfirmLockPattern.java +++ b/src/com/android/settings/password/ConfirmLockPattern.java @@ -523,7 +523,9 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity { } } else if (mForceVerifyPath) { if (isInternalActivity()) { - startVerifyPattern(credential, intent, 0 /* flags */); + final int flags = mRequestWriteRepairModePassword + ? LockPatternUtils.VERIFY_FLAG_WRITE_REPAIR_MODE_PW : 0; + startVerifyPattern(credential, intent, flags); return; } } else {