Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 93845662 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

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
parent dd218cba
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -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
+3 −0
Original line number Diff line number Diff line
@@ -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);
+3 −0
Original line number Diff line number Diff line
@@ -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));
    }