diff --git a/src/com/android/settings/MasterClear.java b/src/com/android/settings/MasterClear.java
index 57dfd1b..62edfce 100644
--- a/src/com/android/settings/MasterClear.java
+++ b/src/com/android/settings/MasterClear.java
@@ -139,8 +139,11 @@
      */
     private boolean runKeyguardConfirmation(int request) {
         Resources res = getActivity().getResources();
-        return new ChooseLockSettingsHelper(getActivity(), this).launchConfirmationActivity(
-                request, res.getText(R.string.master_clear_short_title));
+        final ChooseLockSettingsHelper.Builder builder =
+                new ChooseLockSettingsHelper.Builder(getActivity(), this);
+        return builder.setRequestCode(request)
+                .setTitle(res.getText(R.string.master_clear_short_title))
+                .show();
     }
 
     @VisibleForTesting
diff --git a/src/com/android/settings/ResetNetwork.java b/src/com/android/settings/ResetNetwork.java
index 733d7fe..ce2cd71 100644
--- a/src/com/android/settings/ResetNetwork.java
+++ b/src/com/android/settings/ResetNetwork.java
@@ -92,8 +92,11 @@
      */
     private boolean runKeyguardConfirmation(int request) {
         Resources res = getActivity().getResources();
-        return new ChooseLockSettingsHelper(getActivity(), this).launchConfirmationActivity(
-                request, res.getText(R.string.reset_network_title));
+        final ChooseLockSettingsHelper.Builder builder =
+                new ChooseLockSettingsHelper.Builder(getActivity(), this);
+        return builder.setRequestCode(request)
+                .setTitle(res.getText(R.string.reset_network_title))
+                .show();
     }
 
     @Override
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 64919d9..b9d104a 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -634,7 +634,7 @@
      *
      * @param isInternal indicating if the caller is "internal" to the system,
      *            meaning we're willing to trust extras like
