From 452882a0a8de93331d2809e1b52a9910c10f0591 Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Fri, 3 Jan 2020 15:57:05 +0800 Subject: [PATCH] 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 --- .../com/android/server/wm/ActivityStack.java | 35 ++++++++++++------- .../server/wm/BoundsAnimationController.java | 4 +++ 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 9030fce7cfcc0..ab8e975098a23 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -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); + } + } } /** diff --git a/services/core/java/com/android/server/wm/BoundsAnimationController.java b/services/core/java/com/android/server/wm/BoundsAnimationController.java index 9b464c2d1b96d..5385e2fce0084 100644 --- a/services/core/java/com/android/server/wm/BoundsAnimationController.java +++ b/services/core/java/com/android/server/wm/BoundsAnimationController.java @@ -552,6 +552,10 @@ public class BoundsAnimationController { return animationType; } + boolean isAnimationTypeFadeIn() { + return mAnimationType == FADE_IN; + } + public Handler getHandler() { return mHandler; }