From 69b3a3cd046265165699cce5ba7919dad82f95dc Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Wed, 14 Apr 2021 14:56:11 +0800 Subject: [PATCH] Detects all activities for whether showing work challenge Work challenge did not show when a work activity is not on top, but still visible after screen turns on. Also show work challenge even if the work activity is behind a top fullscreen activity of another profile because the user can still navigate back to the work activity when top activity finishes. Bug: 177457096 Test: RootActivityContainerTests Change-Id: I5e09b09be547d04fdfd709cb9cd4bcd4a94bbf21 Merged-In: I5e09b09be547d04fdfd709cb9cd4bcd4a94bbf21 --- .../server/wm/RootActivityContainer.java | 35 +++++-------------- .../server/wm/RootActivityContainerTests.java | 20 +++++++++++ 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/services/core/java/com/android/server/wm/RootActivityContainer.java b/services/core/java/com/android/server/wm/RootActivityContainer.java index 3ec461d065ffa..e785d8f45964c 100644 --- a/services/core/java/com/android/server/wm/RootActivityContainer.java +++ b/services/core/java/com/android/server/wm/RootActivityContainer.java @@ -2111,13 +2111,14 @@ class RootActivityContainer extends ConfigurationContainer final List tasks = stack.getAllTasks(); for (int taskNdx = tasks.size() - 1; taskNdx >= 0; taskNdx--) { final TaskRecord task = tasks.get(taskNdx); - - // Check the task for a top activity belonging to userId, or returning a - // result to an activity belonging to userId. Example case: a document - // picker for personal files, opened by a work app, should still get locked. - if (taskTopActivityIsUser(task, userId)) { - mService.getTaskChangeNotificationController().notifyTaskProfileLocked( - task.taskId, userId); + for (int activityNdx = task.mActivities.size() - 1; activityNdx >= 0; + activityNdx--) { + final ActivityRecord activity = task.mActivities.get(activityNdx); + if (!activity.finishing && activity.mUserId == userId) { + mService.getTaskChangeNotificationController() + .notifyTaskProfileLocked(task.taskId, userId); + break; + } } } } @@ -2127,26 +2128,6 @@ class RootActivityContainer extends ConfigurationContainer } } - /** - * Detects whether we should show a lock screen in front of this task for a locked user. - *

- * We'll do this if either of the following holds: - *

- * - * @return {@code true} if the top activity looks like it belongs to {@param userId}. - */ - private boolean taskTopActivityIsUser(TaskRecord task, @UserIdInt int userId) { - // To handle the case that work app is in the task but just is not the top one. - final ActivityRecord activityRecord = task.getTopActivity(); - final ActivityRecord resultTo = (activityRecord != null ? activityRecord.resultTo : null); - - return (activityRecord != null && activityRecord.mUserId == userId) - || (resultTo != null && resultTo.mUserId == userId); - } - void cancelInitializingActivities() { for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { final ActivityDisplay display = mActivityDisplays.get(displayNdx); diff --git a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java index 8d2c3dd805382..4e018c8624a2c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java @@ -59,6 +59,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.graphics.Rect; +import android.os.UserHandle; import android.platform.test.annotations.Presubmit; import android.util.Pair; @@ -816,6 +817,25 @@ public class RootActivityContainerTests extends ActivityTestsBase { assertEquals(infoFake1.activityInfo.name, resolvedInfo.first.name); } + @Test + public void testLockAllProfileTasks() { + // Make an activity visible with the user id set to 1 + final TaskRecord task = new TaskBuilder(mSupervisor).setStack(mFullscreenStack).build(); + final ActivityRecord activity = new ActivityBuilder(mService).setTask(task) + .setUid(UserHandle.PER_USER_RANGE + 1).build(); + + // Create another activity on top and the user id is 2 + final ActivityRecord topActivity = new ActivityBuilder(mService) + .setTask(task).setUid(UserHandle.PER_USER_RANGE + 2).build(); + + // Make sure the listeners will be notified for putting the task to locked state + TaskChangeNotificationController controller = + mService.getTaskChangeNotificationController(); + spyOn(controller); + mService.mRootActivityContainer.lockAllProfileTasks(1); + verify(controller).notifyTaskProfileLocked(eq(task.taskId), eq(1)); + } + /** * Mock {@link RootActivityContainerTests#resolveHomeActivity} for returning consistent activity * info for test cases (the original implementation will resolve from the real package manager).