-     *            {@link ChooseLockSettingsHelper#EXTRA_ALLOW_ANY_USER}.
+     *            {@link ChooseLockSettingsHelper#EXTRA_KEY_ALLOW_ANY_USER}.
      * @throws SecurityException if the given userId does not belong to the
      *             current user group.
      */
@@ -643,7 +643,7 @@
             return getCredentialOwnerUserId(context);
         }
         final boolean allowAnyUser = isInternal
-                && bundle.getBoolean(ChooseLockSettingsHelper.EXTRA_ALLOW_ANY_USER, false);
+                && bundle.getBoolean(ChooseLockSettingsHelper.EXTRA_KEY_ALLOW_ANY_USER, false);
         final int userId = bundle.getInt(Intent.EXTRA_USER_ID, UserHandle.myUserId());
         if (userId == LockPatternUtils.USER_FRP) {
             return allowAnyUser ? userId : enforceSystemUser(context, userId);
diff --git a/src/com/android/settings/accounts/AddAccountSettings.java b/src/com/android/settings/accounts/AddAccountSettings.java
index d4d93dd..de8e2f3 100644
--- a/src/com/android/settings/accounts/AddAccountSettings.java
+++ b/src/com/android/settings/accounts/AddAccountSettings.java
@@ -163,11 +163,13 @@
         } else {
             // If the user is locked by fbe: we couldn't start the authenticator. So we must ask the
             // user to unlock it first.
-            ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(this);
-            if (!helper.launchConfirmationActivity(UNLOCK_WORK_PROFILE_REQUEST,
-                    getString(R.string.unlock_set_unlock_launch_picker_title),
-                    false,
-                    mUserHandle.getIdentifier())) {
+            final ChooseLockSettingsHelper.Builder builder =
+                    new ChooseLockSettingsHelper.Builder(this);
+            final boolean launched = builder.setRequestCode(UNLOCK_WORK_PROFILE_REQUEST)
+                    .setTitle(getString(R.string.unlock_set_unlock_launch_picker_title))
+                    .setUserId(mUserHandle.getIdentifier())
+                    .show();
+            if (!launched) {
                 requestChooseAccount();
             }
         }
diff --git a/src/com/android/settings/applications/ConvertToFbe.java b/src/com/android/settings/applications/ConvertToFbe.java
index 2a6bdaf..d470011 100644
--- a/src/com/android/settings/applications/ConvertToFbe.java
+++ b/src/com/android/settings/applications/ConvertToFbe.java
@@ -39,9 +39,11 @@
 
     private boolean runKeyguardConfirmation(int request) {
         Resources res = getActivity().getResources();
-        return new ChooseLockSettingsHelper(getActivity(), this)
-                .launchConfirmationActivity(request,
-                        res.getText(R.string.convert_to_file_encryption));
+        final ChooseLockSettingsHelper.Builder builder =
+                new ChooseLockSettingsHelper.Builder(getActivity(), this);
+        return builder.setRequestCode(request)
+                .setTitle(res.getText(R.string.convert_to_file_encryption))
+                .show();
     }
 
     @Override
diff --git a/src/com/android/settings/biometrics/BiometricEnrollBase.java b/src/com/android/settings/biometrics/BiometricEnrollBase.java
index 308878f..0017117 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollBase.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollBase.java
@@ -181,18 +181,19 @@
     }
 
     protected void launchConfirmLock(int titleResId, long challenge) {
-        ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(this);
-        boolean launchedConfirmationActivity;
-        if (mUserId == UserHandle.USER_NULL) {
-            launchedConfirmationActivity = helper.launchConfirmationActivity(CONFIRM_REQUEST,
-                    getString(titleResId),
-                    null, null, challenge, true /* foregroundOnly */);
-        } else {
-            launchedConfirmationActivity = helper.launchConfirmationActivity(CONFIRM_REQUEST,
-                    getString(titleResId),
-                    null, null, challenge, mUserId, true /* foregroundOnly */);
+        final ChooseLockSettingsHelper.Builder builder = new ChooseLockSettingsHelper.Builder(this);
+        builder.setRequestCode(CONFIRM_REQUEST)
+                .setTitle(getString(titleResId))
+                .setChallenge(challenge)
+                .setForegroundOnly(true)
+                .setReturnCredentials(true);
+
+        if (mUserId != UserHandle.USER_NULL) {
+            builder.setUserId(mUserId);
         }
-        if (!launchedConfirmationActivity) {
+
+        final boolean launched = builder.show();
+        if (!launched) {
             // This shouldn't happen, as we should only end up at this step if a lock thingy is
             // already set.
             finish();
diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
index d815f57..a7f9adb 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
@@ -184,7 +184,7 @@
     }
 
     private void updatePasswordQuality() {
-        final int passwordQuality = new ChooseLockSettingsHelper(this).utils()
+        final int passwordQuality = new LockPatternUtils(this)
                 .getActivePasswordQuality(mUserManager.getCredentialOwnerProfile(mUserId));
         mHasPassword = passwordQuality != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
     }
diff --git a/src/com/android/settings/biometrics/face/FaceSettings.java b/src/com/android/settings/biometrics/face/FaceSettings.java
index f09c383..1c98428 100644
--- a/src/com/android/settings/biometrics/face/FaceSettings.java
+++ b/src/com/android/settings/biometrics/face/FaceSettings.java
@@ -206,12 +206,18 @@
             // created while Keyguard is showing, in which case the resetLockout revokeChallenge
             // will invalidate the too-early created challenge here.
             final long challenge = mFaceManager.generateChallengeBlocking();
-            ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(getActivity(), this);
+            final ChooseLockSettingsHelper.Builder builder =
+                    new ChooseLockSettingsHelper.Builder(getActivity(), this);
+            final boolean launched = builder.setRequestCode(CONFIRM_REQUEST)
+                    .setTitle(getString(R.string.security_settings_face_preference_title))
+                    .setChallenge(challenge)
+                    .setUserId(mUserId)
+                    .setForegroundOnly(true)
+                    .setReturnCredentials(true)
+                    .show();
 
             mConfirmingPassword = true;
-            if (!helper.launchConfirmationActivity(CONFIRM_REQUEST,
-                    getString(R.string.security_settings_face_preference_title),
-                    null, null, challenge, mUserId, true /* foregroundOnly */)) {
+            if (!launched) {
                 Log.e(TAG, "Password not set");
                 finish();
             }
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
index e129908..1fa9a47 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
@@ -634,12 +634,19 @@
         }
 
         private void launchChooseOrConfirmLock() {
-            Intent intent = new Intent();
-            long challenge = mFingerprintManager.generateChallengeBlocking();
-            ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(getActivity(), this);
-            if (!helper.launchConfirmationActivity(CONFIRM_REQUEST,
-                    getString(R.string.security_settings_fingerprint_preference_title),
-                    null, null, challenge, mUserId, true /* foregroundOnly */)) {
+            final Intent intent = new Intent();
+            final long challenge = mFingerprintManager.generateChallengeBlocking();
+            final ChooseLockSettingsHelper.Builder builder =
+                    new ChooseLockSettingsHelper.Builder(getActivity(), this);
+            final boolean launched = builder.setRequestCode(CONFIRM_REQUEST)
+                    .setTitle(getString(R.string.security_settings_fingerprint_preference_title))
+                    .setChallenge(challenge)
+                    .setUserId(mUserId)
+                    .setForegroundOnly(true)
+                    .setReturnCredentials(true)
+                    .show();
+
+            if (!launched) {
                 intent.setClassName(SETTINGS_PACKAGE_NAME, ChooseLockGeneric.class.getName());
                 intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.MINIMUM_QUALITY_KEY,
                         DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
diff --git a/src/com/android/settings/development/OemUnlockPreferenceController.java b/src/com/android/settings/development/OemUnlockPreferenceController.java
index f8a245f..118312a 100644
--- a/src/com/android/settings/development/OemUnlockPreferenceController.java
+++ b/src/com/android/settings/development/OemUnlockPreferenceController.java
@@ -52,8 +52,8 @@
     private final OemLockManager mOemLockManager;
     private final UserManager mUserManager;
     private final TelephonyManager mTelephonyManager;
+    private final Activity mActivity;
     private final DevelopmentSettingsDashboardFragment mFragment;
-    private final ChooseLockSettingsHelper mChooseLockSettingsHelper;
     private RestrictedSwitchPreference mPreference;
 
     public OemUnlockPreferenceController(Context context, Activity activity,
@@ -69,12 +69,8 @@
         }
         mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
         mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+        mActivity = activity;
         mFragment = fragment;
-        if (activity != null || mFragment != null) {
-            mChooseLockSettingsHelper = new ChooseLockSettingsHelper(activity, mFragment);
-        } else {
-            mChooseLockSettingsHelper = null;
-        }
     }
 
     @Override
@@ -204,8 +200,11 @@
 
     @VisibleForTesting
     boolean showKeyguardConfirmation(Resources resources, int requestCode) {
-        return mChooseLockSettingsHelper.launchConfirmationActivity(
-                requestCode, resources.getString(R.string.oem_unlock_enable));
+        final ChooseLockSettingsHelper.Builder builder =
+                new ChooseLockSettingsHelper.Builder(mActivity, mFragment);
+        return builder.setRequestCode(requestCode)
+                .setTitle(resources.getString(R.string.oem_unlock_enable))
+                .show();
     }
 
     @VisibleForTesting
diff --git a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
index 185c8ea..c09ea02 100644
--- a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
@@ -160,11 +160,16 @@
             if (mDevHitCountdown == 0 && !mProcessingLastDevHit) {
                 // Add 1 count back, then start password confirmation flow.
                 mDevHitCountdown++;
-                final ChooseLockSettingsHelper helper =
-                        new ChooseLockSettingsHelper(mActivity, mFragment);
-                mProcessingLastDevHit = helper.launchConfirmationActivity(
-                        REQUEST_CONFIRM_PASSWORD_FOR_DEV_PREF,
-                        mContext.getString(R.string.unlock_set_unlock_launch_picker_title));
+
+                final String title = mContext
+                        .getString(R.string.unlock_set_unlock_launch_picker_title);
+                final ChooseLockSettingsHelper.Builder builder =
+                        new ChooseLockSettingsHelper.Builder(mActivity, mFragment);
+                mProcessingLastDevHit = builder
+                        .setRequestCode(REQUEST_CONFIRM_PASSWORD_FOR_DEV_PREF)
+                        .setTitle(title)
+                        .show();
+
                 if (!mProcessingLastDevHit) {
                     enableDevelopmentSettings();
                 }
diff --git a/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java b/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java
index 1cae22e..ec77126 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java
@@ -103,8 +103,14 @@
                     Log.d(TAG, "User " + user.id + " is currently locked; requesting unlock");
                     final CharSequence description = TextUtils.expandTemplate(
                             getText(R.string.storage_wizard_move_unlock), user.name);
-                    new ChooseLockSettingsHelper(this).launchConfirmationActivityForAnyUser(
-                            REQUEST_CREDENTIAL, null, null, description, user.id);
+                    final ChooseLockSettingsHelper.Builder builder =
+                            new ChooseLockSettingsHelper.Builder(this);
+                    builder.setRequestCode(REQUEST_CREDENTIAL)
+                            .setDescription(description)
+                            .setUserId(user.id)
+                            .setAllowAnyUserId(true)
+                            .setChallenge(0L)
+                            .show();
                     return;
                 }
             }
diff --git a/src/com/android/settings/deviceinfo/StorageWizardMoveConfirm.java b/src/com/android/settings/deviceinfo/StorageWizardMoveConfirm.java
index 8dc878e..ec06858 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardMoveConfirm.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardMoveConfirm.java
@@ -85,8 +85,14 @@
                     Log.d(TAG, "User " + user.id + " is currently locked; requesting unlock");
                     final CharSequence description = TextUtils.expandTemplate(
                             getText(R.string.storage_wizard_move_unlock), user.name);
-                    new ChooseLockSettingsHelper(this).launchConfirmationActivityForAnyUser(
-                            REQUEST_CREDENTIAL, null, null, description, user.id);
+                    final ChooseLockSettingsHelper.Builder builder =
+                            new ChooseLockSettingsHelper.Builder(this);
+                    builder.setRequestCode(REQUEST_CREDENTIAL)
+                            .setDescription(description)
+                            .setUserId(user.id)
+                            .setChallenge(0L)
+                            .setAllowAnyUserId(true)
+                            .show();
                     return;
                 }
             }
diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java
index 04ee1b8..19b0b0b 100644
--- a/src/com/android/settings/password/ChooseLockGeneric.java
+++ b/src/com/android/settings/password/ChooseLockGeneric.java
@@ -142,7 +142,7 @@
         @VisibleForTesting
         static final int SKIP_FINGERPRINT_REQUEST = 104;
 
-        private ChooseLockSettingsHelper mChooseLockSettingsHelper;
+        private LockPatternUtils mLockPatternUtils;
         private DevicePolicyManager mDpm;
         private boolean mHasChallenge = false;
         private long mChallenge;
@@ -150,7 +150,6 @@
         private boolean mWaitingForConfirmation = false;
         private boolean mForChangeCredRequiredForBoot = false;
         private LockscreenCredential mUserPassword;
-        private LockPatternUtils mLockPatternUtils;
         private FingerprintManager mFingerprintManager;
         private FaceManager mFaceManager;
         private int mUserId;
@@ -199,7 +198,6 @@
             mFingerprintManager = Utils.getFingerprintManagerOrNull(activity);
             mFaceManager = Utils.getFaceManagerOrNull(activity);
             mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
-            mChooseLockSettingsHelper = new ChooseLockSettingsHelper(activity);
             mLockPatternUtils = new LockPatternUtils(activity);
             mIsSetNewPassword = ACTION_SET_NEW_PARENT_PROFILE_PASSWORD.equals(chooseLockAction)
                     || ACTION_SET_NEW_PASSWORD.equals(chooseLockAction);
@@ -274,15 +272,17 @@
                             mUserId), false);
                 }
             } else if (!mWaitingForConfirmation) {
-                ChooseLockSettingsHelper helper =
-                        new ChooseLockSettingsHelper(activity, this);
+                final ChooseLockSettingsHelper.Builder builder =
+                        new ChooseLockSettingsHelper.Builder(activity, this);
+                builder.setRequestCode(CONFIRM_EXISTING_REQUEST)
+                        .setTitle(getString(R.string.unlock_set_unlock_launch_picker_title))
+                        .setReturnCredentials(true)
+                        .setUserId(mUserId);
                 boolean managedProfileWithUnifiedLock =
                         UserManager.get(activity).isManagedProfile(mUserId)
                         && !mLockPatternUtils.isSeparateProfileChallengeEnabled(mUserId);
                 boolean skipConfirmation = managedProfileWithUnifiedLock && !mIsSetNewPassword;
-                if (skipConfirmation
-                        || !helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST,
-                        getString(R.string.unlock_set_unlock_launch_picker_title), true, mUserId)) {
+                if (skipConfirmation || !builder.show()) {
                     mPasswordConfirmed = true; // no password set, so no need to confirm
                     updatePreferencesOrFinish(savedInstanceState != null);
                 } else {
@@ -797,10 +797,10 @@
                 if (mUserPassword != null) {
                     // No need to call setLockCredential if the user currently doesn't
                     // have a password
-                    mChooseLockSettingsHelper.utils().setLockCredential(
+                    mLockPatternUtils.setLockCredential(
                             LockscreenCredential.createNone(), mUserPassword, mUserId);
                 }
-                mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled, mUserId);
+                mLockPatternUtils.setLockScreenDisabled(disabled, mUserId);
                 getActivity().setResult(Activity.RESULT_OK);
                 finish();
             }
diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java
index 19cc9c8..a2ac3d5 100644
--- a/src/com/android/settings/password/ChooseLockPassword.java
+++ b/src/com/android/settings/password/ChooseLockPassword.java
@@ -228,7 +228,6 @@
         private LockPatternUtils mLockPatternUtils;
         private SaveAndFinishWorker mSaveAndFinishWorker;
         private int mRequestedQuality = DevicePolicyManager.PASSWORD_QUALITY_NUMERIC;
-        private ChooseLockSettingsHelper mChooseLockSettingsHelper;
         protected Stage mUiStage = Stage.Introduction;
         private PasswordRequirementAdapter mPasswordRequirementAdapter;
         private GlifLayout mLayout;
@@ -396,8 +395,6 @@
                         mLockPatternUtils.getRequestedPasswordMetrics(mUnificationProfileId));
             }
 
