Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d3586c7 authored by Jon Miranda's avatar Jon Miranda
Browse files

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
parent 2f8d53d2
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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) {
+1 −1
Original line number Diff line number Diff line
@@ -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 */);
            }
        }

+28 −14
Original line number Diff line number Diff line
@@ -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<BubbleTextView> 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<BubbleTextView> oldPreviewItems = getPreviewItemsOnPage(0);
            if (itemReturnedOnFailedDrop || index >= MAX_NUM_ITEMS_IN_PREVIEW) {
                List<BubbleTextView> oldPreviewItems = new ArrayList<>(mCurrentPreviewItems);
                addItem(item, false);
                List<BubbleTextView> 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() {
    }
+14 −10
Original line number Diff line number Diff line
@@ -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();
        }