diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java index d6441a2b629b8..4fc3254ed1a3a 100644 --- a/core/java/android/app/ActivityOptions.java +++ b/core/java/android/app/ActivityOptions.java @@ -1149,7 +1149,6 @@ public class ActivityOptions extends ComponentOptions { opts.mLaunchIntoPipParams = new PictureInPictureParams.Builder(pictureInPictureParams) .setIsLaunchIntoPip(true) .build(); - opts.mLaunchBounds = new Rect(pictureInPictureParams.getSourceRectHint()); return opts; } diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 10bd4eef4f7ed..55e6e29bcd1e9 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -1993,6 +1993,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (options.getLaunchIntoPipParams() != null) { pictureInPictureArgs = options.getLaunchIntoPipParams(); + if (sourceRecord != null) { + adjustPictureInPictureParamsIfNeeded(sourceRecord.getBounds()); + } } mOverrideTaskTransition = options.getOverrideTaskTransition(); @@ -9764,6 +9767,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A void setPictureInPictureParams(PictureInPictureParams p) { pictureInPictureArgs.copyOnlySet(p); + adjustPictureInPictureParamsIfNeeded(getBounds()); getTask().getRootTask().onPictureInPictureParamsChanged(); } @@ -9815,6 +9819,18 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return new Point(windowLayout.minWidth, windowLayout.minHeight); } + /** + * Adjust the source rect hint in {@link #pictureInPictureArgs} by window bounds since + * it is relative to its root view (see also b/235599028). + * It is caller's responsibility to make sure this is called exactly once when we update + * {@link #pictureInPictureArgs} to avoid double offset. + */ + private void adjustPictureInPictureParamsIfNeeded(Rect windowBounds) { + if (pictureInPictureArgs != null && pictureInPictureArgs.hasSourceBoundsHint()) { + pictureInPictureArgs.getSourceRectHint().offset(windowBounds.left, windowBounds.top); + } + } + static class Builder { private final ActivityTaskManagerService mAtmService; private WindowProcessController mCallerApp; diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index db730e0cb3689..dfce40b874c05 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -2118,7 +2118,7 @@ class RootWindowContainer extends WindowContainer // entering content-pip animation. mWindowManager.mTaskSnapshotController.recordTaskSnapshot( task, false /* allowSnapshotHome */); - rootTask.setBounds(r.getOptions().getLaunchBounds()); + rootTask.setBounds(r.pictureInPictureArgs.getSourceRectHint()); } rootTask.setDeferTaskAppear(false);