diff options
-rw-r--r-- | src/com/android/launcher2/AppsCustomizePagedView.java | 28 | ||||
-rw-r--r-- | src/com/android/launcher2/DeleteDropTarget.java | 34 | ||||
-rw-r--r-- | src/com/android/launcher2/DragController.java | 10 | ||||
-rw-r--r-- | src/com/android/launcher2/DragSource.java | 17 | ||||
-rw-r--r-- | src/com/android/launcher2/Folder.java | 18 | ||||
-rw-r--r-- | src/com/android/launcher2/Workspace.java | 19 |
6 files changed, 99 insertions, 27 deletions
diff --git a/src/com/android/launcher2/AppsCustomizePagedView.java b/src/com/android/launcher2/AppsCustomizePagedView.java index 1a9958c4b..039ee8aaf 100644 --- a/src/com/android/launcher2/AppsCustomizePagedView.java +++ b/src/com/android/launcher2/AppsCustomizePagedView.java @@ -725,9 +725,14 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen return true; } - private void endDragging(View target, boolean success) { + /** + * Clean up after dragging. + * + * @param target where the item was dragged to (can be null if the item was flung) + */ + private void endDragging(View target, boolean isFlingToDelete, boolean success) { mLauncher.getWorkspace().onDragStopped(success); - if (!success || (target != mLauncher.getWorkspace() && + if (isFlingToDelete || !success || (target != mLauncher.getWorkspace() && !(target instanceof DeleteDropTarget))) { // Exit spring loaded mode if we have not successfully dropped or have not handled the // drop in Workspace @@ -763,8 +768,12 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen } @Override - public void onDropCompleted(View target, DragObject d, boolean success) { - endDragging(target, success); + public void onDropCompleted(View target, DragObject d, boolean isFlingToDelete, + boolean success) { + // Return early and wait for onFlingToDeleteCompleted if this was the result of a fling + if (isFlingToDelete) return; + + endDragging(target, false, success); // Display an error message if the drag failed due to there not being enough space on the // target layout we were dropping on. @@ -791,8 +800,17 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen mDraggingWidget = false; } + @Override + public void onFlingToDeleteCompleted() { + // We just dismiss the drag when we fling, so cleanup here + endDragging(null, true, true); + cleanupWidgetPreloading(); + mDraggingWidget = false; + } + + @Override public boolean supportsFlingToDelete() { - return false; + return true; } @Override diff --git a/src/com/android/launcher2/DeleteDropTarget.java b/src/com/android/launcher2/DeleteDropTarget.java index 6f455905f..7e4225be4 100644 --- a/src/com/android/launcher2/DeleteDropTarget.java +++ b/src/com/android/launcher2/DeleteDropTarget.java @@ -105,6 +105,15 @@ public class DeleteDropTarget extends ButtonDropTarget { return (d.dragSource instanceof Workspace) && (d.dragInfo instanceof FolderInfo); } + private void setHoverColor() { + mCurrentDrawable.startTransition(mTransitionDuration); + setTextColor(mHoverColor); + } + private void resetHoverColor() { + mCurrentDrawable.resetTransition(); + setTextColor(mOriginalTextColor); + } + @Override public boolean acceptDrop(DragObject d) { // We can remove everything including App shortcuts, folders, widgets, etc. @@ -140,8 +149,7 @@ public class DeleteDropTarget extends ButtonDropTarget { mCurrentDrawable = (TransitionDrawable) getCompoundDrawables()[0]; mActive = isVisible; - mCurrentDrawable.resetTransition(); - setTextColor(mOriginalTextColor); + resetHoverColor(); ((ViewGroup) getParent()).setVisibility(isVisible ? View.VISIBLE : View.GONE); if (getText().length() > 0) { setText(isUninstall ? R.string.delete_target_uninstall_label @@ -158,16 +166,14 @@ public class DeleteDropTarget extends ButtonDropTarget { public void onDragEnter(DragObject d) { super.onDragEnter(d); - mCurrentDrawable.startTransition(mTransitionDuration); - setTextColor(mHoverColor); + setHoverColor(); } public void onDragExit(DragObject d) { super.onDragExit(d); if (!d.dragComplete) { - mCurrentDrawable.resetTransition(); - setTextColor(mOriginalTextColor); + resetHoverColor(); } else { // Restore the hover color if we are deleting d.dragView.setColor(mHoverColor); @@ -349,9 +355,15 @@ public class DeleteDropTarget extends ButtonDropTarget { } public void onFlingToDelete(final DragObject d, int x, int y, PointF vel) { + final boolean isAllApps = d.dragSource instanceof AppsCustomizePagedView; + // Don't highlight the icon as it's animating d.dragView.setColor(0); d.dragView.updateInitialScaleToCurrentScale(); + // Don't highlight the target if we are flinging from AllApps + if (isAllApps) { + resetHoverColor(); + } if (mFlingDeleteMode == MODE_FLING_DELETE_TO_TRASH) { // Defer animating out the drop target if we are animating to it @@ -396,8 +408,14 @@ public class DeleteDropTarget extends ButtonDropTarget { @Override public void run() { mSearchDropTargetBar.onDragEnd(); - mLauncher.exitSpringLoadedDragMode(); - completeDrop(d); + + // If we are dragging from AllApps, then we allow AppsCustomizePagedView to clean up + // itself, otherwise, complete the drop to initiate the deletion process + if (!isAllApps) { + mLauncher.exitSpringLoadedDragMode(); + completeDrop(d); + } + mLauncher.getDragController().onDeferredEndFling(d); } }; dragLayer.animateView(d.dragView, updateCb, duration, tInterpolator, onAnimationEndRunnable, diff --git a/src/com/android/launcher2/DragController.java b/src/com/android/launcher2/DragController.java index 2a889257d..5a8617cfe 100644 --- a/src/com/android/launcher2/DragController.java +++ b/src/com/android/launcher2/DragController.java @@ -366,7 +366,7 @@ public class DragController { mDragObject.deferDragViewCleanupPostAnimation = false; mDragObject.cancelled = true; mDragObject.dragComplete = true; - mDragObject.dragSource.onDropCompleted(null, mDragObject, false); + mDragObject.dragSource.onDropCompleted(null, mDragObject, false, false); } endDrag(); } @@ -422,6 +422,10 @@ public class DragController { } } + void onDeferredEndFling(DropTarget.DragObject d) { + d.dragSource.onFlingToDeleteCompleted(); + } + /** * Clamps the position to the drag layer bounds. */ @@ -665,7 +669,7 @@ public class DragController { vel); accepted = true; } - mDragObject.dragSource.onDropCompleted((View) mFlingToDeleteDropTarget, mDragObject, + mDragObject.dragSource.onDropCompleted((View) mFlingToDeleteDropTarget, mDragObject, true, accepted); } @@ -684,7 +688,7 @@ public class DragController { accepted = true; } } - mDragObject.dragSource.onDropCompleted((View) dropTarget, mDragObject, accepted); + mDragObject.dragSource.onDropCompleted((View) dropTarget, mDragObject, false, accepted); } private DropTarget findDropTarget(int x, int y, int[] dropCoordinates) { diff --git a/src/com/android/launcher2/DragSource.java b/src/com/android/launcher2/DragSource.java index a654b93c9..54404770a 100644 --- a/src/com/android/launcher2/DragSource.java +++ b/src/com/android/launcher2/DragSource.java @@ -25,6 +25,21 @@ import com.android.launcher2.DropTarget.DragObject; * */ public interface DragSource { + /** + * @return whether items dragged from this source supports + */ boolean supportsFlingToDelete(); - void onDropCompleted(View target, DragObject d, boolean success); + + /** + * A callback specifically made back to the source after an item from this source has been flung + * to be deleted on a DropTarget. In such a situation, this method will be called after + * onDropCompleted, and more importantly, after the fling animation has completed. + */ + void onFlingToDeleteCompleted(); + + /** + * A callback made back to the source after an item from this source has been dropped on a + * DropTarget. + */ + void onDropCompleted(View target, DragObject d, boolean isFlingToDelete, boolean success); } diff --git a/src/com/android/launcher2/Folder.java b/src/com/android/launcher2/Folder.java index 6856a09eb..c502fb703 100644 --- a/src/com/android/launcher2/Folder.java +++ b/src/com/android/launcher2/Folder.java @@ -44,6 +44,7 @@ import android.widget.LinearLayout; import android.widget.TextView; import com.android.launcher.R; +import com.android.launcher2.DropTarget.DragObject; import com.android.launcher2.FolderInfo.FolderListener; import java.util.ArrayList; @@ -619,7 +620,8 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList mReorderAlarm.cancelAlarm(); } - public void onDropCompleted(View target, DragObject d, boolean success) { + public void onDropCompleted(View target, DragObject d, boolean isFlingToDelete, + boolean success) { if (success) { if (mDeleteFolderOnDropCompleted && !mItemAddedBackToSelfViaIcon) { replaceFolderWithFinalItem(); @@ -653,10 +655,20 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList updateItemLocationsInDatabase(); } + @Override public boolean supportsFlingToDelete() { return true; } + public void onFlingToDelete(DragObject d, int x, int y, PointF vec) { + // Do nothing + } + + @Override + public void onFlingToDeleteCompleted() { + // Do nothing + } + private void updateItemLocationsInDatabase() { ArrayList<View> list = getItemsInReadingOrder(); for (int i = 0; i < list.size(); i++) { @@ -928,10 +940,6 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList mInfo.add(item); } - public void onFlingToDelete(DragObject d, int x, int y, PointF vec) { - // Do nothing - } - public void onAdd(ShortcutInfo item) { mItemsInvalidated = true; // If the item was dropped onto this open folder, we have done the work associated diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java index 8f11612ef..423c9ce08 100644 --- a/src/com/android/launcher2/Workspace.java +++ b/src/com/android/launcher2/Workspace.java @@ -59,6 +59,7 @@ import android.widget.ImageView; import android.widget.TextView; import com.android.launcher.R; +import com.android.launcher2.DropTarget.DragObject; import com.android.launcher2.FolderIcon.FolderRingAnimator; import com.android.launcher2.InstallWidgetReceiver.WidgetMimeTypeHandlerData; import com.android.launcher2.LauncherSettings.Favorites; @@ -2340,10 +2341,6 @@ public class Workspace extends SmoothPagedView } } - public void onFlingToDelete(DragObject d, int x, int y, PointF vec) { - // Do nothing - } - public void setFinalScrollForPageChange(int screen) { if (screen >= 0) { mSavedScrollX = getScrollX(); @@ -3279,7 +3276,8 @@ public class Workspace extends SmoothPagedView /** * Called at the end of a drag which originated on the workspace. */ - public void onDropCompleted(View target, DragObject d, boolean success) { + public void onDropCompleted(View target, DragObject d, boolean isFlingToDelete, + boolean success) { if (success) { if (target != this) { if (mDragInfo != null) { @@ -3336,10 +3334,21 @@ public class Workspace extends SmoothPagedView } } + @Override public boolean supportsFlingToDelete() { return true; } + @Override + public void onFlingToDelete(DragObject d, int x, int y, PointF vec) { + // Do nothing + } + + @Override + public void onFlingToDeleteCompleted() { + // Do nothing + } + public boolean isDropEnabled() { return true; } |