1/n: Make ChooseLockSettingsHelper into a builder
The multitude of slightly different launchConfirmationActivity(*)
methods are a big unsustainable pyramid. It's too difficult to
read, too difficult to track which clients are interested in which
parameters, and too difficult to add new parameters, since we need to
1) Read through all of them and find one that's the closest
2) Try not to affect other callers, so potentially add yet another
3) Modify the internal paths, which all basically call each other
until it reaches the biggest launchConfirmationActivity which
has ALL of the parameters
This change should have no behavioral change.
Note: CredentialStorage doesn't need returnCredentials anymore as of
ag/6073449
Test: make -j56 RunSettingsRoboTests
Test: Manually traced code paths for each invocation. A few hidden
dependencies (such as explicitly setting challenge=0 with
hasChallenge=true) were found. Left them the way they were in
case they were intended
Test: Enroll face, fingerprint
Test: Enable developer options
Test: Change to PIN, Pattern, Password, then back to PIN (so each
type requests confirmation)
Test: adb shell am start -a android.app.action.CONFIRM_DEVICE_CREDENTIAL,
authenticate
Test: adb shell am start -a android.app.action.CONFIRM_FRP_CREDENTIAL
(shows confirm credential screen)
Fixes: 138453993
Change-Id: Ic82ef3c3ac2e14d624281921f2d816bcdacbd82b
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.