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

Commit a905fe43 authored by Issei Suzuki's avatar Issei Suzuki
Browse files

Apply right animation type on translucent window containers.

Bug: 217174830
Test: atest TransitionTests
Change-Id: I97c5220b9fe3fde33e1426c8fc2598410fad3735
parent 8237b942
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -312,9 +312,9 @@ public class TransitionAnimation {

    /** Load animation by attribute Id from android package. */
    @Nullable
    public Animation loadDefaultAnimationAttr(int animAttr) {
    public Animation loadDefaultAnimationAttr(int animAttr, boolean translucent) {
        return loadAnimationAttr(DEFAULT_PACKAGE, mDefaultWindowAnimationStyleResId, animAttr,
                false /* translucent */);
                translucent);
    }

    @Nullable
+10 −6
Original line number Diff line number Diff line
@@ -408,7 +408,8 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
                            || type == TRANSIT_CLOSE
                            || type == TRANSIT_TO_FRONT
                            || type == TRANSIT_TO_BACK;
                    if (isOpenOrCloseTransition) {
                    final boolean isTranslucent = (change.getFlags() & FLAG_TRANSLUCENT) != 0;
                    if (isOpenOrCloseTransition && !isTranslucent) {
                        // Use the overview background as the background for the animation
                        final Context uiContext = ActivityThread.currentActivityThread()
                                .getSystemUiContext();
@@ -729,14 +730,17 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
                        ? R.styleable.WindowAnimation_wallpaperCloseEnterAnimation
                        : R.styleable.WindowAnimation_wallpaperCloseExitAnimation;
            } else if (type == TRANSIT_OPEN) {
                if (isTask) {
                // We will translucent open animation for translucent activities and tasks. Choose
                // WindowAnimation_activityOpenEnterAnimation and set translucent here, then
                // TransitionAnimation loads appropriate animation later.
                if ((changeFlags & FLAG_TRANSLUCENT) != 0 && enter) {
                    translucent = true;
                }
                if (isTask && !translucent) {
                    animAttr = enter
                            ? R.styleable.WindowAnimation_taskOpenEnterAnimation
                            : R.styleable.WindowAnimation_taskOpenExitAnimation;
                } else {
                    if ((changeFlags & FLAG_TRANSLUCENT) != 0 && enter) {
                        translucent = true;
                    }
                    animAttr = enter
                            ? R.styleable.WindowAnimation_activityOpenEnterAnimation
                            : R.styleable.WindowAnimation_activityOpenExitAnimation;
@@ -770,7 +774,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
                            .loadAnimationAttr(options.getPackageName(), options.getAnimations(),
                                    animAttr, translucent);
                } else {
                    a = mTransitionAnimation.loadDefaultAnimationAttr(animAttr);
                    a = mTransitionAnimation.loadDefaultAnimationAttr(animAttr, translucent);
                }
            }
        }
+3 −0
Original line number Diff line number Diff line
@@ -1526,6 +1526,9 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
            if (task != null && task.voiceSession != null) {
                flags |= FLAG_IS_VOICE_INTERACTION;
            }
            if (task != null && task.isTranslucent(null)) {
                flags |= FLAG_TRANSLUCENT;
            }
            final ActivityRecord record = wc.asActivityRecord();
            if (record != null) {
                if (record.mUseTransferredAnimation) {
+82 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import static android.view.WindowManager.TRANSIT_OPEN;
import static android.view.WindowManager.TRANSIT_TO_BACK;
import static android.window.TransitionInfo.FLAG_IS_WALLPAPER;
import static android.window.TransitionInfo.FLAG_SHOW_WALLPAPER;
import static android.window.TransitionInfo.FLAG_TRANSLUCENT;
import static android.window.TransitionInfo.isIndependent;

import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
@@ -327,6 +328,7 @@ public class TransitionTests extends WindowTestsBase {
            final ActivityRecord act = createActivityRecord(tasks[i]);
            // alternate so that the transition doesn't get promoted to the display area
            act.mVisibleRequested = (i % 2) == 0; // starts invisible
            act.visibleIgnoringKeyguard = (i % 2) == 0;
            if (i == showWallpaperTask) {
                doReturn(true).when(act).showWallpaper();
            }
@@ -488,6 +490,86 @@ public class TransitionTests extends WindowTestsBase {
                info.getChange(openInChangeTask.mRemoteToken.toWindowContainerToken()), info));
    }

    @Test
    public void testOpenOpaqueTask() {
        final Transition transition = createTestTransition(TRANSIT_OPEN);
        ArrayMap<WindowContainer, Transition.ChangeInfo> changes = transition.mChanges;
        ArraySet<WindowContainer> participants = transition.mParticipants;

        final Task newTask = createTask(mDisplayContent);
        doReturn(false).when(newTask).isTranslucent(any());
        final Task oldTask = createTask(mDisplayContent);
        doReturn(false).when(oldTask).isTranslucent(any());

        final ActivityRecord closing = createActivityRecord(oldTask);
        closing.setOccludesParent(true);
        final ActivityRecord opening = createActivityRecord(newTask);
        opening.setOccludesParent(false);
        // Start states.
        changes.put(newTask, new Transition.ChangeInfo(false /* vis */, true /* exChg */));
        changes.put(oldTask, new Transition.ChangeInfo(true /* vis */, false /* exChg */));
        changes.put(opening, new Transition.ChangeInfo(false /* vis */, true /* exChg */));
        changes.put(closing, new Transition.ChangeInfo(true /* vis */, false /* exChg */));
        fillChangeMap(changes, newTask);
        // End states.
        closing.mVisibleRequested = true;
        opening.mVisibleRequested = true;

        final int transit = transition.mType;
        int flags = 0;

        // Check basic both tasks participating
        participants.add(oldTask);
        participants.add(newTask);
        ArrayList<WindowContainer> targets = Transition.calculateTargets(participants, changes);
        TransitionInfo info = Transition.calculateTransitionInfo(transit, flags, targets, changes);
        assertEquals(2, info.getChanges().size());
        assertEquals(transit, info.getType());

        assertTrue((info.getChanges().get(0).getFlags() & FLAG_TRANSLUCENT) == 0);
        assertTrue((info.getChanges().get(1).getFlags() & FLAG_TRANSLUCENT) == 0);
    }

    @Test
    public void testOpenTranslucentTask() {
        final Transition transition = createTestTransition(TRANSIT_OPEN);
        ArrayMap<WindowContainer, Transition.ChangeInfo> changes = transition.mChanges;
        ArraySet<WindowContainer> participants = transition.mParticipants;

        final Task newTask = createTask(mDisplayContent);
        doReturn(true).when(newTask).isTranslucent(any());
        final Task oldTask = createTask(mDisplayContent);
        doReturn(false).when(oldTask).isTranslucent(any());

        final ActivityRecord closing = createActivityRecord(oldTask);
        closing.setOccludesParent(true);
        final ActivityRecord opening = createActivityRecord(newTask);
        opening.setOccludesParent(false);
        // Start states.
        changes.put(newTask, new Transition.ChangeInfo(false /* vis */, true /* exChg */));
        changes.put(oldTask, new Transition.ChangeInfo(true /* vis */, false /* exChg */));
        changes.put(opening, new Transition.ChangeInfo(false /* vis */, true /* exChg */));
        changes.put(closing, new Transition.ChangeInfo(true /* vis */, false /* exChg */));
        fillChangeMap(changes, newTask);
        // End states.
        closing.mVisibleRequested = true;
        opening.mVisibleRequested = true;

        final int transit = transition.mType;
        int flags = 0;

        // Check basic both tasks participating
        participants.add(oldTask);
        participants.add(newTask);
        ArrayList<WindowContainer> targets = Transition.calculateTargets(participants, changes);
        TransitionInfo info = Transition.calculateTransitionInfo(transit, flags, targets, changes);
        assertEquals(2, info.getChanges().size());
        assertEquals(transit, info.getType());

        assertTrue((info.getChanges().get(0).getFlags() & FLAG_TRANSLUCENT) != 0);
        assertTrue((info.getChanges().get(1).getFlags() & FLAG_TRANSLUCENT) == 0);
    }

    @Test
    public void testTimeout() {
        final TransitionController controller = new TransitionController(mAtm,