Avoid locking profile task when it is already lock

WorkLockActivity was started repeatedly on top of the
task that contains work apps when turning screen on
and off over and over. So, lots of the WorkLockActivity
instances were created and added in the task, which
caused system sluggish.

Bug: 177457096
Test: manually test work challenges
Test: RootWindowContainerTests
Change-Id: Iac345471ef3badad6b9e5c0cc2873c60938663eb
Merged-In: Iac345471ef3badad6b9e5c0cc2873c60938663eb
(cherry picked from commit 805585ed1baa0ddeeab07aa1f77819333a73c93d)
(cherry picked from commit db7d06c52903b8dccb7e8d9976a23c366430a42e)
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index ddad1db..1c1360f 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -17,6 +17,7 @@
 package com.android.server.wm;
 
 import static android.app.ActivityTaskManager.INVALID_TASK_ID;
+import static android.app.KeyguardManager.ACTION_CONFIRM_DEVICE_CREDENTIAL_WITH_USER;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
@@ -3381,6 +3382,15 @@
         mService.deferWindowLayout();
         try {
             forAllLeafTasks(task -> {
+                final ActivityRecord top = task.topRunningActivity();
+                if (top != null && !top.finishing
+                        && ACTION_CONFIRM_DEVICE_CREDENTIAL_WITH_USER.equals(top.intent.getAction())
+                        && top.packageName.equals(
+                                mService.getSysUiServiceComponentLocked().getPackageName())) {
+                    // Do nothing since the task is already secure by sysui.
+                    return;
+                }
+
                 if (task.getActivity(activity -> !activity.finishing && activity.mUserId == userId)
                         != null) {
                     mService.getTaskChangeNotificationController().notifyTaskProfileLocked(
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
index 1aff8a7..e5c5bf5 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
@@ -16,6 +16,7 @@
 
 package com.android.server.wm;
 
+import static android.app.KeyguardManager.ACTION_CONFIRM_DEVICE_CREDENTIAL_WITH_USER;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.view.Display.DEFAULT_DISPLAY;
@@ -25,6 +26,7 @@
 import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
 import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
 
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
 import static com.android.server.wm.ActivityStack.ActivityState.FINISHING;
 import static com.android.server.wm.ActivityStack.ActivityState.PAUSED;
@@ -37,11 +39,15 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 
 import android.app.WindowConfiguration;
 import android.content.ComponentName;
+import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.os.UserHandle;
 import android.platform.test.annotations.Presubmit;
@@ -194,6 +200,8 @@
                 .setUid(UserHandle.PER_USER_RANGE + 1)
                 .setTask(task)
                 .build();
+        doReturn(true).when(topActivity).okToShowLocked();
+        topActivity.intent.setAction(Intent.ACTION_MAIN);
 
         // Make sure the listeners will be notified for putting the task to locked state
         TaskChangeNotificationController controller =
@@ -201,6 +209,23 @@
         spyOn(controller);
         mWm.mRoot.lockAllProfileTasks(0);
         verify(controller).notifyTaskProfileLocked(eq(task.mTaskId), eq(0));
+
+        // Create the work lock activity on top of the task
+        final ActivityRecord workLockActivity =
+                new ActivityTestsBase.ActivityBuilder(mWm.mAtmService)
+                        .setStack(stack)
+                        .setUid(UserHandle.PER_USER_RANGE + 1)
+                        .setTask(task)
+                        .build();
+        doReturn(true).when(workLockActivity).okToShowLocked();
+        workLockActivity.intent.setAction(ACTION_CONFIRM_DEVICE_CREDENTIAL_WITH_USER);
+        doReturn(workLockActivity.mActivityComponent).when(
+                mWm.mAtmService).getSysUiServiceComponentLocked();
+
+        // Make sure the listener won't be notified again.
+        clearInvocations(controller);
+        mWm.mRoot.lockAllProfileTasks(0);
+        verify(controller, never()).notifyTaskProfileLocked(eq(task.mTaskId), anyInt());
     }
 }