Loading services/core/java/com/android/server/wm/ActivityStartController.java +3 −3 Original line number Diff line number Diff line Loading @@ -389,9 +389,9 @@ public class ActivityStartController { SafeActivityOptions bottomOptions = null; if (options != null) { // To ensure the first N-1 activities (N == total # of activities) are also launched // into the correct display, use a copy of the passed-in options (keeping only // display-related info) for these activities. bottomOptions = options.selectiveCloneDisplayOptions(); // into the correct display and root task, use a copy of the passed-in options (keeping // only display-related and launch-root-task information) for these activities. bottomOptions = options.selectiveCloneLaunchOptions(); } try { intents = ArrayUtils.filterNotNull(intents, Intent[]::new); Loading services/core/java/com/android/server/wm/SafeActivityOptions.java +9 −8 Original line number Diff line number Diff line Loading @@ -117,13 +117,13 @@ public class SafeActivityOptions { /** * To ensure that two activities, one using this object, and the other using the * SafeActivityOptions returned from this function, are launched into the same display through * ActivityStartController#startActivities, all display-related information, i.e. * displayAreaToken, launchDisplayId and callerDisplayId, are cloned. * SafeActivityOptions returned from this function, are launched into the same display/root task * through ActivityStartController#startActivities, all display-related information, i.e. * displayAreaToken, launchDisplayId, callerDisplayId and the launch root task are cloned. */ @Nullable SafeActivityOptions selectiveCloneDisplayOptions() { final ActivityOptions options = cloneLaunchingDisplayOptions(mOriginalOptions); final ActivityOptions callerOptions = cloneLaunchingDisplayOptions(mCallerOptions); @Nullable SafeActivityOptions selectiveCloneLaunchOptions() { final ActivityOptions options = cloneLaunchingOptions(mOriginalOptions); final ActivityOptions callerOptions = cloneLaunchingOptions(mCallerOptions); if (options == null && callerOptions == null) { return null; } Loading @@ -136,11 +136,12 @@ public class SafeActivityOptions { return safeOptions; } private ActivityOptions cloneLaunchingDisplayOptions(ActivityOptions options) { private ActivityOptions cloneLaunchingOptions(ActivityOptions options) { return options == null ? null : ActivityOptions.makeBasic() .setLaunchTaskDisplayArea(options.getLaunchTaskDisplayArea()) .setLaunchDisplayId(options.getLaunchDisplayId()) .setCallerDisplayId((options.getCallerDisplayId())); .setCallerDisplayId(options.getCallerDisplayId()) .setLaunchRootTask(options.getLaunchRootTask()); } /** Loading services/tests/wmtests/src/com/android/server/wm/SafeActivityOptionsTest.java +11 −1 Original line number Diff line number Diff line Loading @@ -57,10 +57,20 @@ public class SafeActivityOptionsTest { .setLaunchTaskDisplayArea(token) .setLaunchDisplayId(launchDisplayId) .setCallerDisplayId(callerDisplayId)) .selectiveCloneDisplayOptions(); .selectiveCloneLaunchOptions(); assertSame(clone.getOriginalOptions().getLaunchTaskDisplayArea(), token); assertEquals(clone.getOriginalOptions().getLaunchDisplayId(), launchDisplayId); assertEquals(clone.getOriginalOptions().getCallerDisplayId(), callerDisplayId); } @Test public void test_selectiveCloneLunchRootTask() { final WindowContainerToken token = mock(WindowContainerToken.class); final SafeActivityOptions clone = new SafeActivityOptions(ActivityOptions.makeBasic() .setLaunchRootTask(token)) .selectiveCloneLaunchOptions(); assertSame(clone.getOriginalOptions().getLaunchRootTask(), token); } } Loading
services/core/java/com/android/server/wm/ActivityStartController.java +3 −3 Original line number Diff line number Diff line Loading @@ -389,9 +389,9 @@ public class ActivityStartController { SafeActivityOptions bottomOptions = null; if (options != null) { // To ensure the first N-1 activities (N == total # of activities) are also launched // into the correct display, use a copy of the passed-in options (keeping only // display-related info) for these activities. bottomOptions = options.selectiveCloneDisplayOptions(); // into the correct display and root task, use a copy of the passed-in options (keeping // only display-related and launch-root-task information) for these activities. bottomOptions = options.selectiveCloneLaunchOptions(); } try { intents = ArrayUtils.filterNotNull(intents, Intent[]::new); Loading
services/core/java/com/android/server/wm/SafeActivityOptions.java +9 −8 Original line number Diff line number Diff line Loading @@ -117,13 +117,13 @@ public class SafeActivityOptions { /** * To ensure that two activities, one using this object, and the other using the * SafeActivityOptions returned from this function, are launched into the same display through * ActivityStartController#startActivities, all display-related information, i.e. * displayAreaToken, launchDisplayId and callerDisplayId, are cloned. * SafeActivityOptions returned from this function, are launched into the same display/root task * through ActivityStartController#startActivities, all display-related information, i.e. * displayAreaToken, launchDisplayId, callerDisplayId and the launch root task are cloned. */ @Nullable SafeActivityOptions selectiveCloneDisplayOptions() { final ActivityOptions options = cloneLaunchingDisplayOptions(mOriginalOptions); final ActivityOptions callerOptions = cloneLaunchingDisplayOptions(mCallerOptions); @Nullable SafeActivityOptions selectiveCloneLaunchOptions() { final ActivityOptions options = cloneLaunchingOptions(mOriginalOptions); final ActivityOptions callerOptions = cloneLaunchingOptions(mCallerOptions); if (options == null && callerOptions == null) { return null; } Loading @@ -136,11 +136,12 @@ public class SafeActivityOptions { return safeOptions; } private ActivityOptions cloneLaunchingDisplayOptions(ActivityOptions options) { private ActivityOptions cloneLaunchingOptions(ActivityOptions options) { return options == null ? null : ActivityOptions.makeBasic() .setLaunchTaskDisplayArea(options.getLaunchTaskDisplayArea()) .setLaunchDisplayId(options.getLaunchDisplayId()) .setCallerDisplayId((options.getCallerDisplayId())); .setCallerDisplayId(options.getCallerDisplayId()) .setLaunchRootTask(options.getLaunchRootTask()); } /** Loading
services/tests/wmtests/src/com/android/server/wm/SafeActivityOptionsTest.java +11 −1 Original line number Diff line number Diff line Loading @@ -57,10 +57,20 @@ public class SafeActivityOptionsTest { .setLaunchTaskDisplayArea(token) .setLaunchDisplayId(launchDisplayId) .setCallerDisplayId(callerDisplayId)) .selectiveCloneDisplayOptions(); .selectiveCloneLaunchOptions(); assertSame(clone.getOriginalOptions().getLaunchTaskDisplayArea(), token); assertEquals(clone.getOriginalOptions().getLaunchDisplayId(), launchDisplayId); assertEquals(clone.getOriginalOptions().getCallerDisplayId(), callerDisplayId); } @Test public void test_selectiveCloneLunchRootTask() { final WindowContainerToken token = mock(WindowContainerToken.class); final SafeActivityOptions clone = new SafeActivityOptions(ActivityOptions.makeBasic() .setLaunchRootTask(token)) .selectiveCloneLaunchOptions(); assertSame(clone.getOriginalOptions().getLaunchRootTask(), token); } }