diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index 132f71a..a1988a1 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -1062,8 +1062,10 @@
             mIsSwipingPipToHome = homeAnimFactory.supportSwipePipToHome()
                     && runningTaskTarget != null
                     && runningTaskTarget.pictureInPictureParams != null
-                    && runningTaskTarget.pictureInPictureParams.isAutoEnterEnabled()
-                    && runningTaskTarget.pictureInPictureParams.getSourceRectHint() != null;
+                    && TaskInfoCompat.isAutoEnterPipEnabled(
+                            runningTaskTarget.pictureInPictureParams)
+                    && TaskInfoCompat.getPipSourceRectHint(
+                            runningTaskTarget.pictureInPictureParams) != null;
             if (mIsSwipingPipToHome) {
                 mSwipePipToHomeAnimator = getSwipePipToHomeAnimator(
                         homeAnimFactory, runningTaskTarget);
@@ -1141,7 +1143,8 @@
         final ActivityManager.RunningTaskInfo taskInfo = mGestureState.getRunningTask();
         final RecentsOrientedState orientationState = mTaskViewSimulator.getOrientationState();
         final Rect destinationBounds = SystemUiProxy.INSTANCE.get(mContext)
-                .startSwipePipToHome(taskInfo.topActivity, taskInfo.topActivityInfo,
+                .startSwipePipToHome(taskInfo.topActivity,
+                        TaskInfoCompat.getTopActivityInfo(taskInfo),
                         runningTaskTarget.pictureInPictureParams,
                         orientationState.getRecentsActivityRotation(),
                         mDp.hotseatBarSizePx);
@@ -1149,8 +1152,8 @@
                 runningTaskTarget.taskId,
                 taskInfo.topActivity,
                 runningTaskTarget.leash.getSurfaceControl(),
-                runningTaskTarget.pictureInPictureParams.getSourceRectHint(),
-                taskInfo.configuration.windowConfiguration.getBounds(),
+                TaskInfoCompat.getPipSourceRectHint(runningTaskTarget.pictureInPictureParams),
+                TaskInfoCompat.getWindowConfigurationBounds(taskInfo),
                 destinationBounds);
         swipePipToHomeAnimator.addListener(new AnimatorListenerAdapter() {
             @Override
diff --git a/quickstep/src/com/android/quickstep/util/SwipePipToHomeAnimator.java b/quickstep/src/com/android/quickstep/util/SwipePipToHomeAnimator.java
index 02b5dfe..87fee79 100644
--- a/quickstep/src/com/android/quickstep/util/SwipePipToHomeAnimator.java
+++ b/quickstep/src/com/android/quickstep/util/SwipePipToHomeAnimator.java
@@ -21,13 +21,13 @@
 import android.animation.RectEvaluator;
 import android.animation.ValueAnimator;
 import android.content.ComponentName;
-import android.graphics.Matrix;
 import android.graphics.Rect;
-import android.graphics.RectF;
 import android.view.SurfaceControl;
 
 import androidx.annotation.NonNull;
 
+import com.android.systemui.shared.pip.PipSurfaceTransactionHelper;
+
 /**
  * An {@link Animator} that animates an Activity to PiP (picture-in-picture) window when
  * swiping up (in gesture navigation mode). Note that this class is derived from
@@ -44,7 +44,7 @@
     private final SurfaceControl mLeash;
     private final Rect mStartBounds = new Rect();
     private final Rect mDestinationBounds = new Rect();
-    private final SurfaceTransactionHelper mSurfaceTransactionHelper;
+    private final PipSurfaceTransactionHelper mSurfaceTransactionHelper;
 
     /** for calculating the transform in {@link #onAnimationUpdate(ValueAnimator)} */
     private final RectEvaluator mRectEvaluator = new RectEvaluator(new Rect());
@@ -69,7 +69,7 @@
         mLeash = leash;
         mStartBounds.set(startBounds);
         mDestinationBounds.set(destinationBounds);
-        mSurfaceTransactionHelper = new SurfaceTransactionHelper();
+        mSurfaceTransactionHelper = new PipSurfaceTransactionHelper();
 
         mSourceHintRectInsets.set(sourceRectHint.left - startBounds.left,
                 sourceRectHint.top - startBounds.top,
@@ -95,7 +95,8 @@
                 mSourceHintRectInsets);
         final SurfaceControl.Transaction tx = new SurfaceControl.Transaction();
         mSurfaceTransactionHelper.scaleAndCrop(tx, mLeash, mStartBounds, bounds, insets);
-        tx.setCornerRadius(mLeash, 0).apply();
+        mSurfaceTransactionHelper.resetCornerRadius(tx, mLeash);
+        tx.apply();
     }
 
     public int getTaskId() {
@@ -114,49 +115,8 @@
         if (mHasAnimationEnded) return;
 
         final SurfaceControl.Transaction tx = new SurfaceControl.Transaction();
-        mSurfaceTransactionHelper.resetScale(tx, mLeash, mDestinationBounds);
-        mSurfaceTransactionHelper.crop(tx, mLeash, mDestinationBounds);
-        tx.setCornerRadius(mLeash, 0).apply();
+        mSurfaceTransactionHelper.reset(tx, mLeash, mDestinationBounds);
+        tx.apply();
         mHasAnimationEnded = true;
     }
-
-    /**
-     * Slim version of {@link com.android.wm.shell.pip.PipSurfaceTransactionHelper}
-     */
-    private static final class SurfaceTransactionHelper {
-        private final Matrix mTmpTransform = new Matrix();
-        private final float[] mTmpFloat9 = new float[9];
-        private final RectF mTmpSourceRectF = new RectF();
-        private final Rect mTmpDestinationRect = new Rect();
-
-        private void scaleAndCrop(SurfaceControl.Transaction tx, SurfaceControl leash,
-                Rect sourceBounds, Rect destinationBounds, Rect insets) {
-            mTmpSourceRectF.set(sourceBounds);
-            mTmpDestinationRect.set(sourceBounds);
-            mTmpDestinationRect.inset(insets);
-            // Scale by the shortest edge and offset such that the top/left of the scaled inset
-            // source rect aligns with the top/left of the destination bounds
-            final float scale = sourceBounds.width() <= sourceBounds.height()
-                    ? (float) destinationBounds.width() / sourceBounds.width()
-                    : (float) destinationBounds.height() / sourceBounds.height();
-            final float left = destinationBounds.left - insets.left * scale;
-            final float top = destinationBounds.top - insets.top * scale;
-            mTmpTransform.setScale(scale, scale);
-            tx.setMatrix(leash, mTmpTransform, mTmpFloat9)
-                    .setWindowCrop(leash, mTmpDestinationRect)
-                    .setPosition(leash, left, top);
-        }
-
-        private void resetScale(SurfaceControl.Transaction tx, SurfaceControl leash,
-                Rect destinationBounds) {
-            tx.setMatrix(leash, Matrix.IDENTITY_MATRIX, mTmpFloat9)
-                    .setPosition(leash, destinationBounds.left, destinationBounds.top);
-        }
-
-        private void crop(SurfaceControl.Transaction tx, SurfaceControl leash,
-                Rect destinationBounds) {
-            tx.setWindowCrop(leash, destinationBounds.width(), destinationBounds.height())
-                    .setPosition(leash, destinationBounds.left, destinationBounds.top);
-        }
-    }
 }