-            mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity());
-
             if (intent.getBooleanExtra(
                     ChooseLockSettingsHelper.EXTRA_KEY_FOR_CHANGE_CRED_REQUIRED_FOR_BOOT, false)) {
                 SaveAndFinishWorker w = new SaveAndFinishWorker();
@@ -406,10 +403,11 @@
                 LockscreenCredential currentCredential = intent.getParcelableExtra(
                         ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
 
+                final LockPatternUtils utils = new LockPatternUtils(getActivity());
+
                 w.setBlocking(true);
                 w.setListener(this);
-                w.start(mChooseLockSettingsHelper.utils(), required, false, 0,
-                        currentCredential, currentCredential, mUserId);
+                w.start(utils, required, false, 0, currentCredential, currentCredential, mUserId);
             }
             mTextChangedHandler = new TextChangedHandler();
         }
@@ -499,9 +497,13 @@
             if (savedInstanceState == null) {
                 updateStage(Stage.Introduction);
                 if (confirmCredentials) {
-                    mChooseLockSettingsHelper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST,
-                            getString(R.string.unlock_set_unlock_launch_picker_title), true,
-                            mUserId);
+                    final ChooseLockSettingsHelper.Builder builder =
+                            new ChooseLockSettingsHelper.Builder(getActivity());
+                    builder.setRequestCode(CONFIRM_EXISTING_REQUEST)
+                            .setTitle(getString(R.string.unlock_set_unlock_launch_picker_title))
+                            .setReturnCredentials(true)
+                            .setUserId(mUserId)
+                            .show();
                 }
             } else {
 
diff --git a/src/com/android/settings/password/ChooseLockPattern.java b/src/com/android/settings/password/ChooseLockPattern.java
index 27fc9f0..2c2d7bb 100644
--- a/src/com/android/settings/password/ChooseLockPattern.java
+++ b/src/com/android/settings/password/ChooseLockPattern.java
@@ -452,7 +452,7 @@
             }
         };
 
