Set transientlaunch before starting transient activity
This makes all transient-launch work the same as recents
transient-launch. Without this, just starting the activity
will cause focus to transfer which violates the transient
launch contract.
This also fixes the omission of transient-hide for a
newly-launched transient activity. Since there's no
restore-below, it will just add all visible tasks to
transient-hide.
Bug: 287534499
Test: Use transient-launch for a non-recents activity and
observe it not prematurely transferring focus.
Change-Id: I8eb153da90f8ccf9c57b5d97973a5dcaa9f50963
This commit is contained in:
@@ -1588,21 +1588,14 @@ class ActivityStarter {
|
||||
newTransition = null;
|
||||
}
|
||||
}
|
||||
if (isTransientLaunch) {
|
||||
if (forceTransientTransition) {
|
||||
transitionController.collect(mLastStartActivityRecord);
|
||||
transitionController.collect(mPriorAboveTask);
|
||||
}
|
||||
// `started` isn't guaranteed to be the actual relevant activity, so we must wait
|
||||
// until after we launched to identify the relevant activity.
|
||||
transitionController.setTransientLaunch(mLastStartActivityRecord, mPriorAboveTask);
|
||||
if (forceTransientTransition) {
|
||||
final DisplayContent dc = mLastStartActivityRecord.getDisplayContent();
|
||||
// update wallpaper target to TransientHide
|
||||
dc.mWallpaperController.adjustWallpaperWindows();
|
||||
// execute transition because there is no change
|
||||
transitionController.setReady(dc, true /* ready */);
|
||||
}
|
||||
if (forceTransientTransition) {
|
||||
transitionController.collect(mLastStartActivityRecord);
|
||||
transitionController.collect(mPriorAboveTask);
|
||||
final DisplayContent dc = mLastStartActivityRecord.getDisplayContent();
|
||||
// update wallpaper target to TransientHide
|
||||
dc.mWallpaperController.adjustWallpaperWindows();
|
||||
// execute transition because there is no change
|
||||
transitionController.setReady(dc, true /* ready */);
|
||||
}
|
||||
if (!userLeaving) {
|
||||
// no-user-leaving implies not entering PiP.
|
||||
@@ -1712,6 +1705,7 @@ class ActivityStarter {
|
||||
activity.destroyIfPossible("Removes redundant singleInstance");
|
||||
}
|
||||
}
|
||||
recordTransientLaunchIfNeeded(targetTaskTop);
|
||||
// Recycle the target task for this launch.
|
||||
startResult = recycleTask(targetTask, targetTaskTop, reusedTask, intentGrants);
|
||||
if (startResult != START_SUCCESS) {
|
||||
@@ -1743,6 +1737,9 @@ class ActivityStarter {
|
||||
addOrReparentStartingActivity(targetTask, "adding to task");
|
||||
}
|
||||
|
||||
// After activity is attached to task, but before actual start
|
||||
recordTransientLaunchIfNeeded(mLastStartActivityRecord);
|
||||
|
||||
if (!mAvoidMoveToFront && mDoResume) {
|
||||
mTargetRootTask.getRootTask().moveToFront("reuseOrNewTask", targetTask);
|
||||
if (!mTargetRootTask.isTopRootTaskInDisplayArea() && mService.isDreaming()
|
||||
@@ -1839,6 +1836,14 @@ class ActivityStarter {
|
||||
return START_SUCCESS;
|
||||
}
|
||||
|
||||
private void recordTransientLaunchIfNeeded(ActivityRecord r) {
|
||||
if (r == null || !mTransientLaunch) return;
|
||||
final TransitionController controller = r.mTransitionController;
|
||||
if (controller.isCollecting() && !controller.isTransientCollect(r)) {
|
||||
controller.setTransientLaunch(r, mPriorAboveTask);
|
||||
}
|
||||
}
|
||||
|
||||
/** Returns the leaf task where the target activity may be placed. */
|
||||
private Task computeTargetTask() {
|
||||
if (mStartActivity.resultTo == null && mInTask == null && !mAddingToTask
|
||||
|
||||
@@ -358,22 +358,30 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
|
||||
mTransientLaunches.put(activity, restoreBelow);
|
||||
setTransientLaunchToChanges(activity);
|
||||
|
||||
if (restoreBelow != null) {
|
||||
final Task transientRootTask = activity.getRootTask();
|
||||
final Task transientRootTask = activity.getRootTask();
|
||||
final WindowContainer<?> parent = restoreBelow != null ? restoreBelow.getParent()
|
||||
: (transientRootTask != null ? transientRootTask.getParent() : null);
|
||||
if (parent != null) {
|
||||
// Collect all visible tasks which can be occluded by the transient activity to
|
||||
// make sure they are in the participants so their visibilities can be updated when
|
||||
// finishing transition.
|
||||
((WindowContainer<?>) restoreBelow.getParent()).forAllTasks(t -> {
|
||||
parent.forAllTasks(t -> {
|
||||
// Skip transient-launch task
|
||||
if (t == transientRootTask) return false;
|
||||
if (t.isVisibleRequested() && !t.isAlwaysOnTop()
|
||||
&& !t.getWindowConfiguration().tasksAreFloating()) {
|
||||
if (t.isRootTask() && t != transientRootTask) {
|
||||
if (t.isRootTask()) {
|
||||
mTransientHideTasks.add(t);
|
||||
}
|
||||
if (t.isLeafTask()) {
|
||||
collect(t);
|
||||
}
|
||||
}
|
||||
return t == restoreBelow;
|
||||
return restoreBelow != null
|
||||
// Stop at the restoreBelow task
|
||||
? t == restoreBelow
|
||||
// Or stop at the last visible task if no restore-below (new task)
|
||||
: (t.isRootTask() && t.fillsParent());
|
||||
});
|
||||
// Add FLAG_ABOVE_TRANSIENT_LAUNCH to the tree of transient-hide tasks,
|
||||
// so ChangeInfo#hasChanged() can return true to report the transition info.
|
||||
|
||||
Reference in New Issue
Block a user