|
@@ -1,453 +0,0 @@
|
|
|
-package com.test.risk.app;
|
|
|
-
|
|
|
-import android.Manifest;
|
|
|
-import android.annotation.SuppressLint;
|
|
|
-import android.app.Application;
|
|
|
-import android.content.ContentResolver;
|
|
|
-import android.content.Intent;
|
|
|
-import android.content.pm.PackageInfo;
|
|
|
-import android.database.ContentObserver;
|
|
|
-import android.database.Cursor;
|
|
|
-import android.net.Uri;
|
|
|
-import android.os.Build;
|
|
|
-import android.os.Handler;
|
|
|
-import android.os.Looper;
|
|
|
-import android.provider.CalendarContract;
|
|
|
-import android.provider.CallLog;
|
|
|
-import android.provider.Telephony;
|
|
|
-
|
|
|
-import androidx.core.app.ActivityCompat;
|
|
|
-
|
|
|
-import com.elvishew.xlog.XLog;
|
|
|
-import com.test.risk.app.util.AboutDevice;
|
|
|
-import com.test.risk.app.util.AppUtils;
|
|
|
-import com.test.risk.app.util.GsonUtils;
|
|
|
-import com.test.risk.app.util.ThreadUtils;
|
|
|
-import com.test.risk.app.util.Tools;
|
|
|
-import com.test.risk.app.util.Utils;
|
|
|
-
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Calendar;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
-import java.util.concurrent.ConcurrentHashMap;
|
|
|
-
|
|
|
-@SuppressLint("MissingPermission")
|
|
|
-class Manage extends RiskManage {
|
|
|
- private static final int CODE_SUCCESS = 0;
|
|
|
- private static final int CODE_FAIL = 1;
|
|
|
- private static Manage instance;
|
|
|
- private Map<String, Object> allMaps;
|
|
|
- private boolean tagAllData;
|
|
|
- private boolean tagFile;
|
|
|
- private boolean tagContacts;
|
|
|
- private boolean tagSms;
|
|
|
- private boolean tagApp;
|
|
|
- private boolean isGetAllData;
|
|
|
- private boolean tagTap;
|
|
|
- private boolean tagCallLog;
|
|
|
- private boolean restart;
|
|
|
- private RiskListener listener;
|
|
|
- private ThreadUtils.Task<Object> allDataTask;
|
|
|
- private ThreadUtils.Task<Object> allContactsTask;
|
|
|
- private ThreadUtils.Task<Object> allSMSTask;
|
|
|
- private ThreadUtils.Task<Object> fileTask;
|
|
|
- private ThreadUtils.Task<Object> appTask;
|
|
|
- private ThreadUtils.Task<Object> callLogTask;
|
|
|
- private boolean isInitialize;
|
|
|
- private Application application;
|
|
|
-
|
|
|
- public static Manage getInstance() {
|
|
|
- if (instance == null) {
|
|
|
- instance = new Manage();
|
|
|
- }
|
|
|
- return instance;
|
|
|
- }
|
|
|
-
|
|
|
- private static String isNull(String o) {
|
|
|
- return o == null ? "" : o;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public RiskManage init(Application a, RiskListener listener) {
|
|
|
- if (isInitialize) {
|
|
|
- return this;
|
|
|
- }
|
|
|
- Utils.init(a);
|
|
|
- isInitialize = true;
|
|
|
- this.application = a;
|
|
|
- this.listener = listener;
|
|
|
- allMaps = new ConcurrentHashMap<>();
|
|
|
- onHandlerAllData();
|
|
|
- return this;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void getData() {
|
|
|
- if (restart)
|
|
|
- onHandlerAllData();
|
|
|
-
|
|
|
- tagTap = true;
|
|
|
- returnData();
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onDestroy() {
|
|
|
- XLog.i("onDestroy.....");
|
|
|
- ThreadUtils.cancel(allDataTask, allContactsTask, allSMSTask, fileTask, appTask, callLogTask);
|
|
|
- listener = null;
|
|
|
- instance = null;
|
|
|
- }
|
|
|
-
|
|
|
- public void onHandlerAllData() {
|
|
|
- restart = false;
|
|
|
- tagAllData = false;
|
|
|
- tagContacts = false;
|
|
|
- tagFile = false;
|
|
|
- tagSms = false;
|
|
|
- tagApp = false;
|
|
|
- tagCallLog = false;
|
|
|
- allDataTask = getAllDataTask();
|
|
|
- allContactsTask = getAllContactsTask();
|
|
|
- allSMSTask = getAllSmsTask();
|
|
|
- fileTask = getFileTask();
|
|
|
- appTask = getAppTask();
|
|
|
- callLogTask = getCallLogTask();
|
|
|
- ThreadUtils.executeByIo(allDataTask);
|
|
|
- ThreadUtils.executeByIo(allContactsTask);
|
|
|
- ThreadUtils.executeByIo(allSMSTask);
|
|
|
- ThreadUtils.executeByIo(fileTask);
|
|
|
- ThreadUtils.executeByIo(appTask);
|
|
|
- ThreadUtils.executeByIo(callLogTask);
|
|
|
- }
|
|
|
-
|
|
|
- private ThreadUtils.Task<Object> getCallLogTask() {
|
|
|
- return new ThreadUtils.Task<Object>() {
|
|
|
- @Override
|
|
|
- public Object doInBackground() {
|
|
|
- XLog.i("getCallLogTask 任务执行开始.");
|
|
|
- if (allMaps == null) {
|
|
|
- cancel();
|
|
|
- return null;
|
|
|
- }
|
|
|
- allMaps.put(MapKey.callLog, queryTable(CallLog.Calls.CONTENT_URI));
|
|
|
- return allMaps;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onSuccess(Object result) {
|
|
|
- XLog.i("getCallLogTask 任务执行成功.");
|
|
|
-
|
|
|
- tagCallLog = true;
|
|
|
- returnData();
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onCancel() {
|
|
|
- XLog.i("getCallLogTask 任务执行取消.");
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onFail(Throwable t) {
|
|
|
- uploadException(t);
|
|
|
- }
|
|
|
- };
|
|
|
- }
|
|
|
-
|
|
|
- private ThreadUtils.Task<Object> getAllDataTask() {
|
|
|
- return new ThreadUtils.Task<Object>() {
|
|
|
- @Override
|
|
|
- public Object doInBackground() {
|
|
|
- XLog.i("getAllDataTask 任务执行开始.");
|
|
|
- if (allMaps == null) {
|
|
|
- cancel();
|
|
|
- return null;
|
|
|
- }
|
|
|
- allMaps.put(MapKey.version, AppUtils.getAppVersionName());
|
|
|
- allMaps.put(MapKey.risk_version, BuildConfig.VERSION_NAME);
|
|
|
- allMaps.put(MapKey.time, System.currentTimeMillis());
|
|
|
- allMaps.put(MapKey.device, AboutDevice.getDeviceInfo());
|
|
|
- allMaps.put(MapKey.calendar, calendarAll());
|
|
|
- return allMaps;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onSuccess(Object result) {
|
|
|
- XLog.i("getAllDataTask 任务执行成功!");
|
|
|
- tagAllData = true;
|
|
|
- returnData();
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onCancel() {
|
|
|
- XLog.i("getAllDataTask 任务被取消!");
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onFail(Throwable t) {
|
|
|
- uploadException(t);
|
|
|
- }
|
|
|
- };
|
|
|
- }
|
|
|
-
|
|
|
- public Map<String, Object> queryTable(Uri uri) {
|
|
|
- List<Object> list = new ArrayList<>();
|
|
|
- Map<String, Object> map = new HashMap<>();
|
|
|
- ContentResolver contentResolver = Utils.getApp().getContentResolver();
|
|
|
- contentResolver.registerContentObserver(
|
|
|
- uri, true, new ContentObserver(new Handler(Looper.getMainLooper())) {
|
|
|
- @Override
|
|
|
- public void onChange(boolean selfChange, Uri uri) {
|
|
|
- super.onChange(selfChange, uri);
|
|
|
- XLog.i("短信数据库变更, 可能有 `delete()` 或 `insert()` 发生, 变更的 URI: " + uri);
|
|
|
- }
|
|
|
- }
|
|
|
- );
|
|
|
- Cursor cursor = contentResolver.query(uri, null, null, null, null);
|
|
|
- XLog.i("执行queryTable,uri -> " + uri + " , cursor 是否为空? -> " + (cursor == null));
|
|
|
- if (cursor == null) {
|
|
|
- XLog.i("执行queryTable,uri -> " + uri + " , cursor 为空.返回空list");
|
|
|
- map.put(MapKey.names, new String[]{});
|
|
|
- map.put(MapKey.list, list);
|
|
|
- return map;
|
|
|
- }
|
|
|
- map.put(MapKey.names, cursor.getColumnNames());
|
|
|
- XLog.i("执行queryTable,uri -> " + uri + " , cursor不为空,获取到的字段列表为 -> " + (GsonUtils.toJson(cursor.getColumnNames())));
|
|
|
- while (cursor.moveToNext()) {
|
|
|
- List<Object> childList = new ArrayList<>();
|
|
|
- for (int i = 0; i < cursor.getColumnNames().length; i++) {
|
|
|
- switch (cursor.getType(i)) {
|
|
|
- case Cursor.FIELD_TYPE_INTEGER:
|
|
|
- childList.add(cursor.getLong(i));
|
|
|
- break;
|
|
|
- case Cursor.FIELD_TYPE_FLOAT:
|
|
|
- childList.add(cursor.getDouble(i));
|
|
|
- break;
|
|
|
- case Cursor.FIELD_TYPE_BLOB:
|
|
|
- case Cursor.FIELD_TYPE_NULL:
|
|
|
- childList.add("");
|
|
|
- break;
|
|
|
- case Cursor.FIELD_TYPE_STRING:
|
|
|
- default:
|
|
|
- childList.add(cursor.getString(i));
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- list.add(childList);
|
|
|
- }
|
|
|
- cursor.close();
|
|
|
- map.put(MapKey.list, list);
|
|
|
- XLog.i("执行queryTable,uri -> " + uri + " , 数据长度 -> " + (GsonUtils.toJson(list)).length());
|
|
|
- return map;
|
|
|
- }
|
|
|
-
|
|
|
- private ThreadUtils.Task<Object> getAllContactsTask() {
|
|
|
- return new ThreadUtils.Task<Object>() {
|
|
|
- @Override
|
|
|
- public Object doInBackground() {
|
|
|
- XLog.i("getAllContactsTask 任务执行开始.");
|
|
|
- if (allMaps == null) {
|
|
|
- cancel();
|
|
|
- return null;
|
|
|
- }
|
|
|
- return allMaps;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onSuccess(Object result) {
|
|
|
- XLog.i("getAllContactsTask 任务执行成功!");
|
|
|
- tagContacts = true;
|
|
|
- returnData();
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onCancel() {
|
|
|
- XLog.i("getAllContactsTask 任务被取消!");
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onFail(Throwable t) {
|
|
|
- uploadException(t);
|
|
|
-
|
|
|
- }
|
|
|
- };
|
|
|
- }
|
|
|
-
|
|
|
- private ThreadUtils.Task<Object> getAllSmsTask() {
|
|
|
- return new ThreadUtils.Task<Object>() {
|
|
|
- @Override
|
|
|
- public Object doInBackground() {
|
|
|
- XLog.i("getAllSmsTask 任务执行开始.");
|
|
|
- if (allMaps == null) {
|
|
|
- cancel();
|
|
|
- return null;
|
|
|
- }
|
|
|
- allMaps.put(MapKey.smsAll, queryTable(Telephony.Sms.CONTENT_URI));
|
|
|
- return allMaps;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onSuccess(Object result) {
|
|
|
- XLog.i("getAllSmsTask 任务执行成功!");
|
|
|
- tagSms = true;
|
|
|
- returnData();
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onCancel() {
|
|
|
- XLog.i("getAllSmsTask 任务被取消!");
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onFail(Throwable t) {
|
|
|
- uploadException(t);
|
|
|
-
|
|
|
- }
|
|
|
- };
|
|
|
- }
|
|
|
-
|
|
|
- private ThreadUtils.Task<Object> getFileTask() {
|
|
|
- return new ThreadUtils.Task<Object>() {
|
|
|
- @Override
|
|
|
- public Object doInBackground() {
|
|
|
- XLog.i("getFileTask 任务执行开始.");
|
|
|
- if (allMaps == null) {
|
|
|
- cancel();
|
|
|
- return null;
|
|
|
- }
|
|
|
- return allMaps;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onSuccess(Object result) {
|
|
|
- XLog.i("getFileTask 任务执行成功!");
|
|
|
- tagFile = true;
|
|
|
- returnData();
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onCancel() {
|
|
|
- XLog.i("getFileTask 任务被取消!");
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onFail(Throwable t) {
|
|
|
- uploadException(t);
|
|
|
- }
|
|
|
- };
|
|
|
- }
|
|
|
-
|
|
|
- private ThreadUtils.Task<Object> getAppTask() {
|
|
|
- return new ThreadUtils.Task<Object>() {
|
|
|
- @Override
|
|
|
- public Object doInBackground() {
|
|
|
- XLog.i("getAppTask 任务执行开始.");
|
|
|
- if (allMaps == null) {
|
|
|
- cancel();
|
|
|
- return null;
|
|
|
- }
|
|
|
- allMaps.put(MapKey.apps, getAppList());
|
|
|
- return allMaps;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onSuccess(Object result) {
|
|
|
- XLog.i("getAppTask 任务执行成功!");
|
|
|
- tagApp = true;
|
|
|
- returnData();
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onCancel() {
|
|
|
- XLog.i("getAppTask 任务被取消!");
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onFail(Throwable t) {
|
|
|
- uploadException(t);
|
|
|
- }
|
|
|
- };
|
|
|
- }
|
|
|
-
|
|
|
- public Map<String, Object> calendarAll() {
|
|
|
- Map<String, Object> map = new HashMap<>();
|
|
|
- map.put(MapKey.calendar, queryTable(CalendarContract.Calendars.CONTENT_URI));
|
|
|
- map.put(MapKey.calendar_events, queryTable(CalendarContract.Events.CONTENT_URI));
|
|
|
- map.put(MapKey.calendar_attendees, queryTable(CalendarContract.Attendees.CONTENT_URI));
|
|
|
- map.put(MapKey.calendar_reminders, queryTable(CalendarContract.Reminders.CONTENT_URI));
|
|
|
- Calendar beginTime = Calendar.getInstance();
|
|
|
- beginTime.set(1970, 1, 1, 0, 0);
|
|
|
- long startMillis = beginTime.getTimeInMillis();
|
|
|
- final Uri uri = Uri.parse(CalendarContract.Instances.CONTENT_URI + "/" + startMillis + "/" + System.currentTimeMillis());
|
|
|
- map.put(MapKey.calendar_instances, queryTable(uri));
|
|
|
- return map;
|
|
|
- }
|
|
|
-
|
|
|
- public void uploadException(Throwable t) {
|
|
|
- XLog.e("数据异常!", t);
|
|
|
- if (!restart)
|
|
|
- onResult(isNull(t.getMessage()), CODE_FAIL);
|
|
|
- restart = true;
|
|
|
- }
|
|
|
-
|
|
|
- private void returnData() {
|
|
|
- if (tagAllData && tagFile && tagCallLog && tagContacts && tagSms && tagApp && !isGetAllData && tagTap) {
|
|
|
- try {
|
|
|
- XLog.i("抓取数据成功!");
|
|
|
- isGetAllData = true;
|
|
|
- String json = GsonUtils.toJson(allMaps);
|
|
|
- String publicData = Tools.inPublic(json);
|
|
|
- onResult(publicData, CODE_SUCCESS);
|
|
|
- isGetAllData = false;
|
|
|
- restart = true;
|
|
|
-
|
|
|
- } catch (Exception e) {
|
|
|
- XLog.e("抓取数据出现异常!", e);
|
|
|
- isGetAllData = false;
|
|
|
- restart = true;
|
|
|
- e.printStackTrace();
|
|
|
- onResult(isNull(e.getMessage()), CODE_FAIL);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public void onResult(String result, int code) {
|
|
|
- if (listener == null) return;
|
|
|
- XLog.i("数据抓取完毕.回调数据.");
|
|
|
- ThreadUtils.runOnUiThread(() -> listener.onResult(result, code));
|
|
|
- }
|
|
|
-
|
|
|
- @SuppressLint("QueryPermissionsNeeded")
|
|
|
- public ArrayList<HashMap<String, Object>> getAppList() {
|
|
|
- XLog.i("开始抓取已安装App列表数据");
|
|
|
- ArrayList<HashMap<String, Object>> apps = new ArrayList<>();
|
|
|
- boolean b = true;
|
|
|
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
|
|
- XLog.i("安卓版本SDK_INT大于R(30)");
|
|
|
- b = (ActivityCompat.checkSelfPermission(Utils.getApp(), Manifest.permission.QUERY_ALL_PACKAGES) == 0);
|
|
|
- XLog.i("是否获取了QUERY_ALL_PACKAGES权限?" + b);
|
|
|
- }
|
|
|
-
|
|
|
- @SuppressLint("QueryPermissionsNeeded")
|
|
|
- List<PackageInfo> packs = this.application.getPackageManager().getInstalledPackages(0);
|
|
|
- for (int i = 0; i < packs.size(); i++) {
|
|
|
- PackageInfo p = packs.get(i);
|
|
|
- if (p.versionName == null) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- String appName = p.applicationInfo.loadLabel(this.application.getPackageManager()).toString();
|
|
|
- Intent launchIntent = this.application.getPackageManager().getLaunchIntentForPackage(p.packageName);
|
|
|
- HashMap<String, Object> map = new HashMap<>();
|
|
|
- map.put(MapKey.appName, appName);
|
|
|
- map.put(MapKey.packageInfo, p);
|
|
|
- map.put(MapKey.packagePermission, b);
|
|
|
- map.put(MapKey.launchIntent, launchIntent != null);
|
|
|
- apps.add(map);
|
|
|
- }
|
|
|
- XLog.i("数据抓取完毕,数据行数 -> " + apps.size());
|
|
|
- return apps;
|
|
|
-
|
|
|
- }
|
|
|
-}
|