Update launch policy state when finishing transient launch

This aligns with the legacy implementation of
RecentsAnimation#finishAnimation:
If it is returning to home, it will call stopAppSwitches
and moveTaskToFront -> TDA#onChildPositionChanged
-> RWC#invalidateTaskLayers.

Legacy: move home to top at the end.
Shell: move home to top at the at the beginning.
So manual call rankTaskLayers for shell transition.

Then the background launch restriction can detect the valid states
for the launches after the swipe-to-home gesture is done.

Bug: 270383113
Test: atest TransitionTests#testTransientLaunch

Change-Id: I0987f2a0afa2bf599322d37acfe19d40060f7879
This commit is contained in:
Riddle Hsu
2023-03-01 15:34:41 +08:00
parent dd218cbaf8
commit 93845662e7
3 changed files with 15 additions and 3 deletions

View File

@@ -813,7 +813,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
}
boolean hasParticipatedDisplay = false;
boolean reportTaskStackChanged = false;
boolean hasVisibleTransientLaunch = false;
// Commit all going-invisible containers
for (int i = 0; i < mParticipants.size(); ++i) {
final WindowContainer<?> participant = mParticipants.valueAt(i);
@@ -856,7 +856,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
&& ar.isVisible()) {
// Transient launch was committed, so report enteringAnimation
ar.mEnteringAnimation = true;
reportTaskStackChanged = true;
hasVisibleTransientLaunch = true;
// Since transient launches don't automatically take focus, make sure we
// synchronize focus since we committed to the launch.
@@ -900,8 +900,14 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
}
}
if (reportTaskStackChanged) {
if (hasVisibleTransientLaunch) {
// Notify the change about the transient-below task that becomes invisible.
mController.mAtm.getTaskChangeNotificationController().notifyTaskStackChanged();
// Prevent spurious background app switches.
mController.mAtm.stopAppSwitches();
// The end of transient launch may not reorder task, so make sure to compute the latest
// task rank according to the current visibility.
mController.mAtm.mRootWindowContainer.rankTaskLayers();
}
// dispatch legacy callback in a different loop. This is because multiple legacy handlers

View File

@@ -1839,6 +1839,9 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
pw.print("F|");
}
}
if ((stateFlags & ACTIVITY_STATE_FLAG_HAS_ACTIVITY_IN_VISIBLE_TASK) != 0) {
pw.print("VT|");
}
final int taskLayer = stateFlags & ACTIVITY_STATE_FLAG_MASK_MIN_TASK_LAYER;
if (taskLayer != ACTIVITY_STATE_FLAG_MASK_MIN_TASK_LAYER) {
pw.print("taskLayer=" + taskLayer);

View File

@@ -1376,6 +1376,9 @@ public class TransitionTests extends WindowTestsBase {
enteringAnimReports.clear();
closeTransition.finishTransition();
assertEquals(ActivityTaskManagerService.APP_SWITCH_DISALLOW, mAtm.getBalAppSwitchesState());
assertFalse(activity1.app.hasActivityInVisibleTask());
verify(snapshotController, times(1)).recordSnapshot(eq(task1), eq(false));
assertTrue(enteringAnimReports.contains(activity2));
}