package com.lzx.lock.db;
import android.content.ContentValues;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import com.lzx.lock.base.AppConstants;
import com.lzx.lock.bean.CommLockInfo;
import com.lzx.lock.bean.FaviterInfo;
import com.lzx.lock.utils.DataUtil;
import org.litepal.crud.DataSupport;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import static org.litepal.crud.DataSupport.where;
/**
* Created by xian on 2017/2/17.
*/
public class CommLockInfoManager {
private PackageManager mPackageManager;
private Context mContext;
public CommLockInfoManager(Context mContext) {
this.mContext = mContext;
mPackageManager = mContext.getPackageManager();
}
/**
* 查找所有
*/
public synchronized List<CommLockInfo> getAllCommLockInfos() {
List<CommLockInfo> commLockInfos = DataSupport.findAll(CommLockInfo.class);
Collections.sort(commLockInfos, commLockInfoComparator);
return commLockInfos;
}
/**
* 删除数据
*/
public synchronized void deleteCommLockInfoTable(List<CommLockInfo> commLockInfos) {
for (CommLockInfo info : commLockInfos) {
DataSupport.deleteAll(CommLockInfo.class, "packageName = ?", info.getPackageName());
}
}
/**
* 将手机应用信息插入数据库
*/
public synchronized void instanceCommLockInfoTable(List<ResolveInfo> resolveInfos) throws PackageManager.NameNotFoundException {
List<CommLockInfo> list = new ArrayList<>();
for (ResolveInfo resolveInfo : resolveInfos) {
boolean isfaviterApp = isHasFaviterAppInfo(resolveInfo.activityInfo.packageName); //是否为推荐加锁的app
CommLockInfo commLockInfo = new CommLockInfo(resolveInfo.activityInfo.packageName, false, isfaviterApp); // 后续需添加默认的开启保护
ApplicationInfo appInfo = mPackageManager.getApplicationInfo(commLockInfo.getPackageName(), PackageManager.GET_UNINSTALLED_PACKAGES);
String appName = mPackageManager.getApplicationLabel(appInfo).toString();
//过滤掉一些应用
if (!commLockInfo.getPackageName().equals(AppConstants.APP_PACKAGE_NAME) && !commLockInfo.getPackageName().equals("com.android.settings")
&& !commLockInfo.getPackageName().equals("com.google.android.googlequicksearchbox")) {
if (isfaviterApp) { //如果是推荐的
commLockInfo.setLocked(true);
} else {
commLockInfo.setLocked(false);
}
commLockInfo.setAppName(appName);
commLockInfo.setSetUnLock(false);
list.add(commLockInfo);
}
}
list = DataUtil.clearRepeatCommLockInfo(list); //去除重复数据
DataSupport.saveAll(list);
}
/**
* 判断是否是推荐加锁的应用
*/
public boolean isHasFaviterAppInfo(String packageName) {
List<FaviterInfo> infos = DataSupport.where("packageName = ?", packageName).find(FaviterInfo.class);
return infos.size() > 0;
}
/**
* 更改数据库app状态为锁定
*/
public void lockCommApplication(String packageName) {
updateLockStatus(packageName, true);
}
/**
* 更改数据库app状态为已解锁
*/
public void unlockCommApplication(String packageName) {
updateLockStatus(packageName, false);
}
public void updateLockStatus(String packageName, boolean isLock) {
ContentValues values = new ContentValues();
values.put("isLocked", isLock);
DataSupport.updateAll(CommLockInfo.class, values, "packageName = ?", packageName);
}
/**
* 是否设置了不锁
*/
public boolean isSetUnLock(String packageName) {
List<CommLockInfo> lockInfos = where("packageName = ?", packageName).find(CommLockInfo.class);
for (CommLockInfo commLockInfo : lockInfos) {
if (commLockInfo.isSetUnLock()) {
return true;
}
}
return false;
}
/**
* 检查状态是否为锁定
*
* @param packageName
* @return
*/
public boolean isLockedPackageName(String packageName) {
List<CommLockInfo> lockInfos = where("packageName = ?", packageName).find(CommLockInfo.class);
for (CommLockInfo commLockInfo : lockInfos) {
if (commLockInfo.isLocked()) {
return true;
}
}
return false;
}
/**
* 模糊匹配
*/
public List<CommLockInfo> queryBlurryList(String appName) {
List<CommLockInfo> infos = DataSupport.where("appName like ?", "%" + appName + "%").find(CommLockInfo.class);
return infos;
}
public void setIsUnLockThisApp(String packageName, boolean isSetUnLock) {
ContentValues values = new ContentValues();
values.put("isSetUnLock", isSetUnLock);
DataSupport.updateAll(CommLockInfo.class, values, "packageName = ?", packageName);
}
private Comparator commLockInfoComparator = new Comparator() {
@Override
public int compare(Object lhs, Object rhs) {
CommLockInfo leftCommLockInfo = (CommLockInfo) lhs;
CommLockInfo rightCommLockInfo = (CommLockInfo) rhs;
if (leftCommLockInfo.isFaviterApp()
&& !leftCommLockInfo.isLocked()
&& !rightCommLockInfo.isFaviterApp()
&& !rightCommLockInfo.isLocked()) {
return -1;
} else if (leftCommLockInfo.isFaviterApp()
&& leftCommLockInfo.isLocked()
&& !rightCommLockInfo.isFaviterApp()
&& !rightCommLockInfo.isLocked()) {
return -1;
} else if (leftCommLockInfo.isFaviterApp()
&& leftCommLockInfo.isLocked()
&& rightCommLockInfo.isFaviterApp()
&& !rightCommLockInfo.isLocked()) {
if (leftCommLockInfo.getAppInfo() != null
&& rightCommLockInfo.getAppInfo() != null)
return 1;
else
return 0;
} else if (!leftCommLockInfo.isFaviterApp()
&& leftCommLockInfo.isLocked()
&& !rightCommLockInfo.isFaviterApp()
&& !rightCommLockInfo.isLocked()) {
return -1;
} else if (leftCommLockInfo.isFaviterApp()
&& leftCommLockInfo.isLocked()
&& !rightCommLockInfo.isFaviterApp()
&& !rightCommLockInfo.isLocked()) {
return -1;
} else if (leftCommLockInfo.isFaviterApp()
&& leftCommLockInfo.isLocked()
&& rightCommLockInfo.isFaviterApp()
&& !rightCommLockInfo.isLocked()) {
if (leftCommLockInfo.getAppInfo() != null
&& rightCommLockInfo.getAppInfo() != null)
return 1;
else
return 0;
} else if (!leftCommLockInfo.isFaviterApp()
&& !leftCommLockInfo.isLocked()
&& rightCommLockInfo.isFaviterApp()
&& !rightCommLockInfo.isLocked()) {
return 1;
} else if (leftCommLockInfo.isFaviterApp()
&& !leftCommLockInfo.isLocked()
&& rightCommLockInfo.isFaviterApp()
&& !rightCommLockInfo.isLocked()) {
if (leftCommLockInfo.getAppInfo() != null
&& rightCommLockInfo.getAppInfo() != null)
return 1;
else
return 0;
} else if (leftCommLockInfo.isFaviterApp()
&& leftCommLockInfo.isLocked()
&& rightCommLockInfo.isFaviterApp()
&& !rightCommLockInfo.isLocked()) {
if (leftCommLockInfo.getAppInfo() != null
&& rightCommLockInfo.getAppInfo() != null)
return 1;
else
return 0;
} else if (!leftCommLockInfo.isFaviterApp()
&& !leftCommLockInfo.isLocked()
&& !rightCommLockInfo.isFaviterApp()
&& rightCommLockInfo.isLocked()) {
return 1;
} else if (!leftCommLockInfo.isFaviterApp()
&& !leftCommLockInfo.isLocked()
&& rightCommLockInfo.isFaviterApp()
&& rightCommLockInfo.isLocked()) {
return 1;
} else if (!leftCommLockInfo.isFaviterApp()
&& leftCommLockInfo.isLocked()
&& rightCommLockInfo.isFaviterApp()
&& rightCommLockInfo.isLocked()) {
return 1;
} else if (!leftCommLockInfo.isFaviterApp()
&& !leftCommLockInfo.isLocked()
&& !rightCommLockInfo.isFaviterApp()
&& !rightCommLockInfo.isLocked()) {
if (leftCommLockInfo.getAppInfo() != null
&& rightCommLockInfo.getAppInfo() != null)
return 1;
else
return 0;
} else if (leftCommLockInfo.isFaviterApp()
&& leftCommLockInfo.isLocked()
&& rightCommLockInfo.isFaviterApp()
&& rightCommLockInfo.isLocked()) {
if (leftCommLockInfo.getAppInfo() != null
&& rightCommLockInfo.getAppInfo() != null)
return 1;
else
return 0;
} else if (!leftCommLockInfo.isFaviterApp()
&& !leftCommLockInfo.isLocked()
&& rightCommLockInfo.isFaviterApp()
&& rightCommLockInfo.isLocked()) {
return 1;
} else if (!leftCommLockInfo.isFaviterApp()
&& leftCommLockInfo.isLocked()
&& !rightCommLockInfo.isFaviterApp()
&& !rightCommLockInfo.isLocked()) {
return -1;
}
return 0;
}
};
}