Fix 3099036: Drag visualization appears in wrong spot
diff --git a/src/com/android/launcher2/DragView.java b/src/com/android/launcher2/DragView.java
index a8dad7a..433dab8 100644
--- a/src/com/android/launcher2/DragView.java
+++ b/src/com/android/launcher2/DragView.java
@@ -123,6 +123,14 @@
         // The point in our scaled bitmap that the touch events are located
         mRegistrationX = registrationX;
         mRegistrationY = registrationY;
+
+        // Force a measure, because Workspace uses getMeasuredHeight() before the layout pass
+        int ms = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
+        measure(ms, ms);
+    }
+
+    public float getOffsetY() {
+        return mOffsetY;
     }
 
     public void setDragRegion(int left, int top, int width, int height) {
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 540b373..2e2c441 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -2257,6 +2257,13 @@
                                     dragView.getDragRegionHeight());
                         }
                     }
+                } else if (source == this) {
+                    // When dragging from the workspace, the drag view is slightly bigger than
+                    // the original view, and offset vertically. Adjust to account for this.
+                    final View origView = mDragInfo.cell;
+                    originX += (dragView.getMeasuredWidth() - origView.getWidth()) / 2;
+                    originY += (dragView.getMeasuredHeight() - origView.getHeight()) / 2
+                            + dragView.getOffsetY();
                 }
 
                 if (mDragTargetLayout != null) {