package com.fastaccess.provider.loader; import android.content.ComponentName; 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.data.dao.AppsModel; import com.fastaccess.provider.icon.IconCache; import com.fastaccess.provider.receiver.ApplicationsReceiver; import java.util.ArrayList; import java.util.List; public class SelectedAppsLoader extends AsyncTaskLoader<List<AppsModel>> { private ApplicationsReceiver mAppsObserver; private final PackageManager packageManager; private List<AppsModel> appsModelList; private long folderId = -1; public SelectedAppsLoader(Context ctx) { super(ctx); packageManager = getContext().getPackageManager(); } public SelectedAppsLoader(Context ctx, long folderId) { super(ctx); this.folderId = folderId; packageManager = getContext().getPackageManager(); } @Override public List<AppsModel> loadInBackground() { List<AppsModel> models = new ArrayList<>(); List<AppsModel> savedApps = folderId == -1 ? AppsModel.getApps() : AppsModel.getApps(folderId); if (savedApps == null || savedApps.isEmpty()) { return models; } IconCache iconCache = App.getInstance().getIconCache(); for (AppsModel model : savedApps) { Intent intent = new Intent(); intent.setComponent(new ComponentName(model.getPackageName(), model.getActivityInfoName())); ResolveInfo resolveInfo = packageManager.resolveActivity(intent, 0); if (resolveInfo != null) { iconCache.getTitleAndIcon(model, resolveInfo, null); models.add(model); } else { model.delete();//app is uninstalled! } } return models; } @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(); } }