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

Commit 234f1105 authored by Jiaming Liu's avatar Jiaming Liu
Browse files

[AE] Allow scene transition for full-screeen TaskFragment

Bug: 425271528
Test: Manual; atest TransitionTests
Flag: EXEMPT bugfix
Change-Id: I595ff4db47d610b81f3c8e2c36a21f633af48361
parent f33bb495
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -2195,14 +2195,16 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
        final List<TransitionInfo.Change> changes = info.getChanges();
        for (int i = changes.size() - 1; i >= 0; --i) {
            final WindowContainer<?> container = mTargets.get(i).mContainer;
            final TransitionInfo.Change change = changes.get(i);
            if (container.asActivityRecord() != null
                    || shouldApplyAnimOptionsToTask(container.asTask())) {
                changes.get(i).setAnimationOptions(mOverrideOptions);
                changes.get(i).setBackgroundColor(mOverrideBackgroundColor);
                    || shouldApplyAnimOptionsToTask(container.asTask())
                    || shouldApplyAnimOptionsToFillParentTf(container.asTaskFragment(), change)) {
                change.setAnimationOptions(mOverrideOptions);
                change.setBackgroundColor(mOverrideBackgroundColor);
            } else if (shouldApplyAnimOptionsToEmbeddedTf(container.asTaskFragment())) {
                // We only override AnimationOptions because backgroundColor should be from
                // TaskFragmentAnimationParams.
                changes.get(i).setAnimationOptions(mOverrideOptions);
                change.setAnimationOptions(mOverrideOptions);
            }
        }
        updateActivityTargetForCrossProfileAnimation(info);
@@ -2218,6 +2220,17 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
        return animType == ANIM_SCENE_TRANSITION || mOverrideOptions.getOverrideTaskTransition();
    }

    private boolean shouldApplyAnimOptionsToFillParentTf(
            @Nullable TaskFragment taskFragment, @NonNull TransitionInfo.Change change) {
        if (taskFragment == null || !taskFragment.isEmbedded() || mOverrideOptions == null) {
            return false;
        }
        // Apply AnimationOptions to TaskFragment if it fills parent and the animation is a scene
        // transition.
        return change.hasFlags(FLAG_FILLS_TASK)
                && mOverrideOptions.getType() == ANIM_SCENE_TRANSITION;
    }

    private boolean shouldApplyAnimOptionsToEmbeddedTf(@Nullable TaskFragment taskFragment) {
        if (taskFragment == null || !taskFragment.isEmbedded()) {
            return false;
+43 −5
Original line number Diff line number Diff line
@@ -2118,8 +2118,9 @@ public class TransitionTests extends WindowTestsBase {
    }

    @Test
    public void testOverrideAnimationOptionsToInfoIfNecessary_sceneAnimOptions() {
        ActivityRecord r = initializeOverrideAnimationOptionsTest();
    public void testOverrideAnimationOptionsToInfoIfNecessary_sceneAnimOptions_fillParentTF() {
        ActivityRecord r = initializeOverrideAnimationOptionsTest(
                true /* fillParentTaskFragment */);
        TransitionInfo.AnimationOptions options = TransitionInfo.AnimationOptions
                .makeSceneTransitionAnimOptions();
        mTransition.setOverrideAnimation(options, r, null /* startCallback */,
@@ -2136,7 +2137,35 @@ public class TransitionTests extends WindowTestsBase {
                displayChange.getAnimationOptions());
        assertEquals("Task change's AnimationOptions must be overridden.",
                options, taskChange.getAnimationOptions());
        assertNull("Embedded TF change's AnimationOptions must not be overridden.",
        assertEquals(
                "Fill-parent embedded TF change's AnimationOptions must be overridden.",
                options, embeddedTfChange.getAnimationOptions());
        assertEquals("Activity change's AnimationOptions must be overridden.",
                options, activityChange.getAnimationOptions());
    }

    @Test
    public void testOverrideAnimationOptionsToInfoIfNecessary_sceneAnimOptions_nonFillParentTF() {
        ActivityRecord r = initializeOverrideAnimationOptionsTest(
                false /* fillParentTaskFragment */);
        TransitionInfo.AnimationOptions options = TransitionInfo.AnimationOptions
                .makeSceneTransitionAnimOptions();
        mTransition.setOverrideAnimation(options, r, null /* startCallback */,
                null /* finishCallback */);

        mTransition.overrideAnimationOptionsToInfoIfNecessary(mInfo);

        final TransitionInfo.Change displayChange = mInfo.getChanges().get(0);
        final TransitionInfo.Change taskChange = mInfo.getChanges().get(1);
        final TransitionInfo.Change embeddedTfChange = mInfo.getChanges().get(2);
        final TransitionInfo.Change activityChange = mInfo.getChanges().get(3);

        assertNull("Display change's AnimationOptions must not be overridden.",
                displayChange.getAnimationOptions());
        assertEquals("Task change's AnimationOptions must be overridden.",
                options, taskChange.getAnimationOptions());
        assertNull(
                "Non-fill-parent embedded TF change's AnimationOptions must not be overridden.",
                embeddedTfChange.getAnimationOptions());
        assertEquals("Activity change's AnimationOptions must be overridden.",
                options, activityChange.getAnimationOptions());
@@ -2291,6 +2320,10 @@ public class TransitionTests extends WindowTestsBase {
    }

    private ActivityRecord initializeOverrideAnimationOptionsTest() {
        return initializeOverrideAnimationOptionsTest(true /* fillParentTaskFragment */);
    }

    private ActivityRecord initializeOverrideAnimationOptionsTest(boolean fillParentTaskFragment) {
        mTransition = createTestTransition(TRANSIT_OPEN);

        // Test set AnimationOptions for Activity and Task.
@@ -2314,8 +2347,13 @@ public class TransitionTests extends WindowTestsBase {
                .toWindowContainerToken(), mDisplayContent.getAnimationLeash()));
        mInfo.addChange(new TransitionInfo.Change(task.mRemoteToken.toWindowContainerToken(),
                task.getAnimationLeash()));
        mInfo.addChange(new TransitionInfo.Change(embeddedTf.mRemoteToken.toWindowContainerToken(),
                embeddedTf.getAnimationLeash()));
        final TransitionInfo.Change embeddedTfChange =
                new TransitionInfo.Change(embeddedTf.mRemoteToken.toWindowContainerToken(),
                        embeddedTf.getAnimationLeash());
        if (fillParentTaskFragment) {
            embeddedTfChange.setFlags(FLAG_FILLS_TASK);
        }
        mInfo.addChange(embeddedTfChange);
        mInfo.addChange(new TransitionInfo.Change(null /* container */,
                nonEmbeddedActivity.getAnimationLeash()));
        return nonEmbeddedActivity;