From 6d3586c761baafc28aeff755c16c2f5968229f22 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Fri, 8 Sep 2017 12:39:10 -0700 Subject: Polish animation when icon returns to Folder. ie. The animation when the user drags an icon from a Folder to a full workspace/hotseat. Bug: 31443188 Change-Id: If51b23cd8fc822543ac3f550f9fd2e48dd58e0e9 --- src/com/android/launcher3/Workspace.java | 2 +- src/com/android/launcher3/folder/Folder.java | 2 +- src/com/android/launcher3/folder/FolderIcon.java | 42 ++++++++++++++-------- .../launcher3/folder/PreviewItemManager.java | 24 +++++++------ 4 files changed, 44 insertions(+), 26 deletions(-) diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index d7f709932..59437f608 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -2092,7 +2092,7 @@ public class Workspace extends PagedView if (dropOverView instanceof FolderIcon) { FolderIcon fi = (FolderIcon) dropOverView; if (fi.acceptDrop(d.dragInfo)) { - fi.onDrop(d); + fi.onDrop(d, false /* itemReturnedOnFailedDrop */); // if the drag started here, we need to remove it from the workspace if (!external) { diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 64a2dabab..b7f8f3e2e 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -888,7 +888,7 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC mItemsInvalidated = true; try (SuppressInfoChanges s = new SuppressInfoChanges()) { - mFolderIcon.onDrop(d); + mFolderIcon.onDrop(d, true /* itemReturnedOnFailedDrop */); } } diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java index bb0a72626..399888899 100644 --- a/src/com/android/launcher3/folder/FolderIcon.java +++ b/src/com/android/launcher3/folder/FolderIcon.java @@ -100,6 +100,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { ClippedFolderIconLayoutRule mPreviewLayoutRule; private PreviewItemManager mPreviewItemManager; private PreviewItemDrawingParams mTmpParams = new PreviewItemDrawingParams(0, 0, 0, 0); + private List mCurrentPreviewItems = new ArrayList<>(); boolean mAnimating = false; private Rect mTempBounds = new Rect(); @@ -198,7 +199,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { private void setFolder(Folder folder) { mFolder = folder; mPreviewVerifier = new FolderIconPreviewVerifier(mLauncher.getDeviceProfile().inv); - mPreviewItemManager.updateItemDrawingParams(false); + updatePreviewItems(false); } private boolean willAcceptItem(ItemInfo item) { @@ -262,7 +263,8 @@ public class FolderIcon extends FrameLayout implements FolderListener { .start(); // This will animate the dragView (srcView) into the new folder - onDrop(srcInfo, srcView, dstRect, scaleRelativeToDragLayer, 1, postAnimationRunnable); + onDrop(srcInfo, srcView, dstRect, scaleRelativeToDragLayer, 1, postAnimationRunnable, + false /* itemReturnedOnFailedDrop */); } public void performDestroyAnimation(Runnable onCompleteRunnable) { @@ -277,7 +279,8 @@ public class FolderIcon extends FrameLayout implements FolderListener { } private void onDrop(final ShortcutInfo item, DragView animateView, Rect finalRect, - float scaleRelativeToDragLayer, int index, Runnable postAnimationRunnable) { + float scaleRelativeToDragLayer, int index, Runnable postAnimationRunnable, + boolean itemReturnedOnFailedDrop) { item.cellX = -1; item.cellY = -1; @@ -305,21 +308,25 @@ public class FolderIcon extends FrameLayout implements FolderListener { workspace.resetTransitionTransform((CellLayout) getParent().getParent()); } + int numItemsInPreview = Math.min(MAX_NUM_ITEMS_IN_PREVIEW, index + 1); boolean itemAdded = false; - if (index >= MAX_NUM_ITEMS_IN_PREVIEW) { - List oldPreviewItems = getPreviewItemsOnPage(0); + if (itemReturnedOnFailedDrop || index >= MAX_NUM_ITEMS_IN_PREVIEW) { + List oldPreviewItems = new ArrayList<>(mCurrentPreviewItems); addItem(item, false); - List newPreviewItems = getPreviewItemsOnPage(0); + mCurrentPreviewItems.clear(); + mCurrentPreviewItems.addAll(getPreviewItems()); - if (!oldPreviewItems.containsAll(newPreviewItems)) { - for (int i = 0; i < newPreviewItems.size(); ++i) { - if (newPreviewItems.get(i).getTag().equals(item)) { + if (!oldPreviewItems.equals(mCurrentPreviewItems)) { + for (int i = 0; i < mCurrentPreviewItems.size(); ++i) { + if (mCurrentPreviewItems.get(i).getTag().equals(item)) { // If the item dropped is going to be in the preview, we update the // index here to reflect its position in the preview. index = i; } } - mPreviewItemManager.onDrop(oldPreviewItems, newPreviewItems, item); + + mPreviewItemManager.hidePreviewItem(index, true); + mPreviewItemManager.onDrop(oldPreviewItems, mCurrentPreviewItems, item); itemAdded = true; } else { removeItem(item, false); @@ -331,7 +338,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { } int[] center = new int[2]; - float scale = getLocalCenterForIndex(index, index + 1, center); + float scale = getLocalCenterForIndex(index, numItemsInPreview, center); center[0] = (int) Math.round(scaleRelativeToDragLayer * center[0]); center[1] = (int) Math.round(scaleRelativeToDragLayer * center[1]); @@ -362,7 +369,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { } } - public void onDrop(DragObject d) { + public void onDrop(DragObject d, boolean itemReturnedOnFailedDrop) { ShortcutInfo item; if (d.dragInfo instanceof AppInfo) { // Came from all apps -- make a copy @@ -374,7 +381,8 @@ public class FolderIcon extends FrameLayout implements FolderListener { item = (ShortcutInfo) d.dragInfo; } mFolder.notifyDrop(); - onDrop(item, d.dragView, null, 1.0f, mInfo.contents.size(), d.postAnimationRunnable); + onDrop(item, d.dragView, null, 1.0f, mInfo.contents.size(), d.postAnimationRunnable, + itemReturnedOnFailedDrop); } public void setBadgeInfo(FolderBadgeInfo badgeInfo) { @@ -545,11 +553,17 @@ public class FolderIcon extends FrameLayout implements FolderListener { @Override public void onItemsChanged(boolean animate) { - mPreviewItemManager.updateItemDrawingParams(animate); + updatePreviewItems(animate); invalidate(); requestLayout(); } + private void updatePreviewItems(boolean animate) { + mPreviewItemManager.updatePreviewItems(animate); + mCurrentPreviewItems.clear(); + mCurrentPreviewItems.addAll(getPreviewItems()); + } + @Override public void prepareAutoUpdate() { } diff --git a/src/com/android/launcher3/folder/PreviewItemManager.java b/src/com/android/launcher3/folder/PreviewItemManager.java index 5d400100f..06d3eb166 100644 --- a/src/com/android/launcher3/folder/PreviewItemManager.java +++ b/src/com/android/launcher3/folder/PreviewItemManager.java @@ -110,7 +110,7 @@ public class PreviewItemManager { mIcon.mPreviewLayoutRule.init(mIcon.mBackground.previewSize, mIntrinsicIconSize, Utilities.isRtl(mIcon.getResources())); - updateItemDrawingParams(false); + updatePreviewItems(false); } } @@ -185,6 +185,11 @@ public class PreviewItemManager { } public void hidePreviewItem(int index, boolean hidden) { + // If there are more params than visible in the preview, they are used for enter/exit + // animation purposes and they were added to the front of the list. + // To index the params properly, we need to skip these params. + index = index + Math.max(mFirstPageParams.size() - MAX_NUM_ITEMS_IN_PREVIEW, 0); + PreviewItemDrawingParams params = index < mFirstPageParams.size() ? mFirstPageParams.get(index) : null; if (params != null) { @@ -266,7 +271,7 @@ public class PreviewItemManager { } } - void updateItemDrawingParams(boolean animate) { + void updatePreviewItems(boolean animate) { buildParamsForPage(0, mFirstPageParams, animate); } @@ -310,8 +315,8 @@ public class PreviewItemManager { int prevIndex = newParams.indexOf(moveIn.get(i)); PreviewItemDrawingParams p = params.get(prevIndex); computePreviewItemDrawingParams(prevIndex, numItems, p); - updateTransitionParam(p, moveIn.get(i), ENTER_INDEX, - newParams.indexOf(moveIn.get(i))); + updateTransitionParam(p, moveIn.get(i), ENTER_INDEX, newParams.indexOf(moveIn.get(i)), + numItems); } // Items that are moving into new positions within the preview. @@ -319,7 +324,7 @@ public class PreviewItemManager { int oldIndex = oldParams.indexOf(newParams.get(newIndex)); if (oldIndex >= 0 && newIndex != oldIndex) { PreviewItemDrawingParams p = params.get(newIndex); - updateTransitionParam(p, newParams.get(newIndex), oldIndex, newIndex); + updateTransitionParam(p, newParams.get(newIndex), oldIndex, newIndex, numItems); } } @@ -330,7 +335,7 @@ public class PreviewItemManager { BubbleTextView item = moveOut.get(i); int oldIndex = oldParams.indexOf(item); PreviewItemDrawingParams p = computePreviewItemDrawingParams(oldIndex, numItems, null); - updateTransitionParam(p, item, oldIndex, EXIT_INDEX); + updateTransitionParam(p, item, oldIndex, EXIT_INDEX, numItems); params.add(0, p); // We want these items first so that they are on drawn last. } @@ -342,7 +347,7 @@ public class PreviewItemManager { } private void updateTransitionParam(final PreviewItemDrawingParams p, BubbleTextView btv, - int prevIndex, int newIndex) { + int prevIndex, int newIndex, int numItems) { p.drawable = btv.getCompoundDrawables()[1]; if (!mIcon.mFolder.isOpen()) { // Set the callback to FolderIcon as it is responsible to drawing the icon. The @@ -350,9 +355,8 @@ public class PreviewItemManager { p.drawable.setCallback(mIcon); } - FolderPreviewItemAnim anim = new FolderPreviewItemAnim(this, p, prevIndex, - MAX_NUM_ITEMS_IN_PREVIEW, newIndex, MAX_NUM_ITEMS_IN_PREVIEW, - DROP_IN_ANIMATION_DURATION, null); + FolderPreviewItemAnim anim = new FolderPreviewItemAnim(this, p, prevIndex, numItems, + newIndex, numItems, DROP_IN_ANIMATION_DURATION, null); if (p.anim != null && !p.anim.hasEqualFinalState(anim)) { p.anim.cancel(); } -- cgit v1.2.3