Loading services/core/java/com/android/server/wm/ActivityStackSupervisor.java +3 −3 Original line number Diff line number Diff line Loading @@ -63,6 +63,9 @@ import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLAS import static com.android.server.wm.ActivityTaskManagerService.ANIMATE; import static com.android.server.wm.ActivityTaskManagerService.H.FIRST_SUPERVISOR_STACK_MSG; import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_NONE; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_ALLOWLISTED; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; import static com.android.server.wm.RootWindowContainer.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS; import static com.android.server.wm.RootWindowContainer.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION; Loading @@ -70,9 +73,6 @@ import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_RECENTS; import static com.android.server.wm.Task.ActivityState.PAUSED; import static com.android.server.wm.Task.ActivityState.PAUSING; import static com.android.server.wm.Task.FLAG_FORCE_HIDDEN_FOR_PINNED_TASK; import static com.android.server.wm.Task.LOCK_TASK_AUTH_ALLOWLISTED; import static com.android.server.wm.Task.LOCK_TASK_AUTH_LAUNCHABLE; import static com.android.server.wm.Task.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; import static com.android.server.wm.Task.REPARENT_KEEP_STACK_AT_FRONT; import static com.android.server.wm.Task.TAG_CLEANUP; import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS; Loading services/core/java/com/android/server/wm/ActivityTaskManagerService.java +1 −1 Original line number Diff line number Diff line Loading @@ -117,13 +117,13 @@ import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_RECEI import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_STRUCTURE; import static com.android.server.wm.ActivityTaskManagerService.H.REPORT_TIME_TRACKER_MSG; import static com.android.server.wm.ActivityTaskManagerService.UiHandler.DISMISS_DIALOG_UI_MSG; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_DONT_LOCK; import static com.android.server.wm.RecentsAnimationController.REORDER_KEEP_IN_PLACE; import static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_ORIGINAL_POSITION; import static com.android.server.wm.RootWindowContainer.MATCH_TASK_IN_STACKS_ONLY; import static com.android.server.wm.RootWindowContainer.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS; import static com.android.server.wm.Task.ActivityState.DESTROYED; import static com.android.server.wm.Task.ActivityState.DESTROYING; import static com.android.server.wm.Task.LOCK_TASK_AUTH_DONT_LOCK; import static com.android.server.wm.Task.REPARENT_KEEP_STACK_AT_FRONT; import static com.android.server.wm.WindowContainer.POSITION_TOP; import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL; Loading services/core/java/com/android/server/wm/LockTaskController.java +48 −5 Original line number Diff line number Diff line Loading @@ -24,6 +24,8 @@ import static android.content.Context.DEVICE_POLICY_SERVICE; import static android.content.Context.STATUS_BAR_SERVICE; import static android.content.Intent.ACTION_CALL_EMERGENCY; import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_ALWAYS; import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_DEFAULT; import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_IF_ALLOWLISTED; import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_NEVER; import static android.os.UserHandle.USER_ALL; import static android.os.UserHandle.USER_CURRENT; Loading @@ -33,11 +35,6 @@ import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_LOCKTASK; import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_LOCKTASK; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.Task.LOCK_TASK_AUTH_ALLOWLISTED; import static com.android.server.wm.Task.LOCK_TASK_AUTH_DONT_LOCK; import static com.android.server.wm.Task.LOCK_TASK_AUTH_LAUNCHABLE; import static com.android.server.wm.Task.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; import static com.android.server.wm.Task.LOCK_TASK_AUTH_PINNABLE; import android.annotation.NonNull; import android.annotation.Nullable; Loading Loading @@ -129,6 +126,18 @@ public class LockTaskController { /** Tag used for disabling of keyguard */ private static final String LOCK_TASK_TAG = "Lock-to-App"; /** Can't be put in lockTask mode. */ static final int LOCK_TASK_AUTH_DONT_LOCK = 0; /** Can enter app pinning with user approval. Can never start over existing lockTask task. */ static final int LOCK_TASK_AUTH_PINNABLE = 1; /** Starts in LOCK_TASK_MODE_LOCKED automatically. Can start over existing lockTask task. */ static final int LOCK_TASK_AUTH_LAUNCHABLE = 2; /** Can enter lockTask without user approval. Can start over existing lockTask task. */ static final int LOCK_TASK_AUTH_ALLOWLISTED = 3; /** Priv-app that starts in LOCK_TASK_MODE_LOCKED automatically. Can start over existing * lockTask task. */ static final int LOCK_TASK_AUTH_LAUNCHABLE_PRIV = 4; private final IBinder mToken = new LockTaskToken(); private final ActivityStackSupervisor mSupervisor; private final Context mContext; Loading Loading @@ -697,6 +706,40 @@ public class LockTaskController { } } int getLockTaskAuth(@Nullable ActivityRecord rootActivity, @Nullable Task task) { if (rootActivity == null && task == null) { return LOCK_TASK_AUTH_DONT_LOCK; } if (rootActivity == null) { return LOCK_TASK_AUTH_PINNABLE; } final String pkg = (task == null || task.realActivity == null) ? null : task.realActivity.getPackageName(); final int userId = task != null ? task.mUserId : rootActivity.mUserId; int lockTaskAuth = LOCK_TASK_AUTH_DONT_LOCK; switch (rootActivity.lockTaskLaunchMode) { case LOCK_TASK_LAUNCH_MODE_DEFAULT: lockTaskAuth = isPackageAllowlisted(userId, pkg) ? LOCK_TASK_AUTH_ALLOWLISTED : LOCK_TASK_AUTH_PINNABLE; break; case LOCK_TASK_LAUNCH_MODE_NEVER: lockTaskAuth = LOCK_TASK_AUTH_DONT_LOCK; break; case LOCK_TASK_LAUNCH_MODE_ALWAYS: lockTaskAuth = LOCK_TASK_AUTH_LAUNCHABLE_PRIV; break; case LOCK_TASK_LAUNCH_MODE_IF_ALLOWLISTED: lockTaskAuth = isPackageAllowlisted(userId, pkg) ? LOCK_TASK_AUTH_LAUNCHABLE : LOCK_TASK_AUTH_PINNABLE; break; } return lockTaskAuth; } boolean isPackageAllowlisted(int userId, String pkg) { if (pkg == null) { return false; Loading services/core/java/com/android/server/wm/Task.java +6 −41 Original line number Diff line number Diff line Loading @@ -43,10 +43,6 @@ import static android.content.pm.ActivityInfo.CONFIG_SCREEN_LAYOUT; import static android.content.pm.ActivityInfo.FLAG_RELINQUISH_TASK_IDENTITY; import static android.content.pm.ActivityInfo.FLAG_RESUME_WHILE_PAUSING; import static android.content.pm.ActivityInfo.FLAG_SHOW_FOR_ALL_USERS; import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_ALWAYS; import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_DEFAULT; import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_IF_ALLOWLISTED; import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_NEVER; import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZABLE_LANDSCAPE_ONLY; import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZABLE_PORTRAIT_ONLY; import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZABLE_PRESERVE_ORIENTATION; Loading Loading @@ -120,6 +116,11 @@ import static com.android.server.wm.ActivityTaskManagerService.H.FIRST_ACTIVITY_ import static com.android.server.wm.IdentifierProto.HASH_CODE; import static com.android.server.wm.IdentifierProto.TITLE; import static com.android.server.wm.IdentifierProto.USER_ID; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_ALLOWLISTED; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_DONT_LOCK; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_PINNABLE; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_RECENTS; import static com.android.server.wm.Task.ActivityState.PAUSED; import static com.android.server.wm.Task.ActivityState.PAUSING; Loading Loading @@ -407,17 +408,6 @@ class Task extends WindowContainer<WindowContainer> { boolean mUserSetupComplete; // The user set-up is complete as of the last time the task activity // was changed. /** Can't be put in lockTask mode. */ final static int LOCK_TASK_AUTH_DONT_LOCK = 0; /** Can enter app pinning with user approval. Can never start over existing lockTask task. */ final static int LOCK_TASK_AUTH_PINNABLE = 1; /** Starts in LOCK_TASK_MODE_LOCKED automatically. Can start over existing lockTask task. */ final static int LOCK_TASK_AUTH_LAUNCHABLE = 2; /** Can enter lockTask without user approval. Can start over existing lockTask task. */ final static int LOCK_TASK_AUTH_ALLOWLISTED = 3; /** Priv-app that starts in LOCK_TASK_MODE_LOCKED automatically. Can start over existing * lockTask task. */ final static int LOCK_TASK_AUTH_LAUNCHABLE_PRIV = 4; int mLockTaskAuth = LOCK_TASK_AUTH_PINNABLE; int mLockTaskUid = -1; // The uid of the application that called startLockTask(). Loading Loading @@ -1941,32 +1931,7 @@ class Task extends WindowContainer<WindowContainer> { } private void setLockTaskAuth(@Nullable ActivityRecord r) { if (r == null) { mLockTaskAuth = LOCK_TASK_AUTH_PINNABLE; return; } final String pkg = (realActivity != null) ? realActivity.getPackageName() : null; final LockTaskController lockTaskController = mAtmService.getLockTaskController(); switch (r.lockTaskLaunchMode) { case LOCK_TASK_LAUNCH_MODE_DEFAULT: mLockTaskAuth = lockTaskController.isPackageAllowlisted(mUserId, pkg) ? LOCK_TASK_AUTH_ALLOWLISTED : LOCK_TASK_AUTH_PINNABLE; break; case LOCK_TASK_LAUNCH_MODE_NEVER: mLockTaskAuth = LOCK_TASK_AUTH_DONT_LOCK; break; case LOCK_TASK_LAUNCH_MODE_ALWAYS: mLockTaskAuth = LOCK_TASK_AUTH_LAUNCHABLE_PRIV; break; case LOCK_TASK_LAUNCH_MODE_IF_ALLOWLISTED: mLockTaskAuth = lockTaskController.isPackageAllowlisted(mUserId, pkg) ? LOCK_TASK_AUTH_LAUNCHABLE : LOCK_TASK_AUTH_PINNABLE; break; } mLockTaskAuth = mAtmService.getLockTaskController().getLockTaskAuth(r, this); ProtoLog.d(WM_DEBUG_LOCKTASK, "setLockTaskAuth: task=%s mLockTaskAuth=%s", this, lockTaskAuthToString()); } Loading services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java +41 −39 Original line number Diff line number Diff line Loading @@ -50,6 +50,11 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.reset; import static com.android.dx.mockito.inline.extended.ExtendedMockito.times; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.dx.mockito.inline.extended.ExtendedMockito.when; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_ALLOWLISTED; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_DONT_LOCK; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_PINNABLE; import static com.android.server.wm.LockTaskController.STATUS_BAR_MASK_LOCKED; import static com.android.server.wm.LockTaskController.STATUS_BAR_MASK_PINNED; Loading Loading @@ -169,7 +174,7 @@ public class LockTaskControllerTest { @Test public void testStartLockTaskMode_once() throws Exception { // GIVEN a task record with allowlisted auth Task tr = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr = getTask(LOCK_TASK_AUTH_ALLOWLISTED); // WHEN calling setLockTaskMode for LOCKED mode without resuming mLockTaskController.startLockTaskMode(tr, false, TEST_UID); Loading @@ -186,8 +191,8 @@ public class LockTaskControllerTest { @Test public void testStartLockTaskMode_twice() throws Exception { // GIVEN two task records with allowlisted auth Task tr1 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr2 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr1 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); Task tr2 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); // WHEN calling setLockTaskMode for LOCKED mode on both tasks mLockTaskController.startLockTaskMode(tr1, false, TEST_UID); Loading @@ -206,7 +211,7 @@ public class LockTaskControllerTest { @Test public void testStartLockTaskMode_pinningRequest() { // GIVEN a task record that is not allowlisted, i.e. with pinned auth Task tr = getTask(Task.LOCK_TASK_AUTH_PINNABLE); Task tr = getTask(LOCK_TASK_AUTH_PINNABLE); // WHEN calling startLockTaskMode mLockTaskController.startLockTaskMode(tr, false, TEST_UID); Loading @@ -218,7 +223,7 @@ public class LockTaskControllerTest { @Test public void testStartLockTaskMode_pinnedBySystem() throws Exception { // GIVEN a task record with pinned auth Task tr = getTask(Task.LOCK_TASK_AUTH_PINNABLE); Task tr = getTask(LOCK_TASK_AUTH_PINNABLE); // WHEN the system calls startLockTaskMode mLockTaskController.startLockTaskMode(tr, true, SYSTEM_UID); Loading @@ -237,41 +242,39 @@ public class LockTaskControllerTest { @Test public void testLockTaskViolation() { // GIVEN one task record with allowlisted auth that is in lock task mode Task tr = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr, false, TEST_UID); // THEN it's not a lock task violation to try and launch this task without clearing assertFalse(mLockTaskController.isLockTaskModeViolation(tr, false)); // THEN it's a lock task violation to launch another task that is not allowlisted assertTrue(mLockTaskController.isLockTaskModeViolation(getTask( Task.LOCK_TASK_AUTH_PINNABLE))); assertTrue(mLockTaskController.isLockTaskModeViolation(getTask(LOCK_TASK_AUTH_PINNABLE))); // THEN it's a lock task violation to launch another task that is disallowed from lock task assertTrue(mLockTaskController.isLockTaskModeViolation(getTask( Task.LOCK_TASK_AUTH_DONT_LOCK))); assertTrue(mLockTaskController.isLockTaskModeViolation(getTask(LOCK_TASK_AUTH_DONT_LOCK))); // THEN it's no a lock task violation to launch another task that is allowlisted assertFalse(mLockTaskController.isLockTaskModeViolation(getTask( Task.LOCK_TASK_AUTH_ALLOWLISTED))); LOCK_TASK_AUTH_ALLOWLISTED))); assertFalse(mLockTaskController.isLockTaskModeViolation(getTask( Task.LOCK_TASK_AUTH_LAUNCHABLE))); LOCK_TASK_AUTH_LAUNCHABLE))); // THEN it's not a lock task violation to launch another task that is priv launchable assertFalse(mLockTaskController.isLockTaskModeViolation(getTask( Task.LOCK_TASK_AUTH_LAUNCHABLE_PRIV))); LOCK_TASK_AUTH_LAUNCHABLE_PRIV))); } @Test public void testLockTaskViolation_emergencyCall() { // GIVEN one task record with allowlisted auth that is in lock task mode Task tr = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr, false, TEST_UID); // GIVEN tasks necessary for emergency calling Task keypad = getTask(new Intent().setComponent(EMERGENCY_DIALER_COMPONENT), Task.LOCK_TASK_AUTH_PINNABLE); LOCK_TASK_AUTH_PINNABLE); Task callAction = getTask(new Intent(Intent.ACTION_CALL_EMERGENCY), Task.LOCK_TASK_AUTH_PINNABLE); Task dialer = getTask("com.example.dialer", Task.LOCK_TASK_AUTH_PINNABLE); LOCK_TASK_AUTH_PINNABLE); Task dialer = getTask("com.example.dialer", LOCK_TASK_AUTH_PINNABLE); when(mTelecomManager.getSystemDialerPackage()) .thenReturn(dialer.intent.getComponent().getPackageName()); Loading @@ -295,7 +298,7 @@ public class LockTaskControllerTest { @Test public void testStopLockTaskMode() throws Exception { // GIVEN one task record with allowlisted auth that is in lock task mode Task tr = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr, false, TEST_UID); // WHEN the same caller calls stopLockTaskMode Loading @@ -312,7 +315,7 @@ public class LockTaskControllerTest { @Test(expected = SecurityException.class) public void testStopLockTaskMode_differentCaller() { // GIVEN one task record with allowlisted auth that is in lock task mode Task tr = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr, false, TEST_UID); // WHEN a different caller calls stopLockTaskMode Loading @@ -324,7 +327,7 @@ public class LockTaskControllerTest { @Test public void testStopLockTaskMode_systemCaller() { // GIVEN one task record with allowlisted auth that is in lock task mode Task tr = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr, false, TEST_UID); // WHEN system calls stopLockTaskMode Loading @@ -337,8 +340,8 @@ public class LockTaskControllerTest { @Test public void testStopLockTaskMode_twoTasks() throws Exception { // GIVEN two task records with allowlisted auth that is in lock task mode Task tr1 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr2 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr1 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); Task tr2 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr1, false, TEST_UID); mLockTaskController.startLockTaskMode(tr2, false, TEST_UID); Loading @@ -358,8 +361,8 @@ public class LockTaskControllerTest { @Test public void testStopLockTaskMode_rootTask() throws Exception { // GIVEN two task records with allowlisted auth that is in lock task mode Task tr1 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr2 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr1 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); Task tr2 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr1, false, TEST_UID); mLockTaskController.startLockTaskMode(tr2, false, TEST_UID); Loading @@ -379,7 +382,7 @@ public class LockTaskControllerTest { @Test public void testStopLockTaskMode_pinned() throws Exception { // GIVEN one task records that is in pinned mode Task tr = getTask(Task.LOCK_TASK_AUTH_PINNABLE); Task tr = getTask(LOCK_TASK_AUTH_PINNABLE); mLockTaskController.startLockTaskMode(tr, true, SYSTEM_UID); // GIVEN that the keyguard is required to show after unlocking Settings.Secure.putInt(mContext.getContentResolver(), Loading @@ -406,8 +409,8 @@ public class LockTaskControllerTest { @Test public void testClearLockedTasks() throws Exception { // GIVEN two task records with allowlisted auth that is in lock task mode Task tr1 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr2 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr1 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); Task tr2 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr1, false, TEST_UID); mLockTaskController.startLockTaskMode(tr2, false, TEST_UID); Loading @@ -434,7 +437,7 @@ public class LockTaskControllerTest { .thenReturn(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED); // AND there is a task record Task tr1 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr1 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr1, true, TEST_UID); // WHEN calling clearLockedTasks on the root task Loading @@ -454,7 +457,7 @@ public class LockTaskControllerTest { .thenReturn(true); // AND there is a task record Task tr1 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr1 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr1, true, TEST_UID); // WHEN calling clearLockedTasks on the root task Loading @@ -471,7 +474,7 @@ public class LockTaskControllerTest { Settings.Secure.LOCK_TO_APP_EXIT_LOCKED, 1, mContext.getUserId()); // AND there is a task record Task tr1 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr1 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr1, true, TEST_UID); // WHEN calling clearLockedTasks on the root task Loading @@ -488,7 +491,7 @@ public class LockTaskControllerTest { Settings.Secure.LOCK_TO_APP_EXIT_LOCKED, 0, mContext.getUserId()); // AND there is a task record Task tr1 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr1 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr1, true, TEST_UID); // WHEN calling clearLockedTasks on the root task Loading Loading @@ -574,7 +577,7 @@ public class LockTaskControllerTest { @Test public void testUpdateLockTaskFeatures() throws Exception { // GIVEN a locked task Task tr = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr, false, TEST_UID); // THEN lock task mode should be started with default status bar masks Loading Loading @@ -616,7 +619,7 @@ public class LockTaskControllerTest { @Test public void testUpdateLockTaskFeatures_differentUser() throws Exception { // GIVEN a locked task Task tr = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr, false, TEST_UID); // THEN lock task mode should be started with default status bar masks Loading @@ -638,7 +641,7 @@ public class LockTaskControllerTest { @Test public void testUpdateLockTaskFeatures_keyguard() { // GIVEN a locked task Task tr = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr, false, TEST_UID); // THEN keyguard should be disabled Loading Loading @@ -704,7 +707,7 @@ public class LockTaskControllerTest { TEST_USER_ID, TEST_PACKAGE_NAME, LOCK_TASK_LAUNCH_MODE_DEFAULT)); // Start lock task mode Task tr = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr, false, TEST_UID); // WHEN LOCK_TASK_FEATURE_BLOCK_ACTIVITY_START_IN_TASK is not enabled Loading Loading @@ -758,14 +761,13 @@ public class LockTaskControllerTest { * @param isAppAware {@code true} if the app has marked if allowlisted in its manifest */ private Task getTaskForUpdate(String pkg, boolean isAppAware) { final int authIfAllowlisted = isAppAware ? Task.LOCK_TASK_AUTH_LAUNCHABLE : Task.LOCK_TASK_AUTH_ALLOWLISTED; final int authIfAllowlisted = isAppAware ? LOCK_TASK_AUTH_LAUNCHABLE : LOCK_TASK_AUTH_ALLOWLISTED; Task tr = getTask(pkg, authIfAllowlisted); doAnswer((invocation) -> { boolean isAllowlisted = mLockTaskController.isPackageAllowlisted(TEST_USER_ID, pkg); tr.mLockTaskAuth = isAllowlisted ? authIfAllowlisted : Task.LOCK_TASK_AUTH_PINNABLE; tr.mLockTaskAuth = isAllowlisted ? authIfAllowlisted : LOCK_TASK_AUTH_PINNABLE; return null; }).when(tr).setLockTaskAuth(); return tr; Loading Loading
services/core/java/com/android/server/wm/ActivityStackSupervisor.java +3 −3 Original line number Diff line number Diff line Loading @@ -63,6 +63,9 @@ import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLAS import static com.android.server.wm.ActivityTaskManagerService.ANIMATE; import static com.android.server.wm.ActivityTaskManagerService.H.FIRST_SUPERVISOR_STACK_MSG; import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_NONE; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_ALLOWLISTED; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; import static com.android.server.wm.RootWindowContainer.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS; import static com.android.server.wm.RootWindowContainer.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION; Loading @@ -70,9 +73,6 @@ import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_RECENTS; import static com.android.server.wm.Task.ActivityState.PAUSED; import static com.android.server.wm.Task.ActivityState.PAUSING; import static com.android.server.wm.Task.FLAG_FORCE_HIDDEN_FOR_PINNED_TASK; import static com.android.server.wm.Task.LOCK_TASK_AUTH_ALLOWLISTED; import static com.android.server.wm.Task.LOCK_TASK_AUTH_LAUNCHABLE; import static com.android.server.wm.Task.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; import static com.android.server.wm.Task.REPARENT_KEEP_STACK_AT_FRONT; import static com.android.server.wm.Task.TAG_CLEANUP; import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS; Loading
services/core/java/com/android/server/wm/ActivityTaskManagerService.java +1 −1 Original line number Diff line number Diff line Loading @@ -117,13 +117,13 @@ import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_RECEI import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_STRUCTURE; import static com.android.server.wm.ActivityTaskManagerService.H.REPORT_TIME_TRACKER_MSG; import static com.android.server.wm.ActivityTaskManagerService.UiHandler.DISMISS_DIALOG_UI_MSG; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_DONT_LOCK; import static com.android.server.wm.RecentsAnimationController.REORDER_KEEP_IN_PLACE; import static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_ORIGINAL_POSITION; import static com.android.server.wm.RootWindowContainer.MATCH_TASK_IN_STACKS_ONLY; import static com.android.server.wm.RootWindowContainer.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS; import static com.android.server.wm.Task.ActivityState.DESTROYED; import static com.android.server.wm.Task.ActivityState.DESTROYING; import static com.android.server.wm.Task.LOCK_TASK_AUTH_DONT_LOCK; import static com.android.server.wm.Task.REPARENT_KEEP_STACK_AT_FRONT; import static com.android.server.wm.WindowContainer.POSITION_TOP; import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL; Loading
services/core/java/com/android/server/wm/LockTaskController.java +48 −5 Original line number Diff line number Diff line Loading @@ -24,6 +24,8 @@ import static android.content.Context.DEVICE_POLICY_SERVICE; import static android.content.Context.STATUS_BAR_SERVICE; import static android.content.Intent.ACTION_CALL_EMERGENCY; import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_ALWAYS; import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_DEFAULT; import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_IF_ALLOWLISTED; import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_NEVER; import static android.os.UserHandle.USER_ALL; import static android.os.UserHandle.USER_CURRENT; Loading @@ -33,11 +35,6 @@ import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_LOCKTASK; import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_LOCKTASK; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.Task.LOCK_TASK_AUTH_ALLOWLISTED; import static com.android.server.wm.Task.LOCK_TASK_AUTH_DONT_LOCK; import static com.android.server.wm.Task.LOCK_TASK_AUTH_LAUNCHABLE; import static com.android.server.wm.Task.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; import static com.android.server.wm.Task.LOCK_TASK_AUTH_PINNABLE; import android.annotation.NonNull; import android.annotation.Nullable; Loading Loading @@ -129,6 +126,18 @@ public class LockTaskController { /** Tag used for disabling of keyguard */ private static final String LOCK_TASK_TAG = "Lock-to-App"; /** Can't be put in lockTask mode. */ static final int LOCK_TASK_AUTH_DONT_LOCK = 0; /** Can enter app pinning with user approval. Can never start over existing lockTask task. */ static final int LOCK_TASK_AUTH_PINNABLE = 1; /** Starts in LOCK_TASK_MODE_LOCKED automatically. Can start over existing lockTask task. */ static final int LOCK_TASK_AUTH_LAUNCHABLE = 2; /** Can enter lockTask without user approval. Can start over existing lockTask task. */ static final int LOCK_TASK_AUTH_ALLOWLISTED = 3; /** Priv-app that starts in LOCK_TASK_MODE_LOCKED automatically. Can start over existing * lockTask task. */ static final int LOCK_TASK_AUTH_LAUNCHABLE_PRIV = 4; private final IBinder mToken = new LockTaskToken(); private final ActivityStackSupervisor mSupervisor; private final Context mContext; Loading Loading @@ -697,6 +706,40 @@ public class LockTaskController { } } int getLockTaskAuth(@Nullable ActivityRecord rootActivity, @Nullable Task task) { if (rootActivity == null && task == null) { return LOCK_TASK_AUTH_DONT_LOCK; } if (rootActivity == null) { return LOCK_TASK_AUTH_PINNABLE; } final String pkg = (task == null || task.realActivity == null) ? null : task.realActivity.getPackageName(); final int userId = task != null ? task.mUserId : rootActivity.mUserId; int lockTaskAuth = LOCK_TASK_AUTH_DONT_LOCK; switch (rootActivity.lockTaskLaunchMode) { case LOCK_TASK_LAUNCH_MODE_DEFAULT: lockTaskAuth = isPackageAllowlisted(userId, pkg) ? LOCK_TASK_AUTH_ALLOWLISTED : LOCK_TASK_AUTH_PINNABLE; break; case LOCK_TASK_LAUNCH_MODE_NEVER: lockTaskAuth = LOCK_TASK_AUTH_DONT_LOCK; break; case LOCK_TASK_LAUNCH_MODE_ALWAYS: lockTaskAuth = LOCK_TASK_AUTH_LAUNCHABLE_PRIV; break; case LOCK_TASK_LAUNCH_MODE_IF_ALLOWLISTED: lockTaskAuth = isPackageAllowlisted(userId, pkg) ? LOCK_TASK_AUTH_LAUNCHABLE : LOCK_TASK_AUTH_PINNABLE; break; } return lockTaskAuth; } boolean isPackageAllowlisted(int userId, String pkg) { if (pkg == null) { return false; Loading
services/core/java/com/android/server/wm/Task.java +6 −41 Original line number Diff line number Diff line Loading @@ -43,10 +43,6 @@ import static android.content.pm.ActivityInfo.CONFIG_SCREEN_LAYOUT; import static android.content.pm.ActivityInfo.FLAG_RELINQUISH_TASK_IDENTITY; import static android.content.pm.ActivityInfo.FLAG_RESUME_WHILE_PAUSING; import static android.content.pm.ActivityInfo.FLAG_SHOW_FOR_ALL_USERS; import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_ALWAYS; import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_DEFAULT; import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_IF_ALLOWLISTED; import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_NEVER; import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZABLE_LANDSCAPE_ONLY; import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZABLE_PORTRAIT_ONLY; import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZABLE_PRESERVE_ORIENTATION; Loading Loading @@ -120,6 +116,11 @@ import static com.android.server.wm.ActivityTaskManagerService.H.FIRST_ACTIVITY_ import static com.android.server.wm.IdentifierProto.HASH_CODE; import static com.android.server.wm.IdentifierProto.TITLE; import static com.android.server.wm.IdentifierProto.USER_ID; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_ALLOWLISTED; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_DONT_LOCK; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_PINNABLE; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_RECENTS; import static com.android.server.wm.Task.ActivityState.PAUSED; import static com.android.server.wm.Task.ActivityState.PAUSING; Loading Loading @@ -407,17 +408,6 @@ class Task extends WindowContainer<WindowContainer> { boolean mUserSetupComplete; // The user set-up is complete as of the last time the task activity // was changed. /** Can't be put in lockTask mode. */ final static int LOCK_TASK_AUTH_DONT_LOCK = 0; /** Can enter app pinning with user approval. Can never start over existing lockTask task. */ final static int LOCK_TASK_AUTH_PINNABLE = 1; /** Starts in LOCK_TASK_MODE_LOCKED automatically. Can start over existing lockTask task. */ final static int LOCK_TASK_AUTH_LAUNCHABLE = 2; /** Can enter lockTask without user approval. Can start over existing lockTask task. */ final static int LOCK_TASK_AUTH_ALLOWLISTED = 3; /** Priv-app that starts in LOCK_TASK_MODE_LOCKED automatically. Can start over existing * lockTask task. */ final static int LOCK_TASK_AUTH_LAUNCHABLE_PRIV = 4; int mLockTaskAuth = LOCK_TASK_AUTH_PINNABLE; int mLockTaskUid = -1; // The uid of the application that called startLockTask(). Loading Loading @@ -1941,32 +1931,7 @@ class Task extends WindowContainer<WindowContainer> { } private void setLockTaskAuth(@Nullable ActivityRecord r) { if (r == null) { mLockTaskAuth = LOCK_TASK_AUTH_PINNABLE; return; } final String pkg = (realActivity != null) ? realActivity.getPackageName() : null; final LockTaskController lockTaskController = mAtmService.getLockTaskController(); switch (r.lockTaskLaunchMode) { case LOCK_TASK_LAUNCH_MODE_DEFAULT: mLockTaskAuth = lockTaskController.isPackageAllowlisted(mUserId, pkg) ? LOCK_TASK_AUTH_ALLOWLISTED : LOCK_TASK_AUTH_PINNABLE; break; case LOCK_TASK_LAUNCH_MODE_NEVER: mLockTaskAuth = LOCK_TASK_AUTH_DONT_LOCK; break; case LOCK_TASK_LAUNCH_MODE_ALWAYS: mLockTaskAuth = LOCK_TASK_AUTH_LAUNCHABLE_PRIV; break; case LOCK_TASK_LAUNCH_MODE_IF_ALLOWLISTED: mLockTaskAuth = lockTaskController.isPackageAllowlisted(mUserId, pkg) ? LOCK_TASK_AUTH_LAUNCHABLE : LOCK_TASK_AUTH_PINNABLE; break; } mLockTaskAuth = mAtmService.getLockTaskController().getLockTaskAuth(r, this); ProtoLog.d(WM_DEBUG_LOCKTASK, "setLockTaskAuth: task=%s mLockTaskAuth=%s", this, lockTaskAuthToString()); } Loading
services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java +41 −39 Original line number Diff line number Diff line Loading @@ -50,6 +50,11 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.reset; import static com.android.dx.mockito.inline.extended.ExtendedMockito.times; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.dx.mockito.inline.extended.ExtendedMockito.when; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_ALLOWLISTED; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_DONT_LOCK; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_PINNABLE; import static com.android.server.wm.LockTaskController.STATUS_BAR_MASK_LOCKED; import static com.android.server.wm.LockTaskController.STATUS_BAR_MASK_PINNED; Loading Loading @@ -169,7 +174,7 @@ public class LockTaskControllerTest { @Test public void testStartLockTaskMode_once() throws Exception { // GIVEN a task record with allowlisted auth Task tr = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr = getTask(LOCK_TASK_AUTH_ALLOWLISTED); // WHEN calling setLockTaskMode for LOCKED mode without resuming mLockTaskController.startLockTaskMode(tr, false, TEST_UID); Loading @@ -186,8 +191,8 @@ public class LockTaskControllerTest { @Test public void testStartLockTaskMode_twice() throws Exception { // GIVEN two task records with allowlisted auth Task tr1 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr2 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr1 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); Task tr2 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); // WHEN calling setLockTaskMode for LOCKED mode on both tasks mLockTaskController.startLockTaskMode(tr1, false, TEST_UID); Loading @@ -206,7 +211,7 @@ public class LockTaskControllerTest { @Test public void testStartLockTaskMode_pinningRequest() { // GIVEN a task record that is not allowlisted, i.e. with pinned auth Task tr = getTask(Task.LOCK_TASK_AUTH_PINNABLE); Task tr = getTask(LOCK_TASK_AUTH_PINNABLE); // WHEN calling startLockTaskMode mLockTaskController.startLockTaskMode(tr, false, TEST_UID); Loading @@ -218,7 +223,7 @@ public class LockTaskControllerTest { @Test public void testStartLockTaskMode_pinnedBySystem() throws Exception { // GIVEN a task record with pinned auth Task tr = getTask(Task.LOCK_TASK_AUTH_PINNABLE); Task tr = getTask(LOCK_TASK_AUTH_PINNABLE); // WHEN the system calls startLockTaskMode mLockTaskController.startLockTaskMode(tr, true, SYSTEM_UID); Loading @@ -237,41 +242,39 @@ public class LockTaskControllerTest { @Test public void testLockTaskViolation() { // GIVEN one task record with allowlisted auth that is in lock task mode Task tr = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr, false, TEST_UID); // THEN it's not a lock task violation to try and launch this task without clearing assertFalse(mLockTaskController.isLockTaskModeViolation(tr, false)); // THEN it's a lock task violation to launch another task that is not allowlisted assertTrue(mLockTaskController.isLockTaskModeViolation(getTask( Task.LOCK_TASK_AUTH_PINNABLE))); assertTrue(mLockTaskController.isLockTaskModeViolation(getTask(LOCK_TASK_AUTH_PINNABLE))); // THEN it's a lock task violation to launch another task that is disallowed from lock task assertTrue(mLockTaskController.isLockTaskModeViolation(getTask( Task.LOCK_TASK_AUTH_DONT_LOCK))); assertTrue(mLockTaskController.isLockTaskModeViolation(getTask(LOCK_TASK_AUTH_DONT_LOCK))); // THEN it's no a lock task violation to launch another task that is allowlisted assertFalse(mLockTaskController.isLockTaskModeViolation(getTask( Task.LOCK_TASK_AUTH_ALLOWLISTED))); LOCK_TASK_AUTH_ALLOWLISTED))); assertFalse(mLockTaskController.isLockTaskModeViolation(getTask( Task.LOCK_TASK_AUTH_LAUNCHABLE))); LOCK_TASK_AUTH_LAUNCHABLE))); // THEN it's not a lock task violation to launch another task that is priv launchable assertFalse(mLockTaskController.isLockTaskModeViolation(getTask( Task.LOCK_TASK_AUTH_LAUNCHABLE_PRIV))); LOCK_TASK_AUTH_LAUNCHABLE_PRIV))); } @Test public void testLockTaskViolation_emergencyCall() { // GIVEN one task record with allowlisted auth that is in lock task mode Task tr = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr, false, TEST_UID); // GIVEN tasks necessary for emergency calling Task keypad = getTask(new Intent().setComponent(EMERGENCY_DIALER_COMPONENT), Task.LOCK_TASK_AUTH_PINNABLE); LOCK_TASK_AUTH_PINNABLE); Task callAction = getTask(new Intent(Intent.ACTION_CALL_EMERGENCY), Task.LOCK_TASK_AUTH_PINNABLE); Task dialer = getTask("com.example.dialer", Task.LOCK_TASK_AUTH_PINNABLE); LOCK_TASK_AUTH_PINNABLE); Task dialer = getTask("com.example.dialer", LOCK_TASK_AUTH_PINNABLE); when(mTelecomManager.getSystemDialerPackage()) .thenReturn(dialer.intent.getComponent().getPackageName()); Loading @@ -295,7 +298,7 @@ public class LockTaskControllerTest { @Test public void testStopLockTaskMode() throws Exception { // GIVEN one task record with allowlisted auth that is in lock task mode Task tr = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr, false, TEST_UID); // WHEN the same caller calls stopLockTaskMode Loading @@ -312,7 +315,7 @@ public class LockTaskControllerTest { @Test(expected = SecurityException.class) public void testStopLockTaskMode_differentCaller() { // GIVEN one task record with allowlisted auth that is in lock task mode Task tr = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr, false, TEST_UID); // WHEN a different caller calls stopLockTaskMode Loading @@ -324,7 +327,7 @@ public class LockTaskControllerTest { @Test public void testStopLockTaskMode_systemCaller() { // GIVEN one task record with allowlisted auth that is in lock task mode Task tr = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr, false, TEST_UID); // WHEN system calls stopLockTaskMode Loading @@ -337,8 +340,8 @@ public class LockTaskControllerTest { @Test public void testStopLockTaskMode_twoTasks() throws Exception { // GIVEN two task records with allowlisted auth that is in lock task mode Task tr1 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr2 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr1 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); Task tr2 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr1, false, TEST_UID); mLockTaskController.startLockTaskMode(tr2, false, TEST_UID); Loading @@ -358,8 +361,8 @@ public class LockTaskControllerTest { @Test public void testStopLockTaskMode_rootTask() throws Exception { // GIVEN two task records with allowlisted auth that is in lock task mode Task tr1 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr2 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr1 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); Task tr2 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr1, false, TEST_UID); mLockTaskController.startLockTaskMode(tr2, false, TEST_UID); Loading @@ -379,7 +382,7 @@ public class LockTaskControllerTest { @Test public void testStopLockTaskMode_pinned() throws Exception { // GIVEN one task records that is in pinned mode Task tr = getTask(Task.LOCK_TASK_AUTH_PINNABLE); Task tr = getTask(LOCK_TASK_AUTH_PINNABLE); mLockTaskController.startLockTaskMode(tr, true, SYSTEM_UID); // GIVEN that the keyguard is required to show after unlocking Settings.Secure.putInt(mContext.getContentResolver(), Loading @@ -406,8 +409,8 @@ public class LockTaskControllerTest { @Test public void testClearLockedTasks() throws Exception { // GIVEN two task records with allowlisted auth that is in lock task mode Task tr1 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr2 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr1 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); Task tr2 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr1, false, TEST_UID); mLockTaskController.startLockTaskMode(tr2, false, TEST_UID); Loading @@ -434,7 +437,7 @@ public class LockTaskControllerTest { .thenReturn(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED); // AND there is a task record Task tr1 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr1 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr1, true, TEST_UID); // WHEN calling clearLockedTasks on the root task Loading @@ -454,7 +457,7 @@ public class LockTaskControllerTest { .thenReturn(true); // AND there is a task record Task tr1 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr1 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr1, true, TEST_UID); // WHEN calling clearLockedTasks on the root task Loading @@ -471,7 +474,7 @@ public class LockTaskControllerTest { Settings.Secure.LOCK_TO_APP_EXIT_LOCKED, 1, mContext.getUserId()); // AND there is a task record Task tr1 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr1 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr1, true, TEST_UID); // WHEN calling clearLockedTasks on the root task Loading @@ -488,7 +491,7 @@ public class LockTaskControllerTest { Settings.Secure.LOCK_TO_APP_EXIT_LOCKED, 0, mContext.getUserId()); // AND there is a task record Task tr1 = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr1 = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr1, true, TEST_UID); // WHEN calling clearLockedTasks on the root task Loading Loading @@ -574,7 +577,7 @@ public class LockTaskControllerTest { @Test public void testUpdateLockTaskFeatures() throws Exception { // GIVEN a locked task Task tr = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr, false, TEST_UID); // THEN lock task mode should be started with default status bar masks Loading Loading @@ -616,7 +619,7 @@ public class LockTaskControllerTest { @Test public void testUpdateLockTaskFeatures_differentUser() throws Exception { // GIVEN a locked task Task tr = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr, false, TEST_UID); // THEN lock task mode should be started with default status bar masks Loading @@ -638,7 +641,7 @@ public class LockTaskControllerTest { @Test public void testUpdateLockTaskFeatures_keyguard() { // GIVEN a locked task Task tr = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr, false, TEST_UID); // THEN keyguard should be disabled Loading Loading @@ -704,7 +707,7 @@ public class LockTaskControllerTest { TEST_USER_ID, TEST_PACKAGE_NAME, LOCK_TASK_LAUNCH_MODE_DEFAULT)); // Start lock task mode Task tr = getTask(Task.LOCK_TASK_AUTH_ALLOWLISTED); Task tr = getTask(LOCK_TASK_AUTH_ALLOWLISTED); mLockTaskController.startLockTaskMode(tr, false, TEST_UID); // WHEN LOCK_TASK_FEATURE_BLOCK_ACTIVITY_START_IN_TASK is not enabled Loading Loading @@ -758,14 +761,13 @@ public class LockTaskControllerTest { * @param isAppAware {@code true} if the app has marked if allowlisted in its manifest */ private Task getTaskForUpdate(String pkg, boolean isAppAware) { final int authIfAllowlisted = isAppAware ? Task.LOCK_TASK_AUTH_LAUNCHABLE : Task.LOCK_TASK_AUTH_ALLOWLISTED; final int authIfAllowlisted = isAppAware ? LOCK_TASK_AUTH_LAUNCHABLE : LOCK_TASK_AUTH_ALLOWLISTED; Task tr = getTask(pkg, authIfAllowlisted); doAnswer((invocation) -> { boolean isAllowlisted = mLockTaskController.isPackageAllowlisted(TEST_USER_ID, pkg); tr.mLockTaskAuth = isAllowlisted ? authIfAllowlisted : Task.LOCK_TASK_AUTH_PINNABLE; tr.mLockTaskAuth = isAllowlisted ? authIfAllowlisted : LOCK_TASK_AUTH_PINNABLE; return null; }).when(tr).setLockTaskAuth(); return tr; Loading