summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerry Chang <chenghsiuchang@google.com>2021-07-15 10:04:47 +0000
committerJerry Chang <chenghsiuchang@google.com>2021-07-19 08:30:47 +0000
commitd2fd498303bbd0602d320eb15cf74dbcb4a26c3f (patch)
tree7c0e631d3cb0dd2027ee2271c59a056d5bfee6b4
parentae942fcf7de86756b406d4b7a2f6827668f0968e (diff)
Propagate launch root task for consecutive launch
Propagate launch root task for consecutive launch to ensure trampoline activities will be launched into the same root task. And prevent the indicated target-root-task been overrided with the root of reusable task. Fix: 193095759 Test: manul check trampoline activities will be launched into indicated root task. Test: atest ActivityMetricsLaunchObserverTests# \ testConsecutiveLaunchNewTask Change-Id: Ic75c7efbf120562fc284c6ee12d49d2f736a42ec
-rw-r--r--services/core/java/com/android/server/wm/ActivityMetricsLogger.java5
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java12
-rw-r--r--services/core/java/com/android/server/wm/ActivityStarter.java25
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java7
4 files changed, 42 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
index b2e3fcbdccfb..b1163c47d607 100644
--- a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
+++ b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
@@ -300,9 +300,12 @@ class ActivityMetricsLogger {
return;
}
if (mLastLaunchedActivity != null) {
- // Transfer the launch cookie because it is a consecutive launch event.
+ // Transfer the launch cookie and launch root task because it is a consecutive
+ // launch event.
r.mLaunchCookie = mLastLaunchedActivity.mLaunchCookie;
mLastLaunchedActivity.mLaunchCookie = null;
+ r.mLaunchRootTask = mLastLaunchedActivity.mLaunchRootTask;
+ mLastLaunchedActivity.mLaunchRootTask = null;
}
mLastLaunchedActivity = r;
if (!r.noDisplay && !r.isReportedDrawn()) {
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 0d439456c3ac..6e0117459331 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -830,6 +830,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// Tracking cookie for the launch of this activity and it's task.
IBinder mLaunchCookie;
+ // Tracking indicated launch root in order to propagate it among trampoline activities.
+ WindowContainerToken mLaunchRootTask;
+
// Entering PiP is usually done in two phases, we put the task into pinned mode first and
// SystemUi sets the pinned mode on activity after transition is done.
boolean mWaitForEnteringPinnedMode;
@@ -1040,6 +1043,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
pw.print("launchCookie=");
pw.println(mLaunchCookie);
}
+ if (mLaunchRootTask != null) {
+ pw.print(prefix);
+ pw.print("mLaunchRootTask=");
+ pw.println(mLaunchRootTask);
+ }
pw.print(prefix); pw.print("mHaveState="); pw.print(mHaveState);
pw.print(" mIcicle="); pw.println(mIcicle);
pw.print(prefix); pw.print("state="); pw.print(mState);
@@ -1794,6 +1802,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
? (TaskDisplayArea) WindowContainer.fromBinder(daToken.asBinder()) : null;
mHandoverLaunchDisplayId = options.getLaunchDisplayId();
mLaunchCookie = options.getLaunchCookie();
+ mLaunchRootTask = options.getLaunchRootTask();
}
mPersistentState = persistentState;
@@ -5962,6 +5971,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
if (task != null) {
task.setHasBeenVisible(true);
}
+ // Clear indicated launch root task because there's no trampoline activity to expect after
+ // the windows are drawn.
+ mLaunchRootTask = null;
}
/** Called when the windows associated app window container are visible. */
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 5c9fdc3580e8..63fb4bf5c12e 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -2038,7 +2038,7 @@ class ActivityStarter {
// We didn't do anything... but it was needed (a.k.a., client don't use that intent!)
// And for paranoia, make sure we have correctly resumed the top activity.
resumeTargetRootTaskIfNeeded();
-
+
mLastStartActivityRecord = targetTaskTop;
return mMovedToFront ? START_TASK_TO_FRONT : START_DELIVERED_TO_TOP;
}
@@ -2585,13 +2585,28 @@ class ActivityStarter {
/**
* Figure out which task and activity to bring to front when we have found an existing matching
* activity record in history. May also clear the task if needed.
+ *
* @param intentActivity Existing matching activity.
* @return {@link ActivityRecord} brought to front.
*/
private void setTargetRootTaskIfNeeded(ActivityRecord intentActivity) {
- mTargetRootTask = intentActivity.getRootTask();
intentActivity.getTaskFragment().clearLastPausedActivity();
Task intentTask = intentActivity.getTask();
+
+ // Only update the target-root-task when it is not indicated.
+ if (mTargetRootTask == null) {
+ if (mSourceRecord != null && mSourceRecord.mLaunchRootTask != null) {
+ // Inherit the target-root-task from source to ensure trampoline activities will be
+ // launched into the same root task.
+ mTargetRootTask = Task.fromWindowContainerToken(mSourceRecord.mLaunchRootTask);
+ } else {
+ final Task launchRootTask =
+ getLaunchRootTask(mStartActivity, mLaunchFlags, intentTask, mOptions);
+ mTargetRootTask =
+ launchRootTask != null ? launchRootTask : intentActivity.getRootTask();
+ }
+ }
+
// If the target task is not in the front, then we need to bring it to the front...
// except... well, with SINGLE_TASK_LAUNCH it's not entirely clear. We'd like to have
// the same behavior as if a new instance was being started, which means not bringing it
@@ -2619,9 +2634,7 @@ class ActivityStarter {
intentActivity.setTaskToAffiliateWith(mSourceRecord.getTask());
}
- final Task launchRootTask = getLaunchRootTask(mStartActivity, mLaunchFlags,
- intentTask, mOptions);
- if (launchRootTask == null || launchRootTask == mTargetRootTask) {
+ if (mTargetRootTask == intentActivity.getRootTask()) {
// TODO(b/151572268): Figure out a better way to move tasks in above 2-levels
// tasks hierarchies.
if (mTargetRootTask != intentTask
@@ -2645,7 +2658,7 @@ class ActivityStarter {
"bringingFoundTaskToFront");
mMovedToFront = !wasTopOfVisibleRootTask;
} else {
- intentTask.reparent(launchRootTask, ON_TOP, REPARENT_MOVE_ROOT_TASK_TO_FRONT,
+ intentTask.reparent(mTargetRootTask, ON_TOP, REPARENT_MOVE_ROOT_TASK_TO_FRONT,
ANIMATE, DEFER_RESUME, "reparentToTargetRootTask");
mMovedToFront = true;
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java
index 697d1021889e..fa1f4aca8642 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java
@@ -44,6 +44,7 @@ import android.os.IBinder;
import android.os.SystemClock;
import android.platform.test.annotations.Presubmit;
import android.util.ArrayMap;
+import android.window.WindowContainerToken;
import androidx.test.filters.SmallTest;
@@ -449,8 +450,10 @@ public class ActivityMetricsLaunchObserverTests extends WindowTestsBase {
@Test
public void testConsecutiveLaunchNewTask() {
final IBinder launchCookie = mock(IBinder.class);
+ final WindowContainerToken launchRootTask = mock(WindowContainerToken.class);
mTrampolineActivity.noDisplay = true;
mTrampolineActivity.mLaunchCookie = launchCookie;
+ mTrampolineActivity.mLaunchRootTask = launchRootTask;
onActivityLaunched(mTrampolineActivity);
final ActivityRecord activityOnNewTask = new ActivityBuilder(mAtm)
.setCreateTask(true)
@@ -464,6 +467,10 @@ public class ActivityMetricsLaunchObserverTests extends WindowTestsBase {
mTrampolineActivity.mLaunchCookie).isNull();
assertWithMessage("The last launch task has the transferred cookie").that(
activityOnNewTask.mLaunchCookie).isEqualTo(launchCookie);
+ assertWithMessage("Trampoline's launch root task must be transferred").that(
+ mTrampolineActivity.mLaunchRootTask).isNull();
+ assertWithMessage("The last launch task has the transferred launch root task").that(
+ activityOnNewTask.mLaunchRootTask).isEqualTo(launchRootTask);
}
@Test