Fix issue 5064004, can't add shortcut to portal from AllApps

Change-Id: I99cd2108af617cf5a80b417f81a86c363fac2377
diff --git a/src/com/android/launcher2/FolderIcon.java b/src/com/android/launcher2/FolderIcon.java
index 10928c0..f1a1508 100644
--- a/src/com/android/launcher2/FolderIcon.java
+++ b/src/com/android/launcher2/FolderIcon.java
@@ -321,44 +321,53 @@
             float scaleRelativeToDragLayer, int index, Runnable postAnimationRunnable) {
         item.cellX = -1;
         item.cellY = -1;
-        DragLayer dragLayer = mLauncher.getDragLayer();
-        Rect from = new Rect();
-        dragLayer.getViewRectRelativeToSelf(animateView, from);
-        Rect to = finalRect;
-        if (to == null) {
-            to = new Rect();
-            Workspace workspace = mLauncher.getWorkspace();
-            // Set cellLayout and this to it's final state to compute final animation locations
-            workspace.setFinalTransitionTransform((CellLayout) getParent().getParent());
-            float scaleX = getScaleX();
-            float scaleY = getScaleY();
-            setScaleX(1.0f);
-            setScaleY(1.0f);
-            scaleRelativeToDragLayer = dragLayer.getDescendantRectRelativeToSelf(this, to);
-            // Finished computing final animation locations, restore current state
-            setScaleX(scaleX);
-            setScaleY(scaleY);
-            workspace.resetTransitionTransform((CellLayout) getParent().getParent());
-        }
 
-        int[] center = new int[2];
-        float scale = getLocalCenterForIndex(index, center);
-        center[0] = (int) Math.round(scaleRelativeToDragLayer * center[0]);
-        center[1] = (int) Math.round(scaleRelativeToDragLayer * center[1]);
-
-        to.offset(center[0] - animateView.getMeasuredWidth() / 2,
-                center[1] - animateView.getMeasuredHeight() / 2);
-
-        float finalAlpha = index < NUM_ITEMS_IN_PREVIEW ? 0.5f : 0f;
-
-        dragLayer.animateView(animateView, from, to, finalAlpha, scale * scaleRelativeToDragLayer,
-                DROP_IN_ANIMATION_DURATION, new DecelerateInterpolator(2),
-                new AccelerateInterpolator(2), postAnimationRunnable, false);
-        postDelayed(new Runnable() {
-            public void run() {
-                addItem(item);
+        // Typically, the animateView corresponds to the DragView; however, if this is being done
+        // after a configuration activity (ie. for a Shortcut being dragged from AllApps) we
+        // will not have a view to animate
+        if (animateView != null) {
+            DragLayer dragLayer = mLauncher.getDragLayer();
+            Rect from = new Rect();
+            dragLayer.getViewRectRelativeToSelf(animateView, from);
+            Rect to = finalRect;
+            if (to == null) {
+                to = new Rect();
+                Workspace workspace = mLauncher.getWorkspace();
+                // Set cellLayout and this to it's final state to compute final animation locations
+                workspace.setFinalTransitionTransform((CellLayout) getParent().getParent());
+                float scaleX = getScaleX();
+                float scaleY = getScaleY();
+                setScaleX(1.0f);
+                setScaleY(1.0f);
+                scaleRelativeToDragLayer = dragLayer.getDescendantRectRelativeToSelf(this, to);
+                // Finished computing final animation locations, restore current state
+                setScaleX(scaleX);
+                setScaleY(scaleY);
+                workspace.resetTransitionTransform((CellLayout) getParent().getParent());
             }
-        }, DROP_IN_ANIMATION_DURATION);
+
+            int[] center = new int[2];
+            float scale = getLocalCenterForIndex(index, center);
+            center[0] = (int) Math.round(scaleRelativeToDragLayer * center[0]);
+            center[1] = (int) Math.round(scaleRelativeToDragLayer * center[1]);
+
+            to.offset(center[0] - animateView.getMeasuredWidth() / 2,
+                    center[1] - animateView.getMeasuredHeight() / 2);
+
+            float finalAlpha = index < NUM_ITEMS_IN_PREVIEW ? 0.5f : 0f;
+
+            dragLayer.animateView(animateView, from, to, finalAlpha,
+                    scale * scaleRelativeToDragLayer, DROP_IN_ANIMATION_DURATION,
+                    new DecelerateInterpolator(2), new AccelerateInterpolator(2),
+                    postAnimationRunnable, false);
+            postDelayed(new Runnable() {
+                public void run() {
+                    addItem(item);
+                }
+            }, DROP_IN_ANIMATION_DURATION);
+        } else {
+            addItem(item);
+        }
     }
 
     public void onDrop(DragObject d) {
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 7ab41bc..9f42cfd 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -40,7 +40,6 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.content.Intent.ShortcutIconResource;
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
@@ -51,7 +50,6 @@
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.AsyncTask;
-import android.os.Build;
 import android.os.Bundle;
 import android.os.Environment;
 import android.os.Handler;
@@ -87,6 +85,7 @@
 
 import com.android.common.Search;
 import com.android.launcher.R;
+import com.android.launcher2.DropTarget.DragObject;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
@@ -799,11 +798,25 @@
 
         boolean foundCellSpan = false;
 
+        ShortcutInfo info = mModel.infoFromShortcutIntent(this, data, null);
+        final View view = createShortcut(info);
+
         // First we check if we already know the exact location where we want to add this item.
         if (cellX >= 0 && cellY >= 0) {
             cellXY[0] = cellX;
             cellXY[1] = cellY;
             foundCellSpan = true;
+
+            // If appropriate, either create a folder or add to an existing folder
+            if (mWorkspace.createUserFolderIfNecessary(view, container, layout, cellXY,
+                    true, null,null)) {
+                return;
+            }
+            DragObject dragObject = new DragObject();
+            dragObject.dragInfo = info;
+            if (mWorkspace.addToExistingFolderIfNecessary(view, layout, cellXY, dragObject, true)) {
+                return;
+            }
         } else if (touchXY != null) {
             // when dragging and dropping, just find the closest free spot
             int[] result = layout.findNearestVacantArea(touchXY[0], touchXY[1], 1, 1, cellXY);
@@ -817,11 +830,9 @@
             return;
         }
 
-        final ShortcutInfo info = mModel.addShortcut(
-                this, data, container, screen, cellXY[0], cellXY[1], false);
+        LauncherModel.addItemToDatabase(this, info, container, screen, cellXY[0], cellXY[1], false);
 
         if (!mRestoring) {
-            final View view = createShortcut(info);
             mWorkspace.addInScreen(view, container, screen, cellXY[0], cellXY[1], 1, 1,
                     isWorkspaceLocked());
         }
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 947c946..36ce4d0 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -2208,8 +2208,15 @@
             sourceInfo.cellX = -1;
             sourceInfo.cellY = -1;
 
-            fi.performCreateAnimation(destInfo, v, sourceInfo, dragView, folderLocation, scale,
-                    postAnimationRunnable);
+            // If the dragView is null, we can't animate
+            boolean animate = dragView != null;
+            if (animate) {
+                fi.performCreateAnimation(destInfo, v, sourceInfo, dragView, folderLocation, scale,
+                        postAnimationRunnable);
+            } else {
+                fi.addItem(destInfo);
+                fi.addItem(sourceInfo);
+            }
             return true;
         }
         return false;
@@ -2996,8 +3003,21 @@
         if (info instanceof PendingAddItemInfo) {
             final PendingAddItemInfo pendingInfo = (PendingAddItemInfo) dragInfo;
 
-            mTargetCell = findNearestVacantArea(touchXY[0], touchXY[1], spanX, spanY, null,
-                    cellLayout, mTargetCell);
+            boolean findNearestVacantCell = true;
+            if (pendingInfo.itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) {
+                mTargetCell = findNearestArea((int) touchXY[0], (int) touchXY[1], spanX, spanY,
+                        cellLayout, mTargetCell);
+                if (willCreateUserFolder((ItemInfo) d.dragInfo, mDragTargetLayout, mTargetCell,
+                        true) || willAddToExistingUserFolder((ItemInfo) d.dragInfo,
+                                mDragTargetLayout, mTargetCell)) {
+                    findNearestVacantCell = false;
+                }
+            }
+            if (findNearestVacantCell) {
+                    mTargetCell = findNearestVacantArea(touchXY[0], touchXY[1], spanX, spanY, null,
+                        cellLayout, mTargetCell);
+            }
+
             Runnable onAnimationCompleteRunnable = new Runnable() {
                 @Override
                 public void run() {