Loading services/core/java/com/android/server/wm/ActivityStarter.java +10 −12 Original line number Diff line number Diff line Loading @@ -194,7 +194,6 @@ class ActivityStarter { private Task mTargetTask; private boolean mMovedToFront; private boolean mNoAnimation; private boolean mKeepCurTransition; private boolean mAvoidMoveToFront; private boolean mFrozeTaskList; private boolean mTransientLaunch; Loading Loading @@ -593,7 +592,6 @@ class ActivityStarter { mTargetRootTask = starter.mTargetRootTask; mMovedToFront = starter.mMovedToFront; mNoAnimation = starter.mNoAnimation; mKeepCurTransition = starter.mKeepCurTransition; mAvoidMoveToFront = starter.mAvoidMoveToFront; mFrozeTaskList = starter.mFrozeTaskList; Loading Loading @@ -1708,6 +1706,8 @@ class ActivityStarter { mIntent.setFlags(mLaunchFlags); // Get top task at beginning because the order may be changed when reusing existing task. final Task prevTopTask = mPreferredTaskDisplayArea.getFocusedRootTask(); final Task reusedTask = getReusableTask(); // If requested, freeze the task list Loading Loading @@ -1787,24 +1787,23 @@ class ActivityStarter { UserHandle.getAppId(mStartActivity.info.applicationInfo.uid) /*recipient*/, resultToUid /*visible*/, true /*direct*/); } final Task startedTask = mStartActivity.getTask(); if (newTask) { EventLogTags.writeWmCreateTask(mStartActivity.mUserId, mStartActivity.getTask().mTaskId); EventLogTags.writeWmCreateTask(mStartActivity.mUserId, startedTask.mTaskId); } mStartActivity.logStartActivity( EventLogTags.WM_CREATE_ACTIVITY, mStartActivity.getTask()); mStartActivity.logStartActivity(EventLogTags.WM_CREATE_ACTIVITY, startedTask); mStartActivity.getTaskFragment().clearLastPausedActivity(); mRootWindowContainer.startPowerModeLaunchIfNeeded( false /* forceSend */, mStartActivity); final boolean isTaskSwitch = startedTask != prevTopTask; mTargetRootTask.startActivityLocked(mStartActivity, topRootTask != null ? topRootTask.getTopNonFinishingActivity() : null, newTask, mKeepCurTransition, mOptions, sourceRecord); isTaskSwitch, mOptions, sourceRecord); if (mDoResume) { final ActivityRecord topTaskActivity = mStartActivity.getTask().topRunningActivityLocked(); final ActivityRecord topTaskActivity = startedTask.topRunningActivityLocked(); if (!mTargetRootTask.isTopActivityFocusable() || (topTaskActivity != null && topTaskActivity.isTaskOverlay() && mStartActivity != topTaskActivity)) { Loading Loading @@ -1838,8 +1837,8 @@ class ActivityStarter { mRootWindowContainer.updateUserRootTask(mStartActivity.mUserId, mTargetRootTask); // Update the recent tasks list immediately when the activity starts mSupervisor.mRecentTasks.add(mStartActivity.getTask()); mSupervisor.handleNonResizableTaskIfNeeded(mStartActivity.getTask(), mSupervisor.mRecentTasks.add(startedTask); mSupervisor.handleNonResizableTaskIfNeeded(startedTask, mPreferredWindowingMode, mPreferredTaskDisplayArea, mTargetRootTask); return START_SUCCESS; Loading Loading @@ -2278,7 +2277,6 @@ class ActivityStarter { mTargetTask = null; mMovedToFront = false; mNoAnimation = false; mKeepCurTransition = false; mAvoidMoveToFront = false; mFrozeTaskList = false; mTransientLaunch = false; Loading services/core/java/com/android/server/wm/Task.java +2 −6 Original line number Diff line number Diff line Loading @@ -5058,7 +5058,7 @@ class Task extends TaskFragment { } void startActivityLocked(ActivityRecord r, @Nullable ActivityRecord focusedTopActivity, boolean newTask, boolean keepCurTransition, ActivityOptions options, boolean newTask, boolean isTaskSwitch, ActivityOptions options, @Nullable ActivityRecord sourceRecord) { Task rTask = r.getTask(); final boolean allowMoveToFront = options == null || !options.getAvoidMoveToFront(); Loading Loading @@ -5179,7 +5179,7 @@ class Task extends TaskFragment { } } r.showStartingWindow(prev, newTask, isTaskSwitch(r, focusedTopActivity), r.showStartingWindow(prev, newTask, isTaskSwitch, true /* startActivity */, sourceRecord); } } else { Loading Loading @@ -5213,10 +5213,6 @@ class Task extends TaskFragment { return true; } private boolean isTaskSwitch(ActivityRecord r, ActivityRecord topFocusedActivity) { return topFocusedActivity != null && r.getTask() != topFocusedActivity.getTask(); } /** * Reset the task by reparenting the activities that have same affinity to the task or * reparenting the activities that have different affinityies out of the task, while these Loading services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +2 −2 Original line number Diff line number Diff line Loading @@ -2600,7 +2600,7 @@ public class ActivityRecordTests extends WindowTestsBase { // Make mVisibleSetFromTransferredStartingWindow true. final ActivityRecord middle = new ActivityBuilder(mAtm).setTask(task).build(); task.startActivityLocked(middle, null /* focusedTopActivity */, false /* newTask */, false /* keepCurTransition */, null /* options */, false /* newTask */, false /* isTaskSwitch */, null /* options */, null /* sourceRecord */); middle.makeFinishingLocked(); Loading @@ -2613,7 +2613,7 @@ public class ActivityRecordTests extends WindowTestsBase { top.setVisible(false); // The finishing middle should be able to transfer starting window to top. task.startActivityLocked(top, null /* focusedTopActivity */, false /* newTask */, false /* keepCurTransition */, null /* options */, false /* newTask */, false /* isTaskSwitch */, null /* options */, null /* sourceRecord */); assertNull(middle.mStartingWindow); Loading services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +12 −8 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK; import static android.content.Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static android.content.Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED; Loading Loading @@ -755,12 +756,12 @@ public class ActivityStarterTests extends WindowTestsBase { } /** * This test ensures that {@link ActivityStarter#setTargetStackAndMoveToFrontIfNeeded} will * move the existing task to front if the current focused stack doesn't have running task. * This test ensures that {@link ActivityStarter#setTargetRootTaskIfNeeded} will * move the existing task to front if the current focused root task doesn't have running task. */ @Test public void testBringTaskToFrontWhenFocusedStackIsFinising() { // Put 2 tasks in the same stack (simulate the behavior of home stack). public void testBringTaskToFrontWhenFocusedTaskIsFinishing() { // Put 2 tasks in the same root task (simulate the behavior of home root task). final Task rootTask = new TaskBuilder(mSupervisor).build(); final ActivityRecord activity = new ActivityBuilder(mAtm) .setParentTask(rootTask) Loading @@ -777,13 +778,16 @@ public class ActivityStarterTests extends WindowTestsBase { assertEquals(finishingTopActivity, mRootWindowContainer.topRunningActivity()); finishingTopActivity.finishing = true; // Launch the bottom task of the target stack. // Launch the bottom task of the target root task. prepareStarter(FLAG_ACTIVITY_NEW_TASK, false /* mockGetLaunchStack */) .setReason("testBringTaskToFrontWhenTopStackIsFinising") .setIntent(activity.intent) .setReason("testBringTaskToFrontWhenFocusedTaskIsFinishing") .setIntent(activity.intent.addFlags( FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK)) .execute(); verify(activity.getRootTask()).startActivityLocked(any(), any(), anyBoolean(), eq(true) /* isTaskSwitch */, any(), any()); // The hierarchies of the activity should move to front. assertEquals(activity, mRootWindowContainer.topRunningActivity()); assertEquals(activity.getTask(), mRootWindowContainer.topRunningActivity().getTask()); } /** Loading Loading
services/core/java/com/android/server/wm/ActivityStarter.java +10 −12 Original line number Diff line number Diff line Loading @@ -194,7 +194,6 @@ class ActivityStarter { private Task mTargetTask; private boolean mMovedToFront; private boolean mNoAnimation; private boolean mKeepCurTransition; private boolean mAvoidMoveToFront; private boolean mFrozeTaskList; private boolean mTransientLaunch; Loading Loading @@ -593,7 +592,6 @@ class ActivityStarter { mTargetRootTask = starter.mTargetRootTask; mMovedToFront = starter.mMovedToFront; mNoAnimation = starter.mNoAnimation; mKeepCurTransition = starter.mKeepCurTransition; mAvoidMoveToFront = starter.mAvoidMoveToFront; mFrozeTaskList = starter.mFrozeTaskList; Loading Loading @@ -1708,6 +1706,8 @@ class ActivityStarter { mIntent.setFlags(mLaunchFlags); // Get top task at beginning because the order may be changed when reusing existing task. final Task prevTopTask = mPreferredTaskDisplayArea.getFocusedRootTask(); final Task reusedTask = getReusableTask(); // If requested, freeze the task list Loading Loading @@ -1787,24 +1787,23 @@ class ActivityStarter { UserHandle.getAppId(mStartActivity.info.applicationInfo.uid) /*recipient*/, resultToUid /*visible*/, true /*direct*/); } final Task startedTask = mStartActivity.getTask(); if (newTask) { EventLogTags.writeWmCreateTask(mStartActivity.mUserId, mStartActivity.getTask().mTaskId); EventLogTags.writeWmCreateTask(mStartActivity.mUserId, startedTask.mTaskId); } mStartActivity.logStartActivity( EventLogTags.WM_CREATE_ACTIVITY, mStartActivity.getTask()); mStartActivity.logStartActivity(EventLogTags.WM_CREATE_ACTIVITY, startedTask); mStartActivity.getTaskFragment().clearLastPausedActivity(); mRootWindowContainer.startPowerModeLaunchIfNeeded( false /* forceSend */, mStartActivity); final boolean isTaskSwitch = startedTask != prevTopTask; mTargetRootTask.startActivityLocked(mStartActivity, topRootTask != null ? topRootTask.getTopNonFinishingActivity() : null, newTask, mKeepCurTransition, mOptions, sourceRecord); isTaskSwitch, mOptions, sourceRecord); if (mDoResume) { final ActivityRecord topTaskActivity = mStartActivity.getTask().topRunningActivityLocked(); final ActivityRecord topTaskActivity = startedTask.topRunningActivityLocked(); if (!mTargetRootTask.isTopActivityFocusable() || (topTaskActivity != null && topTaskActivity.isTaskOverlay() && mStartActivity != topTaskActivity)) { Loading Loading @@ -1838,8 +1837,8 @@ class ActivityStarter { mRootWindowContainer.updateUserRootTask(mStartActivity.mUserId, mTargetRootTask); // Update the recent tasks list immediately when the activity starts mSupervisor.mRecentTasks.add(mStartActivity.getTask()); mSupervisor.handleNonResizableTaskIfNeeded(mStartActivity.getTask(), mSupervisor.mRecentTasks.add(startedTask); mSupervisor.handleNonResizableTaskIfNeeded(startedTask, mPreferredWindowingMode, mPreferredTaskDisplayArea, mTargetRootTask); return START_SUCCESS; Loading Loading @@ -2278,7 +2277,6 @@ class ActivityStarter { mTargetTask = null; mMovedToFront = false; mNoAnimation = false; mKeepCurTransition = false; mAvoidMoveToFront = false; mFrozeTaskList = false; mTransientLaunch = false; Loading
services/core/java/com/android/server/wm/Task.java +2 −6 Original line number Diff line number Diff line Loading @@ -5058,7 +5058,7 @@ class Task extends TaskFragment { } void startActivityLocked(ActivityRecord r, @Nullable ActivityRecord focusedTopActivity, boolean newTask, boolean keepCurTransition, ActivityOptions options, boolean newTask, boolean isTaskSwitch, ActivityOptions options, @Nullable ActivityRecord sourceRecord) { Task rTask = r.getTask(); final boolean allowMoveToFront = options == null || !options.getAvoidMoveToFront(); Loading Loading @@ -5179,7 +5179,7 @@ class Task extends TaskFragment { } } r.showStartingWindow(prev, newTask, isTaskSwitch(r, focusedTopActivity), r.showStartingWindow(prev, newTask, isTaskSwitch, true /* startActivity */, sourceRecord); } } else { Loading Loading @@ -5213,10 +5213,6 @@ class Task extends TaskFragment { return true; } private boolean isTaskSwitch(ActivityRecord r, ActivityRecord topFocusedActivity) { return topFocusedActivity != null && r.getTask() != topFocusedActivity.getTask(); } /** * Reset the task by reparenting the activities that have same affinity to the task or * reparenting the activities that have different affinityies out of the task, while these Loading
services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +2 −2 Original line number Diff line number Diff line Loading @@ -2600,7 +2600,7 @@ public class ActivityRecordTests extends WindowTestsBase { // Make mVisibleSetFromTransferredStartingWindow true. final ActivityRecord middle = new ActivityBuilder(mAtm).setTask(task).build(); task.startActivityLocked(middle, null /* focusedTopActivity */, false /* newTask */, false /* keepCurTransition */, null /* options */, false /* newTask */, false /* isTaskSwitch */, null /* options */, null /* sourceRecord */); middle.makeFinishingLocked(); Loading @@ -2613,7 +2613,7 @@ public class ActivityRecordTests extends WindowTestsBase { top.setVisible(false); // The finishing middle should be able to transfer starting window to top. task.startActivityLocked(top, null /* focusedTopActivity */, false /* newTask */, false /* keepCurTransition */, null /* options */, false /* newTask */, false /* isTaskSwitch */, null /* options */, null /* sourceRecord */); assertNull(middle.mStartingWindow); Loading
services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +12 −8 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK; import static android.content.Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static android.content.Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED; Loading Loading @@ -755,12 +756,12 @@ public class ActivityStarterTests extends WindowTestsBase { } /** * This test ensures that {@link ActivityStarter#setTargetStackAndMoveToFrontIfNeeded} will * move the existing task to front if the current focused stack doesn't have running task. * This test ensures that {@link ActivityStarter#setTargetRootTaskIfNeeded} will * move the existing task to front if the current focused root task doesn't have running task. */ @Test public void testBringTaskToFrontWhenFocusedStackIsFinising() { // Put 2 tasks in the same stack (simulate the behavior of home stack). public void testBringTaskToFrontWhenFocusedTaskIsFinishing() { // Put 2 tasks in the same root task (simulate the behavior of home root task). final Task rootTask = new TaskBuilder(mSupervisor).build(); final ActivityRecord activity = new ActivityBuilder(mAtm) .setParentTask(rootTask) Loading @@ -777,13 +778,16 @@ public class ActivityStarterTests extends WindowTestsBase { assertEquals(finishingTopActivity, mRootWindowContainer.topRunningActivity()); finishingTopActivity.finishing = true; // Launch the bottom task of the target stack. // Launch the bottom task of the target root task. prepareStarter(FLAG_ACTIVITY_NEW_TASK, false /* mockGetLaunchStack */) .setReason("testBringTaskToFrontWhenTopStackIsFinising") .setIntent(activity.intent) .setReason("testBringTaskToFrontWhenFocusedTaskIsFinishing") .setIntent(activity.intent.addFlags( FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK)) .execute(); verify(activity.getRootTask()).startActivityLocked(any(), any(), anyBoolean(), eq(true) /* isTaskSwitch */, any(), any()); // The hierarchies of the activity should move to front. assertEquals(activity, mRootWindowContainer.topRunningActivity()); assertEquals(activity.getTask(), mRootWindowContainer.topRunningActivity().getTask()); } /** Loading