Fix bug with drag-to-split involving work profiles

This patch fixes a bug where the user would unexpectedly create a split with the work profile version of an app when intending to split with the personal profile version.

The bug occurred because RecentTasksController#findTaskInBackground only checked for ComponentName equality, not for userId equality. So when dragging to split, it would accidentally find the background (work) version of the task instead of creating a new (personal) one.

Fixed by adding a check for userId equality.

Fixes: 283021596
Test: Manual
Change-Id: I128f93267af57a74f5a6237d4ad3b841ca194499
This commit is contained in:
Jeremy Sim
2023-05-19 15:56:47 -07:00
parent 3376f68636
commit beafcf1562
3 changed files with 6 additions and 5 deletions

View File

@@ -371,7 +371,8 @@ public class RecentTasksController implements TaskStackListenerCallback,
* Find the background task that match the given component.
*/
@Nullable
public ActivityManager.RecentTaskInfo findTaskInBackground(ComponentName componentName) {
public ActivityManager.RecentTaskInfo findTaskInBackground(ComponentName componentName,
int userId) {
if (componentName == null) {
return null;
}
@@ -383,7 +384,7 @@ public class RecentTasksController implements TaskStackListenerCallback,
if (task.isVisible) {
continue;
}
if (componentName.equals(task.baseIntent.getComponent())) {
if (componentName.equals(task.baseIntent.getComponent()) && userId == task.userId) {
return task;
}
}

View File

@@ -723,7 +723,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
// in the background with priority.
final ActivityManager.RecentTaskInfo taskInfo = mRecentTasksOptional
.map(recentTasks -> recentTasks.findTaskInBackground(
intent.getIntent().getComponent()))
intent.getIntent().getComponent(), userId1))
.orElse(null);
if (taskInfo != null) {
startTask(taskInfo.taskId, position, options);

View File

@@ -223,7 +223,7 @@ public class SplitScreenControllerTests extends ShellTestCase {
doReturn(topRunningTask).when(mRecentTasks).getTopRunningTask();
// Put the same component into a task in the background
ActivityManager.RecentTaskInfo sameTaskInfo = new ActivityManager.RecentTaskInfo();
doReturn(sameTaskInfo).when(mRecentTasks).findTaskInBackground(any());
doReturn(sameTaskInfo).when(mRecentTasks).findTaskInBackground(any(), anyInt());
mSplitScreenController.startIntent(pendingIntent, mContext.getUserId(), null,
SPLIT_POSITION_TOP_OR_LEFT, null);
@@ -247,7 +247,7 @@ public class SplitScreenControllerTests extends ShellTestCase {
SPLIT_POSITION_BOTTOM_OR_RIGHT);
// Put the same component into a task in the background
doReturn(new ActivityManager.RecentTaskInfo()).when(mRecentTasks)
.findTaskInBackground(any());
.findTaskInBackground(any(), anyInt());
mSplitScreenController.startIntent(pendingIntent, mContext.getUserId(), null,
SPLIT_POSITION_TOP_OR_LEFT, null);