Merge "Update the KQS app launch animation to match the spec exactly" into main
diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java
index 9dac89d..2421c94 100644
--- a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java
@@ -23,6 +23,7 @@
 import android.app.ActivityOptions;
 import android.view.KeyEvent;
 import android.view.View;
+import android.view.animation.AnimationUtils;
 import android.window.RemoteTransition;
 
 import androidx.annotation.NonNull;
@@ -38,6 +39,7 @@
 import com.android.systemui.shared.recents.model.Task;
 import com.android.systemui.shared.recents.model.ThumbnailData;
 import com.android.systemui.shared.system.ActivityManagerWrapper;
+import com.android.systemui.shared.system.QuickStepContract;
 
 import java.io.PrintWriter;
 import java.util.List;
@@ -148,8 +150,13 @@
             return -1;
         }
 
+        TaskbarActivityContext context = mControllers.taskbarActivityContext;
         RemoteTransition remoteTransition = new RemoteTransition(new SlideInRemoteTransition(
-                Utilities.isRtl(mControllers.taskbarActivityContext.getResources())));
+                Utilities.isRtl(mControllers.taskbarActivityContext.getResources()),
+                context.getDeviceProfile().overviewPageSpacing,
+                QuickStepContract.getWindowCornerRadius(context),
+                AnimationUtils.loadInterpolator(
+                        context, android.R.interpolator.fast_out_extra_slow_in)));
         if (mOnDesktop) {
             UI_HELPER_EXECUTOR.execute(() ->
                     SystemUiProxy.INSTANCE.get(mKeyboardQuickSwitchView.getContext())
diff --git a/quickstep/src/com/android/quickstep/util/SlideInRemoteTransition.kt b/quickstep/src/com/android/quickstep/util/SlideInRemoteTransition.kt
index c1fa2f3..6544ba7 100644
--- a/quickstep/src/com/android/quickstep/util/SlideInRemoteTransition.kt
+++ b/quickstep/src/com/android/quickstep/util/SlideInRemoteTransition.kt
@@ -15,6 +15,7 @@
  */
 package com.android.quickstep.util
 
+import android.animation.TimeInterpolator
 import android.animation.ValueAnimator
 import android.app.WindowConfiguration.ACTIVITY_TYPE_HOME
 import android.graphics.Rect
@@ -30,7 +31,13 @@
 import com.android.wm.shell.util.TransitionUtil
 
 /** Remote animation which slides the opening targets in and the closing targets out */
-class SlideInRemoteTransition(val isRtl: Boolean) : IRemoteTransition.Stub() {
+class SlideInRemoteTransition(
+    private val isRtl: Boolean,
+    private val pageSpacing: Int,
+    private val cornerRadius: Float,
+    private val interpolator: TimeInterpolator,
+) : IRemoteTransition.Stub() {
+    private val animationDurationMs = 500L
 
     override fun mergeAnimation(
         iBinder: IBinder,
@@ -54,6 +61,8 @@
         finishCB: IRemoteTransitionFinishedCallback
     ) {
         val anim = ValueAnimator.ofFloat(0f, 1f)
+        anim.interpolator = interpolator
+        anim.duration = animationDurationMs
 
         val closingStartBounds: HashMap<SurfaceControl, Rect> = HashMap()
         val openingEndBounds: HashMap<SurfaceControl, Rect> = HashMap()
@@ -67,9 +76,11 @@
             }
             if (TransitionUtil.isClosingType(chg.mode)) {
                 closingStartBounds[leash] = chg.startAbsBounds
+                startT.setCrop(leash, chg.startAbsBounds).setCornerRadius(leash, cornerRadius)
             }
             if (TransitionUtil.isOpeningType(chg.mode)) {
                 openingEndBounds[leash] = chg.endAbsBounds
+                startT.setCrop(leash, chg.endAbsBounds).setCornerRadius(leash, cornerRadius)
             }
         }
         startT.apply()
@@ -80,7 +91,7 @@
                 // Translate the surface from its original position on-screen to off-screen on the
                 // right (or left in RTL)
                 val startBounds = closingStartBounds[it]
-                val targetX = (if (isRtl) -1 else 1) * startBounds!!.right
+                val targetX = (if (isRtl) -1 else 1) * (startBounds!!.right + pageSpacing)
                 t.setPosition(it, anim.animatedValue as Float * targetX, 0f)
             }
             openingEndBounds.keys.forEach {
@@ -90,7 +101,7 @@
                 // Translate the surface from off-screen on the left (or left in RTL) to its final
                 // position on-screen
                 val endBounds = openingEndBounds[it]
-                val targetX = (if (isRtl) -1 else 1) * endBounds!!.right
+                val targetX = (if (isRtl) -1 else 1) * (endBounds!!.right + pageSpacing)
                 t.setPosition(it, (1f - anim.animatedValue as Float) * -targetX, 0f)
             }
             t.apply()