-        private ChooseLockSettingsHelper mChooseLockSettingsHelper;
+        private LockPatternUtils mLockPatternUtils;
         private SaveAndFinishWorker mSaveAndFinishWorker;
         protected int mUserId;
         protected boolean mForFingerprint;
@@ -465,7 +465,6 @@
         @Override
         public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
-            mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity());
             if (!(getActivity() instanceof ChooseLockPattern)) {
                 throw new SecurityException("Fragment contained in wrong activity");
             }
@@ -473,6 +472,8 @@
             // Only take this argument into account if it belongs to the current profile.
             mUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras());
 
+            mLockPatternUtils = new LockPatternUtils(getActivity());
+
             if (intent.getBooleanExtra(
                     ChooseLockSettingsHelper.EXTRA_KEY_FOR_CHANGE_CRED_REQUIRED_FOR_BOOT, false)) {
                 SaveAndFinishWorker w = new SaveAndFinishWorker();
@@ -482,8 +483,7 @@
                         ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
                 w.setBlocking(true);
                 w.setListener(this);
-                w.start(mChooseLockSettingsHelper.utils(), required,
-                        false, 0, current, current, mUserId);
+                w.start(mLockPatternUtils, required, false, 0, current, current, mUserId);
             }
             mForFingerprint = intent.getBooleanExtra(
                     ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, false);
@@ -543,7 +543,7 @@
             mLockPatternView = (LockPatternView) view.findViewById(R.id.lockPattern);
             mLockPatternView.setOnPatternListener(mChooseNewLockPatternListener);
             mLockPatternView.setTactileFeedbackEnabled(
-                    mChooseLockSettingsHelper.utils().isTactileFeedbackEnabled());
+                    mLockPatternUtils.isTactileFeedbackEnabled());
             mLockPatternView.setFadePattern(false);
 
             mFooterText = (TextView) view.findViewById(R.id.footerText);
@@ -572,12 +572,16 @@
                     // first launch. As a security measure, we're in NeedToConfirm mode until we
                     // know there isn't an existing password or the user confirms their password.
                     updateStage(Stage.NeedToConfirm);
-                    boolean launchedConfirmationActivity =
-                        mChooseLockSettingsHelper.launchConfirmationActivity(
-                                CONFIRM_EXISTING_REQUEST,
-                                getString(R.string.unlock_set_unlock_launch_picker_title), true,
-                                mUserId);
-                    if (!launchedConfirmationActivity) {
+
+                    final ChooseLockSettingsHelper.Builder builder =
+                            new ChooseLockSettingsHelper.Builder(getActivity());
+                    final boolean launched = builder.setRequestCode(CONFIRM_EXISTING_REQUEST)
+                            .setTitle(getString(R.string.unlock_set_unlock_launch_picker_title))
+                            .setReturnCredentials(true)
+                            .setUserId(mUserId)
+                            .show();
+
+                    if (!launched) {
                         updateStage(Stage.Introduction);
                     }
                 } else {
@@ -853,7 +857,7 @@
                             profileCredential);
                 }
             }
-            mSaveAndFinishWorker.start(mChooseLockSettingsHelper.utils(), required,
+            mSaveAndFinishWorker.start(mLockPatternUtils, required,
                     mHasChallenge, mChallenge, mChosenPattern, mCurrentCredential, mUserId);
         }
 
diff --git a/src/com/android/settings/password/ChooseLockSettingsHelper.java b/src/com/android/settings/password/ChooseLockSettingsHelper.java
index 3989ee6..962294b 100644
--- a/src/com/android/settings/password/ChooseLockSettingsHelper.java
+++ b/src/com/android/settings/password/ChooseLockSettingsHelper.java
@@ -18,14 +18,15 @@
 
 import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
 
+import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.Activity;
 import android.app.KeyguardManager;
 import android.app.admin.DevicePolicyManager;
 import android.content.Intent;
 import android.content.IntentSender;
-import android.os.Bundle;
 import android.os.UserManager;
+import android.util.Log;
 
 import androidx.annotation.VisibleForTesting;
 import androidx.fragment.app.Fragment;
