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

Commit 80fed353 authored by Tony Wickham's avatar Tony Wickham Committed by Android (Google) Code Review
Browse files

Merge "Properly animate canceled deep shortcut drag back to original icon" into tm-dev

parents 18b9d159 a56a197e
Loading
Loading
Loading
Loading
+14 −18
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
package com.android.launcher3.taskbar;

import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_ALL_APPS;
import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -55,20 +56,20 @@ import com.android.launcher3.dragndrop.DragDriver;
import com.android.launcher3.dragndrop.DragOptions;
import com.android.launcher3.dragndrop.DragView;
import com.android.launcher3.dragndrop.DraggableView;
import com.android.launcher3.folder.FolderIcon;
import com.android.launcher3.graphics.DragPreviewProvider;
import com.android.launcher3.logging.StatsLogManager;
import com.android.launcher3.model.data.FolderInfo;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.model.data.WorkspaceItemInfo;
import com.android.launcher3.popup.PopupContainerWithArrow;
import com.android.launcher3.shortcuts.DeepShortcutView;
import com.android.launcher3.shortcuts.ShortcutDragPreviewProvider;
import com.android.launcher3.util.LauncherBindableItemsContainer;
import com.android.launcher3.util.IntSet;
import com.android.launcher3.util.ItemInfoMatcher;
import com.android.systemui.shared.recents.model.Task;

import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Collections;

/**
 * Handles long click on Taskbar items to start a system drag and drop operation.
@@ -422,23 +423,18 @@ public class TaskbarDragController extends DragController<BaseTaskbarContext> im
            ItemInfo item = (ItemInfo) tag;
            TaskbarViewController taskbarViewController = mControllers.taskbarViewController;
            if (item.container == CONTAINER_ALL_APPS) {
                // Since all apps closes when the drag starts, target the all apps button instead
                // Since all apps closes when the drag starts, target the all apps button instead.
                target = taskbarViewController.getAllAppsButtonView();
            } else if (item.container >= 0) {
                // Since folders close when the drag starts, target the folder icon instead
                LauncherBindableItemsContainer.ItemOperator op = (info, v) -> {
                    if (info instanceof FolderInfo && v instanceof FolderIcon) {
                        FolderInfo fi = (FolderInfo) info;
                        for (WorkspaceItemInfo si : fi.contents) {
                            if (si.id == item.id) {
                                // Found the parent
                                return true;
                            }
                        }
                    }
                    return false;
                };
                target = taskbarViewController.mapOverItems(op);
                // Since folders close when the drag starts, target the folder icon instead.
                ItemInfoMatcher matcher = ItemInfoMatcher.forFolderMatch(
                        ItemInfoMatcher.ofItemIds(IntSet.wrap(item.id)));
                target = taskbarViewController.getFirstIconMatch(matcher);
            } else if (item.itemType == ITEM_TYPE_DEEP_SHORTCUT) {
                // Find first icon with same package/user as the deep shortcut.
                ItemInfoMatcher packageUserMatcher = ItemInfoMatcher.ofPackages(
                        Collections.singleton(item.getTargetPackage()), item.user);
                target = taskbarViewController.getFirstIconMatch(packageUserMatcher);
            }
        }

+25 −5
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import com.android.launcher3.model.data.FolderInfo;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.model.data.WorkspaceItemInfo;
import com.android.launcher3.uioverrides.ApiWrapper;
import com.android.launcher3.util.ItemInfoMatcher;
import com.android.launcher3.util.LauncherBindableItemsContainer;
import com.android.launcher3.views.ActivityContext;
import com.android.launcher3.views.AllAppsButton;
@@ -367,17 +368,36 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar
    }

    /**
     * Maps {@code op} over all the child views, returning the view that {@code op} evaluates
     * {@code true} for, or {@code null} if none satisfy {@code op}.
     * Maps {@code op} over all the child views.
     */
    protected View mapOverItems(LauncherBindableItemsContainer.ItemOperator op) {
    public void mapOverItems(LauncherBindableItemsContainer.ItemOperator op) {
        // map over all the shortcuts on the taskbar
        for (int i = 0; i < getChildCount(); i++) {
            View item = getChildAt(i);
            if (op.evaluate((ItemInfo) item.getTag(), item)) {
                return;
            }
        }
    }

    /**
     * Finds the first icon to match one of the given matchers, from highest to lowest priority.
     * @return The first match, or All Apps button if no match was found.
     */
    public View getFirstMatch(ItemInfoMatcher... matchers) {
        for (ItemInfoMatcher matcher : matchers) {
            for (int i = 0; i < getChildCount(); i++) {
                View item = getChildAt(i);
                if (!(item.getTag() instanceof ItemInfo)) {
                    // Should only happen for All Apps button.
                    continue;
                }
                ItemInfo info = (ItemInfo) item.getTag();
                if (matcher.matchesInfo(info)) {
                    return item;
                }
            }
        return null;
        }
        return mAllAppsButton;
    }
}
+17 −2
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import com.android.launcher3.anim.PendingAnimation;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.folder.FolderIcon;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.util.ItemInfoMatcher;
import com.android.launcher3.util.LauncherBindableItemsContainer;
import com.android.launcher3.util.MultiValueAlpha;
import com.android.quickstep.AnimatedFloat;
@@ -274,8 +275,22 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar
        mTaskbarNavButtonTranslationY.updateValue(-deviceProfile.getTaskbarOffsetY());
    }

    public View mapOverItems(LauncherBindableItemsContainer.ItemOperator op) {
        return mTaskbarView.mapOverItems(op);
    /**
     * Maps the given operator to all the top-level children of TaskbarView.
     */
    public void mapOverItems(LauncherBindableItemsContainer.ItemOperator op) {
        mTaskbarView.mapOverItems(op);
    }

    /**
     * Returns the first icon to match the given parameter, in priority from:
     * 1) Icons directly on Taskbar
     * 2) FolderIcon of the Folder containing the given icon
     * 3) All Apps button
     */
    public View getFirstIconMatch(ItemInfoMatcher matcher) {
        ItemInfoMatcher folderMatcher = ItemInfoMatcher.forFolderMatch(matcher);
        return mTaskbarView.getFirstMatch(matcher, folderMatcher);
    }

    /**