Merge "Adding tuner params for paging and full screen thumbnails."
diff --git a/api/current.txt b/api/current.txt
index 3ed2bb5..0263927 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -36777,6 +36777,7 @@
     method public void stopNestedScroll();
     method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
     method public void unscheduleDrawable(android.graphics.drawable.Drawable);
+    method public final void updateDragShadow(android.view.View.DragShadowBuilder);
     method protected boolean verifyDrawable(android.graphics.drawable.Drawable);
     method public boolean willNotCacheDrawing();
     method public boolean willNotDraw();
diff --git a/api/system-current.txt b/api/system-current.txt
index 08009c8..621a282 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -39100,6 +39100,7 @@
     method public void stopNestedScroll();
     method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
     method public void unscheduleDrawable(android.graphics.drawable.Drawable);
+    method public final void updateDragShadow(android.view.View.DragShadowBuilder);
     method protected boolean verifyDrawable(android.graphics.drawable.Drawable);
     method public boolean willNotCacheDrawing();
     method public boolean willNotDraw();
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 179a928..ab1943c 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -19992,19 +19992,22 @@
             Log.d(VIEW_LOG_TAG, "drag shadow: width=" + shadowSize.x + " height=" + shadowSize.y
                     + " shadowX=" + shadowTouchPoint.x + " shadowY=" + shadowTouchPoint.y);
         }
-        Surface surface = new Surface();
+        if (mAttachInfo.mDragSurface != null) {
+            mAttachInfo.mDragSurface.release();
+        }
+        mAttachInfo.mDragSurface = new Surface();
         try {
             mAttachInfo.mDragToken = mAttachInfo.mSession.prepareDrag(mAttachInfo.mWindow,
-                    flags, shadowSize.x, shadowSize.y, surface);
+                    flags, shadowSize.x, shadowSize.y, mAttachInfo.mDragSurface);
             if (ViewDebug.DEBUG_DRAG) Log.d(VIEW_LOG_TAG, "prepareDrag returned token="
-                    + mAttachInfo.mDragToken + " surface=" + surface);
+                    + mAttachInfo.mDragToken + " surface=" + mAttachInfo.mDragSurface);
             if (mAttachInfo.mDragToken != null) {
-                Canvas canvas = surface.lockCanvas(null);
+                Canvas canvas = mAttachInfo.mDragSurface.lockCanvas(null);
                 try {
                     canvas.drawColor(0, PorterDuff.Mode.CLEAR);
                     shadowBuilder.onDrawShadow(canvas);
                 } finally {
-                    surface.unlockCanvasAndPost(canvas);
+                    mAttachInfo.mDragSurface.unlockCanvasAndPost(canvas);
                 }
 
                 final ViewRootImpl root = getViewRootImpl();
@@ -20019,14 +20022,11 @@
                         shadowSize.x, shadowSize.y,
                         shadowTouchPoint.x, shadowTouchPoint.y, data);
                 if (ViewDebug.DEBUG_DRAG) Log.d(VIEW_LOG_TAG, "performDrag returned " + okay);
-
-                // Off and running!  Release our local surface instance; the drag
-                // shadow surface is now managed by the system process.
-                surface.release();
             }
         } catch (Exception e) {
             Log.e(VIEW_LOG_TAG, "Unable to initiate drag", e);
-            surface.destroy();
+            mAttachInfo.mDragSurface.destroy();
+            mAttachInfo.mDragSurface = null;
         }
 
         return okay;
@@ -20065,6 +20065,27 @@
         }
     }
 
+    public final void updateDragShadow(DragShadowBuilder shadowBuilder) {
+        if (ViewDebug.DEBUG_DRAG) {
+            Log.d(VIEW_LOG_TAG, "updateDragShadow");
+        }
+        if (mAttachInfo.mDragToken != null) {
+            try {
+                Canvas canvas = mAttachInfo.mDragSurface.lockCanvas(null);
+                try {
+                    canvas.drawColor(0, PorterDuff.Mode.CLEAR);
+                    shadowBuilder.onDrawShadow(canvas);
+                } finally {
+                    mAttachInfo.mDragSurface.unlockCanvasAndPost(canvas);
+                }
+            } catch (Exception e) {
+                Log.e(VIEW_LOG_TAG, "Unable to update drag shadow", e);
+            }
+        } else {
+            Log.e(VIEW_LOG_TAG, "No active drag");
+        }
+    }
+
     /**
      * Starts a move from {startX, startY}, the amount of the movement will be the offset
      * between {startX, startY} and the new cursor positon.
@@ -22356,6 +22377,11 @@
         IBinder mDragToken;
 
         /**
+         * The drag shadow surface for the current drag operation.
+         */
+        public Surface mDragSurface;
+
+        /**
          * Creates a new set of attachment information with the specified
          * events handler and thread.
          *
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 2c0cd7a..b503e12 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -5376,6 +5376,10 @@
                 if (what == DragEvent.ACTION_DRAG_ENDED) {
                     setLocalDragState(null);
                     mAttachInfo.mDragToken = null;
+                    if (mAttachInfo.mDragSurface != null) {
+                        mAttachInfo.mDragSurface.release();
+                        mAttachInfo.mDragSurface = null;
+                    }
                 }
             }
         }
diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java
index 74750a9..fdccc3f 100644
--- a/services/core/java/com/android/server/wm/DragState.java
+++ b/services/core/java/com/android/server/wm/DragState.java
@@ -281,7 +281,7 @@
         }
     }
 
-    void broadcastDragEndedLw() {
+    private void broadcastDragEndedLw() {
         final int myPid = Process.myPid();
 
         if (WindowManagerService.DEBUG_DRAG) {
@@ -313,6 +313,9 @@
     }
 
     void endDragLw() {
+        if (mAnimation != null) {
+            return;
+        }
         if (!mDragResult) {
             mAnimation = createReturnAnimationLocked();
             mService.scheduleAnimationLocked();
@@ -322,7 +325,7 @@
     }
 
 
-    void cleanUpDragLw() {
+    private void cleanUpDragLw() {
         broadcastDragEndedLw();
 
         // stop intercepting input
@@ -336,6 +339,9 @@
     }
 
     void notifyMoveLw(float x, float y) {
+        if (mAnimation != null) {
+            return;
+        }
         mCurrentX = x;
         mCurrentY = y;
 
@@ -410,6 +416,9 @@
     // result from the recipient.
     boolean notifyDropLw(WindowState touchedWin, DropPermissionHolder dropPermissionHolder,
             float x, float y) {
+        if (mAnimation != null) {
+            return false;
+        }
         mCurrentX = x;
         mCurrentY = y;