package com.fastaccess.provider.loader; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.support.v4.content.AsyncTaskLoader; import com.fastaccess.App; import com.fastaccess.BuildConfig; import com.fastaccess.data.dao.AppsModel; import com.fastaccess.helper.AppHelper; import com.fastaccess.provider.icon.IconCache; import com.fastaccess.provider.receiver.ApplicationsReceiver; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class DeviceAppsLoader extends AsyncTaskLoader<List<AppsModel>> { private ApplicationsReceiver mAppsObserver; private final PackageManager packageManager; private List<AppsModel> appsModelList; public DeviceAppsLoader(Context ctx) { super(ctx); packageManager = getContext().getPackageManager(); } @Override public List<AppsModel> loadInBackground() { try { List<AppsModel> entries = new ArrayList<>(); Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); List<ResolveInfo> list = packageManager.queryIntentActivities(mainIntent, 0); if (list == null || list.isEmpty()) { return entries; } Collections.sort(list, new ResolveInfo.DisplayNameComparator(packageManager)); String appPackage = BuildConfig.APPLICATION_ID; IconCache iconCache = App.getInstance().getIconCache(); for (ResolveInfo resolveInfo : list) { if (!resolveInfo.activityInfo.applicationInfo.packageName.equalsIgnoreCase(appPackage)) { AppsModel model = new AppsModel(); model.setPackageName(resolveInfo.activityInfo.applicationInfo.packageName); model.setActivityInfoName(resolveInfo.activityInfo.name); iconCache.getTitleAndIcon(model, resolveInfo, null); entries.add(model); } } return entries; } catch (Exception e) {//catching TransactionTooLargeException, e.printStackTrace(); return AppHelper.getInstalledPackages(getContext()); } } @Override public void deliverResult(List<AppsModel> apps) { if (isReset()) { if (apps != null) { return; } } appsModelList = apps; if (isStarted()) { super.deliverResult(apps); } } @Override protected void onStartLoading() { if (appsModelList != null && !appsModelList.isEmpty()) { deliverResult(appsModelList); } if (mAppsObserver == null) { mAppsObserver = new ApplicationsReceiver(this); } if (takeContentChanged()) { forceLoad(); } else if (appsModelList == null) { forceLoad(); } } @Override protected void onStopLoading() { cancelLoad(); } @Override protected void onReset() { onStopLoading(); if (appsModelList != null) { appsModelList = null; } if (mAppsObserver != null) { getContext().unregisterReceiver(mAppsObserver); mAppsObserver = null; } } @Override public void onCanceled(List<AppsModel> apps) { super.onCanceled(apps); } @Override public void forceLoad() { if (appsModelList != null) appsModelList.clear(); super.forceLoad(); } }