package com.amaze.filemanager.services.asynctasks;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.support.v4.content.AsyncTaskLoader;
import android.text.format.Formatter;
import com.amaze.filemanager.R;
import com.amaze.filemanager.ui.LayoutElement;
import com.amaze.filemanager.utils.FileListSorter;
import com.amaze.filemanager.utils.InterestingConfigChange;
import com.amaze.filemanager.utils.broadcast_receiver.PackageReceiver;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Created by vishal on 23/2/17.
*
* Class loads all the packages installed
*/
public class AppListLoader extends AsyncTaskLoader<List<LayoutElement>> {
private PackageManager packageManager;
private PackageReceiver packageReceiver;
private Context context;
private List<LayoutElement> mApps;
private int sortBy, asc;
public AppListLoader(Context context, int sortBy, int asc) {
super(context);
this.context = context;
this.sortBy = sortBy;
this.asc = asc;
/*
* using global context because of the fact that loaders are supposed to be used
* across fragments and activities
*/
packageManager = getContext().getPackageManager();
}
@Override
public List<LayoutElement> loadInBackground() {
List<ApplicationInfo> apps = packageManager.getInstalledApplications(
PackageManager.MATCH_UNINSTALLED_PACKAGES |
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS);
if (apps == null)
apps = new ArrayList<>();
mApps = new ArrayList<>(apps.size());
for (ApplicationInfo object : apps) {
File sourceDir = new File(object.sourceDir);
String label = object.loadLabel(packageManager).toString();
PackageInfo info;
try {
info = packageManager.getPackageInfo(object.packageName, 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
info = null;
}
mApps.add(new LayoutElement(new BitmapDrawable(context.getResources(),
BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_doc_apk_grid)),
label == null ? object.packageName : label, object.sourceDir,
object.packageName, object.flags + "_" + (info!=null ? info.versionName:""),
Formatter.formatFileSize(getContext(), sourceDir.length()),
sourceDir.length(), false, sourceDir.lastModified()+"", false));
Collections.sort(mApps, new FileListSorter(0, sortBy, asc));
}
return mApps;
}
@Override
public void deliverResult(List<LayoutElement> data) {
if (isReset()) {
if (data != null)
onReleaseResources(data);//TODO onReleaseResources() is empty
}
// preserving old data for it to be closed
List<LayoutElement> oldData = mApps;
mApps = data;
if (isStarted()) {
// loader has been started, if we have data, return immediately
super.deliverResult(mApps);
}
// releasing older resources as we don't need them now
if (oldData != null) {
onReleaseResources(oldData);//TODO onReleaseResources() is empty
}
}
@Override
protected void onStartLoading() {
if (mApps != null) {
// we already have the results, load immediately
deliverResult(mApps);
}
if (packageReceiver != null) {
packageReceiver = new PackageReceiver(this);
}
boolean didConfigChange = InterestingConfigChange.isConfigChanged(getContext().getResources());
if (takeContentChanged() || mApps == null || didConfigChange) {
forceLoad();
}
}
@Override
protected void onStopLoading() {
cancelLoad();
}
@Override
public void onCanceled(List<LayoutElement> data) {
super.onCanceled(data);
onReleaseResources(data);//TODO onReleaseResources() is empty
}
@Override
protected void onReset() {
super.onReset();
onStopLoading();
// we're free to clear resources
if (mApps != null) {
onReleaseResources(mApps);//TODO onReleaseResources() is empty
mApps = null;
}
if (packageReceiver != null) {
getContext().unregisterReceiver(packageReceiver);
packageReceiver = null;
}
InterestingConfigChange.recycle();
}
/**
* We would want to release resources here
* List is nothing we would want to close
* @param layoutElementList
*/
//TODO do something
private void onReleaseResources(List<LayoutElement> layoutElementList) {
}
}