summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/model/WidgetsAndShortcutNameComparator.java
blob: b99056023a02235a4a02951513e7e22b15552298 (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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package com.android.launcher3.model;

import android.content.ComponentName;
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 com.android.launcher3.util.ComponentKey;

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<ComponentKey, String> mLabelCache;
    private final Collator mCollator;
    private final UserHandleCompat mMainHandle;

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

    /**
     * Resets any stored state.
     */
    public void reset() {
        mLabelCache.clear();
    }

    @Override
    public final int compare(Object objA, Object objB) {
        ComponentKey keyA = getComponentKey(objA);
        ComponentKey keyB = getComponentKey(objB);

        // Independent of how the labels compare, if only one of the two widget info belongs to
        // work profile, put that one in the back.
        boolean aWorkProfile = !mMainHandle.equals(keyA.user);
        boolean bWorkProfile = !mMainHandle.equals(keyB.user);
        if (aWorkProfile && !bWorkProfile) {
            return 1;
        }
        if (!aWorkProfile && bWorkProfile) {
            return -1;
        }

        // Get the labels for comparison
        String labelA = mLabelCache.get(keyA);
        String labelB = mLabelCache.get(keyB);
        if (labelA == null) {
            labelA = getLabel(objA);
            mLabelCache.put(keyA, labelA);
        }
        if (labelB == null) {
            labelB = getLabel(objB);
            mLabelCache.put(keyB, labelB);
        }
        return mCollator.compare(labelA, labelB);
    }

    /**
     * @return a component key for the given widget or shortcut info.
     */
    private ComponentKey getComponentKey(Object o) {
        if (o instanceof LauncherAppWidgetProviderInfo) {
            LauncherAppWidgetProviderInfo widgetInfo = (LauncherAppWidgetProviderInfo) o;
            return new ComponentKey(widgetInfo.provider, mManager.getUser(widgetInfo));
        } else {
            ResolveInfo shortcutInfo = (ResolveInfo) o;
            ComponentName cn = new ComponentName(shortcutInfo.activityInfo.packageName,
                    shortcutInfo.activityInfo.name);
            // Currently, there are no work profile shortcuts
            return new ComponentKey(cn, UserHandleCompat.myUserHandle());
        }
    }

    /**
     * @return the label for the given widget or shortcut info.  This may be an expensive call.
     */
    private String getLabel(Object o) {
        if (o instanceof LauncherAppWidgetProviderInfo) {
            LauncherAppWidgetProviderInfo widgetInfo = (LauncherAppWidgetProviderInfo) o;
            return Utilities.trim(mManager.loadLabel(widgetInfo));
        } else {
            ResolveInfo shortcutInfo = (ResolveInfo) o;
            return Utilities.trim(shortcutInfo.loadLabel(mPackageManager));
        }
    }
};