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
This commit is contained in:
Evan Rosky
2023-08-17 09:02:16 -07:00
parent df13d6f717
commit 7b3c8ddea7
2 changed files with 37 additions and 4 deletions

View File

@@ -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) {

View File

@@ -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) {