Merge "Allows splitscreen with work & personal version of the same app" into udc-dev am: 11e4f30b36
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23183679 Change-Id: I47dec6296725eb446e302a764cf62ce4b903e2f6 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -78,8 +78,15 @@ public class SplitScreenUtils {
|
|||||||
return taskInfo != null ? getPackageName(taskInfo.baseIntent) : null;
|
return taskInfo != null ? getPackageName(taskInfo.baseIntent) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns true if they are the same package. */
|
/** Retrieve user id from a taskId */
|
||||||
public static boolean samePackage(String packageName1, String packageName2) {
|
public static int getUserId(int taskId, ShellTaskOrganizer taskOrganizer) {
|
||||||
return packageName1 != null && packageName1.equals(packageName2);
|
final ActivityManager.RunningTaskInfo taskInfo = taskOrganizer.getRunningTaskInfo(taskId);
|
||||||
|
return taskInfo != null ? taskInfo.userId : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns true if package names and user ids match. */
|
||||||
|
public static boolean samePackage(String packageName1, String packageName2,
|
||||||
|
int userId1, int userId2) {
|
||||||
|
return (packageName1 != null && packageName1.equals(packageName2)) && (userId1 == userId2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -266,6 +266,7 @@ public class DragAndDropPolicy {
|
|||||||
final boolean isShortcut = description.hasMimeType(MIMETYPE_APPLICATION_SHORTCUT);
|
final boolean isShortcut = description.hasMimeType(MIMETYPE_APPLICATION_SHORTCUT);
|
||||||
final Bundle opts = intent.hasExtra(EXTRA_ACTIVITY_OPTIONS)
|
final Bundle opts = intent.hasExtra(EXTRA_ACTIVITY_OPTIONS)
|
||||||
? intent.getBundleExtra(EXTRA_ACTIVITY_OPTIONS) : new Bundle();
|
? intent.getBundleExtra(EXTRA_ACTIVITY_OPTIONS) : new Bundle();
|
||||||
|
final UserHandle user = intent.getParcelableExtra(EXTRA_USER);
|
||||||
|
|
||||||
if (isTask) {
|
if (isTask) {
|
||||||
final int taskId = intent.getIntExtra(EXTRA_TASK_ID, INVALID_TASK_ID);
|
final int taskId = intent.getIntExtra(EXTRA_TASK_ID, INVALID_TASK_ID);
|
||||||
@@ -273,14 +274,14 @@ public class DragAndDropPolicy {
|
|||||||
} else if (isShortcut) {
|
} else if (isShortcut) {
|
||||||
final String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME);
|
final String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME);
|
||||||
final String id = intent.getStringExtra(EXTRA_SHORTCUT_ID);
|
final String id = intent.getStringExtra(EXTRA_SHORTCUT_ID);
|
||||||
final UserHandle user = intent.getParcelableExtra(EXTRA_USER);
|
|
||||||
mStarter.startShortcut(packageName, id, position, opts, user);
|
mStarter.startShortcut(packageName, id, position, opts, user);
|
||||||
} else {
|
} else {
|
||||||
final PendingIntent launchIntent = intent.getParcelableExtra(EXTRA_PENDING_INTENT);
|
final PendingIntent launchIntent = intent.getParcelableExtra(EXTRA_PENDING_INTENT);
|
||||||
// Put BAL flags to avoid activity start aborted.
|
// Put BAL flags to avoid activity start aborted.
|
||||||
opts.putBoolean(KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED, true);
|
opts.putBoolean(KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED, true);
|
||||||
opts.putBoolean(KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED_BY_PERMISSION, true);
|
opts.putBoolean(KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED_BY_PERMISSION, true);
|
||||||
mStarter.startIntent(launchIntent, null /* fillIntent */, position, opts);
|
mStarter.startIntent(launchIntent, user.getIdentifier(), null /* fillIntent */,
|
||||||
|
position, opts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -334,8 +335,8 @@ public class DragAndDropPolicy {
|
|||||||
void startTask(int taskId, @SplitPosition int position, @Nullable Bundle options);
|
void startTask(int taskId, @SplitPosition int position, @Nullable Bundle options);
|
||||||
void startShortcut(String packageName, String shortcutId, @SplitPosition int position,
|
void startShortcut(String packageName, String shortcutId, @SplitPosition int position,
|
||||||
@Nullable Bundle options, UserHandle user);
|
@Nullable Bundle options, UserHandle user);
|
||||||
void startIntent(PendingIntent intent, Intent fillInIntent, @SplitPosition int position,
|
void startIntent(PendingIntent intent, int userId, Intent fillInIntent,
|
||||||
@Nullable Bundle options);
|
@SplitPosition int position, @Nullable Bundle options);
|
||||||
void enterSplitScreen(int taskId, boolean leftOrTop);
|
void enterSplitScreen(int taskId, boolean leftOrTop);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -379,8 +380,8 @@ public class DragAndDropPolicy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startIntent(PendingIntent intent, @Nullable Intent fillInIntent, int position,
|
public void startIntent(PendingIntent intent, int userId, @Nullable Intent fillInIntent,
|
||||||
@Nullable Bundle options) {
|
int position, @Nullable Bundle options) {
|
||||||
try {
|
try {
|
||||||
intent.send(mContext, 0, fillInIntent, null, null, null, options);
|
intent.send(mContext, 0, fillInIntent, null, null, null, options);
|
||||||
} catch (PendingIntent.CanceledException e) {
|
} catch (PendingIntent.CanceledException e) {
|
||||||
|
|||||||
@@ -73,8 +73,8 @@ interface ISplitScreen {
|
|||||||
/**
|
/**
|
||||||
* Starts an activity in a stage.
|
* Starts an activity in a stage.
|
||||||
*/
|
*/
|
||||||
oneway void startIntent(in PendingIntent intent, in Intent fillInIntent, int position,
|
oneway void startIntent(in PendingIntent intent, int userId, in Intent fillInIntent,
|
||||||
in Bundle options, in InstanceId instanceId) = 9;
|
int position, in Bundle options, in InstanceId instanceId) = 9;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Starts tasks simultaneously in one transition.
|
* Starts tasks simultaneously in one transition.
|
||||||
@@ -86,8 +86,8 @@ interface ISplitScreen {
|
|||||||
/**
|
/**
|
||||||
* Starts a pair of intent and task in one transition.
|
* Starts a pair of intent and task in one transition.
|
||||||
*/
|
*/
|
||||||
oneway void startIntentAndTask(in PendingIntent pendingIntent, in Bundle options1, int taskId,
|
oneway void startIntentAndTask(in PendingIntent pendingIntent, int userId1, in Bundle options1,
|
||||||
in Bundle options2, int sidePosition, float splitRatio,
|
int taskId, in Bundle options2, int sidePosition, float splitRatio,
|
||||||
in RemoteTransition remoteTransition, in InstanceId instanceId) = 16;
|
in RemoteTransition remoteTransition, in InstanceId instanceId) = 16;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -107,7 +107,7 @@ interface ISplitScreen {
|
|||||||
/**
|
/**
|
||||||
* Starts a pair of intent and task using legacy transition system.
|
* Starts a pair of intent and task using legacy transition system.
|
||||||
*/
|
*/
|
||||||
oneway void startIntentAndTaskWithLegacyTransition(in PendingIntent pendingIntent,
|
oneway void startIntentAndTaskWithLegacyTransition(in PendingIntent pendingIntent, int userId1,
|
||||||
in Bundle options1, int taskId, in Bundle options2, int splitPosition, float splitRatio,
|
in Bundle options1, int taskId, in Bundle options2, int splitPosition, float splitRatio,
|
||||||
in RemoteAnimationAdapter adapter, in InstanceId instanceId) = 12;
|
in RemoteAnimationAdapter adapter, in InstanceId instanceId) = 12;
|
||||||
|
|
||||||
@@ -121,18 +121,18 @@ interface ISplitScreen {
|
|||||||
/**
|
/**
|
||||||
* Start a pair of intents using legacy transition system.
|
* Start a pair of intents using legacy transition system.
|
||||||
*/
|
*/
|
||||||
oneway void startIntentsWithLegacyTransition(in PendingIntent pendingIntent1,
|
oneway void startIntentsWithLegacyTransition(in PendingIntent pendingIntent1, int userId1,
|
||||||
in ShortcutInfo shortcutInfo1, in Bundle options1, in PendingIntent pendingIntent2,
|
in ShortcutInfo shortcutInfo1, in Bundle options1, in PendingIntent pendingIntent2,
|
||||||
in ShortcutInfo shortcutInfo2, in Bundle options2, int splitPosition, float splitRatio,
|
int userId2, in ShortcutInfo shortcutInfo2, in Bundle options2, int splitPosition,
|
||||||
in RemoteAnimationAdapter adapter, in InstanceId instanceId) = 18;
|
float splitRatio, in RemoteAnimationAdapter adapter, in InstanceId instanceId) = 18;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Start a pair of intents in one transition.
|
* Start a pair of intents in one transition.
|
||||||
*/
|
*/
|
||||||
oneway void startIntents(in PendingIntent pendingIntent1, in ShortcutInfo shortcutInfo1,
|
oneway void startIntents(in PendingIntent pendingIntent1, int userId1,
|
||||||
in Bundle options1, in PendingIntent pendingIntent2, in ShortcutInfo shortcutInfo2,
|
in ShortcutInfo shortcutInfo1, in Bundle options1, in PendingIntent pendingIntent2,
|
||||||
in Bundle options2, int splitPosition, float splitRatio,
|
int userId2, in ShortcutInfo shortcutInfo2, in Bundle options2, int splitPosition,
|
||||||
in RemoteTransition remoteTransition, in InstanceId instanceId) = 19;
|
float splitRatio, in RemoteTransition remoteTransition, in InstanceId instanceId) = 19;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Blocking call that notifies and gets additional split-screen targets when entering
|
* Blocking call that notifies and gets additional split-screen targets when entering
|
||||||
|
|||||||
@@ -502,7 +502,8 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
if (options == null) options = new Bundle();
|
if (options == null) options = new Bundle();
|
||||||
final ActivityOptions activityOptions = ActivityOptions.fromBundle(options);
|
final ActivityOptions activityOptions = ActivityOptions.fromBundle(options);
|
||||||
|
|
||||||
if (samePackage(packageName, getPackageName(reverseSplitPosition(position)))) {
|
if (samePackage(packageName, getPackageName(reverseSplitPosition(position)),
|
||||||
|
user.getIdentifier(), getUserId(reverseSplitPosition(position)))) {
|
||||||
if (supportMultiInstancesSplit(packageName)) {
|
if (supportMultiInstancesSplit(packageName)) {
|
||||||
activityOptions.setApplyMultipleTaskFlagForShortcut(true);
|
activityOptions.setApplyMultipleTaskFlagForShortcut(true);
|
||||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Adding MULTIPLE_TASK");
|
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Adding MULTIPLE_TASK");
|
||||||
@@ -531,7 +532,9 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
|
|
||||||
final String packageName1 = shortcutInfo.getPackage();
|
final String packageName1 = shortcutInfo.getPackage();
|
||||||
final String packageName2 = SplitScreenUtils.getPackageName(taskId, mTaskOrganizer);
|
final String packageName2 = SplitScreenUtils.getPackageName(taskId, mTaskOrganizer);
|
||||||
if (samePackage(packageName1, packageName2)) {
|
final int userId1 = shortcutInfo.getUserId();
|
||||||
|
final int userId2 = SplitScreenUtils.getUserId(taskId, mTaskOrganizer);
|
||||||
|
if (samePackage(packageName1, packageName2, userId1, userId2)) {
|
||||||
if (supportMultiInstancesSplit(shortcutInfo.getPackage())) {
|
if (supportMultiInstancesSplit(shortcutInfo.getPackage())) {
|
||||||
activityOptions.setApplyMultipleTaskFlagForShortcut(true);
|
activityOptions.setApplyMultipleTaskFlagForShortcut(true);
|
||||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Adding MULTIPLE_TASK");
|
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Adding MULTIPLE_TASK");
|
||||||
@@ -558,7 +561,9 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
// NOTE: This doesn't correctly pull out packageName2 if taskId is referring to a task in
|
// NOTE: This doesn't correctly pull out packageName2 if taskId is referring to a task in
|
||||||
// recents that hasn't launched and is not being organized
|
// recents that hasn't launched and is not being organized
|
||||||
final String packageName2 = SplitScreenUtils.getPackageName(taskId, mTaskOrganizer);
|
final String packageName2 = SplitScreenUtils.getPackageName(taskId, mTaskOrganizer);
|
||||||
if (samePackage(packageName1, packageName2)) {
|
final int userId1 = shortcutInfo.getUserId();
|
||||||
|
final int userId2 = SplitScreenUtils.getUserId(taskId, mTaskOrganizer);
|
||||||
|
if (samePackage(packageName1, packageName2, userId1, userId2)) {
|
||||||
if (supportMultiInstancesSplit(packageName1)) {
|
if (supportMultiInstancesSplit(packageName1)) {
|
||||||
activityOptions.setApplyMultipleTaskFlagForShortcut(true);
|
activityOptions.setApplyMultipleTaskFlagForShortcut(true);
|
||||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Adding MULTIPLE_TASK");
|
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Adding MULTIPLE_TASK");
|
||||||
@@ -578,23 +583,24 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* See {@link #startIntent(PendingIntent, Intent, int, Bundle)}
|
* See {@link #startIntent(PendingIntent, int, Intent, int, Bundle)}
|
||||||
* @param instanceId to be used by {@link SplitscreenEventLogger}
|
* @param instanceId to be used by {@link SplitscreenEventLogger}
|
||||||
*/
|
*/
|
||||||
public void startIntent(PendingIntent intent, @Nullable Intent fillInIntent,
|
public void startIntent(PendingIntent intent, int userId, @Nullable Intent fillInIntent,
|
||||||
@SplitPosition int position, @Nullable Bundle options, @NonNull InstanceId instanceId) {
|
@SplitPosition int position, @Nullable Bundle options, @NonNull InstanceId instanceId) {
|
||||||
mStageCoordinator.onRequestToSplit(instanceId, ENTER_REASON_LAUNCHER);
|
mStageCoordinator.onRequestToSplit(instanceId, ENTER_REASON_LAUNCHER);
|
||||||
startIntent(intent, fillInIntent, position, options);
|
startIntent(intent, userId, fillInIntent, position, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startIntentAndTaskWithLegacyTransition(PendingIntent pendingIntent,
|
private void startIntentAndTaskWithLegacyTransition(PendingIntent pendingIntent, int userId1,
|
||||||
@Nullable Bundle options1, int taskId, @Nullable Bundle options2,
|
@Nullable Bundle options1, int taskId, @Nullable Bundle options2,
|
||||||
@SplitPosition int splitPosition, float splitRatio, RemoteAnimationAdapter adapter,
|
@SplitPosition int splitPosition, float splitRatio, RemoteAnimationAdapter adapter,
|
||||||
InstanceId instanceId) {
|
InstanceId instanceId) {
|
||||||
Intent fillInIntent = null;
|
Intent fillInIntent = null;
|
||||||
final String packageName1 = SplitScreenUtils.getPackageName(pendingIntent);
|
final String packageName1 = SplitScreenUtils.getPackageName(pendingIntent);
|
||||||
final String packageName2 = SplitScreenUtils.getPackageName(taskId, mTaskOrganizer);
|
final String packageName2 = SplitScreenUtils.getPackageName(taskId, mTaskOrganizer);
|
||||||
if (samePackage(packageName1, packageName2)) {
|
final int userId2 = SplitScreenUtils.getUserId(taskId, mTaskOrganizer);
|
||||||
|
if (samePackage(packageName1, packageName2, userId1, userId2)) {
|
||||||
if (supportMultiInstancesSplit(packageName1)) {
|
if (supportMultiInstancesSplit(packageName1)) {
|
||||||
fillInIntent = new Intent();
|
fillInIntent = new Intent();
|
||||||
fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK);
|
fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK);
|
||||||
@@ -611,15 +617,17 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
options1, taskId, options2, splitPosition, splitRatio, adapter, instanceId);
|
options1, taskId, options2, splitPosition, splitRatio, adapter, instanceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startIntentAndTask(PendingIntent pendingIntent, @Nullable Bundle options1,
|
private void startIntentAndTask(PendingIntent pendingIntent, int userId1,
|
||||||
int taskId, @Nullable Bundle options2, @SplitPosition int splitPosition,
|
@Nullable Bundle options1, int taskId, @Nullable Bundle options2,
|
||||||
float splitRatio, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
@SplitPosition int splitPosition, float splitRatio,
|
||||||
|
@Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
||||||
Intent fillInIntent = null;
|
Intent fillInIntent = null;
|
||||||
final String packageName1 = SplitScreenUtils.getPackageName(pendingIntent);
|
final String packageName1 = SplitScreenUtils.getPackageName(pendingIntent);
|
||||||
// NOTE: This doesn't correctly pull out packageName2 if taskId is referring to a task in
|
// NOTE: This doesn't correctly pull out packageName2 if taskId is referring to a task in
|
||||||
// recents that hasn't launched and is not being organized
|
// recents that hasn't launched and is not being organized
|
||||||
final String packageName2 = SplitScreenUtils.getPackageName(taskId, mTaskOrganizer);
|
final String packageName2 = SplitScreenUtils.getPackageName(taskId, mTaskOrganizer);
|
||||||
if (samePackage(packageName1, packageName2)) {
|
final int userId2 = SplitScreenUtils.getUserId(taskId, mTaskOrganizer);
|
||||||
|
if (samePackage(packageName1, packageName2, userId1, userId2)) {
|
||||||
if (supportMultiInstancesSplit(packageName1)) {
|
if (supportMultiInstancesSplit(packageName1)) {
|
||||||
fillInIntent = new Intent();
|
fillInIntent = new Intent();
|
||||||
fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK);
|
fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK);
|
||||||
@@ -639,16 +647,16 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
options2, splitPosition, splitRatio, remoteTransition, instanceId);
|
options2, splitPosition, splitRatio, remoteTransition, instanceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startIntentsWithLegacyTransition(PendingIntent pendingIntent1,
|
private void startIntentsWithLegacyTransition(PendingIntent pendingIntent1, int userId1,
|
||||||
@Nullable ShortcutInfo shortcutInfo1, @Nullable Bundle options1,
|
@Nullable ShortcutInfo shortcutInfo1, @Nullable Bundle options1,
|
||||||
PendingIntent pendingIntent2, @Nullable ShortcutInfo shortcutInfo2,
|
PendingIntent pendingIntent2, int userId2, @Nullable ShortcutInfo shortcutInfo2,
|
||||||
@Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio,
|
@Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio,
|
||||||
RemoteAnimationAdapter adapter, InstanceId instanceId) {
|
RemoteAnimationAdapter adapter, InstanceId instanceId) {
|
||||||
Intent fillInIntent1 = null;
|
Intent fillInIntent1 = null;
|
||||||
Intent fillInIntent2 = null;
|
Intent fillInIntent2 = null;
|
||||||
final String packageName1 = SplitScreenUtils.getPackageName(pendingIntent1);
|
final String packageName1 = SplitScreenUtils.getPackageName(pendingIntent1);
|
||||||
final String packageName2 = SplitScreenUtils.getPackageName(pendingIntent2);
|
final String packageName2 = SplitScreenUtils.getPackageName(pendingIntent2);
|
||||||
if (samePackage(packageName1, packageName2)) {
|
if (samePackage(packageName1, packageName2, userId1, userId2)) {
|
||||||
if (supportMultiInstancesSplit(packageName1)) {
|
if (supportMultiInstancesSplit(packageName1)) {
|
||||||
fillInIntent1 = new Intent();
|
fillInIntent1 = new Intent();
|
||||||
fillInIntent1.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK);
|
fillInIntent1.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK);
|
||||||
@@ -668,16 +676,16 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
splitPosition, splitRatio, adapter, instanceId);
|
splitPosition, splitRatio, adapter, instanceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startIntents(PendingIntent pendingIntent1,
|
private void startIntents(PendingIntent pendingIntent1, int userId1,
|
||||||
@Nullable ShortcutInfo shortcutInfo1, @Nullable Bundle options1,
|
@Nullable ShortcutInfo shortcutInfo1, @Nullable Bundle options1,
|
||||||
PendingIntent pendingIntent2, @Nullable ShortcutInfo shortcutInfo2,
|
PendingIntent pendingIntent2, int userId2, @Nullable ShortcutInfo shortcutInfo2,
|
||||||
@Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio,
|
@Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio,
|
||||||
@Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
@Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
||||||
Intent fillInIntent1 = null;
|
Intent fillInIntent1 = null;
|
||||||
Intent fillInIntent2 = null;
|
Intent fillInIntent2 = null;
|
||||||
final String packageName1 = SplitScreenUtils.getPackageName(pendingIntent1);
|
final String packageName1 = SplitScreenUtils.getPackageName(pendingIntent1);
|
||||||
final String packageName2 = SplitScreenUtils.getPackageName(pendingIntent2);
|
final String packageName2 = SplitScreenUtils.getPackageName(pendingIntent2);
|
||||||
if (samePackage(packageName1, packageName2)) {
|
if (samePackage(packageName1, packageName2, userId1, userId2)) {
|
||||||
if (supportMultiInstancesSplit(packageName1)) {
|
if (supportMultiInstancesSplit(packageName1)) {
|
||||||
fillInIntent1 = new Intent();
|
fillInIntent1 = new Intent();
|
||||||
fillInIntent1.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK);
|
fillInIntent1.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK);
|
||||||
@@ -698,7 +706,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startIntent(PendingIntent intent, @Nullable Intent fillInIntent,
|
public void startIntent(PendingIntent intent, int userId1, @Nullable Intent fillInIntent,
|
||||||
@SplitPosition int position, @Nullable Bundle options) {
|
@SplitPosition int position, @Nullable Bundle options) {
|
||||||
// Flag this as a no-user-action launch to prevent sending user leaving event to the current
|
// Flag this as a no-user-action launch to prevent sending user leaving event to the current
|
||||||
// top activity since it's going to be put into another side of the split. This prevents the
|
// top activity since it's going to be put into another side of the split. This prevents the
|
||||||
@@ -708,7 +716,8 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
|
|
||||||
final String packageName1 = SplitScreenUtils.getPackageName(intent);
|
final String packageName1 = SplitScreenUtils.getPackageName(intent);
|
||||||
final String packageName2 = getPackageName(reverseSplitPosition(position));
|
final String packageName2 = getPackageName(reverseSplitPosition(position));
|
||||||
if (SplitScreenUtils.samePackage(packageName1, packageName2)) {
|
final int userId2 = getUserId(reverseSplitPosition(position));
|
||||||
|
if (samePackage(packageName1, packageName2, userId1, userId2)) {
|
||||||
if (supportMultiInstancesSplit(packageName1)) {
|
if (supportMultiInstancesSplit(packageName1)) {
|
||||||
// To prevent accumulating large number of instances in the background, reuse task
|
// To prevent accumulating large number of instances in the background, reuse task
|
||||||
// in the background with priority.
|
// in the background with priority.
|
||||||
@@ -761,6 +770,24 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
return taskInfo != null ? SplitScreenUtils.getPackageName(taskInfo.baseIntent) : null;
|
return taskInfo != null ? SplitScreenUtils.getPackageName(taskInfo.baseIntent) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Retrieve user id of a specific split position if split screen is activated, otherwise
|
||||||
|
* returns the user id of the top running task. */
|
||||||
|
private int getUserId(@SplitPosition int position) {
|
||||||
|
ActivityManager.RunningTaskInfo taskInfo;
|
||||||
|
if (isSplitScreenVisible()) {
|
||||||
|
taskInfo = getTaskInfo(position);
|
||||||
|
} else {
|
||||||
|
taskInfo = mRecentTasksOptional
|
||||||
|
.map(recentTasks -> recentTasks.getTopRunningTask())
|
||||||
|
.orElse(null);
|
||||||
|
if (!isValidToSplit(taskInfo)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return taskInfo != null ? taskInfo.userId : -1;
|
||||||
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
boolean supportMultiInstancesSplit(String packageName) {
|
boolean supportMultiInstancesSplit(String packageName) {
|
||||||
if (packageName != null) {
|
if (packageName != null) {
|
||||||
@@ -1069,14 +1096,14 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startIntentAndTaskWithLegacyTransition(PendingIntent pendingIntent,
|
public void startIntentAndTaskWithLegacyTransition(PendingIntent pendingIntent, int userId1,
|
||||||
Bundle options1, int taskId, Bundle options2, int splitPosition, float splitRatio,
|
Bundle options1, int taskId, Bundle options2, int splitPosition, float splitRatio,
|
||||||
RemoteAnimationAdapter adapter, InstanceId instanceId) {
|
RemoteAnimationAdapter adapter, InstanceId instanceId) {
|
||||||
executeRemoteCallWithTaskPermission(mController,
|
executeRemoteCallWithTaskPermission(mController,
|
||||||
"startIntentAndTaskWithLegacyTransition", (controller) ->
|
"startIntentAndTaskWithLegacyTransition", (controller) ->
|
||||||
controller.startIntentAndTaskWithLegacyTransition(pendingIntent,
|
controller.startIntentAndTaskWithLegacyTransition(pendingIntent,
|
||||||
options1, taskId, options2, splitPosition, splitRatio, adapter,
|
userId1, options1, taskId, options2, splitPosition, splitRatio,
|
||||||
instanceId));
|
adapter, instanceId));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1102,13 +1129,14 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startIntentAndTask(PendingIntent pendingIntent, @Nullable Bundle options1,
|
public void startIntentAndTask(PendingIntent pendingIntent, int userId1,
|
||||||
int taskId, @Nullable Bundle options2, @SplitPosition int splitPosition,
|
@Nullable Bundle options1, int taskId, @Nullable Bundle options2,
|
||||||
float splitRatio, @Nullable RemoteTransition remoteTransition,
|
@SplitPosition int splitPosition, float splitRatio,
|
||||||
InstanceId instanceId) {
|
@Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
||||||
executeRemoteCallWithTaskPermission(mController, "startIntentAndTask",
|
executeRemoteCallWithTaskPermission(mController, "startIntentAndTask",
|
||||||
(controller) -> controller.startIntentAndTask(pendingIntent, options1, taskId,
|
(controller) -> controller.startIntentAndTask(pendingIntent, userId1, options1,
|
||||||
options2, splitPosition, splitRatio, remoteTransition, instanceId));
|
taskId, options2, splitPosition, splitRatio, remoteTransition,
|
||||||
|
instanceId));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1122,29 +1150,29 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startIntentsWithLegacyTransition(PendingIntent pendingIntent1,
|
public void startIntentsWithLegacyTransition(PendingIntent pendingIntent1, int userId1,
|
||||||
@Nullable ShortcutInfo shortcutInfo1, @Nullable Bundle options1,
|
@Nullable ShortcutInfo shortcutInfo1, @Nullable Bundle options1,
|
||||||
PendingIntent pendingIntent2, @Nullable ShortcutInfo shortcutInfo2,
|
PendingIntent pendingIntent2, int userId2, @Nullable ShortcutInfo shortcutInfo2,
|
||||||
@Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio,
|
@Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio,
|
||||||
RemoteAnimationAdapter adapter, InstanceId instanceId) {
|
RemoteAnimationAdapter adapter, InstanceId instanceId) {
|
||||||
executeRemoteCallWithTaskPermission(mController, "startIntentsWithLegacyTransition",
|
executeRemoteCallWithTaskPermission(mController, "startIntentsWithLegacyTransition",
|
||||||
(controller) ->
|
(controller) ->
|
||||||
controller.startIntentsWithLegacyTransition(pendingIntent1, shortcutInfo1,
|
controller.startIntentsWithLegacyTransition(pendingIntent1, userId1,
|
||||||
options1, pendingIntent2, shortcutInfo2, options2, splitPosition,
|
shortcutInfo1, options1, pendingIntent2, userId2, shortcutInfo2,
|
||||||
splitRatio, adapter, instanceId)
|
options2, splitPosition, splitRatio, adapter, instanceId)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startIntents(PendingIntent pendingIntent1, @Nullable ShortcutInfo shortcutInfo1,
|
public void startIntents(PendingIntent pendingIntent1, int userId1,
|
||||||
@Nullable Bundle options1, PendingIntent pendingIntent2,
|
@Nullable ShortcutInfo shortcutInfo1, @Nullable Bundle options1,
|
||||||
@Nullable ShortcutInfo shortcutInfo2, @Nullable Bundle options2,
|
PendingIntent pendingIntent2, int userId2, @Nullable ShortcutInfo shortcutInfo2,
|
||||||
@SplitPosition int splitPosition, float splitRatio,
|
@Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio,
|
||||||
@Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
@Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
||||||
executeRemoteCallWithTaskPermission(mController, "startIntents",
|
executeRemoteCallWithTaskPermission(mController, "startIntents",
|
||||||
(controller) ->
|
(controller) ->
|
||||||
controller.startIntents(pendingIntent1, shortcutInfo1,
|
controller.startIntents(pendingIntent1, userId1, shortcutInfo1,
|
||||||
options1, pendingIntent2, shortcutInfo2, options2,
|
options1, pendingIntent2, userId2, shortcutInfo2, options2,
|
||||||
splitPosition, splitRatio, remoteTransition, instanceId)
|
splitPosition, splitRatio, remoteTransition, instanceId)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -1158,11 +1186,11 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startIntent(PendingIntent intent, Intent fillInIntent, int position,
|
public void startIntent(PendingIntent intent, int userId, Intent fillInIntent, int position,
|
||||||
@Nullable Bundle options, InstanceId instanceId) {
|
@Nullable Bundle options, InstanceId instanceId) {
|
||||||
executeRemoteCallWithTaskPermission(mController, "startIntent",
|
executeRemoteCallWithTaskPermission(mController, "startIntent",
|
||||||
(controller) -> controller.startIntent(intent, fillInIntent, position, options,
|
(controller) -> controller.startIntent(intent, userId, fillInIntent, position,
|
||||||
instanceId));
|
options, instanceId));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ public class DragAndDropPolicyTest extends ShellTestCase {
|
|||||||
mPolicy.getTargets(mInsets), TYPE_FULLSCREEN);
|
mPolicy.getTargets(mInsets), TYPE_FULLSCREEN);
|
||||||
|
|
||||||
mPolicy.handleDrop(filterTargetByType(targets, TYPE_FULLSCREEN), mActivityClipData);
|
mPolicy.handleDrop(filterTargetByType(targets, TYPE_FULLSCREEN), mActivityClipData);
|
||||||
verify(mSplitScreenStarter).startIntent(any(), any(),
|
verify(mSplitScreenStarter).startIntent(any(), anyInt(), any(),
|
||||||
eq(SPLIT_POSITION_UNDEFINED), any());
|
eq(SPLIT_POSITION_UNDEFINED), any());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -223,12 +223,12 @@ public class DragAndDropPolicyTest extends ShellTestCase {
|
|||||||
mPolicy.getTargets(mInsets), TYPE_SPLIT_LEFT, TYPE_SPLIT_RIGHT);
|
mPolicy.getTargets(mInsets), TYPE_SPLIT_LEFT, TYPE_SPLIT_RIGHT);
|
||||||
|
|
||||||
mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_LEFT), mActivityClipData);
|
mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_LEFT), mActivityClipData);
|
||||||
verify(mSplitScreenStarter).startIntent(any(), any(),
|
verify(mSplitScreenStarter).startIntent(any(), anyInt(), any(),
|
||||||
eq(SPLIT_POSITION_TOP_OR_LEFT), any());
|
eq(SPLIT_POSITION_TOP_OR_LEFT), any());
|
||||||
reset(mSplitScreenStarter);
|
reset(mSplitScreenStarter);
|
||||||
|
|
||||||
mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_RIGHT), mActivityClipData);
|
mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_RIGHT), mActivityClipData);
|
||||||
verify(mSplitScreenStarter).startIntent(any(), any(),
|
verify(mSplitScreenStarter).startIntent(any(), anyInt(), any(),
|
||||||
eq(SPLIT_POSITION_BOTTOM_OR_RIGHT), any());
|
eq(SPLIT_POSITION_BOTTOM_OR_RIGHT), any());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -240,12 +240,12 @@ public class DragAndDropPolicyTest extends ShellTestCase {
|
|||||||
mPolicy.getTargets(mInsets), TYPE_SPLIT_TOP, TYPE_SPLIT_BOTTOM);
|
mPolicy.getTargets(mInsets), TYPE_SPLIT_TOP, TYPE_SPLIT_BOTTOM);
|
||||||
|
|
||||||
mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_TOP), mActivityClipData);
|
mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_TOP), mActivityClipData);
|
||||||
verify(mSplitScreenStarter).startIntent(any(), any(),
|
verify(mSplitScreenStarter).startIntent(any(), anyInt(), any(),
|
||||||
eq(SPLIT_POSITION_TOP_OR_LEFT), any());
|
eq(SPLIT_POSITION_TOP_OR_LEFT), any());
|
||||||
reset(mSplitScreenStarter);
|
reset(mSplitScreenStarter);
|
||||||
|
|
||||||
mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_BOTTOM), mActivityClipData);
|
mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_BOTTOM), mActivityClipData);
|
||||||
verify(mSplitScreenStarter).startIntent(any(), any(),
|
verify(mSplitScreenStarter).startIntent(any(), anyInt(), any(),
|
||||||
eq(SPLIT_POSITION_BOTTOM_OR_RIGHT), any());
|
eq(SPLIT_POSITION_BOTTOM_OR_RIGHT), any());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -181,7 +181,8 @@ public class SplitScreenControllerTests extends ShellTestCase {
|
|||||||
PendingIntent pendingIntent =
|
PendingIntent pendingIntent =
|
||||||
PendingIntent.getActivity(mContext, 0, startIntent, FLAG_IMMUTABLE);
|
PendingIntent.getActivity(mContext, 0, startIntent, FLAG_IMMUTABLE);
|
||||||
|
|
||||||
mSplitScreenController.startIntent(pendingIntent, null, SPLIT_POSITION_TOP_OR_LEFT, null);
|
mSplitScreenController.startIntent(pendingIntent, mContext.getUserId(), null,
|
||||||
|
SPLIT_POSITION_TOP_OR_LEFT, null);
|
||||||
|
|
||||||
verify(mStageCoordinator).startIntent(eq(pendingIntent), mIntentCaptor.capture(),
|
verify(mStageCoordinator).startIntent(eq(pendingIntent), mIntentCaptor.capture(),
|
||||||
eq(SPLIT_POSITION_TOP_OR_LEFT), isNull());
|
eq(SPLIT_POSITION_TOP_OR_LEFT), isNull());
|
||||||
@@ -200,7 +201,8 @@ public class SplitScreenControllerTests extends ShellTestCase {
|
|||||||
createTaskInfo(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, startIntent);
|
createTaskInfo(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, startIntent);
|
||||||
doReturn(topRunningTask).when(mRecentTasks).getTopRunningTask();
|
doReturn(topRunningTask).when(mRecentTasks).getTopRunningTask();
|
||||||
|
|
||||||
mSplitScreenController.startIntent(pendingIntent, null, SPLIT_POSITION_TOP_OR_LEFT, null);
|
mSplitScreenController.startIntent(pendingIntent, mContext.getUserId(), null,
|
||||||
|
SPLIT_POSITION_TOP_OR_LEFT, null);
|
||||||
|
|
||||||
verify(mStageCoordinator).startIntent(eq(pendingIntent), mIntentCaptor.capture(),
|
verify(mStageCoordinator).startIntent(eq(pendingIntent), mIntentCaptor.capture(),
|
||||||
eq(SPLIT_POSITION_TOP_OR_LEFT), isNull());
|
eq(SPLIT_POSITION_TOP_OR_LEFT), isNull());
|
||||||
@@ -223,7 +225,8 @@ public class SplitScreenControllerTests extends ShellTestCase {
|
|||||||
ActivityManager.RecentTaskInfo sameTaskInfo = new ActivityManager.RecentTaskInfo();
|
ActivityManager.RecentTaskInfo sameTaskInfo = new ActivityManager.RecentTaskInfo();
|
||||||
doReturn(sameTaskInfo).when(mRecentTasks).findTaskInBackground(any());
|
doReturn(sameTaskInfo).when(mRecentTasks).findTaskInBackground(any());
|
||||||
|
|
||||||
mSplitScreenController.startIntent(pendingIntent, null, SPLIT_POSITION_TOP_OR_LEFT, null);
|
mSplitScreenController.startIntent(pendingIntent, mContext.getUserId(), null,
|
||||||
|
SPLIT_POSITION_TOP_OR_LEFT, null);
|
||||||
|
|
||||||
verify(mSplitScreenController).startTask(anyInt(), eq(SPLIT_POSITION_TOP_OR_LEFT),
|
verify(mSplitScreenController).startTask(anyInt(), eq(SPLIT_POSITION_TOP_OR_LEFT),
|
||||||
isNull());
|
isNull());
|
||||||
@@ -246,7 +249,8 @@ public class SplitScreenControllerTests extends ShellTestCase {
|
|||||||
doReturn(new ActivityManager.RecentTaskInfo()).when(mRecentTasks)
|
doReturn(new ActivityManager.RecentTaskInfo()).when(mRecentTasks)
|
||||||
.findTaskInBackground(any());
|
.findTaskInBackground(any());
|
||||||
|
|
||||||
mSplitScreenController.startIntent(pendingIntent, null, SPLIT_POSITION_TOP_OR_LEFT, null);
|
mSplitScreenController.startIntent(pendingIntent, mContext.getUserId(), null,
|
||||||
|
SPLIT_POSITION_TOP_OR_LEFT, null);
|
||||||
|
|
||||||
verify(mSplitScreenController).startTask(anyInt(), eq(SPLIT_POSITION_TOP_OR_LEFT),
|
verify(mSplitScreenController).startTask(anyInt(), eq(SPLIT_POSITION_TOP_OR_LEFT),
|
||||||
isNull());
|
isNull());
|
||||||
@@ -265,7 +269,8 @@ public class SplitScreenControllerTests extends ShellTestCase {
|
|||||||
doReturn(sameTaskInfo).when(mSplitScreenController).getTaskInfo(
|
doReturn(sameTaskInfo).when(mSplitScreenController).getTaskInfo(
|
||||||
SPLIT_POSITION_BOTTOM_OR_RIGHT);
|
SPLIT_POSITION_BOTTOM_OR_RIGHT);
|
||||||
|
|
||||||
mSplitScreenController.startIntent(pendingIntent, null, SPLIT_POSITION_TOP_OR_LEFT, null);
|
mSplitScreenController.startIntent(pendingIntent, mContext.getUserId(), null,
|
||||||
|
SPLIT_POSITION_TOP_OR_LEFT, null);
|
||||||
|
|
||||||
verify(mStageCoordinator).switchSplitPosition(anyString());
|
verify(mStageCoordinator).switchSplitPosition(anyString());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user