Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8c33a548 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Consider LaunchParams when creating new stack."

parents 45855e50 20d9e2fa
Loading
Loading
Loading
Loading
+35 −19
Original line number Diff line number Diff line
@@ -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;
@@ -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 */);
    }

    /**
@@ -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;
@@ -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
@@ -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;
                }
@@ -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;
                }
@@ -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(
@@ -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*/);
        }
@@ -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()...
@@ -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;
            }
+8 −4
Original line number Diff line number Diff line
@@ -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
@@ -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,
@@ -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.

+1 −1
Original line number Diff line number Diff line
@@ -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