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.MainContract;
import com.lzx.lock.utils.SpUtil;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Created by xian on 2017/2/17.
*/
public class MainPresenter implements MainContract.Presenter {
private MainContract.View mView;
private PackageManager mPackageManager;
private CommLockInfoManager mLockInfoManager;
private Context mContext;
private LoadAppInfoAsyncTask mLoadAppInfo;
private LoadLockAsyncTask mLoadLockAsyncTask;
public MainPresenter(MainContract.View view, Context mContext) {
mView = view;
this.mContext = mContext;
mPackageManager = mContext.getPackageManager();
mLockInfoManager = new CommLockInfoManager(mContext);
}
@Override
public void loadAppInfo(Context context, boolean isSort) {
mLoadAppInfo = new LoadAppInfoAsyncTask(isSort);
mLoadAppInfo.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
@Override
public void loadLockAppInfo(Context context) {
mLoadLockAsyncTask = new LoadLockAsyncTask();
mLoadLockAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
private class LoadAppInfoAsyncTask extends AsyncTask<Void, String, List<CommLockInfo>> {
private boolean isSort = false;
public LoadAppInfoAsyncTask(boolean isSort) {
this.isSort = isSort;
}
@Override
protected List<CommLockInfo> doInBackground(Void... params) {
List<CommLockInfo> commLockInfos = mLockInfoManager.getAllCommLockInfos();
Iterator<CommLockInfo> infoIterator = commLockInfos.iterator();
int favoriteNum = 0;
int sysAppNum = 0;
int userAppNum = 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);
if (isSort) {
List<CommLockInfo> sysList = new ArrayList<>();
List<CommLockInfo> userList = new ArrayList<>();
for (CommLockInfo info : commLockInfos) {
if (info.isSysApp()) {
sysList.add(info);
sysAppNum++;
} else {
userList.add(info);
userAppNum++;
}
}
SpUtil.getInstance().putInt(AppConstants.LOCK_SYS_APP_NUM, sysAppNum);
SpUtil.getInstance().putInt(AppConstants.LOCK_USER_APP_NUM, userAppNum);
commLockInfos.clear();
commLockInfos.addAll(sysList);
commLockInfos.addAll(userList);
}
return commLockInfos;
}
@Override
protected void onPostExecute(List<CommLockInfo> commLockInfos) {
super.onPostExecute(commLockInfos);
mView.loadAppInfoSuccess(commLockInfos);
}
}
private class LoadLockAsyncTask extends AsyncTask<String, Void, List<CommLockInfo>> {
@Override
protected List<CommLockInfo> doInBackground(String... params) {
List<CommLockInfo> commLockInfos = mLockInfoManager.getAllCommLockInfos();
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();
}
}
List<CommLockInfo> list = new ArrayList<>();
for (CommLockInfo info : commLockInfos) {
if (info.isLocked()) {
list.add(info);
}
}
return list;
}
@Override
protected void onPostExecute(List<CommLockInfo> commLockInfos) {
super.onPostExecute(commLockInfos);
mView.loadAppInfoSuccess(commLockInfos);
}
}
@Override
public void onDestroy() {
if (mLoadAppInfo != null && mLoadAppInfo.getStatus() != AsyncTask.Status.FINISHED) {
mLoadAppInfo.cancel(true);
}
if (mLoadLockAsyncTask != null && mLoadLockAsyncTask.getStatus() != AsyncTask.Status.FINISHED) {
mLoadLockAsyncTask.cancel(true);
}
}
}