Reparent PiP overlay under task as soon as possible

For enter PiP animations started from Launcher, we send the signal to
WMShell to reparent the overlay under task as soon as possible.

This avoids flicker issue caused by race condition of cleaning up the
transition leash before the reparenting was done, which made the issue
of overlay being not attached to anything for few frames.

Bug: 281711939
Test: winscope trace from comment#28, leash follows task
Test: after http://recall/-/ekEuGtt9d9HWqkUtAzpHx8/ewrarENSYYOmUCa0b3fdtp

Change-Id: Ia16afd49a94d9ba8456287c2cdffb2a84e5a2bc7
This commit is contained in:
Mateusz Cicheński
2023-06-16 21:12:29 +00:00
parent bde7e310c5
commit 357f68275c
2 changed files with 18 additions and 8 deletions

View File

@@ -1530,6 +1530,21 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
if (mSwipePipToHomeReleaseCheck != null) {
mSwipePipToHomeReleaseCheck.setCanRelease(false);
}
// grab a screenshot before the PipContentOverlay gets parented on top of the task
UI_HELPER_EXECUTOR.execute(() -> {
final int taskId = mGestureState.getRunningTaskId();
mTaskSnapshotCache.put(taskId,
mRecentsAnimationController.screenshotTask(taskId));
});
// let SystemUi reparent the overlay leash as soon as possible
SystemUiProxy.INSTANCE.get(mContext).stopSwipePipToHome(
mSwipePipToHomeAnimator.getTaskId(),
mSwipePipToHomeAnimator.getComponentName(),
mSwipePipToHomeAnimator.getDestinationBounds(),
mSwipePipToHomeAnimator.getContentOverlay());
windowAnim = mSwipePipToHomeAnimators;
} else {
mSwipePipToHomeAnimator = null;
@@ -2108,11 +2123,6 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
*/
private void maybeFinishSwipePipToHome() {
if (mIsSwipingPipToHome && mSwipePipToHomeAnimators[0] != null) {
SystemUiProxy.INSTANCE.get(mContext).stopSwipePipToHome(
mSwipePipToHomeAnimator.getTaskId(),
mSwipePipToHomeAnimator.getComponentName(),
mSwipePipToHomeAnimator.getDestinationBounds(),
mSwipePipToHomeAnimator.getContentOverlay());
mRecentsAnimationController.setFinishTaskTransaction(
mSwipePipToHomeAnimator.getTaskId(),
mSwipePipToHomeAnimator.getFinishTransaction(),

View File

@@ -563,9 +563,9 @@ public class SystemUiProxy implements ISystemUiProxy {
}
/**
* Notifies WM Shell that launcher has finished all the animation for swipe to home. WM Shell
* can choose to fade out the overlay when entering PIP is finished, and WM Shell should be
* responsible for cleaning up the overlay.
* Notifies WM Shell that launcher has finished the preparation of the animation for swipe to
* home. WM Shell can choose to fade out the overlay when entering PIP is finished, and WM Shell
* should be responsible for cleaning up the overlay.
*/
public void stopSwipePipToHome(int taskId, ComponentName componentName, Rect destinationBounds,
SurfaceControl overlay) {