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