Fix clip reveal animation in docked window case

- Move ClipRectTB/LRAnimation to wm package, because that's the only
place we use it.
- Extend ClipRectTBAnimation to combine it with translation animation
so the clipping gets applied after the translation.
- Fix clip reveal transitions when a window is docked.
- Make the docked divider minimizing animations synchronized with clip
reveal animation.

Bug: 27154882
Bug: 22174716

Change-Id: If5c94c777f3b51c6f53f6f34cc261bf3439cfc88
diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java
index ec99d1f..d7c1b32 100644
--- a/services/core/java/com/android/server/wm/DockedStackDividerController.java
+++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java
@@ -28,6 +28,7 @@
 import android.view.SurfaceControl;
 import android.view.animation.AnimationUtils;
 import android.view.animation.Interpolator;
+import android.view.animation.PathInterpolator;
 
 import com.android.server.wm.DimLayer.DimLayerUser;
 
@@ -39,6 +40,8 @@
 import static android.view.WindowManager.DOCKED_LEFT;
 import static android.view.WindowManager.DOCKED_RIGHT;
 import static android.view.WindowManager.DOCKED_TOP;
+import static com.android.server.wm.AppTransition.DEFAULT_APP_TRANSITION_DURATION;
+import static com.android.server.wm.AppTransition.TOUCH_RESPONSE_INTERPOLATOR;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
 
@@ -49,8 +52,6 @@
 
     private static final String TAG = TAG_WITH_CLASS_NAME ? "DockedStackDividerController" : TAG_WM;
 
-    private static final long MINIMIZED_DOCK_ANIMATION_DURATION = 400;
-
     private final WindowManagerService mService;
     private final DisplayContent mDisplayContent;
     private final int mDividerWindowWidth;
@@ -71,6 +72,7 @@
     private long mAnimationStartTime;
     private float mAnimationStart;
     private float mAnimationTarget;
+    private long mAnimationDuration;
     private final Interpolator mMinimizedDockInterpolator;
 
     DockedStackDividerController(WindowManagerService service, DisplayContent displayContent) {
@@ -331,6 +333,10 @@
         notifyDockedStackMinimizedChanged(minimized, 0);
     }
 
+    private boolean isAnimationMaximizing() {
+        return mAnimationTarget == 0f;
+    }
+
     public boolean animate(long now) {
         if (!mAnimating) {
             return false;
@@ -339,12 +345,17 @@
         if (!mAnimationStarted) {
             mAnimationStarted = true;
             mAnimationStartTime = now;
+            final long transitionDuration = isAnimationMaximizing()
+                    ? mService.mAppTransition.getLastClipRevealTransitionDuration()
+                    : DEFAULT_APP_TRANSITION_DURATION;
+            mAnimationDuration = (long)
+                    (transitionDuration * mService.getTransitionAnimationScaleLocked());
             notifyDockedStackMinimizedChanged(mMinimizedDock,
-                    MINIMIZED_DOCK_ANIMATION_DURATION);
+                    mAnimationDuration);
         }
-        float t = Math.min(1f, (float) (now - mAnimationStartTime)
-                / MINIMIZED_DOCK_ANIMATION_DURATION);
-        t = mMinimizedDockInterpolator.getInterpolation(t);
+        float t = Math.min(1f, (float) (now - mAnimationStartTime) / mAnimationDuration);
+        t = (isAnimationMaximizing() ? TOUCH_RESPONSE_INTERPOLATOR : mMinimizedDockInterpolator)
+                .getInterpolation(t);
         final TaskStack stack = mDisplayContent.getDockedStackVisibleForUserLocked();
         if (stack != null) {
             final float amount = t * mAnimationTarget + (1 - t) * mAnimationStart;