package com.pitchedapps.butler.iconrequest.utils;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import com.pitchedapps.butler.iconrequest.App;
import com.pitchedapps.butler.iconrequest.events.AppLoadingEvent;
import com.pitchedapps.butler.iconrequest.events.EventState;
import com.pitchedapps.butler.iconrequest.logs.IRLog;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
/**
* Created by Allan Wang on 2016-08-20.
*/
public class ComponentInfoUtil {
private static class NameComparator implements Comparator<ResolveInfo> {
private final PackageManager mPM;
public NameComparator(PackageManager pm) {
mPM = pm;
}
@Override
public int compare(ResolveInfo ra, ResolveInfo rb) {
CharSequence sa = ra.loadLabel(mPM);
if (sa == null) {
sa = ra.activityInfo.packageName;
}
CharSequence sb = rb.loadLabel(mPM);
if (sb == null) {
sb = rb.activityInfo.packageName;
}
return sa.toString().compareTo(sb.toString());
}
}
public static ArrayList<App> getInstalledApps(final Context context,
final HashSet<String> filter,
final EventState loadingState) {
IRUtils.startTimer("getInstalledApps");
final PackageManager pm = context.getPackageManager();
EventBusUtils.post(new AppLoadingEvent(-1), loadingState);
final List<ResolveInfo> packageList =
pm.queryIntentActivities(
new Intent("android.intent.action.MAIN")
.addCategory("android.intent.category.LAUNCHER"), 0);
// TODO: This throws IllegalArgumentException: Comparison method violates its general
// contract!
Collections.sort(packageList, new NameComparator(pm));
final ArrayList<App> apps = new ArrayList<>();
int loaded = 0;
int filtered = 0;
for (ResolveInfo ri : packageList) {
String riPkg = ri.activityInfo.packageName;
String launchStr = riPkg + "/" + ri.activityInfo.name;
if ((filter.contains(launchStr)) || (context.getPackageName().equals(riPkg))) {
filtered++;
// IRLog.d("Filtered %s", launchStr);
continue;
}
// IRLog.d("Loaded %s", launchStr);
CharSequence name = ri.loadLabel(pm);
if (name == null) name = ri.activityInfo.packageName;
apps.add(new App(IRUtils.getLocalizedName(context, launchStr, name.toString()),
launchStr, ri.activityInfo.packageName));
loaded++;
final int percent = (loaded * 100 / packageList.size());
EventBusUtils.post(new AppLoadingEvent(percent), loadingState);
}
IRLog.d("Loaded %d total app(s), filtered out %d app(s).", apps.size(), filtered);
IRUtils.stopTimer("getInstalledApps");
return apps;
}
private ComponentInfoUtil() {
}
}