@@ -39,6 +40,8 @@
 
 public final class ChooseLockSettingsHelper {
 
+    private static final String TAG = "ChooseLockSettingsHelper";
+
     public static final String EXTRA_KEY_TYPE = "type";
     public static final String EXTRA_KEY_PASSWORD = "password";
     public static final String EXTRA_KEY_RETURN_CREDENTIALS = "return_credentials";
@@ -84,319 +87,192 @@
      * controls if we relax the enforcement of
      * {@link Utils#enforceSameOwner(android.content.Context, int)}.
      */
-    public static final String EXTRA_ALLOW_ANY_USER = "allow_any_user";
+    public static final String EXTRA_KEY_ALLOW_ANY_USER = "allow_any_user";
 
-    @VisibleForTesting LockPatternUtils mLockPatternUtils;
-    private Activity mActivity;
-    private Fragment mFragment;
+    @VisibleForTesting @NonNull LockPatternUtils mLockPatternUtils;
+    @NonNull private final Activity mActivity;
+    @Nullable private final Fragment mFragment;
+    @NonNull private final Builder mBuilder;
 
-    public ChooseLockSettingsHelper(Activity activity) {
+    private ChooseLockSettingsHelper(@NonNull Builder builder, @NonNull Activity activity,
+            @Nullable Fragment fragment) {
+        mBuilder = builder;
         mActivity = activity;
+        mFragment = fragment;
         mLockPatternUtils = new LockPatternUtils(activity);
     }
 
-    public ChooseLockSettingsHelper(Activity activity, Fragment fragment) {
-        this(activity);
-        mFragment = fragment;
-    }
+    public static class Builder {
+        @NonNull private final Activity mActivity;
+        @Nullable private Fragment mFragment;
 
-    public LockPatternUtils utils() {
-        return mLockPatternUtils;
+        private int mRequestCode;
+        @Nullable private CharSequence mTitle;
+        @Nullable private CharSequence mHeader;
+        @Nullable private CharSequence mDescription;
+        @Nullable private CharSequence mAlternateButton;
+        private boolean mReturnCredentials;
+        private boolean mExternal;
+        private boolean mForegroundOnly;
+        // ChooseLockSettingsHelper will determine the caller's userId if none provided.
+        private int mUserId;
+        private boolean mAllowAnyUserId;
+        // The challenge can be 0, which is different than "no challenge"
+        @Nullable Long mChallenge;
+
+        public Builder(@NonNull Activity activity) {
+            mActivity = activity;
+            mUserId = Utils.getCredentialOwnerUserId(mActivity);
+        }
+
+        public Builder(@NonNull Activity activity, @NonNull Fragment fragment) {
+            this(activity);
+            mFragment = fragment;
+        }
+
+        /**
+         * @param requestCode for onActivityResult
+         */
+        @NonNull public Builder setRequestCode(int requestCode) {
+            mRequestCode = requestCode;
+            return this;
+        }
+
+        /**
+         * @param title of the confirmation screen; shown in the action bar
+         */
+        @NonNull public Builder setTitle(@Nullable CharSequence title) {
+            mTitle = title;
+            return this;
+        }
+
+        /**
+         * @param header of the confirmation screen; shown as large text
+         */
+        @NonNull public Builder setHeader(@Nullable CharSequence header) {
+            mHeader = header;
+            return this;
+        }
+
+        /**
+         * @param description of the confirmation screen
+         */
+        @NonNull public Builder setDescription(@Nullable CharSequence description) {
+            mDescription = description;
+            return this;
+        }
+
+        /**
+         * @param alternateButton text for an alternate button
+         */
+        @NonNull public Builder setAlternateButton(@Nullable CharSequence alternateButton) {
+            mAlternateButton = alternateButton;
+            return this;
+        }
+
+        /**
+         * @param returnCredentials if true, puts the following credentials into intent for
+         *                          onActivityResult with the following keys:
+         *                          {@link #EXTRA_KEY_TYPE}, {@link #EXTRA_KEY_PASSWORD},
+         *                          {@link #EXTRA_KEY_CHALLENGE_TOKEN}.
+         *                          Note that if this is true, this can only be called internally.
+         */
+        @NonNull public Builder setReturnCredentials(boolean returnCredentials) {
+            mReturnCredentials = returnCredentials;
+            return this;
+        }
+
+        /**
+         * @param userId for whom the credential should be confirmed.
+         */
+        @NonNull public Builder setUserId(int userId) {
+            mUserId = userId;
+            return this;
+        }
+
+        /**
+         * @param allowAnyUserId Allows the caller to prompt for credentials of any user, including
+         *                       those which aren't associated with the current user. As an example,
+         *                       this is useful when unlocking the storage for secondary users.
+         */
+        @NonNull public Builder setAllowAnyUserId(boolean allowAnyUserId) {
+            mAllowAnyUserId = allowAnyUserId;
+            return this;
+        }
+
+        /**
+         * @param external specifies whether this activity is launched externally, meaning that it
+         *                 will get a dark theme, allow biometric authentication, and it will
+         *                 forward the activity result.
+         */
+        @NonNull public Builder setExternal(boolean external) {
+            mExternal = external;
+            return this;
+        }
+
+        /**
+         * @param foregroundOnly if true, the confirmation activity will be finished if it loses
+         *                       foreground.
+         */
+        @NonNull public Builder setForegroundOnly(boolean foregroundOnly) {
+            mForegroundOnly = foregroundOnly;
+            return this;
+        }
+
+        /**
+         * @param challenge an opaque payload that will be wrapped in the Gatekeeper's payload
+         *                  if authentication is successful. Common use case is for the caller's
+         *                  secure layer (e.g. Trusted Execution Environment) to 1) verify that
+         *                  the Gatekeeper HAT's HMAC is valid, and 2) if so, perform an operation
+         *                  based on the challenge.
+         */
+        @NonNull public Builder setChallenge(long challenge) {
+            mChallenge = challenge;
+            return this;
+        }
+
+        @NonNull public ChooseLockSettingsHelper build() {
+            if (!mAllowAnyUserId && mUserId != LockPatternUtils.USER_FRP) {
+                Utils.enforceSameOwner(mActivity, mUserId);
+            }
+
+            if (mExternal && mReturnCredentials) {
+                throw new IllegalArgumentException("External and ReturnCredentials specified. "
+                        + " External callers should never be allowed to receive credentials in"
+                        + " onActivityResult");
+            }
+
+            if (mChallenge != null && !mReturnCredentials) {
+                // HAT containing the signed challenge will not be available to the caller.
+                Log.w(TAG, "Challenge set but not requesting ReturnCredentials. Are you sure this"
+                        + " is what you want?");
+            }
+
+            return new ChooseLockSettingsHelper(this, mActivity, mFragment);
+        }
+
+        public boolean show() {
+            return build().launch();
+        }
     }
 
     /**
-     * If a pattern, password or PIN exists, prompt the user before allowing them to change it.
-     *
-     * @param title title of the confirmation screen; shown in the action bar
-     * @return true if one exists and we launched an activity to confirm it
-     * @see Activity#onActivityResult(int, int, android.content.Intent)
+     * If a PIN, Pattern, or Password exists, prompt the user to confirm it.
+     * @return true if the confirmation activity is shown (e.g. user has a credential set up)
      */
-    public boolean launchConfirmationActivity(int request, CharSequence title) {
-        return launchConfirmationActivity(
-                request /* request */,
-                title /* title */,
-                null /* header */,
-                null /* description */,
-                false /* returnCredentials */,
-                false /* external */,
-                false /* foregroundOnly */);
-    }
-
-    /**
-     * If a pattern, password or PIN exists, prompt the user before allowing them to change it.
-     *
-     * @param title title of the confirmation screen; shown in the action bar
-     * @param returnCredentials if true, put credentials into intent. Note that if this is true,
-     *                          this can only be called internally.
-     * @return true if one exists and we launched an activity to confirm it
-     * @see Activity#onActivityResult(int, int, android.content.Intent)
-     */
-    public boolean launchConfirmationActivity(int request, CharSequence title, boolean returnCredentials) {
-        return launchConfirmationActivity(
-                request /* request */,
-                title /* title */,
-                null /* header */,
-                null /* description */,
-                returnCredentials /* returnCredentials */,
-                false /* external */,
-                false /* foregroundOnly */);
-    }
-
-    /**
-     * If a pattern, password or PIN exists, prompt the user before allowing them to change it.
-     *
-     * @param title title of the confirmation screen; shown in the action bar
-     * @param returnCredentials if true, put credentials into intent. Note that if this is true,
-     *                          this can only be called internally.
-     * @param userId The userId for whom the lock should be confirmed.
-     * @return true if one exists and we launched an activity to confirm it
-     * @see Activity#onActivityResult(int, int, android.content.Intent)
-     */
-    public boolean launchConfirmationActivity(int request, CharSequence title,
-            boolean returnCredentials, int userId) {
-        return launchConfirmationActivity(
-                request /* request */,
-                title /* title */,
-                null /* header */,
-                null /* description */,
-                returnCredentials /* returnCredentials */,
-                false /* external */,
-                false /* hasChallenge */,
-                0 /* challenge */,
-                Utils.enforceSameOwner(mActivity, userId) /* userId */,
-                false /* foregroundOnly */);
-    }
-
-    /**
-     * If a pattern, password or PIN exists, prompt the user before allowing them to change it.
-     *
-     * @param title title of the confirmation screen; shown in the action bar
-     * @param header header of the confirmation screen; shown as large text
-     * @param description description of the confirmation screen
-     * @param returnCredentials if true, put credentials into intent. Note that if this is true,
-     *                          this can only be called internally.
-     * @param external specifies whether this activity is launched externally, meaning that it will
-     *                 get a dark theme, allow fingerprint authentication and it will forward
-     *                 activity result.
-     * @param foregroundOnly if the confirmation activity should be finished if it loses foreground.
-     * @return true if one exists and we launched an activity to confirm it
-     * @see Activity#onActivityResult(int, int, android.content.Intent)
-     */
-    boolean launchConfirmationActivity(int request, @Nullable CharSequence title,
-            @Nullable CharSequence header, @Nullable CharSequence description,
-            boolean returnCredentials, boolean external, boolean foregroundOnly) {
-        return launchConfirmationActivity(
-                request /* request */,
-                title /* title */,
-                header /* header */,
-                description /* description */,
-                returnCredentials /* returnCredentials */,
-                external /* external */,
-                false /* hasChallenge */,
-                0 /* challenge */,
-                Utils.getCredentialOwnerUserId(mActivity) /* userId */,
-                foregroundOnly /* foregroundOnly */);
-    }
-
-    /**
-     * If a pattern, password or PIN exists, prompt the user before allowing them to change it.
-     *
-     * @param title title of the confirmation screen; shown in the action bar
-     * @param header header of the confirmation screen; shown as large text
-     * @param description description of the confirmation screen
-     * @param returnCredentials if true, put credentials into intent. Note that if this is true,
-     *                          this can only be called internally.
-     * @param external specifies whether this activity is launched externally, meaning that it will
-     *                 get a dark theme, allow fingerprint authentication and it will forward
-     *                 activity result.
-     * @param userId The userId for whom the lock should be confirmed.
-     * @return true if one exists and we launched an activity to confirm it
-     * @see Activity#onActivityResult(int, int, android.content.Intent)
-     */
-    boolean launchConfirmationActivity(int request, @Nullable CharSequence title,
-            @Nullable CharSequence header, @Nullable CharSequence description,
-            boolean returnCredentials, boolean external, int userId) {
-        return launchConfirmationActivity(
-                request /* request */,
-                title /* title */,
-                header /* header */,
-                description /* description */,
-                returnCredentials /* returnCredentials */,
-                external /* external */,
-                false /* hasChallenge */,
-                0 /* challenge */,
-                Utils.enforceSameOwner(mActivity, userId) /* userId */,
-                false /* foregroundOnly */);
-    }
-
-    /**
-     * If a pattern, password or PIN exists, prompt the user before allowing them to change it.
-     *
-     * @param title title of the confirmation screen; shown in the action bar
-     * @param header header of the confirmation screen; shown as large text
-     * @param description description of the confirmation screen
-     * @param challenge a challenge to be verified against the device credential.
-     * @param foregroundOnly if the confirmation activity should be finished if it loses foreground.
-     * @return true if one exists and we launched an activity to confirm it
-     * @see Activity#onActivityResult(int, int, android.content.Intent)
-     */
-    public boolean launchConfirmationActivity(int request, @Nullable CharSequence title,
-            @Nullable CharSequence header, @Nullable CharSequence description,
-            long challenge, boolean foregroundOnly) {
-        return launchConfirmationActivity(
-                request /* request */,
-                title /* title */,
-                header /* header */,
-                description /* description */,
-                true /* returnCredentials */,
-                false /* external */,
-                true /* hasChallenge */,
-                challenge /* challenge */,
-                Utils.getCredentialOwnerUserId(mActivity) /* userId */,
-                foregroundOnly /* foregroundOnly */);
-    }
-
-    /**
-     * If a pattern, password or PIN exists, prompt the user before allowing them to change it.
-     *
-     * @param title title of the confirmation screen; shown in the action bar
-     * @param header header of the confirmation screen; shown as large text
-     * @param description description of the confirmation screen
-     * @param challenge a challenge to be verified against the device credential.
-     * @param userId The userId for whom the lock should be confirmed.
-     * @param foregroundOnly if the confirmation activity should be finished if it loses foreground.
-     * @return true if one exists and we launched an activity to confirm it
-     * @see Activity#onActivityResult(int, int, android.content.Intent)
-     */
-    public boolean launchConfirmationActivity(int request, @Nullable CharSequence title,
-            @Nullable CharSequence header, @Nullable CharSequence description,
-            long challenge, int userId, boolean foregroundOnly) {
-        return launchConfirmationActivity(
-                request /* request */,
-                title /* title */,
-                header /* header */,
-                description /* description */,
-                true /* returnCredentials */,
-                false /* external */,
-                true /* hasChallenge */,
-                challenge /* challenge */,
-                Utils.enforceSameOwner(mActivity, userId) /* userId */,
-                foregroundOnly);
-    }
-
-    /**
-     * If a pattern, password or PIN exists, prompt the user before allowing them to change it.
-     *
-     * @param title title of the confirmation screen; shown in the action bar
-     * @param header header of the confirmation screen; shown as large text
-     * @param description description of the confirmation screen
-     * @param external specifies whether this activity is launched externally, meaning that it will
-     *                 get a dark theme, allow fingerprint authentication and it will forward
-     *                 activity result.
-     * @param challenge a challenge to be verified against the device credential.
-     * @param userId The userId for whom the lock should be confirmed.
-     * @return true if one exists and we launched an activity to confirm it
-     * @see Activity#onActivityResult(int, int, android.content.Intent)
-     */
-    public boolean launchConfirmationActivityWithExternalAndChallenge(int request,
-            @Nullable CharSequence title, @Nullable CharSequence header,
-            @Nullable CharSequence description, boolean external, long challenge, int userId) {
-        return launchConfirmationActivity(
-                request /* request */,
-                title /* title */,
-                header /* header */,
-                description /* description */,
-                false /* returnCredentials */,
-                external /* external */,
-                true /* hasChallenge */,
-                challenge /* challenge */,
-                Utils.enforceSameOwner(mActivity, userId) /* userId */,
-                false /* foregroundOnly */);
-    }
-
-    /**
-     * Variant that allows you to prompt for credentials of any user, including
-     * those which aren't associated with the current user. As an example, this
-     * is useful when unlocking the storage for secondary users.
-     */
-    public boolean launchConfirmationActivityForAnyUser(int request,
-            @Nullable CharSequence title, @Nullable CharSequence header,
-            @Nullable CharSequence description, int userId) {
-        final Bundle extras = new Bundle();
-        extras.putBoolean(EXTRA_ALLOW_ANY_USER, true);
-        return launchConfirmationActivity(
-                request /* request */,
-                title /* title */,
-                header /* header */,
-                description /* description */,
-                false /* returnCredentials */,
-                false /* external */,
-                true /* hasChallenge */,
-                0 /* challenge */,
-                userId /* userId */,
-                extras /* extras */);
+    public boolean launch() {
+        final long challenge = mBuilder.mChallenge != null ? mBuilder.mChallenge : 0L;
+        return launchConfirmationActivity(mBuilder.mRequestCode, mBuilder.mTitle, mBuilder.mHeader,
+                mBuilder.mDescription, mBuilder.mReturnCredentials, mBuilder.mExternal,
+                mBuilder.mChallenge != null, challenge, mBuilder.mUserId,
+                mBuilder.mAlternateButton, mBuilder.mAllowAnyUserId, mBuilder.mForegroundOnly);
     }
 
     private boolean launchConfirmationActivity(int request, @Nullable CharSequence title,
             @Nullable CharSequence header, @Nullable CharSequence description,
             boolean returnCredentials, boolean external, boolean hasChallenge,
-            long challenge, int userId, boolean foregroundOnly) {
-        return launchConfirmationActivity(
-                request /* request */,
-                title /* title */,
-                header /* header */,
-                description /* description */,
-                returnCredentials /* returnCredentials */,
-                external /* external */,
-                hasChallenge /* hasChallenge */,
-                challenge /* challenge */,
-                userId /* userId */,
-                null /* alternateButton */,
-                null /* extras */,
-                foregroundOnly /* foregroundOnly */);
-    }
-
-    private boolean launchConfirmationActivity(int request, @Nullable CharSequence title,
-            @Nullable CharSequence header, @Nullable CharSequence description,
-            boolean returnCredentials, boolean external, boolean hasChallenge,
-            long challenge, int userId, Bundle extras) {
-        return launchConfirmationActivity(
-                request /* request */,
-                title /* title */,
-                header /* header */,
-                description /* description */,
-                returnCredentials /* returnCredentials */,
-                external /* external */,
-                hasChallenge /* hasChallenge */,
-                challenge /* challenge */,
-                userId /* userId */,
-                null /* alternateButton */,
-                extras /* extras */,
-                false /* foregroundOnly */);
-    }
-
-    public boolean launchFrpConfirmationActivity(int request, @Nullable CharSequence header,
-            @Nullable CharSequence description, @Nullable CharSequence alternateButton) {
-        return launchConfirmationActivity(
-                request /* request */,
-                null /* title */,
-                header /* header */,
-                description /* description */,
-                false /* returnCredentials */,
-                true /* external */,
-                false /* hasChallenge */,
-                0 /* challenge */,
-                LockPatternUtils.USER_FRP /* userId */,
-                alternateButton /* alternateButton */,
-                null /* extras */,
-                false /* foregroundOnly */);
-    }
-
-    private boolean launchConfirmationActivity(int request, @Nullable CharSequence title,
-            @Nullable CharSequence header, @Nullable CharSequence description,
-            boolean returnCredentials, boolean external, boolean hasChallenge,
-            long challenge, int userId, @Nullable CharSequence alternateButton, Bundle extras,
-            boolean foregroundOnly) {
+            long challenge, int userId, @Nullable CharSequence alternateButton,
+            boolean allowAnyUser, boolean foregroundOnly) {
         final int effectiveUserId = UserManager.get(mActivity).getCredentialOwnerProfile(userId);
         boolean launched = false;
 
@@ -406,7 +282,7 @@
                         returnCredentials || hasChallenge
                                 ? ConfirmLockPattern.InternalActivity.class
                                 : ConfirmLockPattern.class, returnCredentials, external,
-                                hasChallenge, challenge, userId, alternateButton, extras,
+                                hasChallenge, challenge, userId, alternateButton, allowAnyUser,
                                 foregroundOnly);
                 break;
             case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
@@ -419,7 +295,7 @@
                         returnCredentials || hasChallenge
                                 ? ConfirmLockPassword.InternalActivity.class
                                 : ConfirmLockPassword.class, returnCredentials, external,
-                                hasChallenge, challenge, userId, alternateButton, extras,
+                                hasChallenge, challenge, userId, alternateButton, allowAnyUser,
                                 foregroundOnly);
                 break;
         }
@@ -429,7 +305,7 @@
     private boolean launchConfirmationActivity(int request, CharSequence title, CharSequence header,
             CharSequence message, Class<?> activityClass, boolean returnCredentials,
             boolean external, boolean hasChallenge, long challenge,
-            int userId, @Nullable CharSequence alternateButton, Bundle extras,
+            int userId, @Nullable CharSequence alternateButton, boolean allowAnyUser,
             boolean foregroundOnly) {
         final Intent intent = new Intent();
         intent.putExtra(ConfirmDeviceCredentialBaseFragment.TITLE_TEXT, title);
@@ -446,9 +322,8 @@
         intent.putExtra(Intent.EXTRA_USER_ID, userId);
         intent.putExtra(KeyguardManager.EXTRA_ALTERNATE_BUTTON_LABEL, alternateButton);
         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOREGROUND_ONLY, foregroundOnly);
-        if (extras != null) {
-            intent.putExtras(extras);
-        }
+        intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_ALLOW_ANY_USER, allowAnyUser);
+
         intent.setClassName(SETTINGS_PACKAGE_NAME, activityClass.getName());
         if (external) {
             intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
index c25a259..02a1dbc 100644
--- a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
@@ -98,7 +98,6 @@
     private LockPatternUtils mLockPatternUtils;
     private UserManager mUserManager;
     private TrustManager mTrustManager;
-    private ChooseLockSettingsHelper mChooseLockSettingsHelper;
     private Handler mHandler = new Handler(Looper.getMainLooper());
     private Context mContext;
     private boolean mCheckDevicePolicyManager;
@@ -214,8 +213,6 @@
             mTitle = getTitleFromOrganizationName(mUserId);
         }
 
-
-        mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this);
         final LockPatternUtils lockPatternUtils = new LockPatternUtils(this);
 
         final PromptInfo promptInfo = new PromptInfo();
@@ -240,8 +237,14 @@
         // tied profile so it will enable work mode and unlock managed profile, when personal
         // challenge is unlocked.
         if (frp) {
-            launchedCDC = mChooseLockSettingsHelper.launchFrpConfirmationActivity(
-                    0, mTitle, mDetails, alternateButton);
+            final ChooseLockSettingsHelper.Builder builder =
+                    new ChooseLockSettingsHelper.Builder(this);
+            launchedCDC = builder.setHeader(mTitle) // Show the title in the header location
+                    .setDescription(mDetails)
+                    .setAlternateButton(alternateButton)
+                    .setExternal(true)
+                    .setUserId(LockPatternUtils.USER_FRP)
+                    .show();
         } else if (isManagedProfile && isInternalActivity()
                 && !lockPatternUtils.isSeparateProfileChallengeEnabled(mUserId)) {
             mCredentialMode = CREDENTIAL_MANAGED;
@@ -385,15 +388,22 @@
         // LockPatternChecker and LockPatternUtils. verifyPassword should be the only API to use,
         // which optionally accepts a challenge.
         if (mCredentialMode == CREDENTIAL_MANAGED) {
-            launched = mChooseLockSettingsHelper
-                    .launchConfirmationActivityWithExternalAndChallenge(
-                            0 /* request code */, null /* title */, mTitle, mDetails,
-                            true /* isExternal */, 0L /* challenge */, mUserId);
+            final ChooseLockSettingsHelper.Builder builder =
+                    new ChooseLockSettingsHelper.Builder(this);
+            launched = builder.setHeader(mTitle)
+                    .setDescription(mDetails)
+                    .setExternal(true)
+                    .setUserId(mUserId)
+                    .setChallenge(0L)
+                    .show();
         } else if (mCredentialMode == CREDENTIAL_NORMAL) {
-            launched = mChooseLockSettingsHelper.launchConfirmationActivity(
-                    0 /* request code */, null /* title */,
-                    mTitle, mDetails, false /* returnCredentials */, true /* isExternal */,
-                    mUserId);
+            final ChooseLockSettingsHelper.Builder builder =
+                    new ChooseLockSettingsHelper.Builder(this);
+            launched = builder.setHeader(mTitle) // Show the title string in the header area
+                    .setDescription(mDetails)
+                    .setExternal(true)
+                    .setUserId(mUserId)
+                    .show();
         }
         if (!launched) {
             Log.d(TAG, "No pin/pattern/pass set");
diff --git a/src/com/android/settings/security/CredentialStorage.java b/src/com/android/settings/security/CredentialStorage.java
index 5e64723..2e3e2ed 100644
--- a/src/com/android/settings/security/CredentialStorage.java
+++ b/src/com/android/settings/security/CredentialStorage.java
@@ -357,9 +357,11 @@
      */
     private boolean confirmKeyGuard(int requestCode) {
         final Resources res = getResources();
-        return new ChooseLockSettingsHelper(this)
-                .launchConfirmationActivity(requestCode,
-                        res.getText(R.string.credentials_title), true);
+        final ChooseLockSettingsHelper.Builder builder =
+                new ChooseLockSettingsHelper.Builder(this);
+        return builder.setRequestCode(requestCode)
+                .setTitle(res.getText(R.string.credentials_title))
+                .show();
     }
 
     @Override
diff --git a/src/com/android/settings/security/CryptKeeperSettings.java b/src/com/android/settings/security/CryptKeeperSettings.java
index aa47b2b..4fc17fb 100644
--- a/src/com/android/settings/security/CryptKeeperSettings.java
+++ b/src/com/android/settings/security/CryptKeeperSettings.java
@@ -37,6 +37,7 @@
 import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 
+import com.android.internal.widget.LockPatternUtils;
 import com.android.internal.widget.LockscreenCredential;
 import com.android.settings.CryptKeeperConfirm;
 import com.android.settings.R;
@@ -169,17 +170,20 @@
      * @return true if confirmation launched
      */
     private boolean runKeyguardConfirmation(int request) {
-        Resources res = getActivity().getResources();
-        ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(getActivity(), this);
-
-        if (helper.utils().getKeyguardStoredPasswordQuality(UserHandle.myUserId())
+        final LockPatternUtils utils = new LockPatternUtils(getActivity());
+        if (utils.getKeyguardStoredPasswordQuality(UserHandle.myUserId())
                 == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
             showFinalConfirmation(StorageManager.CRYPT_TYPE_DEFAULT, "".getBytes());
             return true;
         }
 
-        return helper.launchConfirmationActivity(request,
-                res.getText(R.string.crypt_keeper_encrypt_title), true);
+        final Resources res = getActivity().getResources();
+        final ChooseLockSettingsHelper.Builder builder =
+                new ChooseLockSettingsHelper.Builder(getActivity(), this);
+        return builder.setRequestCode(request)
+                .setTitle(res.getText(R.string.crypt_keeper_encrypt_title))
+                .setReturnCredentials(true)
+                .show();
     }
 
     @Override
diff --git a/src/com/android/settings/security/LockUnificationPreferenceController.java b/src/com/android/settings/security/LockUnificationPreferenceController.java
index 9cacf8e..e47180e 100644
--- a/src/com/android/settings/security/LockUnificationPreferenceController.java
+++ b/src/com/android/settings/security/LockUnificationPreferenceController.java
@@ -118,11 +118,15 @@
             startUnification();
         } else {
             final String title = mContext.getString(R.string.unlock_set_unlock_launch_picker_title);
-            final ChooseLockSettingsHelper helper =
-                    new ChooseLockSettingsHelper(mHost.getActivity(), mHost);
-            if (!helper.launchConfirmationActivity(
-                    UNUNIFY_LOCK_CONFIRM_DEVICE_REQUEST,
-                    title, true /* returnCredentials */, MY_USER_ID)) {
+            final ChooseLockSettingsHelper.Builder builder =
+                    new ChooseLockSettingsHelper.Builder(mHost.getActivity(), mHost);
+            final boolean launched = builder.setRequestCode(UNUNIFY_LOCK_CONFIRM_DEVICE_REQUEST)
+                    .setTitle(title)
+                    .setReturnCredentials(true)
+                    .setUserId(MY_USER_ID)
+                    .show();
+
+            if (!launched) {
                 ununifyLocks();
             }
         }
@@ -176,10 +180,14 @@
         // Confirm profile lock
         final String title = mContext.getString(
                 R.string.unlock_set_unlock_launch_picker_title_profile);
-        final ChooseLockSettingsHelper helper =
-                new ChooseLockSettingsHelper(mHost.getActivity(), mHost);
-        if (!helper.launchConfirmationActivity(
-                UNIFY_LOCK_CONFIRM_PROFILE_REQUEST, title, true, mProfileUserId)) {
+        final ChooseLockSettingsHelper.Builder builder =
+                new ChooseLockSettingsHelper.Builder(mHost.getActivity(), mHost);
+        final boolean launched = builder.setRequestCode(UNIFY_LOCK_CONFIRM_PROFILE_REQUEST)
+                .setTitle(title)
+                .setReturnCredentials(true)
+                .setUserId(mProfileUserId)
+                .show();
+        if (!launched) {
             // If profile has no lock, go straight to unification.
             unifyLocks();
             // TODO: update relevant prefs.
diff --git a/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java b/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java
index 19e25fc..5e624cc 100644
--- a/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java
+++ b/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java
@@ -120,11 +120,14 @@
         if (!mTrustAgentsKeyList.contains(preference.getKey())) {
             return super.handlePreferenceTreeClick(preference);
         }
-        final ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(
-                mHost.getActivity(), mHost);
+
+        final ChooseLockSettingsHelper.Builder builder =
+                new ChooseLockSettingsHelper.Builder(mHost.getActivity(), mHost);
+        final boolean confirmationLaunched = builder.setRequestCode(CHANGE_TRUST_AGENT_SETTINGS)
+                .setTitle(preference.getTitle())
+                .show();
+
         mTrustAgentClickIntent = preference.getIntent();
-        boolean confirmationLaunched = helper.launchConfirmationActivity(
-                CHANGE_TRUST_AGENT_SETTINGS, preference.getTitle());
 
         if (!confirmationLaunched && mTrustAgentClickIntent != null) {
             // If this returns false, it means no password confirmation is required.
