Merge "Show work lock confirmation in a task overlay" into udc-dev am: 7d91a4916d

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/21851695

Change-Id: I2c9b00b9e82001b49a8b52e7178baca6ce7d9995
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Pavel Grafov
2023-03-14 19:47:55 +00:00
committed by Automerger Merge Worker
2 changed files with 45 additions and 42 deletions

View File

@@ -21,12 +21,14 @@ import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.app.Activity; import android.app.Activity;
import android.app.ActivityOptions;
import android.app.KeyguardManager; import android.app.KeyguardManager;
import android.app.RemoteLockscreenValidationSession; import android.app.RemoteLockscreenValidationSession;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Intent; import android.content.Intent;
import android.content.IntentSender; import android.content.IntentSender;
import android.os.Bundle;
import android.os.UserManager; import android.os.UserManager;
import android.util.Log; import android.util.Log;
@@ -147,7 +149,8 @@ public final class ChooseLockSettingsHelper {
private boolean mRemoteLockscreenValidation; private boolean mRemoteLockscreenValidation;
@Nullable private RemoteLockscreenValidationSession mRemoteLockscreenValidationSession; @Nullable private RemoteLockscreenValidationSession mRemoteLockscreenValidationSession;
@Nullable private ComponentName mRemoteLockscreenValidationServiceComponent; @Nullable private ComponentName mRemoteLockscreenValidationServiceComponent;
boolean mRequestGatekeeperPasswordHandle; private boolean mRequestGatekeeperPasswordHandle;
private boolean mTaskOverlay;
public Builder(@NonNull Activity activity) { public Builder(@NonNull Activity activity) {
mActivity = activity; mActivity = activity;
@@ -252,6 +255,14 @@ public final class ChooseLockSettingsHelper {
return this; return this;
} }
/**
* @param taskOverlay specifies whether the activity should be launched as a task overlay.
*/
@NonNull public Builder setTaskOverlay(boolean taskOverlay) {
mTaskOverlay = taskOverlay;
return this;
}
/** /**
* @param foregroundOnly if true, the confirmation activity will be finished if it loses * @param foregroundOnly if true, the confirmation activity will be finished if it loses
* foreground. * foreground.
@@ -371,7 +382,8 @@ public final class ChooseLockSettingsHelper {
mBuilder.mCheckBoxLabel, mBuilder.mRemoteLockscreenValidation, mBuilder.mCheckBoxLabel, mBuilder.mRemoteLockscreenValidation,
mBuilder.mRemoteLockscreenValidationSession, mBuilder.mRemoteLockscreenValidationSession,
mBuilder.mRemoteLockscreenValidationServiceComponent, mBuilder.mAllowAnyUserId, mBuilder.mRemoteLockscreenValidationServiceComponent, mBuilder.mAllowAnyUserId,
mBuilder.mForegroundOnly, mBuilder.mRequestGatekeeperPasswordHandle); mBuilder.mForegroundOnly, mBuilder.mRequestGatekeeperPasswordHandle,
mBuilder.mTaskOverlay);
} }
private boolean launchConfirmationActivity(int request, @Nullable CharSequence title, private boolean launchConfirmationActivity(int request, @Nullable CharSequence title,
@@ -381,7 +393,8 @@ public final class ChooseLockSettingsHelper {
@Nullable CharSequence checkboxLabel, boolean remoteLockscreenValidation, @Nullable CharSequence checkboxLabel, boolean remoteLockscreenValidation,
@Nullable RemoteLockscreenValidationSession remoteLockscreenValidationSession, @Nullable RemoteLockscreenValidationSession remoteLockscreenValidationSession,
@Nullable ComponentName remoteLockscreenValidationServiceComponent, @Nullable ComponentName remoteLockscreenValidationServiceComponent,
boolean allowAnyUser, boolean foregroundOnly, boolean requestGatekeeperPasswordHandle) { boolean allowAnyUser, boolean foregroundOnly, boolean requestGatekeeperPasswordHandle,
boolean taskOverlay) {
Optional<Class<?>> activityClass = determineAppropriateActivityClass( Optional<Class<?>> activityClass = determineAppropriateActivityClass(
returnCredentials, forceVerifyPath, userId, remoteLockscreenValidationSession); returnCredentials, forceVerifyPath, userId, remoteLockscreenValidationSession);
if (activityClass.isEmpty()) { if (activityClass.isEmpty()) {
@@ -392,7 +405,7 @@ public final class ChooseLockSettingsHelper {
returnCredentials, external, forceVerifyPath, userId, alternateButton, returnCredentials, external, forceVerifyPath, userId, alternateButton,
checkboxLabel, remoteLockscreenValidation, remoteLockscreenValidationSession, checkboxLabel, remoteLockscreenValidation, remoteLockscreenValidationSession,
remoteLockscreenValidationServiceComponent, allowAnyUser, foregroundOnly, remoteLockscreenValidationServiceComponent, allowAnyUser, foregroundOnly,
requestGatekeeperPasswordHandle); requestGatekeeperPasswordHandle, taskOverlay);
} }
private boolean launchConfirmationActivity(int request, CharSequence title, CharSequence header, private boolean launchConfirmationActivity(int request, CharSequence title, CharSequence header,
@@ -402,7 +415,8 @@ public final class ChooseLockSettingsHelper {
boolean remoteLockscreenValidation, boolean remoteLockscreenValidation,
@Nullable RemoteLockscreenValidationSession remoteLockscreenValidationSession, @Nullable RemoteLockscreenValidationSession remoteLockscreenValidationSession,
@Nullable ComponentName remoteLockscreenValidationServiceComponent, @Nullable ComponentName remoteLockscreenValidationServiceComponent,
boolean allowAnyUser, boolean foregroundOnly, boolean requestGatekeeperPasswordHandle) { boolean allowAnyUser, boolean foregroundOnly, boolean requestGatekeeperPasswordHandle,
boolean taskOverlay) {
final Intent intent = new Intent(); final Intent intent = new Intent();
intent.putExtra(ConfirmDeviceCredentialBaseFragment.TITLE_TEXT, title); intent.putExtra(ConfirmDeviceCredentialBaseFragment.TITLE_TEXT, title);
intent.putExtra(ConfirmDeviceCredentialBaseFragment.HEADER_TEXT, header); intent.putExtra(ConfirmDeviceCredentialBaseFragment.HEADER_TEXT, header);
@@ -434,28 +448,39 @@ public final class ChooseLockSettingsHelper {
Intent inIntent = mFragment != null ? mFragment.getActivity().getIntent() : Intent inIntent = mFragment != null ? mFragment.getActivity().getIntent() :
mActivity.getIntent(); mActivity.getIntent();
copyInternalExtras(inIntent, intent); copyInternalExtras(inIntent, intent);
Bundle launchOptions = createLaunchOptions(taskOverlay);
if (external) { if (external) {
intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
copyOptionalExtras(inIntent, intent); copyOptionalExtras(inIntent, intent);
if (mActivityResultLauncher != null) { if (mActivityResultLauncher != null) {
mActivityResultLauncher.launch(intent); mActivityResultLauncher.launch(intent);
} else if (mFragment != null) { } else if (mFragment != null) {
mFragment.startActivity(intent); mFragment.startActivity(intent, launchOptions);
} else { } else {
mActivity.startActivity(intent); mActivity.startActivity(intent, launchOptions);
} }
} else { } else {
if (mActivityResultLauncher != null) { if (mActivityResultLauncher != null) {
mActivityResultLauncher.launch(intent); mActivityResultLauncher.launch(intent);
} else if (mFragment != null) { } else if (mFragment != null) {
mFragment.startActivityForResult(intent, request); mFragment.startActivityForResult(intent, request, launchOptions);
} else { } else {
mActivity.startActivityForResult(intent, request); mActivity.startActivityForResult(intent, request, launchOptions);
} }
} }
return true; return true;
} }
private Bundle createLaunchOptions(boolean taskOverlay) {
if (!taskOverlay) {
return null;
}
ActivityOptions options = ActivityOptions.makeBasic();
options.setLaunchTaskId(mActivity.getTaskId());
options.setTaskOverlay(true /* taskOverlay */, true /* canResume */);
return options.toBundle();
}
private Optional<Integer> passwordQualityToLockTypes(int quality) { private Optional<Integer> passwordQualityToLockTypes(int quality) {
switch (quality) { switch (quality) {
case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING: case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:

View File

@@ -24,8 +24,6 @@ import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROF
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PATTERN; import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PATTERN;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PIN; import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PIN;
import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
import android.app.Activity; import android.app.Activity;
import android.app.KeyguardManager; import android.app.KeyguardManager;
import android.app.RemoteLockscreenValidationSession; import android.app.RemoteLockscreenValidationSession;
@@ -63,13 +61,6 @@ import java.util.concurrent.Executor;
public class ConfirmDeviceCredentialActivity extends FragmentActivity { public class ConfirmDeviceCredentialActivity extends FragmentActivity {
public static final String TAG = ConfirmDeviceCredentialActivity.class.getSimpleName(); public static final String TAG = ConfirmDeviceCredentialActivity.class.getSimpleName();
/**
* If the intent is sent from {@link com.android.systemui.keyguard.WorkLockActivityController}
* then check for device policy management flags.
*/
public static final String EXTRA_FROM_WORK_LOCK_ACTIVITY_CONTROLLER =
"from_work_lock_activity_controller";
// The normal flow that apps go through // The normal flow that apps go through
private static final int CREDENTIAL_NORMAL = 1; private static final int CREDENTIAL_NORMAL = 1;
// Unlocks the managed profile when the primary profile is unlocked // Unlocks the managed profile when the primary profile is unlocked
@@ -80,15 +71,6 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
public static class InternalActivity extends ConfirmDeviceCredentialActivity { public static class InternalActivity extends ConfirmDeviceCredentialActivity {
} }
public static Intent createIntent(CharSequence title, CharSequence details) {
Intent intent = new Intent();
intent.setClassName(SETTINGS_PACKAGE_NAME,
ConfirmDeviceCredentialActivity.class.getName());
intent.putExtra(KeyguardManager.EXTRA_TITLE, title);
intent.putExtra(KeyguardManager.EXTRA_DESCRIPTION, details);
return intent;
}
private BiometricFragment mBiometricFragment; private BiometricFragment mBiometricFragment;
private DevicePolicyManager mDevicePolicyManager; private DevicePolicyManager mDevicePolicyManager;
private LockPatternUtils mLockPatternUtils; private LockPatternUtils mLockPatternUtils;
@@ -97,6 +79,7 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
private Handler mHandler = new Handler(Looper.getMainLooper()); private Handler mHandler = new Handler(Looper.getMainLooper());
private Context mContext; private Context mContext;
private boolean mCheckDevicePolicyManager; private boolean mCheckDevicePolicyManager;
private boolean mTaskOverlay;
private String mTitle; private String mTitle;
private CharSequence mDetails; private CharSequence mDetails;
@@ -186,6 +169,8 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
boolean frp = KeyguardManager.ACTION_CONFIRM_FRP_CREDENTIAL.equals(intent.getAction()); boolean frp = KeyguardManager.ACTION_CONFIRM_FRP_CREDENTIAL.equals(intent.getAction());
boolean remoteValidation = boolean remoteValidation =
KeyguardManager.ACTION_CONFIRM_REMOTE_DEVICE_CREDENTIAL.equals(intent.getAction()); KeyguardManager.ACTION_CONFIRM_REMOTE_DEVICE_CREDENTIAL.equals(intent.getAction());
mTaskOverlay = isInternalActivity()
&& intent.getBooleanExtra(KeyguardManager.EXTRA_FORCE_TASK_OVERLAY, false);
mUserId = UserHandle.myUserId(); mUserId = UserHandle.myUserId();
if (isInternalActivity()) { if (isInternalActivity()) {
@@ -417,6 +402,12 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
*/ */
private void showConfirmCredentials() { private void showConfirmCredentials() {
boolean launched = false; boolean launched = false;
ChooseLockSettingsHelper.Builder builder = new ChooseLockSettingsHelper.Builder(this)
.setHeader(mTitle)
.setDescription(mDetails)
.setExternal(true)
.setUserId(mUserId)
.setTaskOverlay(mTaskOverlay);
// The only difference between CREDENTIAL_MANAGED and CREDENTIAL_NORMAL is that for // The only difference between CREDENTIAL_MANAGED and CREDENTIAL_NORMAL is that for
// CREDENTIAL_MANAGED, we launch the real confirm credential activity with an explicit // CREDENTIAL_MANAGED, we launch the real confirm credential activity with an explicit
// but fake challenge value (0L). This will result in ConfirmLockPassword calling // but fake challenge value (0L). This will result in ConfirmLockPassword calling
@@ -429,22 +420,9 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
// LockPatternChecker and LockPatternUtils. verifyPassword should be the only API to use, // LockPatternChecker and LockPatternUtils. verifyPassword should be the only API to use,
// which optionally accepts a challenge. // which optionally accepts a challenge.
if (mCredentialMode == CREDENTIAL_MANAGED) { if (mCredentialMode == CREDENTIAL_MANAGED) {
final ChooseLockSettingsHelper.Builder builder = launched = builder.setForceVerifyPath(true).show();
new ChooseLockSettingsHelper.Builder(this);
launched = builder.setHeader(mTitle)
.setDescription(mDetails)
.setExternal(true)
.setUserId(mUserId)
.setForceVerifyPath(true)
.show();
} else if (mCredentialMode == CREDENTIAL_NORMAL) { } else if (mCredentialMode == CREDENTIAL_NORMAL) {
final ChooseLockSettingsHelper.Builder builder = launched = builder.show();
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) { if (!launched) {
Log.d(TAG, "No pin/pattern/pass set"); Log.d(TAG, "No pin/pattern/pass set");