diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutManager.java b/src/com/android/launcher3/shortcuts/DeepShortcutManager.java index 66e98cd424..450c36df44 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutManager.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutManager.java @@ -81,11 +81,13 @@ public class DeepShortcutManager { } /** - * Gets all the shortcuts associated with the given package and user. + * Gets all the manifest and dynamic shortcuts associated with the given package and user, + * to be displayed in the shortcuts container on long press. */ - public List queryForAllAppShortcuts(ComponentName activity, + public List queryForShortcutsContainer(ComponentName activity, List ids, UserHandleCompat user) { - return query(FLAG_GET_ALL, activity.getPackageName(), activity, ids, user); + return query(FLAG_MATCH_MANIFEST | FLAG_MATCH_DYNAMIC, + activity.getPackageName(), activity, ids, user); } /** diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java index d9e34a69a3..70082f3653 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java @@ -38,6 +38,8 @@ import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.UiThreadCircularReveal; +import java.util.Collections; +import java.util.Comparator; import java.util.List; /** @@ -65,6 +67,26 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC private boolean mIsLeftAligned; private boolean mIsAboveIcon; + /** + * Sorts shortcuts in rank order, with manifest shortcuts coming before dynamic shortcuts. + */ + private static final Comparator sShortcutsComparator + = new Comparator() { + @Override + public int compare(ShortcutInfoCompat a, ShortcutInfoCompat b) { + if (a.isDeclaredInManifest() && !b.isDeclaredInManifest()) { + return -1; + } + if (!a.isDeclaredInManifest() && b.isDeclaredInManifest()) { + return 1; + } + return Integer.compare(a.getRank(), b.getRank()); + } + }; + + private static final Comparator sShortcutsComparatorReversed + = Collections.reverseOrder(sShortcutsComparator); + public DeepShortcutsContainer(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mLauncher = (Launcher) context; @@ -109,7 +131,11 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC @Override public void run() { final List shortcuts = mDeepShortcutsManager - .queryForAllAppShortcuts(activity, ids, user); + .queryForShortcutsContainer(activity, ids, user); + // We want the lowest rank to be closest to the user's finger. + final Comparator shortcutsComparator = mIsAboveIcon ? + sShortcutsComparatorReversed : sShortcutsComparator; + Collections.sort(shortcuts, shortcutsComparator); for (int i = 0; i < shortcuts.size(); i++) { final ShortcutInfoCompat shortcut = shortcuts.get(i); final ShortcutInfo launcherShortcutInfo = ShortcutInfo diff --git a/src/com/android/launcher3/shortcuts/ShortcutInfoCompat.java b/src/com/android/launcher3/shortcuts/ShortcutInfoCompat.java index 8dbeaa7410..00553dfbd3 100644 --- a/src/com/android/launcher3/shortcuts/ShortcutInfoCompat.java +++ b/src/com/android/launcher3/shortcuts/ShortcutInfoCompat.java @@ -97,6 +97,14 @@ public class ShortcutInfoCompat { return mShortcutInfo.isPinned(); } + public boolean isDeclaredInManifest() { + return mShortcutInfo.isDeclaredInManifest(); + } + + public int getRank() { + return mShortcutInfo.getRank(); + } + @Override public String toString() { return mShortcutInfo.toString();