From b3aa96f89f61adcdeba4b95ee9e0ee43c57e36ba Mon Sep 17 00:00:00 2001 From: Alex Johnston Date: Thu, 12 May 2022 18:11:50 +0100 Subject: [PATCH] Add background protection when work biometrics is shown * Remove existing coloured background. * Add a background with a layout that includes a badged icon of the app being opened. Manual testing steps: * Set up device with a work profile using TestDPC * Set a fingerprint in the work profile * Open a work app * Lock the device * Verify the background protection is shown behind the biometric prompt Screenshots: * Dark mode: https://screenshot.googleplex.com/3SwGWrBREYoZFaH * Light mode: https://screenshot.googleplex.com/8bzX9wLoFGJ2ado Bug: 206761107 Test: Manual testing WorkLockActivityControllerTest TaskStackListenerImplTest Change-Id: I90d117a97d7457a3186953c16db8bd0bbac048ed --- core/java/android/app/ITaskStackListener.aidl | 2 +- core/java/android/app/TaskStackListener.java | 2 +- .../common/TaskStackListenerCallback.java | 2 +- .../shell/common/TaskStackListenerImpl.java | 8 ++- .../common/TaskStackListenerImplTest.java | 7 +- packages/SystemUI/AndroidManifest.xml | 2 +- .../res/layout/auth_biometric_background.xml | 30 ++++++++ .../system/TaskStackChangeListener.java | 2 +- .../system/TaskStackChangeListeners.java | 7 +- .../systemui/keyguard/WorkLockActivity.java | 68 +++++++++---------- .../keyguard/WorkLockActivityController.java | 23 +++---- .../WorkLockActivityControllerTest.java | 11 ++- .../keyguard/WorkLockActivityTest.java | 66 +++++++----------- .../server/wm/RootWindowContainer.java | 2 +- .../wm/TaskChangeNotificationController.java | 8 +-- .../server/wm/RootWindowContainerTests.java | 4 +- 16 files changed, 129 insertions(+), 115 deletions(-) create mode 100644 packages/SystemUI/res/layout/auth_biometric_background.xml diff --git a/core/java/android/app/ITaskStackListener.aidl b/core/java/android/app/ITaskStackListener.aidl index 7bb5d9a8d3877..36e57620c9dd3 100644 --- a/core/java/android/app/ITaskStackListener.aidl +++ b/core/java/android/app/ITaskStackListener.aidl @@ -137,7 +137,7 @@ oneway interface ITaskStackListener { * activities inside it belong to a managed profile user, and that user has just * been locked. */ - void onTaskProfileLocked(int taskId, int userId); + void onTaskProfileLocked(in ActivityManager.RunningTaskInfo taskInfo); /** * Called when a task snapshot got updated. diff --git a/core/java/android/app/TaskStackListener.java b/core/java/android/app/TaskStackListener.java index 83fe29fa2ba67..774bc06e1adbe 100644 --- a/core/java/android/app/TaskStackListener.java +++ b/core/java/android/app/TaskStackListener.java @@ -155,7 +155,7 @@ public abstract class TaskStackListener extends ITaskStackListener.Stub { @Override @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) - public void onTaskProfileLocked(int taskId, int userId) throws RemoteException { + public void onTaskProfileLocked(RunningTaskInfo taskInfo) throws RemoteException { } @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/TaskStackListenerCallback.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/TaskStackListenerCallback.java index 59374a6069c8b..b9ddd3650b86a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/TaskStackListenerCallback.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/TaskStackListenerCallback.java @@ -38,7 +38,7 @@ public interface TaskStackListenerCallback { default void onTaskStackChanged() { } - default void onTaskProfileLocked(int taskId, int userId) { } + default void onTaskProfileLocked(RunningTaskInfo taskInfo) { } default void onTaskDisplayChanged(int taskId, int newDisplayId) { } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/TaskStackListenerImpl.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/TaskStackListenerImpl.java index 3b670057cb1a1..85e2654e4ebe7 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/TaskStackListenerImpl.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/TaskStackListenerImpl.java @@ -150,8 +150,8 @@ public class TaskStackListenerImpl extends TaskStackListener implements Handler. } @Override - public void onTaskProfileLocked(int taskId, int userId) { - mMainHandler.obtainMessage(ON_TASK_PROFILE_LOCKED, taskId, userId).sendToTarget(); + public void onTaskProfileLocked(ActivityManager.RunningTaskInfo taskInfo) { + mMainHandler.obtainMessage(ON_TASK_PROFILE_LOCKED, taskInfo).sendToTarget(); } @Override @@ -341,8 +341,10 @@ public class TaskStackListenerImpl extends TaskStackListener implements Handler. break; } case ON_TASK_PROFILE_LOCKED: { + final ActivityManager.RunningTaskInfo + info = (ActivityManager.RunningTaskInfo) msg.obj; for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) { - mTaskStackListeners.get(i).onTaskProfileLocked(msg.arg1, msg.arg2); + mTaskStackListeners.get(i).onTaskProfileLocked(info); } break; } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/TaskStackListenerImplTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/TaskStackListenerImplTest.java index d8aebc284bf1e..96938ebc27df9 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/TaskStackListenerImplTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/TaskStackListenerImplTest.java @@ -109,9 +109,10 @@ public class TaskStackListenerImplTest { @Test public void testOnTaskProfileLocked() { - mImpl.onTaskProfileLocked(1, 2); - verify(mCallback).onTaskProfileLocked(eq(1), eq(2)); - verify(mOtherCallback).onTaskProfileLocked(eq(1), eq(2)); + ActivityManager.RunningTaskInfo info = mock(ActivityManager.RunningTaskInfo.class); + mImpl.onTaskProfileLocked(info); + verify(mCallback).onTaskProfileLocked(eq(info)); + verify(mOtherCallback).onTaskProfileLocked(eq(info)); } @Test diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 4d0888ab8d2de..5dd1b09b06a2a 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -723,7 +723,7 @@ android:excludeFromRecents="true" android:stateNotNeeded="true" android:resumeWhilePausing="true" - android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"> + android:theme="@style/Theme.AppCompat.DayNight.NoActionBar"> diff --git a/packages/SystemUI/res/layout/auth_biometric_background.xml b/packages/SystemUI/res/layout/auth_biometric_background.xml new file mode 100644 index 0000000000000..7ce81ad7f01bd --- /dev/null +++ b/packages/SystemUI/res/layout/auth_biometric_background.xml @@ -0,0 +1,30 @@ + + + + + + + diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java index f65d82a5d6d2a..acd42228f4e2f 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java @@ -61,7 +61,7 @@ public interface TaskStackChangeListener { onActivityLaunchOnSecondaryDisplayRerouted(); } - default void onTaskProfileLocked(int taskId, int userId) { } + default void onTaskProfileLocked(RunningTaskInfo taskInfo) { } default void onTaskCreated(int taskId, ComponentName componentName) { } default void onTaskRemoved(int taskId) { } default void onTaskMovedToFront(int taskId) { } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java index b5019b426ad52..2fd5aaefa34b7 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java @@ -211,8 +211,8 @@ public class TaskStackChangeListeners { } @Override - public void onTaskProfileLocked(int taskId, int userId) { - mHandler.obtainMessage(ON_TASK_PROFILE_LOCKED, taskId, userId).sendToTarget(); + public void onTaskProfileLocked(RunningTaskInfo taskInfo) { + mHandler.obtainMessage(ON_TASK_PROFILE_LOCKED, taskInfo).sendToTarget(); } @Override @@ -357,8 +357,9 @@ public class TaskStackChangeListeners { break; } case ON_TASK_PROFILE_LOCKED: { + final RunningTaskInfo info = (RunningTaskInfo) msg.obj; for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) { - mTaskStackListeners.get(i).onTaskProfileLocked(msg.arg1, msg.arg2); + mTaskStackListeners.get(i).onTaskProfileLocked(info); } break; } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivity.java b/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivity.java index e6b650b20711b..546a4093ec7d3 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivity.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivity.java @@ -17,23 +17,22 @@ package com.android.systemui.keyguard; import static android.app.ActivityManager.TaskDescription; -import static android.app.admin.DevicePolicyResources.Strings.SystemUi.WORK_LOCK_ACCESSIBILITY; -import android.annotation.ColorInt; import android.annotation.UserIdInt; import android.app.Activity; import android.app.ActivityOptions; import android.app.KeyguardManager; import android.app.PendingIntent; -import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.graphics.Color; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.UserHandle; -import android.view.View; +import android.os.UserManager; +import android.widget.ImageView; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.R; @@ -52,12 +51,6 @@ import javax.inject.Inject; public class WorkLockActivity extends Activity { private static final String TAG = "WorkLockActivity"; - /** - * Contains a {@link TaskDescription} for the activity being covered. - */ - static final String EXTRA_TASK_DESCRIPTION = - "com.android.systemui.keyguard.extra.TASK_DESCRIPTION"; - private static final int REQUEST_CODE_CONFIRM_CREDENTIALS = 1; /** @@ -65,12 +58,17 @@ public class WorkLockActivity extends Activity { * @see KeyguardManager */ private KeyguardManager mKgm; + private UserManager mUserManager; + private PackageManager mPackageManager; private final BroadcastDispatcher mBroadcastDispatcher; @Inject - public WorkLockActivity(BroadcastDispatcher broadcastDispatcher) { + public WorkLockActivity(BroadcastDispatcher broadcastDispatcher, UserManager userManager, + PackageManager packageManager) { super(); mBroadcastDispatcher = broadcastDispatcher; + mUserManager = userManager; + mPackageManager = packageManager; } @Override @@ -91,15 +89,28 @@ public class WorkLockActivity extends Activity { // Draw captions overlaid on the content view, so the whole window is one solid color. setOverlayWithDecorCaptionEnabled(true); - // Blank out the activity. When it is on-screen it will look like a Recents thumbnail with - // redaction switched on. - final DevicePolicyManager dpm = getSystemService(DevicePolicyManager.class); - String contentDescription = dpm.getResources().getString( - WORK_LOCK_ACCESSIBILITY, () -> getString(R.string.accessibility_desc_work_lock)); - final View blankView = new View(this); - blankView.setContentDescription(contentDescription); - blankView.setBackgroundColor(getPrimaryColor()); - setContentView(blankView); + // Add background protection that contains a badged icon of the app being opened. + setContentView(R.layout.auth_biometric_background); + Drawable badgedIcon = getBadgedIcon(); + if (badgedIcon != null) { + ((ImageView) findViewById(R.id.icon)).setImageDrawable(badgedIcon); + } + } + + @VisibleForTesting + protected Drawable getBadgedIcon() { + String packageName = getIntent().getStringExtra(Intent.EXTRA_PACKAGE_NAME); + if (!packageName.isEmpty()) { + try { + return mUserManager.getBadgedIconForUser(mPackageManager.getApplicationIcon( + mPackageManager.getApplicationInfoAsUser(packageName, + PackageManager.ApplicationInfoFlags.of(0), getTargetUserId())), + UserHandle.of(getTargetUserId())); + } catch (PackageManager.NameNotFoundException e) { + // Unable to set the badged icon, show the background protection without an icon. + } + } + return null; } /** @@ -208,19 +219,4 @@ public class WorkLockActivity extends Activity { final int getTargetUserId() { return getIntent().getIntExtra(Intent.EXTRA_USER_ID, UserHandle.myUserId()); } - - @VisibleForTesting - @ColorInt - final int getPrimaryColor() { - final TaskDescription taskDescription = (TaskDescription) - getIntent().getExtra(EXTRA_TASK_DESCRIPTION); - if (taskDescription != null && Color.alpha(taskDescription.getPrimaryColor()) == 255) { - return taskDescription.getPrimaryColor(); - } else { - // No task description. Use an organization color set by the policy controller. - final DevicePolicyManager devicePolicyManager = (DevicePolicyManager) - getSystemService(Context.DEVICE_POLICY_SERVICE); - return devicePolicyManager.getOrganizationColorForUser(getTargetUserId()); - } - } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivityController.java b/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivityController.java index 75851102bc4a1..16817ed4c5fe5 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivityController.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivityController.java @@ -52,22 +52,17 @@ public class WorkLockActivityController { tscl.registerTaskStackListener(mLockListener); } - private void startWorkChallengeInTask(int taskId, int userId) { - ActivityManager.TaskDescription taskDescription = null; - try { - taskDescription = mIatm.getTaskDescription(taskId); - } catch (RemoteException e) { - Log.w(TAG, "Failed to get description for task=" + taskId); - } + private void startWorkChallengeInTask(ActivityManager.RunningTaskInfo info) { + String packageName = info.baseActivity != null ? info.baseActivity.getPackageName() : ""; Intent intent = new Intent(KeyguardManager.ACTION_CONFIRM_DEVICE_CREDENTIAL_WITH_USER) .setComponent(new ComponentName(mContext, WorkLockActivity.class)) - .putExtra(Intent.EXTRA_USER_ID, userId) - .putExtra(WorkLockActivity.EXTRA_TASK_DESCRIPTION, taskDescription) + .putExtra(Intent.EXTRA_USER_ID, info.userId) + .putExtra(Intent.EXTRA_PACKAGE_NAME, packageName) .addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP); final ActivityOptions options = ActivityOptions.makeBasic(); - options.setLaunchTaskId(taskId); + options.setLaunchTaskId(info.taskId); options.setTaskOverlay(true, false /* canResume */); final int result = startActivityAsUser(intent, options.toBundle(), UserHandle.USER_CURRENT); @@ -77,9 +72,9 @@ public class WorkLockActivityController { // Starting the activity inside the task failed. We can't be sure why, so to be // safe just remove the whole task if it still exists. try { - mIatm.removeTask(taskId); + mIatm.removeTask(info.taskId); } catch (RemoteException e) { - Log.w(TAG, "Failed to get description for task=" + taskId); + Log.w(TAG, "Failed to get description for task=" + info.taskId); } } } @@ -112,8 +107,8 @@ public class WorkLockActivityController { private final TaskStackChangeListener mLockListener = new TaskStackChangeListener() { @Override - public void onTaskProfileLocked(int taskId, int userId) { - startWorkChallengeInTask(taskId, userId); + public void onTaskProfileLocked(ActivityManager.RunningTaskInfo info) { + startWorkChallengeInTask(info); } }; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java index cd5740d227c40..e9db8cc205fd7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java @@ -60,6 +60,13 @@ import org.mockito.MockitoAnnotations; public class WorkLockActivityControllerTest extends SysuiTestCase { private static final int USER_ID = 333; private static final int TASK_ID = 444; + private static final ActivityManager.RunningTaskInfo TASK_INFO = + new ActivityManager.RunningTaskInfo(); + + static { + TASK_INFO.userId = USER_ID; + TASK_INFO.taskId = TASK_ID; + } private @Mock Context mContext; private @Mock TaskStackChangeListeners mTaskStackChangeListeners; @@ -91,7 +98,7 @@ public class WorkLockActivityControllerTest extends SysuiTestCase { setActivityStartCode(TASK_ID, true /*taskOverlay*/, ActivityManager.START_SUCCESS); // And the controller receives a message saying the profile is locked, - mTaskStackListener.onTaskProfileLocked(TASK_ID, USER_ID); + mTaskStackListener.onTaskProfileLocked(TASK_INFO); // The overlay should start and the task the activity started in should not be removed. verifyStartActivity(TASK_ID, true /*taskOverlay*/); @@ -104,7 +111,7 @@ public class WorkLockActivityControllerTest extends SysuiTestCase { setActivityStartCode(TASK_ID, true /*taskOverlay*/, ActivityManager.START_CLASS_NOT_FOUND); // And the controller receives a message saying the profile is locked, - mTaskStackListener.onTaskProfileLocked(TASK_ID, USER_ID); + mTaskStackListener.onTaskProfileLocked(TASK_INFO); // The task the activity started in should be removed to prevent the locked task from // being shown. diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java index e4c387a26fd50..640e6dc0461df 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java @@ -16,8 +16,6 @@ package com.android.systemui.keyguard; -import static android.app.ActivityManager.TaskDescription; - import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.eq; @@ -25,14 +23,15 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.annotation.ColorInt; import android.annotation.UserIdInt; -import android.app.KeyguardManager; -import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.Intent; -import android.graphics.Color; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; import android.os.Looper; +import android.os.UserHandle; +import android.os.UserManager; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; @@ -53,18 +52,21 @@ import org.mockito.MockitoAnnotations; @RunWith(AndroidJUnit4.class) public class WorkLockActivityTest extends SysuiTestCase { private static final @UserIdInt int USER_ID = 270; - private static final String TASK_LABEL = "task label"; + private static final String CALLING_PACKAGE_NAME = "com.android.test"; - private @Mock DevicePolicyManager mDevicePolicyManager; - private @Mock KeyguardManager mKeyguardManager; + private @Mock UserManager mUserManager; + private @Mock PackageManager mPackageManager; private @Mock Context mContext; private @Mock BroadcastDispatcher mBroadcastDispatcher; + private @Mock Drawable mDrawable; + private @Mock Drawable mBadgedDrawable; private WorkLockActivity mActivity; private static class WorkLockActivityTestable extends WorkLockActivity { - WorkLockActivityTestable(Context baseContext, BroadcastDispatcher broadcastDispatcher) { - super(broadcastDispatcher); + WorkLockActivityTestable(Context baseContext, BroadcastDispatcher broadcastDispatcher, + UserManager userManager, PackageManager packageManager) { + super(broadcastDispatcher, userManager, packageManager); attachBaseContext(baseContext); } } @@ -73,46 +75,26 @@ public class WorkLockActivityTest extends SysuiTestCase { public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - when(mContext.getSystemService(eq(Context.DEVICE_POLICY_SERVICE))) - .thenReturn(mDevicePolicyManager); - when(mContext.getSystemService(eq(Context.KEYGUARD_SERVICE))) - .thenReturn(mKeyguardManager); - if (Looper.myLooper() == null) { Looper.prepare(); } - mActivity = new WorkLockActivityTestable(mContext, mBroadcastDispatcher); + mActivity = new WorkLockActivityTestable(mContext, mBroadcastDispatcher, mUserManager, + mPackageManager); } @Test - public void testBackgroundAlwaysOpaque() throws Exception { - final @ColorInt int orgColor = Color.rgb(250, 199, 67); - when(mDevicePolicyManager.getOrganizationColorForUser(eq(USER_ID))).thenReturn(orgColor); - - final @ColorInt int opaqueColor= Color.rgb(164, 198, 57); - final @ColorInt int transparentColor = Color.argb(0, 0, 0, 0); - TaskDescription opaque = new TaskDescription(null, null, opaqueColor); - TaskDescription transparent = new TaskDescription(null, null, transparentColor); - - // When a task description is provided with a suitable (opaque) primaryColor, it should be - // used as the scrim's background color. + public void testGetBadgedIcon() throws Exception { + ApplicationInfo info = new ApplicationInfo(); + when(mPackageManager.getApplicationInfoAsUser(eq(CALLING_PACKAGE_NAME), any(), + eq(USER_ID))).thenReturn(info); + when(mPackageManager.getApplicationIcon(eq(info))).thenReturn(mDrawable); + when(mUserManager.getBadgedIconForUser(any(), eq(UserHandle.of(USER_ID)))).thenReturn( + mBadgedDrawable); mActivity.setIntent(new Intent() .putExtra(Intent.EXTRA_USER_ID, USER_ID) - .putExtra(WorkLockActivity.EXTRA_TASK_DESCRIPTION, opaque)); - assertEquals(opaqueColor, mActivity.getPrimaryColor()); + .putExtra(Intent.EXTRA_PACKAGE_NAME, CALLING_PACKAGE_NAME)); - // When a task description is provided but has no primaryColor / the primaryColor is - // transparent, the organization color should be used instead. - mActivity.setIntent(new Intent() - .putExtra(Intent.EXTRA_USER_ID, USER_ID) - .putExtra(WorkLockActivity.EXTRA_TASK_DESCRIPTION, transparent)); - assertEquals(orgColor, mActivity.getPrimaryColor()); - - // When no task description is provided at all, it should be treated like a transparent - // description and the organization color shown instead. - mActivity.setIntent(new Intent() - .putExtra(Intent.EXTRA_USER_ID, USER_ID)); - assertEquals(orgColor, mActivity.getPrimaryColor()); + assertEquals(mBadgedDrawable, mActivity.getBadgedIcon()); } @Test diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 0aab186045286..7240fd5107614 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -3231,7 +3231,7 @@ class RootWindowContainer extends WindowContainer if (task.getActivity(activity -> !activity.finishing && activity.mUserId == userId) != null) { mService.getTaskChangeNotificationController().notifyTaskProfileLocked( - task.mTaskId, userId); + task.getTaskInfo()); } }, true /* traverseTopToBottom */); } diff --git a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java index 61963c48a14c2..49d064f833455 100644 --- a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java +++ b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java @@ -144,7 +144,7 @@ class TaskChangeNotificationController { }; private final TaskStackConsumer mNotifyTaskProfileLocked = (l, m) -> { - l.onTaskProfileLocked(m.arg1, m.arg2); + l.onTaskProfileLocked((RunningTaskInfo) m.obj); }; private final TaskStackConsumer mNotifyTaskSnapshotChanged = (l, m) -> { @@ -467,9 +467,9 @@ class TaskChangeNotificationController { * Notify listeners that the task has been put in a locked state because one or more of the * activities inside it belong to a managed profile user that has been locked. */ - void notifyTaskProfileLocked(int taskId, int userId) { - final Message msg = mHandler.obtainMessage(NOTIFY_TASK_PROFILE_LOCKED_LISTENERS_MSG, taskId, - userId); + void notifyTaskProfileLocked(ActivityManager.RunningTaskInfo taskInfo) { + final Message msg = mHandler.obtainMessage(NOTIFY_TASK_PROFILE_LOCKED_LISTENERS_MSG, + taskInfo); forAllLocalListeners(mNotifyTaskProfileLocked, msg); msg.sendToTarget(); } 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 8ef9ada8995ff..700fadd61c9a6 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java @@ -1097,7 +1097,7 @@ public class RootWindowContainerTests extends WindowTestsBase { TaskChangeNotificationController controller = mAtm.getTaskChangeNotificationController(); spyOn(controller); mWm.mRoot.lockAllProfileTasks(profileUserId); - verify(controller).notifyTaskProfileLocked(eq(task.mTaskId), eq(profileUserId)); + verify(controller).notifyTaskProfileLocked(any()); // Create the work lock activity on top of the task final ActivityRecord workLockActivity = new ActivityBuilder(mAtm).setTask(task).build(); @@ -1107,7 +1107,7 @@ public class RootWindowContainerTests extends WindowTestsBase { // Make sure the listener won't be notified again. clearInvocations(controller); mWm.mRoot.lockAllProfileTasks(profileUserId); - verify(controller, never()).notifyTaskProfileLocked(anyInt(), anyInt()); + verify(controller, never()).notifyTaskProfileLocked(any()); } /**