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
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -552,6 +552,10 @@ public class BoundsAnimationController {
|
||||
return animationType;
|
||||
}
|
||||
|
||||
boolean isAnimationTypeFadeIn() {
|
||||
return mAnimationType == FADE_IN;
|
||||
}
|
||||
|
||||
public Handler getHandler() {
|
||||
return mHandler;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user