package com.lzx.lock.mvp.p;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.AsyncTask;
import com.lzx.lock.base.AppConstants;
import com.lzx.lock.bean.CommLockInfo;
import com.lzx.lock.db.CommLockInfoManager;
import com.lzx.lock.mvp.contract.LockMainContract;
import com.lzx.lock.utils.SpUtil;
import java.util.Iterator;
import java.util.List;
/**
* Created by xian on 2017/2/17.
*/
public class LockMainPresenter implements LockMainContract.Presenter {
private LockMainContract.View mView;
private PackageManager mPackageManager;
private CommLockInfoManager mLockInfoManager;
private Context mContext;
private LoadAppInfo mLoadAppInfo;
public LockMainPresenter(LockMainContract.View view, Context mContext) {
mView = view;
this.mContext = mContext;
mPackageManager = mContext.getPackageManager();
mLockInfoManager = new CommLockInfoManager(mContext);
}
/**
* 加载所有app
*/
@Override
public void loadAppInfo(Context context) {
mLoadAppInfo = new LoadAppInfo();
mLoadAppInfo.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
@Override
public void searchAppInfo(String search, ISearchResultListener listener) {
new SearchInfoAsyncTask(listener).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, search);
}
@Override
public void onDestroy() {
if (mLoadAppInfo != null && mLoadAppInfo.getStatus() != AsyncTask.Status.FINISHED) {
mLoadAppInfo.cancel(true);
}
}
private class LoadAppInfo extends AsyncTask<Void, String, List<CommLockInfo>> {
@Override
protected List<CommLockInfo> doInBackground(Void... params) {
List<CommLockInfo> commLockInfos = mLockInfoManager.getAllCommLockInfos();
Iterator<CommLockInfo> infoIterator = commLockInfos.iterator();
int favoriteNum = 0;
while (infoIterator.hasNext()) {
CommLockInfo info = infoIterator.next();
try {
ApplicationInfo appInfo = mPackageManager.getApplicationInfo(info.getPackageName(), PackageManager.GET_UNINSTALLED_PACKAGES);
if (appInfo == null || mPackageManager.getApplicationIcon(appInfo) == null) {
infoIterator.remove(); //将有错的app移除
continue;
} else {
info.setAppInfo(appInfo); //给列表ApplicationInfo赋值
if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { //判断是否是系统应用 ApplicationInfo#isSystemApp()
info.setSysApp(true);
info.setTopTitle("系统应用");
} else {
info.setSysApp(false);
info.setTopTitle("用户应用");
}
}
//获取推荐应用总数
if (info.isLocked()) {
favoriteNum++;
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
infoIterator.remove();
}
}
SpUtil.getInstance().putInt(AppConstants.LOCK_FAVITER_NUM, favoriteNum);
return commLockInfos;
}
@Override
protected void onPostExecute(List<CommLockInfo> commLockInfos) {
super.onPostExecute(commLockInfos);
mView.loadAppInfoSuccess(commLockInfos);
}
}
private class SearchInfoAsyncTask extends AsyncTask<String, Void, List<CommLockInfo>> {
private ISearchResultListener mSearchResultListener;
public SearchInfoAsyncTask(ISearchResultListener searchResultListener) {
mSearchResultListener = searchResultListener;
}
@Override
protected List<CommLockInfo> doInBackground(String... params) {
List<CommLockInfo> commLockInfos = mLockInfoManager.queryBlurryList(params[0]);
Iterator<CommLockInfo> infoIterator = commLockInfos.iterator();
while (infoIterator.hasNext()) {
CommLockInfo info = infoIterator.next();
try {
ApplicationInfo appInfo = mPackageManager.getApplicationInfo(info.getPackageName(), PackageManager.GET_UNINSTALLED_PACKAGES);
if (appInfo == null || mPackageManager.getApplicationIcon(appInfo) == null) {
infoIterator.remove(); //将有错的app移除
continue;
} else {
info.setAppInfo(appInfo); //给列表ApplicationInfo赋值
if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { //判断是否是系统应用 ApplicationInfo#isSystemApp()
info.setSysApp(true);
info.setTopTitle("系统应用");
} else {
info.setSysApp(false);
info.setTopTitle("用户应用");
}
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
infoIterator.remove();
}
}
return commLockInfos;
}
@Override
protected void onPostExecute(List<CommLockInfo> commLockInfos) {
super.onPostExecute(commLockInfos);
mSearchResultListener.onSearchResult(commLockInfos);
}
}
public interface ISearchResultListener {
void onSearchResult(List<CommLockInfo> commLockInfos);
}
}