Swap source and destination transfer objects.

It will be better to have the object that moves layout parameters to
animation on the layout side, and the object that moves animation
parameters back to layout on the animation side. That way we can
do partial filling of these objects without calling across. We
may never do partial draining of these objects.

Change-Id: I88826fa97350f96e309beef386885f55a9a73305
diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java
index abe7ff3..4d32bcc 100644
--- a/services/java/com/android/server/wm/WindowAnimator.java
+++ b/services/java/com/android/server/wm/WindowAnimator.java
@@ -10,17 +10,19 @@
 import static com.android.server.wm.WindowManagerService.LayoutFields.SET_FORCE_HIDING_CHANGED;
 
 import static com.android.server.wm.WindowManagerService.H.SET_DIM_PARAMETERS;
+import static com.android.server.wm.WindowManagerService.H.UPDATE_ANIM_PARAMETERS;
 
 import android.content.Context;
 import android.os.SystemClock;
 import android.util.Log;
 import android.util.Slog;
-import android.view.Choreographer;
 import android.view.Surface;
 import android.view.WindowManagerPolicy;
 import android.view.animation.Animation;
 
 import com.android.internal.policy.impl.PhoneWindowManager;
+import com.android.server.wm.WindowManagerService.AnimatorToLayoutParams;
+import com.android.server.wm.WindowManagerService.LayoutToAnimatorParams;
 
 import java.io.PrintWriter;
 import java.util.ArrayList;
@@ -36,22 +38,10 @@
     final Context mContext;
     final WindowManagerPolicy mPolicy;
 
-    final Choreographer mChoreographer = Choreographer.getInstance();
-
     ArrayList<WindowStateAnimator> mWinAnimators = new ArrayList<WindowStateAnimator>();
 
     boolean mAnimating;
 
-    static class LayoutToAnimatorParams {
-        boolean mAnimationScheduled;
-        ArrayList<WindowStateAnimator> mWinAnimators = new ArrayList<WindowStateAnimator>();
-        WindowState mWallpaperTarget;
-    }
-    /** Params from WindowManagerService. Do not modify or read without first locking on
-     * either WindowManagerService.mWindowMap or WindowManagerService.mAnimator.and then on
-     * mLayoutToAnim */
-    final LayoutToAnimatorParams mLayoutToAnim = new LayoutToAnimatorParams();
-
     final Runnable mAnimationRunnable;
 
     int mAdjResult;
@@ -95,6 +85,8 @@
 
     WindowState mWallpaperTarget = null;
 
+    final AnimatorToLayoutParams mAnimToLayout = new AnimatorToLayoutParams();
+
     WindowAnimator(final WindowManagerService service, final Context context,
             final WindowManagerPolicy policy) {
         mService = service;
@@ -118,9 +110,24 @@
         mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession);
     }
 
+    /** Locked on mAnimToLayout */
+    void updateAnimToLayoutLocked() {
+        final AnimatorToLayoutParams animToLayout = mAnimToLayout;
+        synchronized (animToLayout) {
+            animToLayout.mBulkUpdateParams = mBulkUpdateParams;
+            animToLayout.mPendingLayoutChanges = mPendingLayoutChanges;
+            animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper;
+
+            if (!animToLayout.mUpdateQueued) {
+                animToLayout.mUpdateQueued = true;
+                mService.mH.sendMessage(mService.mH.obtainMessage(UPDATE_ANIM_PARAMETERS));
+            }
+        }
+    }
+
     /** Copy all WindowManagerService params into local params here. Locked on 'this'. */
     private void copyLayoutToAnimParamsLocked() {
-        final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim;
+        final LayoutToAnimatorParams layoutToAnim = mService.mLayoutToAnim;
         synchronized(layoutToAnim) {
             layoutToAnim.mAnimationScheduled = false;
 
@@ -129,16 +136,6 @@
         }
     }
 
-    /** Note that Locked in this case is on mLayoutToAnim */
-    void scheduleAnimationLocked() {
-        final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim;
-        if (!layoutToAnim.mAnimationScheduled) {
-            layoutToAnim.mAnimationScheduled = true;
-            mChoreographer.postCallback(
-                    Choreographer.CALLBACK_ANIMATION, mAnimationRunnable, null);
-        }
-    }
-
     void hideWallpapersLocked(final WindowState w) {
         if ((mService.mWallpaperTarget == w && mService.mLowerWallpaperTarget == null)
                 || mService.mWallpaperTarget == null) {
@@ -544,18 +541,12 @@
         }
 
         if (mBulkUpdateParams != 0 || mPendingLayoutChanges != 0) {
-            final WindowManagerService.AnimatorToLayoutParams animToLayout = mService.mAnimToLayout;
-            synchronized (animToLayout) {
-                animToLayout.mBulkUpdateParams = mBulkUpdateParams;
-                animToLayout.mPendingLayoutChanges = mPendingLayoutChanges;
-                animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper;
-                mService.setAnimatorParametersLocked();
-            }
+            updateAnimToLayoutLocked();
         }
 
         if (mAnimating) {
-            synchronized (mLayoutToAnim) {
-                scheduleAnimationLocked();
+            synchronized (mService.mLayoutToAnim) {
+                mService.scheduleAnimationLocked();
             }
         } else if (wasAnimating) {
             mService.requestTraversalLocked();