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

Commit ee6f81b2 authored by chaviw's avatar chaviw
Browse files

Set options on startingActivity instead of topActivity

When an activity is starting, it may not be the top activity yet.
If that occurs, the options are set on the wrong activity when
moveTaskToFrontLocked is called. Therefore, when the options on
the correct activity are consumed and cleared, the options are
still set on the incorrect activity. This can lead to incorrect
behavior.

Specifically, this was causing issues when a RemoteAnimation was
set for a starting activity. The activity that was previously on
top was also getting the options and expecting a RemoteAnimation.
This caused no animation to execute when the next expected animation
was a WindowAnimation because it was still waiting on the
RemoteAnimation

Fixes: 74611027
Test: Launch activity then background. Open second activity from
notification. When pressing back, window animation should start.

Change-Id: I2198d8e2a0b14fb060c71a265cc98f24ce018ef9
parent 4c6130dd
Loading
Loading
Loading
Loading
+9 −8
Original line number Diff line number Diff line
@@ -4511,11 +4511,11 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
        return hasVisibleActivities;
    }

    private void updateTransitLocked(int transit, ActivityOptions options) {
    private void updateTransitLocked(int transit, ActivityRecord starting,
            ActivityOptions options) {
        if (options != null) {
            ActivityRecord r = topRunningActivityLocked();
            if (r != null && !r.isState(RESUMED)) {
                r.updateOptionsLocked(options);
            if (starting != null && !starting.isState(RESUMED)) {
                starting.updateOptionsLocked(options);
            } else {
                ActivityOptions.abort(options);
            }
@@ -4552,8 +4552,9 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
        }
    }

    final void moveTaskToFrontLocked(TaskRecord tr, boolean noAnimation, ActivityOptions options,
            AppTimeTracker timeTracker, String reason) {
    final void moveTaskToFrontLocked(TaskRecord tr, ActivityRecord starting,
            boolean noAnimation, ActivityOptions options, AppTimeTracker timeTracker,
            String reason) {
        if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "moveTaskToFront: " + tr);

        final ActivityStack topStack = getDisplay().getTopStack();
@@ -4565,7 +4566,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
            if (noAnimation) {
                ActivityOptions.abort(options);
            } else {
                updateTransitLocked(TRANSIT_TASK_TO_FRONT, options);
                updateTransitLocked(TRANSIT_TASK_TO_FRONT, starting, options);
            }
            return;
        }
@@ -4603,7 +4604,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
            }
            ActivityOptions.abort(options);
        } else {
            updateTransitLocked(TRANSIT_TASK_TO_FRONT, options);
            updateTransitLocked(TRANSIT_TASK_TO_FRONT, starting, options);
        }
        // If a new task is moved to the front, then mark the existing top activity as supporting
        // picture-in-picture while paused only if the task would not be considered an oerlay on top
+1 −1
Original line number Diff line number Diff line
@@ -2196,7 +2196,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
        }

        final ActivityRecord r = task.getTopActivity();
        currentStack.moveTaskToFrontLocked(task, false /* noAnimation */, options,
        currentStack.moveTaskToFrontLocked(task, r, false /* noAnimation */, options,
                r == null ? null : r.appTimeTracker, reason);

        if (DEBUG_STACK) Slog.d(TAG_STACK,
+9 −8
Original line number Diff line number Diff line
@@ -1815,8 +1815,9 @@ class ActivityStarter {
                        // We only want to move to the front, if we aren't going to launch on a
                        // different stack. If we launch on a different stack, we will put the
                        // task on top there.
                        mTargetStack.moveTaskToFrontLocked(intentTask, mNoAnimation, mOptions,
                                mStartActivity.appTimeTracker, "bringingFoundTaskToFront");
                        mTargetStack.moveTaskToFrontLocked(intentTask, mStartActivity, mNoAnimation,
                                mOptions, mStartActivity.appTimeTracker,
                                "bringingFoundTaskToFront");
                        mMovedToFront = true;
                    } else if (launchStack.inSplitScreenWindowingMode()) {
                        if ((mLaunchFlags & FLAG_ACTIVITY_LAUNCH_ADJACENT) != 0) {
@@ -1830,7 +1831,7 @@ class ActivityStarter {
                            // We choose to move task to front instead of launching it adjacent
                            // when specific stack was requested explicitly and it appeared to be
                            // adjacent stack, but FLAG_ACTIVITY_LAUNCH_ADJACENT was not set.
                            mTargetStack.moveTaskToFrontLocked(intentTask,
                            mTargetStack.moveTaskToFrontLocked(intentTask, mStartActivity,
                                    mNoAnimation, mOptions, mStartActivity.appTimeTracker,
                                    "bringToFrontInsteadOfAdjacentLaunch");
                        }
@@ -2059,7 +2060,7 @@ class ActivityStarter {

        final TaskRecord topTask = mTargetStack.topTask();
        if (topTask != sourceTask && !mAvoidMoveToFront) {
            mTargetStack.moveTaskToFrontLocked(sourceTask, mNoAnimation, mOptions,
            mTargetStack.moveTaskToFrontLocked(sourceTask, mStartActivity, mNoAnimation, mOptions,
                    mStartActivity.appTimeTracker, "sourceTaskToFront");
        } else if (mDoResume) {
            mTargetStack.moveToFront("sourceStackToFront");
@@ -2125,7 +2126,7 @@ class ActivityStarter {
                && top.userId == mStartActivity.userId) {
            if ((mLaunchFlags & FLAG_ACTIVITY_SINGLE_TOP) != 0
                    || isLaunchModeOneOf(LAUNCH_SINGLE_TOP, LAUNCH_SINGLE_TASK)) {
                mTargetStack.moveTaskToFrontLocked(mInTask, mNoAnimation, mOptions,
                mTargetStack.moveTaskToFrontLocked(mInTask, mStartActivity, mNoAnimation, mOptions,
                        mStartActivity.appTimeTracker, "inTaskToFront");
                if ((mStartFlags & START_FLAG_ONLY_IF_NEEDED) != 0) {
                    // We don't need to start a new activity, and the client said not to do
@@ -2138,7 +2139,7 @@ class ActivityStarter {
        }

        if (!mAddingToTask) {
            mTargetStack.moveTaskToFrontLocked(mInTask, mNoAnimation, mOptions,
            mTargetStack.moveTaskToFrontLocked(mInTask, mStartActivity, mNoAnimation, mOptions,
                    mStartActivity.appTimeTracker, "inTaskToFront");
            // We don't actually want to have this activity added to the task, so just
            // stop here but still tell the caller that we consumed the intent.
@@ -2158,8 +2159,8 @@ class ActivityStarter {
            updateBounds(mInTask, mLaunchParams.mBounds);
        }

        mTargetStack.moveTaskToFrontLocked(
                mInTask, mNoAnimation, mOptions, mStartActivity.appTimeTracker, "inTaskToFront");
        mTargetStack.moveTaskToFrontLocked(mInTask, mStartActivity, mNoAnimation, mOptions,
                mStartActivity.appTimeTracker, "inTaskToFront");

        addOrReparentStartingActivity(mInTask, "setTaskFromInTask");
        if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity