From 558baaf0a0b1c6a9062a6771088098533a35222b Mon Sep 17 00:00:00 2001 From: Adam Cohen Date: Mon, 15 Aug 2011 15:22:57 -0700 Subject: Fix issue 5064004, can't add shortcut to portal from AllApps Change-Id: I99cd2108af617cf5a80b417f81a86c363fac2377 --- src/com/android/launcher2/FolderIcon.java | 77 +++++++++++++++++-------------- src/com/android/launcher2/Launcher.java | 21 +++++++-- src/com/android/launcher2/Workspace.java | 28 +++++++++-- 3 files changed, 83 insertions(+), 43 deletions(-) diff --git a/src/com/android/launcher2/FolderIcon.java b/src/com/android/launcher2/FolderIcon.java index 10928c05e..f1a150856 100644 --- a/src/com/android/launcher2/FolderIcon.java +++ b/src/com/android/launcher2/FolderIcon.java @@ -321,44 +321,53 @@ public class FolderIcon extends LinearLayout implements FolderListener { 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]); + // 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()); + } - to.offset(center[0] - animateView.getMeasuredWidth() / 2, - center[1] - animateView.getMeasuredHeight() / 2); + 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]); - float finalAlpha = index < NUM_ITEMS_IN_PREVIEW ? 0.5f : 0f; + to.offset(center[0] - animateView.getMeasuredWidth() / 2, + center[1] - animateView.getMeasuredHeight() / 2); - 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); + 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 7ab41bc4e..9f42cfd58 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -40,7 +40,6 @@ import android.content.Context; 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.Rect; 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 android.widget.Toast; 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 @@ public final class Launcher extends Activity 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 @@ public final class Launcher extends Activity 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 947c94624..36ce4d0b3 100644 --- a/src/com/android/launcher2/Workspace.java +++ b/src/com/android/launcher2/Workspace.java @@ -2208,8 +2208,15 @@ public class Workspace extends SmoothPagedView 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 @@ public class Workspace extends SmoothPagedView 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() { -- cgit v1.2.3