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:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user