1package com.android.launcher3.model;
2
3import android.content.Context;
4import android.content.pm.PackageManager;
5import android.content.pm.ResolveInfo;
6
7import com.android.launcher3.LauncherAppWidgetProviderInfo;
8import com.android.launcher3.Utilities;
9import com.android.launcher3.compat.AppWidgetManagerCompat;
10import com.android.launcher3.compat.UserHandleCompat;
11
12import java.text.Collator;
13import java.util.Comparator;
14import java.util.HashMap;
15
16public class WidgetsAndShortcutNameComparator implements Comparator<Object> {
17    private final AppWidgetManagerCompat mManager;
18    private final PackageManager mPackageManager;
19    private final HashMap<Object, String> mLabelCache;
20    private final Collator mCollator;
21    private final UserHandleCompat mMainHandle;
22
23    public WidgetsAndShortcutNameComparator(Context context) {
24        mManager = AppWidgetManagerCompat.getInstance(context);
25        mPackageManager = context.getPackageManager();
26        mLabelCache = new HashMap<Object, String>();
27        mCollator = Collator.getInstance();
28        mMainHandle = UserHandleCompat.myUserHandle();
29    }
30
31    @Override
32    public final int compare(Object a, Object b) {
33        String labelA, labelB;
34        if (mLabelCache.containsKey(a)) {
35            labelA = mLabelCache.get(a);
36        } else {
37            labelA = (a instanceof LauncherAppWidgetProviderInfo)
38                    ? Utilities.trim(mManager.loadLabel((LauncherAppWidgetProviderInfo) a))
39                    : Utilities.trim(((ResolveInfo) a).loadLabel(mPackageManager));
40            mLabelCache.put(a, labelA);
41        }
42        if (mLabelCache.containsKey(b)) {
43            labelB = mLabelCache.get(b);
44        } else {
45            labelB = (b instanceof LauncherAppWidgetProviderInfo)
46                    ? Utilities.trim(mManager.loadLabel((LauncherAppWidgetProviderInfo) b))
47                    : Utilities.trim(((ResolveInfo) b).loadLabel(mPackageManager));
48            mLabelCache.put(b, labelB);
49        }
50
51        // Currently, there is no work profile shortcuts, hence only considering the widget cases.
52
53        boolean aWorkProfile = (a instanceof LauncherAppWidgetProviderInfo) &&
54                !mMainHandle.equals(mManager.getUser((LauncherAppWidgetProviderInfo) a));
55        boolean bWorkProfile = (b instanceof LauncherAppWidgetProviderInfo) &&
56                !mMainHandle.equals(mManager.getUser((LauncherAppWidgetProviderInfo) b));
57
58        // Independent of how the labels compare, if only one of the two widget info belongs to
59        // work profile, put that one in the back.
60        if (aWorkProfile && !bWorkProfile) {
61            return 1;
62        }
63        if (!aWorkProfile && bWorkProfile) {
64            return -1;
65        }
66        return mCollator.compare(labelA, labelB);
67    }
68};
69