package com.lzx.lock.service;
import android.app.ActivityManager;
import android.app.IntentService;
import android.app.usage.UsageEvents;
import android.app.usage.UsageStatsManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Build;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import com.lzx.lock.LockApplication;
import com.lzx.lock.base.AppConstants;
import com.lzx.lock.db.CommLockInfoManager;
import com.lzx.lock.module.lock.GestureUnlockActivity;
import com.lzx.lock.utils.SpUtil;
import java.util.ArrayList;
import java.util.List;
/**
* Created by xian on 2017/2/17.
*/
public class LockService extends IntentService {
public LockService() {
super("LockService");
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
public boolean threadIsTerminate = false; //是否开启循环
public static final String UNLOCK_ACTION = "UNLOCK_ACTION";
public static final String LOCK_SERVICE_LASTTIME = "LOCK_SERVICE_LASTTIME";
public static final String LOCK_SERVICE_LASTAPP = "LOCK_SERVICE_LASTAPP";
private long lastUnlockTimeSeconds = 0; //最后解锁的时间
private String lastUnlockPackageName = ""; //最后解锁的程序包名
private boolean lockState;
private ServiceReceiver mServiceReceiver;
private CommLockInfoManager mLockInfoManager;
private ActivityManager activityManager;
public static boolean isActionLock = false;
public String savePkgName;
@Override
public void onCreate() {
super.onCreate();
lockState = SpUtil.getInstance().getBoolean(AppConstants.LOCK_STATE);
mLockInfoManager = new CommLockInfoManager(this);
activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
//注册广播
mServiceReceiver = new ServiceReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(UNLOCK_ACTION);
registerReceiver(mServiceReceiver, filter);
//开启一个检查锁屏的线程
threadIsTerminate = true;
}
@Override
protected void onHandleIntent(Intent intent) {
checkData();
}
private void checkData() {
while (threadIsTerminate) {
//获取栈顶app的包名
String packageName = getLauncherTopApp(LockService.this, activityManager);
//判断包名打开解锁页面
if (lockState && !inWhiteList(packageName) && !TextUtils.isEmpty(packageName)) {
boolean isLockOffScreenTime = SpUtil.getInstance().getBoolean(AppConstants.LOCK_AUTO_SCREEN_TIME, false); //是否开启暂时离开
boolean isLockOffScreen = SpUtil.getInstance().getBoolean(AppConstants.LOCK_AUTO_SCREEN, false); //是否在手机屏幕关闭后再次锁定
savePkgName = SpUtil.getInstance().getString(AppConstants.LOCK_LAST_LOAD_PKG_NAME, "");
//Log.i("Server", "packageName = " + packageName + " savePkgName = " + savePkgName);
//情况一 解锁后一段时间才再锁
if (isLockOffScreenTime && !isLockOffScreen) {
long time = SpUtil.getInstance().getLong(AppConstants.LOCK_CURR_MILLISENCONS, 0); //获取记录的时间
long leaverTime = SpUtil.getInstance().getLong(AppConstants.LOCK_APART_MILLISENCONS, 0); //获取离开时间
if (!TextUtils.isEmpty(savePkgName)) {
if (!TextUtils.isEmpty(packageName)) {
if (!savePkgName.equals(packageName)) { //
if (getHomes().contains(packageName) || packageName.contains("launcher")) {
boolean isSetUnLock = mLockInfoManager.isSetUnLock(savePkgName);
if (!isSetUnLock) {
if (System.currentTimeMillis() - time > leaverTime) {
mLockInfoManager.lockCommApplication(savePkgName);
}
}
}
}
}
}
}
//情况二 解锁后没关屏:退出应用后一段时间后再锁
if (isLockOffScreenTime && isLockOffScreen) {
long time = SpUtil.getInstance().getLong(AppConstants.LOCK_CURR_MILLISENCONS, 0); //获取记录的时间
long leaverTime = SpUtil.getInstance().getLong(AppConstants.LOCK_APART_MILLISENCONS, 0); //获取离开时间
if (!TextUtils.isEmpty(savePkgName)) {
if (!TextUtils.isEmpty(packageName)) {
if (!savePkgName.equals(packageName)) {
if (getHomes().contains(packageName) || packageName.contains("launcher")) {
boolean isSetUnLock = mLockInfoManager.isSetUnLock(savePkgName);
if (!isSetUnLock) {
if (System.currentTimeMillis() - time > leaverTime) {
mLockInfoManager.lockCommApplication(savePkgName);
}
}
}
}
}
}
}
//情况三 用户关屏后立马锁定,退出后也锁定
if (!isLockOffScreenTime && isLockOffScreen) {
if (!TextUtils.isEmpty(savePkgName)) {
if (!TextUtils.isEmpty(packageName)) {
if (!savePkgName.equals(packageName)) {
isActionLock = false;
if (getHomes().contains(packageName) || packageName.contains("launcher")) {
boolean isSetUnLock = mLockInfoManager.isSetUnLock(savePkgName);
if (!isSetUnLock) {
mLockInfoManager.lockCommApplication(savePkgName);
}
}
} else {
isActionLock = true;
}
}
}
}
//情况四 每次都锁
if (!isLockOffScreenTime && !isLockOffScreen) {
if (!TextUtils.isEmpty(savePkgName)) {
if (!TextUtils.isEmpty(packageName)) {
if (!savePkgName.equals(packageName)) {
if (getHomes().contains(packageName) || packageName.contains("launcher")) {
boolean isSetUnLock = mLockInfoManager.isSetUnLock(savePkgName);
if (!isSetUnLock) {
mLockInfoManager.lockCommApplication(savePkgName);
}
}
}
}
}
}
// 查找各种的锁,若存在则判断逻辑
if (mLockInfoManager.isLockedPackageName(packageName)) {
passwordLock(packageName);
continue;
} else {
}
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* 白名单
*/
private boolean inWhiteList(String packageName) {
return packageName.equals(AppConstants.APP_PACKAGE_NAME)
|| packageName.equals("com.android.settings");
}
/**
* 服务广播
*/
public class ServiceReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
boolean isLockOffScreen = SpUtil.getInstance().getBoolean(AppConstants.LOCK_AUTO_SCREEN, false); //是否在手机屏幕关闭后再次锁定
boolean isLockOffScreenTime = SpUtil.getInstance().getBoolean(AppConstants.LOCK_AUTO_SCREEN_TIME, false); //是否在手机屏幕关闭后时间段后再次锁定
switch (action) {
case UNLOCK_ACTION: //解锁后广播
lastUnlockPackageName = intent.getStringExtra(LOCK_SERVICE_LASTAPP); //最后解锁的程序包名
lastUnlockTimeSeconds = intent.getLongExtra(LOCK_SERVICE_LASTTIME, lastUnlockTimeSeconds); //最后解锁时间
break;
case Intent.ACTION_SCREEN_OFF: //屏幕关闭的广播
SpUtil.getInstance().putLong(AppConstants.LOCK_CURR_MILLISENCONS, System.currentTimeMillis()); //记录屏幕关闭时间
//情况三
if (!isLockOffScreenTime && isLockOffScreen) {
String savePkgName = SpUtil.getInstance().getString(AppConstants.LOCK_LAST_LOAD_PKG_NAME, "");
if (!TextUtils.isEmpty(savePkgName)) {
if (isActionLock) {
mLockInfoManager.lockCommApplication(lastUnlockPackageName);
}
}
}
break;
}
}
}
/**
* 获取栈顶应用包名
*/
public String getLauncherTopApp(Context context, ActivityManager activityManager) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
List<ActivityManager.RunningTaskInfo> appTasks = activityManager.getRunningTasks(1);
if (null != appTasks && !appTasks.isEmpty()) {
return appTasks.get(0).topActivity.getPackageName();
}
} else {
//5.0以后需要用这方法
UsageStatsManager sUsageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
long endTime = System.currentTimeMillis();
long beginTime = endTime - 10000;
String result = "";
UsageEvents.Event event = new UsageEvents.Event();
UsageEvents usageEvents = sUsageStatsManager.queryEvents(beginTime, endTime);
while (usageEvents.hasNextEvent()) {
usageEvents.getNextEvent(event);
if (event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) {
result = event.getPackageName();
}
}
if (!android.text.TextUtils.isEmpty(result)) {
return result;
}
}
return "";
}
/**
* 获得属于桌面的应用的应用包名称
*/
private List<String> getHomes() {
List<String> names = new ArrayList<>();
PackageManager packageManager = this.getPackageManager();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo ri : resolveInfo) {
names.add(ri.activityInfo.packageName);
}
return names;
}
/**
* 转到解锁界面
*/
private void passwordLock(String packageName) {
LockApplication.getInstance().clearAllActivity();
Intent intent = new Intent(this, GestureUnlockActivity.class);
intent.putExtra(AppConstants.LOCK_PACKAGE_NAME, packageName);
intent.putExtra(AppConstants.LOCK_FROM, AppConstants.LOCK_FROM_FINISH);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
threadIsTerminate = false;
unregisterReceiver(mServiceReceiver);
}
}