diff options
4 files changed, 41 insertions, 30 deletions
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index ea9bb396f83c..37692d363a4b 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -537,8 +537,8 @@ public abstract class ActivityManagerInternal { /** * Returns whether the given user requires credential entry at this time. This is used to - * intercept activity launches for locked work apps due to work challenge being triggered or - * when the profile user is yet to be unlocked. + * intercept activity launches for apps corresponding to locked profiles due to separate + * challenge being triggered or when the profile user is yet to be unlocked. */ public abstract boolean shouldConfirmCredentials(@UserIdInt int userId); diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index a6b532cdef09..badd7f085e56 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -3050,8 +3050,8 @@ class UserController implements Handler.Callback { /** * Returns whether the given user requires credential entry at this time. This is used to - * intercept activity launches for locked work apps due to work challenge being triggered - * or when the profile user is yet to be unlocked. + * intercept activity launches for apps corresponding to locked profiles due to separate + * challenge being triggered or when the profile user is yet to be unlocked. */ protected boolean shouldConfirmCredentials(@UserIdInt int userId) { if (getStartedUserState(userId) == null) { diff --git a/services/core/java/com/android/server/wm/ActivityStartInterceptor.java b/services/core/java/com/android/server/wm/ActivityStartInterceptor.java index 1b45c1b4f3f1..e7621ffe8e3c 100644 --- a/services/core/java/com/android/server/wm/ActivityStartInterceptor.java +++ b/services/core/java/com/android/server/wm/ActivityStartInterceptor.java @@ -224,7 +224,7 @@ class ActivityStartInterceptor { // before issuing the work challenge. return true; } - if (interceptLockedManagedProfileIfNeeded()) { + if (interceptLockedProfileIfNeeded()) { return true; } if (interceptHomeIfNeeded()) { @@ -378,7 +378,7 @@ class ActivityStartInterceptor { return true; } - private boolean interceptLockedManagedProfileIfNeeded() { + private boolean interceptLockedProfileIfNeeded() { final Intent interceptingIntent = interceptWithConfirmCredentialsIfNeeded(mAInfo, mUserId); if (interceptingIntent == null) { return false; diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index b5e5d848c75c..cb2adbcf460a 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -579,30 +579,11 @@ class ActivityStarter { computeResolveFilterUid(callingUid, realCallingUid, filterCallingUid), realCallingPid); if (resolveInfo == null) { - final UserInfo userInfo = supervisor.getUserInfo(userId); - if (userInfo != null && userInfo.isManagedProfile()) { - // Special case for managed profiles, if attempting to launch non-cryto aware - // app in a locked managed profile from an unlocked parent allow it to resolve - // as user will be sent via confirm credentials to unlock the profile. - final UserManager userManager = UserManager.get(supervisor.mService.mContext); - boolean profileLockedAndParentUnlockingOrUnlocked = false; - final long token = Binder.clearCallingIdentity(); - try { - final UserInfo parent = userManager.getProfileParent(userId); - profileLockedAndParentUnlockingOrUnlocked = (parent != null) - && userManager.isUserUnlockingOrUnlocked(parent.id) - && !userManager.isUserUnlockingOrUnlocked(userId); - } finally { - Binder.restoreCallingIdentity(token); - } - if (profileLockedAndParentUnlockingOrUnlocked) { - resolveInfo = supervisor.resolveIntent(intent, resolvedType, userId, - PackageManager.MATCH_DIRECT_BOOT_AWARE - | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, - computeResolveFilterUid(callingUid, realCallingUid, - filterCallingUid), realCallingPid); - } - } + // Special case for profiles: If attempting to launch non-crypto aware app in a + // locked profile or launch an app in a profile that is stopped by quiet mode from + // an unlocked parent, allow it to resolve as user will be sent via confirm + // credentials to unlock the profile. + resolveInfo = resolveIntentForLockedOrStoppedProfiles(supervisor); } // Collect information about the target of the Intent. @@ -616,6 +597,36 @@ class ActivityStarter { UserHandle.getUserId(activityInfo.applicationInfo.uid)); } } + + /** + * Resolve intent for locked or stopped profiles if the parent profile is unlocking or + * unlocked. + */ + ResolveInfo resolveIntentForLockedOrStoppedProfiles( + ActivityTaskSupervisor supervisor) { + final UserInfo userInfo = supervisor.getUserInfo(userId); + if (userInfo != null && userInfo.isProfile()) { + final UserManager userManager = UserManager.get(supervisor.mService.mContext); + boolean profileLockedAndParentUnlockingOrUnlocked = false; + final long token = Binder.clearCallingIdentity(); + try { + final UserInfo parent = userManager.getProfileParent(userId); + profileLockedAndParentUnlockingOrUnlocked = (parent != null) + && userManager.isUserUnlockingOrUnlocked(parent.id) + && !userManager.isUserUnlockingOrUnlocked(userId); + } finally { + Binder.restoreCallingIdentity(token); + } + if (profileLockedAndParentUnlockingOrUnlocked) { + return supervisor.resolveIntent(intent, resolvedType, userId, + PackageManager.MATCH_DIRECT_BOOT_AWARE + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, + computeResolveFilterUid(callingUid, realCallingUid, + filterCallingUid), realCallingPid); + } + } + return null; + } } ActivityStarter(ActivityStartController controller, ActivityTaskManagerService service, |