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

Commit 7b3c8dde authored by Evan Rosky's avatar Evan Rosky
Browse files

Only set SYNC flag if >1 track

While technically it's true that a transition is sync
if another is running in the same track, tracks already
imply sync between their constituents, so it's redundant.
The player also interprets SYNC as "stop everything
immediately" which isn't actually useful unless there are
multiple active tracks.

So, only set the sync flag when there are >1 tracks.

Bug: 296242449
Test: atest TransitionTests#testNoSyncFlagIfOneTrack
Change-Id: I61d97542825627beba4dbfa77f1cff0cf1e86ab8
parent df13d6f7
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -1124,14 +1124,15 @@ class TransitionController {
                        + "track #%d", transition.getSyncId(), track);
            }
        }
        if (sync) {
        transition.mAnimationTrack = track;
        info.setTrack(track);
        mTrackCount = Math.max(mTrackCount, track + 1);
        if (sync && mTrackCount > 1) {
            // If there are >1 tracks, mark as sync so that all tracks finish.
            info.setFlags(info.getFlags() | TransitionInfo.FLAG_SYNC);
            ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Marking #%d animation as SYNC.",
                    transition.getSyncId());
        }
        transition.mAnimationTrack = track;
        info.setTrack(track);
        mTrackCount = Math.max(mTrackCount, track + 1);
    }

    void updateAnimatingState(SurfaceControl.Transaction t) {
+32 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import static android.window.TransitionInfo.FLAG_IS_BEHIND_STARTING_WINDOW;
import static android.window.TransitionInfo.FLAG_IS_WALLPAPER;
import static android.window.TransitionInfo.FLAG_MOVED_TO_TOP;
import static android.window.TransitionInfo.FLAG_SHOW_WALLPAPER;
import static android.window.TransitionInfo.FLAG_SYNC;
import static android.window.TransitionInfo.FLAG_TRANSLUCENT;
import static android.window.TransitionInfo.isIndependent;

@@ -2384,6 +2385,37 @@ public class TransitionTests extends WindowTestsBase {
        assertFalse(controller.isCollecting());
    }

    @Test
    public void testNoSyncFlagIfOneTrack() {
        final TransitionController controller = mAtm.getTransitionController();
        final TestTransitionPlayer player = registerTestTransitionPlayer();

        mSyncEngine = createTestBLASTSyncEngine();
        controller.setSyncEngine(mSyncEngine);

        final Transition transitA = createTestTransition(TRANSIT_OPEN, controller);
        final Transition transitB = createTestTransition(TRANSIT_OPEN, controller);
        final Transition transitC = createTestTransition(TRANSIT_OPEN, controller);

        controller.startCollectOrQueue(transitA, (deferred) -> {});
        controller.startCollectOrQueue(transitB, (deferred) -> {});
        controller.startCollectOrQueue(transitC, (deferred) -> {});

        // Verify that, as-long as there is <= 1 track, we won't get a SYNC flag
        transitA.start();
        transitA.setAllReady();
        mSyncEngine.tryFinishForTest(transitA.getSyncId());
        assertTrue((player.mLastReady.getFlags() & FLAG_SYNC) == 0);
        transitB.start();
        transitB.setAllReady();
        mSyncEngine.tryFinishForTest(transitB.getSyncId());
        assertTrue((player.mLastReady.getFlags() & FLAG_SYNC) == 0);
        transitC.start();
        transitC.setAllReady();
        mSyncEngine.tryFinishForTest(transitC.getSyncId());
        assertTrue((player.mLastReady.getFlags() & FLAG_SYNC) == 0);
    }

    private static void makeTaskOrganized(Task... tasks) {
        final ITaskOrganizer organizer = mock(ITaskOrganizer.class);
        for (Task t : tasks) {