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

Commit 452882a0 authored by wilsonshih's avatar wilsonshih
Browse files

Check to start the PiP animation early.

Before Android Q, we will start PiP animation when activity requests to
enter pinned stack. Since we will move the pinned stack control to SystemUI,
the original transition sequence would break and cause flicker.
An easy way to prevent flicker is to check if the animation needs to
start early.

Fix: 146432422
Test: Manual enter PiP with gesture/3-button navigation several times.
Test: atest PinnedStackTests
Change-Id: I646efe7fbf0c58224d55112ab1bc8749c3dc41da
parent 45b0fc87
Loading
Loading
Loading
Loading
+23 −12
Original line number Diff line number Diff line
@@ -60,18 +60,6 @@ import static android.view.WindowManager.TRANSIT_TASK_OPEN_BEHIND;
import static android.view.WindowManager.TRANSIT_TASK_TO_BACK;
import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT;

import static com.android.server.wm.TaskProto.ACTIVITIES;
import static com.android.server.wm.TaskProto.ACTIVITY_TYPE;
import static com.android.server.wm.TaskProto.BOUNDS;
import static com.android.server.wm.TaskProto.DISPLAYED_BOUNDS;
import static com.android.server.wm.TaskProto.DISPLAY_ID;
import static com.android.server.wm.TaskProto.LAST_NON_FULLSCREEN_BOUNDS;
import static com.android.server.wm.TaskProto.MIN_HEIGHT;
import static com.android.server.wm.TaskProto.MIN_WIDTH;
import static com.android.server.wm.TaskProto.ORIG_ACTIVITY;
import static com.android.server.wm.TaskProto.REAL_ACTIVITY;
import static com.android.server.wm.TaskProto.RESIZE_MODE;
import static com.android.server.wm.TaskProto.RESUMED_ACTIVITY;
import static com.android.server.wm.ActivityStack.ActivityState.PAUSED;
import static com.android.server.wm.ActivityStack.ActivityState.PAUSING;
import static com.android.server.wm.ActivityStack.ActivityState.RESUMED;
@@ -115,14 +103,26 @@ import static com.android.server.wm.BoundsAnimationController.NO_PIP_MODE_CHANGE
import static com.android.server.wm.BoundsAnimationController.SCHEDULE_PIP_MODE_CHANGED_ON_END;
import static com.android.server.wm.BoundsAnimationController.SCHEDULE_PIP_MODE_CHANGED_ON_START;
import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_DOCKED_DIVIDER;
import static com.android.server.wm.TaskProto.ACTIVITIES;
import static com.android.server.wm.TaskProto.ACTIVITY_TYPE;
import static com.android.server.wm.TaskProto.ADJUSTED_BOUNDS;
import static com.android.server.wm.TaskProto.ADJUSTED_FOR_IME;
import static com.android.server.wm.TaskProto.ADJUST_DIVIDER_AMOUNT;
import static com.android.server.wm.TaskProto.ADJUST_IME_AMOUNT;
import static com.android.server.wm.TaskProto.ANIMATING_BOUNDS;
import static com.android.server.wm.TaskProto.BOUNDS;
import static com.android.server.wm.TaskProto.DEFER_REMOVAL;
import static com.android.server.wm.TaskProto.DISPLAYED_BOUNDS;
import static com.android.server.wm.TaskProto.DISPLAY_ID;
import static com.android.server.wm.TaskProto.FILLS_PARENT;
import static com.android.server.wm.TaskProto.LAST_NON_FULLSCREEN_BOUNDS;
import static com.android.server.wm.TaskProto.MINIMIZE_AMOUNT;
import static com.android.server.wm.TaskProto.MIN_HEIGHT;
import static com.android.server.wm.TaskProto.MIN_WIDTH;
import static com.android.server.wm.TaskProto.ORIG_ACTIVITY;
import static com.android.server.wm.TaskProto.REAL_ACTIVITY;
import static com.android.server.wm.TaskProto.RESIZE_MODE;
import static com.android.server.wm.TaskProto.RESUMED_ACTIVITY;
import static com.android.server.wm.TaskProto.ROOT_TASK_ID;
import static com.android.server.wm.TaskProto.SURFACE_HEIGHT;
import static com.android.server.wm.TaskProto.SURFACE_WIDTH;
@@ -828,6 +828,17 @@ class ActivityStack extends Task implements BoundsAnimationTarget {
        setWindowingMode(windowingMode, false /* animate */, false /* showRecents */,
                false /* enteringSplitScreenMode */, false /* deferEnsuringVisibility */,
                false /* creating */);
        if (windowingMode == WINDOWING_MODE_PINNED) {
            // This stack will be visible before SystemUI requests PiP animation to start, and if
            // the selected animation type is fade in, this stack will be close first. If the
            // animation does not start early, user may see this full screen window appear again
            // after the closing transition finish, which could cause screen to flicker.
            // Check if animation should start here in advance.
            final BoundsAnimationController controller = getDisplay().mBoundsAnimationController;
            if (controller.isAnimationTypeFadeIn()) {
                setPinnedStackAlpha(0f);
            }
        }
    }

    /**
+4 −0
Original line number Diff line number Diff line
@@ -552,6 +552,10 @@ public class BoundsAnimationController {
        return animationType;
    }

    boolean isAnimationTypeFadeIn() {
        return mAnimationType == FADE_IN;
    }

    public Handler getHandler() {
        return mHandler;
    }