summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/model/WidgetsAndShortcutNameComparator.java
blob: 61e89528314194c56b5d6762c09357e758f74c59 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.android.launcher3.model;

import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;

import com.android.launcher3.LauncherAppWidgetProviderInfo;
import com.android.launcher3.Utilities;
import com.android.launcher3.compat.AppWidgetManagerCompat;
import com.android.launcher3.compat.UserHandleCompat;

import java.text.Collator;
import java.util.Comparator;
import java.util.HashMap;

public class WidgetsAndShortcutNameComparator implements Comparator<Object> {
    private final AppWidgetManagerCompat mManager;
    private final PackageManager mPackageManager;
    private final HashMap<Object, String> mLabelCache;
    private final Collator mCollator;
    private final UserHandleCompat mMainHandle;

    public WidgetsAndShortcutNameComparator(Context context) {
        mManager = AppWidgetManagerCompat.getInstance(context);
        mPackageManager = context.getPackageManager();
        mLabelCache = new HashMap<Object, String>();
        mCollator = Collator.getInstance();
        mMainHandle = UserHandleCompat.myUserHandle();
    }

    @Override
    public final int compare(Object a, Object b) {
        String labelA, labelB;
        if (mLabelCache.containsKey(a)) {
            labelA = mLabelCache.get(a);
        } else {
            labelA = (a instanceof LauncherAppWidgetProviderInfo)
                    ? Utilities.trim(mManager.loadLabel((LauncherAppWidgetProviderInfo) a))
                    : Utilities.trim(((ResolveInfo) a).loadLabel(mPackageManager));
            mLabelCache.put(a, labelA);
        }
        if (mLabelCache.containsKey(b)) {
            labelB = mLabelCache.get(b);
        } else {
            labelB = (b instanceof LauncherAppWidgetProviderInfo)
                    ? Utilities.trim(mManager.loadLabel((LauncherAppWidgetProviderInfo) b))
                    : Utilities.trim(((ResolveInfo) b).loadLabel(mPackageManager));
            mLabelCache.put(b, labelB);
        }

        // Currently, there is no work profile shortcuts, hence only considering the widget cases.

        boolean aWorkProfile = (a instanceof LauncherAppWidgetProviderInfo) &&
                !mMainHandle.equals(mManager.getUser((LauncherAppWidgetProviderInfo) a));
        boolean bWorkProfile = (b instanceof LauncherAppWidgetProviderInfo) &&
                !mMainHandle.equals(mManager.getUser((LauncherAppWidgetProviderInfo) b));

        // Independent of how the labels compare, if only one of the two widget info belongs to
        // work profile, put that one in the back.
        if (aWorkProfile && !bWorkProfile) {
            return 1;
        }
        if (!aWorkProfile && bWorkProfile) {
            return -1;
        }
        return mCollator.compare(labelA, labelB);
    }
};