Merge "Fix PIP exit animation flickering on non-match parent activity" into main
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java
index 5276d9d..55e90e7 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java
@@ -324,6 +324,8 @@
private final @AnimationType int mAnimationType;
private final Rect mDestinationBounds = new Rect();
+ private final Point mLeashOffset = new Point();
+
private T mBaseValue;
protected T mCurrentValue;
protected T mStartValue;
@@ -338,13 +340,22 @@
// Flag to avoid double-end
private boolean mHasRequestedEnd;
- private PipTransitionAnimator(TaskInfo taskInfo, SurfaceControl leash,
- @AnimationType int animationType,
- Rect destinationBounds, T baseValue, T startValue, T endValue) {
+ private PipTransitionAnimator(@NonNull TaskInfo taskInfo, @NonNull SurfaceControl leash,
+ @AnimationType int animationType, @NonNull Rect destinationBounds,
+ @NonNull T baseValue, @NonNull T startValue, @NonNull T endValue) {
+ this(taskInfo, leash, animationType, destinationBounds, new Point(), baseValue,
+ startValue, endValue);
+ }
+
+ private PipTransitionAnimator(@NonNull TaskInfo taskInfo, @NonNull SurfaceControl leash,
+ @AnimationType int animationType, @NonNull Rect destinationBounds,
+ @NonNull Point leashOffset, @NonNull T baseValue, @NonNull T startValue,
+ @NonNull T endValue) {
mTaskInfo = taskInfo;
mLeash = leash;
mAnimationType = animationType;
mDestinationBounds.set(destinationBounds);
+ mLeashOffset.set(leashOffset);
mBaseValue = baseValue;
mStartValue = startValue;
mEndValue = endValue;
@@ -496,6 +507,15 @@
}
}
+ /**
+ * Returns the offset of the {@link #mLeash}.
+ */
+ @NonNull
+ Point getLeashOffset() {
+ // Use copy to prevent the leash to be modified unexpectedly.
+ return new Point(mLeashOffset);
+ }
+
void setCurrentValue(T value) {
mCurrentValue = value;
}
@@ -692,8 +712,8 @@
final Rect zeroInsets = new Rect(0, 0, 0, 0);
// construct new Rect instances in case they are recycled
- return new PipTransitionAnimator<Rect>(taskInfo, leash, ANIM_TYPE_BOUNDS,
- endBounds, new Rect(baseBounds), new Rect(startBounds), new Rect(endBounds)) {
+ return new PipTransitionAnimator<Rect>(taskInfo, leash, ANIM_TYPE_BOUNDS, endBounds,
+ leashOffset, new Rect(baseBounds), new Rect(startBounds), new Rect(endBounds)) {
private final RectEvaluator mRectEvaluator = new RectEvaluator(new Rect());
private final RectEvaluator mInsetsEvaluator = new RectEvaluator(new Rect());
@@ -720,6 +740,7 @@
// Use the bounds relative to the task leash in case the leash does not
// start from (0, 0).
final Rect relativeEndBounds = new Rect(end);
+ final Point leashOffset = getLeashOffset();
relativeEndBounds.offset(-leashOffset.x, -leashOffset.y);
getSurfaceTransactionHelper()
.crop(tx, leash, relativeEndBounds)
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java
index 72c1ef0..0042ec9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java
@@ -507,8 +507,8 @@
}
@Override
- public void onFinishResize(TaskInfo taskInfo, Rect destinationBounds,
- @PipAnimationController.TransitionDirection int direction,
+ public void onFinishResize(@NonNull TaskInfo taskInfo, @NonNull Rect destinationBounds,
+ @NonNull Point leashOffset, @PipAnimationController.TransitionDirection int direction,
@NonNull SurfaceControl.Transaction tx) {
final boolean enteringPip = isInPipDirection(direction);
if (enteringPip) {
@@ -531,12 +531,16 @@
if (mFixedRotationState != FIXED_ROTATION_TRANSITION
&& mFinishTransaction != null) {
mFinishTransaction.merge(tx);
- // Set window crop and position to destination bounds to avoid flickering.
+ // Set crop and position to destination bounds to avoid flickering.
if (hasValidLeash) {
- mFinishTransaction.setWindowCrop(leash, destinationBounds.width(),
- destinationBounds.height());
- mFinishTransaction.setPosition(leash, destinationBounds.left,
- destinationBounds.top);
+ final Rect relativeDestinationBounds = new Rect(destinationBounds);
+ relativeDestinationBounds.offset(-leashOffset.x, -leashOffset.y);
+ mFinishTransaction
+ .setCrop(leash, relativeDestinationBounds)
+ // Note that we should set the position to the start position of
+ // leash then the visible region will be at the same place even if
+ // the crop region doesn't start at (0, 0).
+ .setPosition(leash, leashOffset.x, leashOffset.y);
}
}
} else {
@@ -1267,7 +1271,8 @@
mPipBoundsState.setBounds(destinationBounds);
final SurfaceControl.Transaction tx = new SurfaceControl.Transaction();
- onFinishResize(pipTaskInfo, destinationBounds, TRANSITION_DIRECTION_TO_PIP, tx);
+ onFinishResize(pipTaskInfo, destinationBounds, animator.getLeashOffset(),
+ TRANSITION_DIRECTION_TO_PIP, tx);
sendOnPipTransitionFinished(TRANSITION_DIRECTION_TO_PIP);
if (swipePipToHomeOverlay != null) {
mPipOrganizer.fadeOutAndRemoveOverlay(swipePipToHomeOverlay,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransitionController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransitionController.java
index a2738227..6129651 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransitionController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransitionController.java
@@ -31,6 +31,7 @@
import android.app.TaskInfo;
import android.content.ComponentName;
import android.content.pm.ActivityInfo;
+import android.graphics.Point;
import android.graphics.Rect;
import android.os.IBinder;
import android.os.RemoteException;
@@ -92,7 +93,8 @@
mPipOrganizer.fadeOutAndRemoveOverlay(mPipOrganizer.mPipOverlay,
null /* callback */, true /* withStartDelay*/);
}
- onFinishResize(taskInfo, animator.getDestinationBounds(), direction, tx);
+ onFinishResize(taskInfo, animator.getDestinationBounds(),
+ animator.getLeashOffset(), direction, tx);
sendOnPipTransitionFinished(direction);
}
@@ -112,9 +114,9 @@
* Called when transition is about to finish. This is usually for performing tasks such as
* applying WindowContainerTransaction to finalize the PiP bounds and send to the framework.
*/
- public void onFinishResize(TaskInfo taskInfo, Rect destinationBounds,
- @PipAnimationController.TransitionDirection int direction,
- SurfaceControl.Transaction tx) {
+ public void onFinishResize(@NonNull TaskInfo taskInfo, @NonNull Rect destinationBounds,
+ @NonNull Point leashOffset, @PipAnimationController.TransitionDirection int direction,
+ @NonNull SurfaceControl.Transaction tx) {
}
/**