Loading services/core/java/com/android/server/wm/ActivityStackSupervisor.java +35 −19 Original line number Diff line number Diff line Loading @@ -121,6 +121,7 @@ import android.app.AppOpsManager; import android.app.ProfilerInfo; import android.app.ResultInfo; import android.app.WaitResult; import android.app.WindowConfiguration; import android.app.WindowConfiguration.ActivityType; import android.app.WindowConfiguration.WindowingMode; import android.app.servertransaction.ActivityLifecycleItem; Loading Loading @@ -2405,7 +2406,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D <T extends ActivityStack> T getLaunchStack(@Nullable ActivityRecord r, @Nullable ActivityOptions options, @Nullable TaskRecord candidateTask, boolean onTop) { return getLaunchStack(r, options, candidateTask, onTop, INVALID_DISPLAY); return getLaunchStack(r, options, candidateTask, onTop, null /* launchParams */); } /** Loading @@ -2414,12 +2415,13 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D * @param r The activity we are trying to launch. Can be null. * @param options The activity options used to the launch. Can be null. * @param candidateTask The possible task the activity might be launched in. Can be null. * @params launchParams The resolved launch params to use. * * @return The stack to use for the launch or INVALID_STACK_ID. */ <T extends ActivityStack> T getLaunchStack(@Nullable ActivityRecord r, @Nullable ActivityOptions options, @Nullable TaskRecord candidateTask, boolean onTop, int candidateDisplayId) { @Nullable LaunchParamsController.LaunchParams launchParams) { int taskId = INVALID_TASK_ID; int displayId = INVALID_DISPLAY; //Rect bounds = null; Loading @@ -2427,9 +2429,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D // We give preference to the launch preference in activity options. if (options != null) { taskId = options.getLaunchTaskId(); displayId = options.getLaunchDisplayId(); // TODO: Need to work this into the equation... //bounds = options.getLaunchBounds(); } // First preference for stack goes to the task Id set in the activity options. Use the stack Loading @@ -2446,16 +2445,16 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } final int activityType = resolveActivityType(r, options, candidateTask); T stack = null; T stack; // Next preference for stack goes to the display Id set in the activity options or the // candidate display. if (displayId == INVALID_DISPLAY) { displayId = candidateDisplayId; // Next preference for stack goes to the display Id set the candidate display. if (launchParams != null) { displayId = launchParams.mPreferredDisplayId; } if (displayId != INVALID_DISPLAY && canLaunchOnDisplay(r, displayId)) { if (r != null) { stack = (T) getValidLaunchStackOnDisplay(displayId, r, candidateTask, options); stack = (T) getValidLaunchStackOnDisplay(displayId, r, candidateTask, options, launchParams); if (stack != null) { return stack; } Loading @@ -2482,8 +2481,12 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D if (stack != null) { display = stack.getDisplay(); if (display != null && canLaunchOnDisplay(r, display.mDisplayId)) { final int windowingMode = display.resolveWindowingMode(r, options, candidateTask, activityType); int windowingMode = launchParams != null ? launchParams.mWindowingMode : WindowConfiguration.WINDOWING_MODE_UNDEFINED; if (windowingMode == WindowConfiguration.WINDOWING_MODE_UNDEFINED) { windowingMode = display.resolveWindowingMode(r, options, candidateTask, activityType); } if (stack.isCompatible(windowingMode, activityType)) { return stack; } Loading Loading @@ -2523,8 +2526,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D * @param candidateTask The possible task the activity might be put in. * @return Existing stack if there is a valid one, new dynamic stack if it is valid or null. */ ActivityStack getValidLaunchStackOnDisplay(int displayId, @NonNull ActivityRecord r, @Nullable TaskRecord candidateTask, @Nullable ActivityOptions options) { private ActivityStack getValidLaunchStackOnDisplay(int displayId, @NonNull ActivityRecord r, @Nullable TaskRecord candidateTask, @Nullable ActivityOptions options, @Nullable LaunchParamsController.LaunchParams launchParams) { final ActivityDisplay activityDisplay = getActivityDisplayOrCreateLocked(displayId); if (activityDisplay == null) { throw new IllegalArgumentException( Loading Loading @@ -2552,8 +2556,18 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D // If there is no valid stack on the external display - check if new dynamic stack will do. if (displayId != DEFAULT_DISPLAY) { final int windowingMode; if (launchParams != null) { // When launch params is not null, we always defer to its windowing mode. Sometimes // it could be unspecified, which indicates it should inherit windowing mode from // display. windowingMode = launchParams.mWindowingMode; } else { windowingMode = options != null ? options.getLaunchWindowingMode() : r.getWindowingMode(); } return activityDisplay.createStack( options != null ? options.getLaunchWindowingMode() : r.getWindowingMode(), windowingMode, options != null ? options.getLaunchActivityType() : r.getActivityType(), true /*onTop*/); } Loading @@ -2563,8 +2577,10 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } ActivityStack getValidLaunchStackOnDisplay(int displayId, @NonNull ActivityRecord r, @Nullable ActivityOptions options) { return getValidLaunchStackOnDisplay(displayId, r, null /* candidateTask */, options); @Nullable ActivityOptions options, @Nullable LaunchParamsController.LaunchParams launchParams) { return getValidLaunchStackOnDisplay(displayId, r, null /* candidateTask */, options, launchParams); } // TODO: Can probably be consolidated into getLaunchStack()... Loading Loading @@ -2644,7 +2660,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D continue; } final ActivityStack stack = getValidLaunchStackOnDisplay(display.mDisplayId, r, null /* options */); null /* options */, null /* launchParams */); if (stack != null) { return stack; } Loading services/core/java/com/android/server/wm/ActivityStarter.java +8 −4 Original line number Diff line number Diff line Loading @@ -2145,7 +2145,7 @@ class ActivityStarter { if (mTargetStack == null && targetDisplayId != sourceStack.mDisplayId) { // Can't use target display, lets find a stack on the source display. mTargetStack = mSupervisor.getValidLaunchStackOnDisplay( sourceStack.mDisplayId, mStartActivity, mOptions); sourceStack.mDisplayId, mStartActivity, mOptions, mLaunchParams); } if (mTargetStack == null) { // There are no suitable stacks on the target and source display(s). Look on all Loading Loading @@ -2368,7 +2368,8 @@ class ActivityStarter { if (mPreferredDisplayId != DEFAULT_DISPLAY) { // Try to put the activity in a stack on a secondary display. stack = mSupervisor.getValidLaunchStackOnDisplay(mPreferredDisplayId, r, aOptions); stack = mSupervisor.getValidLaunchStackOnDisplay(mPreferredDisplayId, r, aOptions, mLaunchParams); if (stack == null) { // If source display is not suitable - look for topmost valid stack in the system. if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG_FOCUS, Loading Loading @@ -2432,9 +2433,12 @@ class ActivityStarter { || mPreferredDisplayId != DEFAULT_DISPLAY) { // We don't pass in the default display id into the get launch stack call so it can do a // full resolution. final int candidateDisplay = mLaunchParams.mPreferredDisplayId = mPreferredDisplayId != DEFAULT_DISPLAY ? mPreferredDisplayId : INVALID_DISPLAY; return mSupervisor.getLaunchStack(r, aOptions, task, ON_TOP, candidateDisplay); final ActivityStack stack = mSupervisor.getLaunchStack(r, aOptions, task, ON_TOP, mLaunchParams); mLaunchParams.mPreferredDisplayId = mPreferredDisplayId; return stack; } // Otherwise handle adjacent launch. Loading services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +1 −1 Original line number Diff line number Diff line Loading @@ -346,7 +346,7 @@ public class ActivityStarterTests extends ActivityTestsBase { doReturn(stack).when(mService.mStackSupervisor) .getLaunchStack(any(), any(), any(), anyBoolean()); doReturn(stack).when(mService.mStackSupervisor) .getLaunchStack(any(), any(), any(), anyBoolean(), anyInt()); .getLaunchStack(any(), any(), any(), anyBoolean(), any()); } // Set up mock package manager internal and make sure no unmocked methods are called Loading Loading
services/core/java/com/android/server/wm/ActivityStackSupervisor.java +35 −19 Original line number Diff line number Diff line Loading @@ -121,6 +121,7 @@ import android.app.AppOpsManager; import android.app.ProfilerInfo; import android.app.ResultInfo; import android.app.WaitResult; import android.app.WindowConfiguration; import android.app.WindowConfiguration.ActivityType; import android.app.WindowConfiguration.WindowingMode; import android.app.servertransaction.ActivityLifecycleItem; Loading Loading @@ -2405,7 +2406,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D <T extends ActivityStack> T getLaunchStack(@Nullable ActivityRecord r, @Nullable ActivityOptions options, @Nullable TaskRecord candidateTask, boolean onTop) { return getLaunchStack(r, options, candidateTask, onTop, INVALID_DISPLAY); return getLaunchStack(r, options, candidateTask, onTop, null /* launchParams */); } /** Loading @@ -2414,12 +2415,13 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D * @param r The activity we are trying to launch. Can be null. * @param options The activity options used to the launch. Can be null. * @param candidateTask The possible task the activity might be launched in. Can be null. * @params launchParams The resolved launch params to use. * * @return The stack to use for the launch or INVALID_STACK_ID. */ <T extends ActivityStack> T getLaunchStack(@Nullable ActivityRecord r, @Nullable ActivityOptions options, @Nullable TaskRecord candidateTask, boolean onTop, int candidateDisplayId) { @Nullable LaunchParamsController.LaunchParams launchParams) { int taskId = INVALID_TASK_ID; int displayId = INVALID_DISPLAY; //Rect bounds = null; Loading @@ -2427,9 +2429,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D // We give preference to the launch preference in activity options. if (options != null) { taskId = options.getLaunchTaskId(); displayId = options.getLaunchDisplayId(); // TODO: Need to work this into the equation... //bounds = options.getLaunchBounds(); } // First preference for stack goes to the task Id set in the activity options. Use the stack Loading @@ -2446,16 +2445,16 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } final int activityType = resolveActivityType(r, options, candidateTask); T stack = null; T stack; // Next preference for stack goes to the display Id set in the activity options or the // candidate display. if (displayId == INVALID_DISPLAY) { displayId = candidateDisplayId; // Next preference for stack goes to the display Id set the candidate display. if (launchParams != null) { displayId = launchParams.mPreferredDisplayId; } if (displayId != INVALID_DISPLAY && canLaunchOnDisplay(r, displayId)) { if (r != null) { stack = (T) getValidLaunchStackOnDisplay(displayId, r, candidateTask, options); stack = (T) getValidLaunchStackOnDisplay(displayId, r, candidateTask, options, launchParams); if (stack != null) { return stack; } Loading @@ -2482,8 +2481,12 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D if (stack != null) { display = stack.getDisplay(); if (display != null && canLaunchOnDisplay(r, display.mDisplayId)) { final int windowingMode = display.resolveWindowingMode(r, options, candidateTask, activityType); int windowingMode = launchParams != null ? launchParams.mWindowingMode : WindowConfiguration.WINDOWING_MODE_UNDEFINED; if (windowingMode == WindowConfiguration.WINDOWING_MODE_UNDEFINED) { windowingMode = display.resolveWindowingMode(r, options, candidateTask, activityType); } if (stack.isCompatible(windowingMode, activityType)) { return stack; } Loading Loading @@ -2523,8 +2526,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D * @param candidateTask The possible task the activity might be put in. * @return Existing stack if there is a valid one, new dynamic stack if it is valid or null. */ ActivityStack getValidLaunchStackOnDisplay(int displayId, @NonNull ActivityRecord r, @Nullable TaskRecord candidateTask, @Nullable ActivityOptions options) { private ActivityStack getValidLaunchStackOnDisplay(int displayId, @NonNull ActivityRecord r, @Nullable TaskRecord candidateTask, @Nullable ActivityOptions options, @Nullable LaunchParamsController.LaunchParams launchParams) { final ActivityDisplay activityDisplay = getActivityDisplayOrCreateLocked(displayId); if (activityDisplay == null) { throw new IllegalArgumentException( Loading Loading @@ -2552,8 +2556,18 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D // If there is no valid stack on the external display - check if new dynamic stack will do. if (displayId != DEFAULT_DISPLAY) { final int windowingMode; if (launchParams != null) { // When launch params is not null, we always defer to its windowing mode. Sometimes // it could be unspecified, which indicates it should inherit windowing mode from // display. windowingMode = launchParams.mWindowingMode; } else { windowingMode = options != null ? options.getLaunchWindowingMode() : r.getWindowingMode(); } return activityDisplay.createStack( options != null ? options.getLaunchWindowingMode() : r.getWindowingMode(), windowingMode, options != null ? options.getLaunchActivityType() : r.getActivityType(), true /*onTop*/); } Loading @@ -2563,8 +2577,10 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } ActivityStack getValidLaunchStackOnDisplay(int displayId, @NonNull ActivityRecord r, @Nullable ActivityOptions options) { return getValidLaunchStackOnDisplay(displayId, r, null /* candidateTask */, options); @Nullable ActivityOptions options, @Nullable LaunchParamsController.LaunchParams launchParams) { return getValidLaunchStackOnDisplay(displayId, r, null /* candidateTask */, options, launchParams); } // TODO: Can probably be consolidated into getLaunchStack()... Loading Loading @@ -2644,7 +2660,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D continue; } final ActivityStack stack = getValidLaunchStackOnDisplay(display.mDisplayId, r, null /* options */); null /* options */, null /* launchParams */); if (stack != null) { return stack; } Loading
services/core/java/com/android/server/wm/ActivityStarter.java +8 −4 Original line number Diff line number Diff line Loading @@ -2145,7 +2145,7 @@ class ActivityStarter { if (mTargetStack == null && targetDisplayId != sourceStack.mDisplayId) { // Can't use target display, lets find a stack on the source display. mTargetStack = mSupervisor.getValidLaunchStackOnDisplay( sourceStack.mDisplayId, mStartActivity, mOptions); sourceStack.mDisplayId, mStartActivity, mOptions, mLaunchParams); } if (mTargetStack == null) { // There are no suitable stacks on the target and source display(s). Look on all Loading Loading @@ -2368,7 +2368,8 @@ class ActivityStarter { if (mPreferredDisplayId != DEFAULT_DISPLAY) { // Try to put the activity in a stack on a secondary display. stack = mSupervisor.getValidLaunchStackOnDisplay(mPreferredDisplayId, r, aOptions); stack = mSupervisor.getValidLaunchStackOnDisplay(mPreferredDisplayId, r, aOptions, mLaunchParams); if (stack == null) { // If source display is not suitable - look for topmost valid stack in the system. if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG_FOCUS, Loading Loading @@ -2432,9 +2433,12 @@ class ActivityStarter { || mPreferredDisplayId != DEFAULT_DISPLAY) { // We don't pass in the default display id into the get launch stack call so it can do a // full resolution. final int candidateDisplay = mLaunchParams.mPreferredDisplayId = mPreferredDisplayId != DEFAULT_DISPLAY ? mPreferredDisplayId : INVALID_DISPLAY; return mSupervisor.getLaunchStack(r, aOptions, task, ON_TOP, candidateDisplay); final ActivityStack stack = mSupervisor.getLaunchStack(r, aOptions, task, ON_TOP, mLaunchParams); mLaunchParams.mPreferredDisplayId = mPreferredDisplayId; return stack; } // Otherwise handle adjacent launch. Loading
services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +1 −1 Original line number Diff line number Diff line Loading @@ -346,7 +346,7 @@ public class ActivityStarterTests extends ActivityTestsBase { doReturn(stack).when(mService.mStackSupervisor) .getLaunchStack(any(), any(), any(), anyBoolean()); doReturn(stack).when(mService.mStackSupervisor) .getLaunchStack(any(), any(), any(), anyBoolean(), anyInt()); .getLaunchStack(any(), any(), any(), anyBoolean(), any()); } // Set up mock package manager internal and make sure no unmocked methods are called Loading