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

Commit 25fb4913 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Only link rotation transform of visible activity to wallpaper

Since commit ae078778, the task animating by recents will be the
wallpaper target. When swiping from a landscape app to portrait home,
the landscape app is still wallpaper target (they are animating, i.e.
opening and closing, so wallpaper target won't update). That causes
a unnecessary propogation of rotation transform to wallpaper. Then
the configuration of wallpaper needs to be updated so the transition
cannot commit visibility in time. The result is that the landscape
app flickers a while after going to home.

Fixes: 155724535
Test: WallpaperControllerTests#testFixedRotationRecentsAnimatingTask

Change-Id: Ic131459a75f40c90d4a662c608a49e66b0cd2257
parent aca49a44
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -123,19 +123,20 @@ class WallpaperWindowToken extends WindowToken {
        }

        final WallpaperController wallpaperController = mDisplayContent.mWallpaperController;

        if (visible) {
        final WindowState wallpaperTarget = wallpaperController.getWallpaperTarget();

        if (visible && wallpaperTarget != null) {
            final RecentsAnimationController recentsAnimationController =
                    mWmService.getRecentsAnimationController();
            if (wallpaperTarget != null
                    && recentsAnimationController != null
            if (recentsAnimationController != null
                    && recentsAnimationController.isAnimatingTask(wallpaperTarget.getTask())) {
                // If the Recents animation is running, and the wallpaper target is the animating
                // task we want the wallpaper to be rotated in the same orientation as the
                // RecentsAnimation's target (e.g the launcher)
                recentsAnimationController.linkFixedRotationTransformIfNeeded(this);
            } else if (wallpaperTarget != null
            } else if ((wallpaperTarget.mActivityRecord == null
                    // Ignore invisible activity because it may be moving to background.
                    || wallpaperTarget.mActivityRecord.mVisibleRequested)
                    && wallpaperTarget.mToken.hasFixedRotationTransform()) {
                // If the wallpaper target has a fixed rotation, we want the wallpaper to follow its
                // rotation
+23 −0
Original line number Diff line number Diff line
@@ -271,6 +271,29 @@ public class WallpaperControllerTests extends WindowTestsBase {
        assertEquals(WINDOWING_MODE_FULLSCREEN, token.getWindowingMode());
    }

    @Test
    public void testFixedRotationRecentsAnimatingTask() {
        final RecentsAnimationController recentsController = mock(RecentsAnimationController.class);
        doReturn(true).when(recentsController).isWallpaperVisible(eq(mAppWindow));
        mWm.setRecentsAnimationController(recentsController);

        mAppWindow.mActivityRecord.applyFixedRotationTransform(mDisplayContent.getDisplayInfo(),
                mDisplayContent.mDisplayFrames, mDisplayContent.getConfiguration());
        mAppWindow.mActivityRecord.mVisibleRequested = true;
        mDisplayContent.mWallpaperController.adjustWallpaperWindows();

        assertEquals(mAppWindow, mDisplayContent.mWallpaperController.getWallpaperTarget());
        // Wallpaper should link the transform of its target.
        assertTrue(mAppWindow.mActivityRecord.hasFixedRotationTransform());

        mAppWindow.mActivityRecord.finishFixedRotationTransform();
        // Invisible requested activity should not share its rotation transform.
        mAppWindow.mActivityRecord.mVisibleRequested = false;
        mDisplayContent.mWallpaperController.adjustWallpaperWindows();

        assertFalse(mAppWindow.mActivityRecord.hasFixedRotationTransform());
    }

    private WindowState createWallpaperTargetWindow(DisplayContent dc) {
        final ActivityRecord homeActivity = new ActivityTestsBase.ActivityBuilder(mWm.mAtmService)
                .setStack(dc.getDefaultTaskDisplayArea().getRootHomeTask())