Misc fixes for window moving and resizing

- Do not skip resizeTask if we're starting or ending drag. We need
  the relayout because surface mode is changing.

- When we're changing the surface mode, need to wait for the first
  draw to finish before we can modify shown frame. Otherwise there
  could be 1 old frame displayed with new position, which makes the
  window position look a bit off.

- Clean up dragResizing/dragResizeChanged flags.

Change-Id: Ia396d6b88fd616ad57aa8cd24ca7e1161add7205
diff --git a/services/core/java/com/android/server/wm/TaskPositioner.java b/services/core/java/com/android/server/wm/TaskPositioner.java
index 17b56ba..5487349 100644
--- a/services/core/java/com/android/server/wm/TaskPositioner.java
+++ b/services/core/java/com/android/server/wm/TaskPositioner.java
@@ -86,8 +86,7 @@
     private int mMinVisibleWidth;
     private int mMinVisibleHeight;
 
-    private int mTaskId;
-    private TaskStack mStack;
+    private Task mTask;
     private boolean mResizing;
     private final Rect mWindowOriginalBounds = new Rect();
     private final Rect mWindowDragBounds = new Rect();
@@ -136,7 +135,7 @@
                         }
                         try {
                             mService.mActivityManager.resizeTask(
-                                    mTaskId, mWindowDragBounds, true /* resizedByUser */);
+                                    mTask.mTaskId, mWindowDragBounds, true /* resizedByUser */);
                         } catch(RemoteException e) {}
                     } break;
 
@@ -156,21 +155,29 @@
                 }
 
                 if (endDrag) {
-                    mResizing = false;
+                    synchronized (mService.mWindowMap) {
+                        endDragLocked();
+                    }
                     try {
-                        mService.mActivityManager.resizeTask(
-                                mTaskId, mWindowDragBounds, true /* resizedByUser */);
+                        if (mResizing) {
+                            // We were using fullscreen surface during resizing. Request
+                            // resizeTask() one last time to restore surface to window size.
+                            mService.mActivityManager.resizeTask(
+                                    mTask.mTaskId, mWindowDragBounds, true /* resizedByUser */);
+                        }
+
+                        if (mCurrentDimSide != CTRL_NONE) {
+                            final int createMode = mCurrentDimSide == CTRL_LEFT
+                                    ? DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT
+                                    : DOCKED_STACK_CREATE_MODE_BOTTOM_OR_RIGHT;
+                            mService.mActivityManager.moveTaskToDockedStack(
+                                    mTask.mTaskId, createMode, true /*toTop*/);
+                        }
                     } catch(RemoteException e) {}
+
                     // Post back to WM to handle clean-ups. We still need the input
                     // event handler for the last finishInputEvent()!
                     mService.mH.sendEmptyMessage(H.FINISH_TASK_POSITIONING);
-                    if (mCurrentDimSide != CTRL_NONE) {
-                        final int createMode = mCurrentDimSide == CTRL_LEFT
-                                ? DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT
-                                : DOCKED_STACK_CREATE_MODE_BOTTOM_OR_RIGHT;
-                        mService.mActivityManager.moveTaskToDockedStack(
-                                mTaskId, createMode, true /*toTop*/);
-                    }
                 }
                 handled = true;
             } catch (Exception e) {
@@ -291,10 +298,6 @@
         mService.resumeRotationLocked();
     }
 
-    boolean isTaskResizing(final Task task) {
-        return mResizing && task != null && mTaskId == task.mTaskId;
-    }
-
     void startDragLocked(WindowState win, boolean resize, float startX, float startY) {
         if (DEBUG_TASK_POSITIONING) {
             Slog.d(TAG, "startDragLocked: win=" + win + ", resize=" + resize
@@ -318,13 +321,16 @@
             mResizing = true;
         }
 
-        final Task task = win.getTask();
-        mTaskId = task.mTaskId;
-        mStack = task.mStack;
+        mTask = win.getTask();
         mStartDragX = startX;
         mStartDragY = startY;
 
-        mService.getTaskBounds(mTaskId, mWindowOriginalBounds);
+        mService.getTaskBounds(mTask.mTaskId, mWindowOriginalBounds);
+    }
+
+    private void endDragLocked() {
+        mResizing = false;
+        mTask.setDragResizing(false);
     }
 
     /** Returns true if the move operation should be ended. */
@@ -354,11 +360,12 @@
                 bottom = Math.max(top + mMinVisibleHeight, bottom + deltaY);
             }
             mWindowDragBounds.set(left, top, right, bottom);
+            mTask.setDragResizing(true);
             return false;
         }
 
         // This is a moving operation.
-        mStack.getBounds(mTmpRect);
+        mTask.mStack.getBounds(mTmpRect);
         mTmpRect.inset(mMinVisibleWidth, mMinVisibleHeight);
         if (!mTmpRect.contains((int) x, (int) y)) {
             // We end the moving operation if position is outside the stack bounds.
@@ -397,13 +404,13 @@
      * shouldn't be shown.
      */
     private int getDimSide(int x) {
-        if (mStack.mStackId != FREEFORM_WORKSPACE_STACK_ID
-                || !mStack.isFullscreen()
+        if (mTask.mStack.mStackId != FREEFORM_WORKSPACE_STACK_ID
+                || !mTask.mStack.isFullscreen()
                 || mService.mCurConfiguration.orientation != ORIENTATION_LANDSCAPE) {
             return CTRL_NONE;
         }
 
-        mStack.getBounds(mTmpRect);
+        mTask.mStack.getBounds(mTmpRect);
         if (x - mSideMargin <= mTmpRect.left) {
             return CTRL_LEFT;
         }
@@ -415,7 +422,7 @@
     }
 
     private void showDimLayer() {
-        mStack.getBounds(mTmpRect);
+        mTask.mStack.getBounds(mTmpRect);
         if (mCurrentDimSide == CTRL_LEFT) {
             mTmpRect.right = mTmpRect.centerX();
         } else if (mCurrentDimSide == CTRL_RIGHT) {
@@ -433,7 +440,7 @@
 
     @Override /** {@link DimLayer.DimLayerUser} */
     public DisplayInfo getDisplayInfo() {
-        return mStack.getDisplayInfo();
+        return mTask.mStack.getDisplayInfo();
     }
 
     private int getDragLayerLocked() {