Merge "Check task switch by comparing the previous top task" into sc-v2-dev am: 045adab7b6
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15421190 Change-Id: I21dfb913795cdf0f850a57ba6f9cc5cf620af28a
This commit is contained in:
@@ -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;
|
||||
@@ -593,7 +592,6 @@ class ActivityStarter {
|
||||
mTargetRootTask = starter.mTargetRootTask;
|
||||
mMovedToFront = starter.mMovedToFront;
|
||||
mNoAnimation = starter.mNoAnimation;
|
||||
mKeepCurTransition = starter.mKeepCurTransition;
|
||||
mAvoidMoveToFront = starter.mAvoidMoveToFront;
|
||||
mFrozeTaskList = starter.mFrozeTaskList;
|
||||
|
||||
@@ -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
|
||||
@@ -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)) {
|
||||
@@ -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;
|
||||
@@ -2278,7 +2277,6 @@ class ActivityStarter {
|
||||
mTargetTask = null;
|
||||
mMovedToFront = false;
|
||||
mNoAnimation = false;
|
||||
mKeepCurTransition = false;
|
||||
mAvoidMoveToFront = false;
|
||||
mFrozeTaskList = false;
|
||||
mTransientLaunch = false;
|
||||
|
||||
@@ -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();
|
||||
@@ -5179,7 +5179,7 @@ class Task extends TaskFragment {
|
||||
}
|
||||
}
|
||||
|
||||
r.showStartingWindow(prev, newTask, isTaskSwitch(r, focusedTopActivity),
|
||||
r.showStartingWindow(prev, newTask, isTaskSwitch,
|
||||
true /* startActivity */, sourceRecord);
|
||||
}
|
||||
} else {
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
@@ -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)
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user