diff --git a/app/build.gradle b/app/build.gradle index 2230ab0..449aa44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -67,8 +67,8 @@ android { productFlavors { beta { flavorDimensions "default" - versionCode 30 - versionName "3.9" + versionCode 32 + versionName "4.1" } official { diff --git a/app/src/main/java/com/uiui/sn/bean/RemainTime.java b/app/src/main/java/com/uiui/sn/bean/RemainTime.java index 00418c2..f29d0cf 100644 --- a/app/src/main/java/com/uiui/sn/bean/RemainTime.java +++ b/app/src/main/java/com/uiui/sn/bean/RemainTime.java @@ -24,6 +24,8 @@ public class RemainTime implements Serializable { int disableType; /*禁用提示*/ String content; + /*总时间*/ + long totalTime; /*应用设置的可用时间*/ long availableTime; /*app使用时间*/ @@ -54,6 +56,14 @@ public class RemainTime implements Serializable { this.content = content; } + public long getTotalTime() { + return totalTime; + } + + public void setTotalTime(long totalTime) { + this.totalTime = totalTime; + } + public long getAvailableTime() { return availableTime; } diff --git a/app/src/main/java/com/uiui/sn/bean/SystemSettings.java b/app/src/main/java/com/uiui/sn/bean/SystemSettings.java index 4a59ce4..bc45f53 100644 --- a/app/src/main/java/com/uiui/sn/bean/SystemSettings.java +++ b/app/src/main/java/com/uiui/sn/bean/SystemSettings.java @@ -7,7 +7,6 @@ import com.google.gson.JsonParser; import java.io.Serializable; public class SystemSettings implements Serializable { - private static final long serialVersionUID = -7763589370400496883L; int setting_call; @@ -47,6 +46,7 @@ public class SystemSettings implements Serializable { String browser_app; String typewriting_app; int is_control; + int is_network; int setting_rotation; int setting_airplane; @@ -345,6 +345,14 @@ public class SystemSettings implements Serializable { this.is_control = is_control; } + public int getIs_network() { + return is_network; + } + + public void setIs_network(int is_network) { + this.is_network = is_network; + } + public int getSetting_rotation() { return setting_rotation; } diff --git a/app/src/main/java/com/uiui/sn/config/CommonConfig.java b/app/src/main/java/com/uiui/sn/config/CommonConfig.java index 02684a9..288fae2 100644 --- a/app/src/main/java/com/uiui/sn/config/CommonConfig.java +++ b/app/src/main/java/com/uiui/sn/config/CommonConfig.java @@ -39,6 +39,8 @@ public class CommonConfig { /*USB模式-MIDI*/ public final static String AOLE_ACTION_USB_USB_MIDI = "aole_action_usb_usb_midi"; + public final static String AOLE_ACTION_SCREEN_SHARE = "aole_app_screen_share"; + /*应用安装白名单*/ public final static String AOLE_ACTION_APP_FORBID = "aole_app_forbid"; /*强制安装应用,禁止卸载*/ diff --git a/app/src/main/java/com/uiui/sn/desktop/RunningAppManager.java b/app/src/main/java/com/uiui/sn/desktop/RunningAppManager.java index 8e1966a..d844bab 100644 --- a/app/src/main/java/com/uiui/sn/desktop/RunningAppManager.java +++ b/app/src/main/java/com/uiui/sn/desktop/RunningAppManager.java @@ -43,19 +43,16 @@ import java.lang.reflect.Type; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.LocalDateTime; -import java.time.ZoneOffset; -import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Calendar; +import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; -import java.util.function.Predicate; +import java.util.concurrent.atomic.AtomicLong; import java.util.stream.Collectors; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; @@ -73,23 +70,20 @@ public class RunningAppManager { private Context mContext; private MMKV mMMKV = MMKV.defaultMMKV(); - public static final String RemainingTimeMap = "RemainingTimeMap_KEY"; public static final String GlobalUsageTimeMap = "GlobalUsageTimeMap_KEY"; + public static final String AllApplUsageTimeMap = "AllAppUsageTimeMap_KEY"; + //剩余时间 private long globalRemainingTime = 0L; - //存储每个单独有配置app剩余时间 private HashMap mRemainingTimeMap = new HashMap<>(); - //存储整机配置app使用时间 private HashMap mGlobalUsageTime = new HashMap<>(); - - - //存储每个分类剩余时间 - HashMap mClassifyTimeMap = new HashMap<>(); + //存储所有app使用时间 + private HashMap mAllAppUsageTime = new HashMap<>(); public static long minuteTime = 60 * 1000; public static long dayTime = minuteTime * 60 * 24; @@ -129,6 +123,16 @@ public class RunningAppManager { if (appUsageTimeHashMap != null) { mGlobalUsageTime = appUsageTimeHashMap; } + + String allAppUsageTimeJson = mMMKV.decodeString(AllApplUsageTimeMap, ""); + Log.i(TAG, "allAppUsageTimeJson: " + globalUsageTimeJson); + Type allAppUsageTimeType = new TypeToken>() { + }.getType(); + HashMap allAppUsageTimeHashMap = gson.fromJson(allAppUsageTimeJson, allAppUsageTimeType); + if (allAppUsageTimeHashMap != null) { + mAllAppUsageTime = allAppUsageTimeHashMap; + } + inInterval(); } @@ -201,6 +205,7 @@ public class RunningAppManager { Log.i(TAG, "checkForegroundAppName: 没有切换应用"); if (RunningAppManager.getInstance().inControlTime(appPackageName)) { removeTask(topPackage); + JGYUtils.getInstance().killBackgroundProcesses(topPackage); gotoLauncher(); } else { Log.i(TAG, "checkForegroundAppName: 没有管控"); @@ -221,6 +226,7 @@ public class RunningAppManager { if (RunningAppManager.getInstance().inControlTime(appPackageName)) { Log.i(TAG, "checkForegroundAppName: 没有剩余时间2"); removeTask(topPackage); + JGYUtils.getInstance().killBackgroundProcesses(topPackage); gotoLauncher(); } else { RunningAppManager.getInstance().recordPackageOpenTime(topPackage); @@ -433,6 +439,8 @@ public class RunningAppManager { mMMKV.encode(RemainingTimeMap, jsonString); String timeString = GsonUtils.toJSONString(mGlobalUsageTime); mMMKV.encode(GlobalUsageTimeMap, timeString); + String singleString = GsonUtils.toJSONString(mAllAppUsageTime); + mMMKV.encode(AllApplUsageTimeMap, singleString); } private long getAppTodayRunTime(String pkg) { @@ -493,6 +501,7 @@ public class RunningAppManager { MachineControl machineControl = TimeControlManager.getInstance().getGlobalMachineControl(); if (havaConfigure) { AppTimeControl appTimeControl = TimeControlManager.getInstance().getAppTimeControl(pkg); + //全局配置的 if (appTimeControl.getTc_use_type() == 2) { AppUsageTime appUsageTime; if (mGlobalUsageTime.get(pkg) == null) { @@ -508,6 +517,18 @@ public class RunningAppManager { } else { mGlobalUsageTime.remove(pkg); } + //单个app的 + AppUsageTime singleAppUsageTime; + if (mAllAppUsageTime.get(pkg) == null) { + singleAppUsageTime = new AppUsageTime(); + singleAppUsageTime.setPkg(pkg); + singleAppUsageTime.setAppName(getAppName(pkg)); + singleAppUsageTime.setUsageTime(1); + } else { + singleAppUsageTime = mAllAppUsageTime.get(pkg); + singleAppUsageTime.setUsageTime(singleAppUsageTime.getUsageTime() + 1); + } + mAllAppUsageTime.put(pkg, singleAppUsageTime); Log.i(TAG, "reduceAppRemainingTime: " + appTimeControl.getToday_time()); long remainingTime = appTimeControl.getToday_time() - time; if (remainingTime < 0) { @@ -717,6 +738,11 @@ public class RunningAppManager { if (havaConfigure) { //有单独设置 不管是分类整机还是其他都是这个设置 AppTimeControl appTimeControl = TimeControlManager.getInstance().getAppTimeControl(pkg); + if (inWeekDay()) { + remainTime.setTotalTime(appTimeControl.getWork_time()); + } else { + remainTime.setTotalTime(appTimeControl.getRest_time()); + } if (appTimeControl.getIs_control() == 0) { remainTime.setDisableType(1); remainTime.setContent("应用已被禁用"); @@ -749,7 +775,7 @@ public class RunningAppManager { //分类没有时间 if (appTimeControl.getTc_use_type() == 1) { remainTime.setDisableType(5); - remainTime.setAppUsageTimes(getAppClassificationTime(appTimeControl.getTc_class_id())); + remainTime.setAppUsageTimes(getClassAppUsageTime(appTimeControl.getTc_class_id())); } else if (appTimeControl.getTc_use_type() == 2) { remainTime.setDisableType(4); remainTime.setAppUsageTimes(getMachineTime()); @@ -769,7 +795,7 @@ public class RunningAppManager { //没有剩余时间 if (appTimeControl.getTc_use_type() == 1) { remainTime.setDisableType(5); - remainTime.setAppUsageTimes(getAppClassificationTime(appTimeControl.getTc_class_id())); + remainTime.setAppUsageTimes(getClassAppUsageTime(appTimeControl.getTc_class_id())); } else if (appTimeControl.getTc_use_type() == 2) { remainTime.setDisableType(4); remainTime.setAppUsageTimes(getMachineTime()); @@ -786,6 +812,11 @@ public class RunningAppManager { if (machineControl == null) { return ""; } + if (inWeekDay()) { + remainTime.setTotalTime(machineControl.getWork_time()); + } else { + remainTime.setTotalTime(machineControl.getRest_time()); + } if (machineControl.is_quota == 1) { if (haveUseTime(machineControl.getWork_time(), machineControl.getRest_time(), machineControl.getToday_time())) { return ""; @@ -806,9 +837,72 @@ public class RunningAppManager { } } + /** + * 获取id对应分类每个app的时间 + * + * @param id + * @return + */ + private List getClassAppUsageTime(int id) { + List appUsageTimes = new ArrayList<>(); + HashMap appTimeControlHashMap = TimeControlManager.getInstance().getAppTimeControlMap(); + if (appTimeControlHashMap == null || appTimeControlHashMap.size() == 0) { + return appUsageTimes; + } + appTimeControlHashMap.entrySet().stream().forEach((entry) -> { + if (entry.getValue().getTc_class_id() == id) { + String pkg = entry.getKey(); + if (TextUtils.isEmpty(pkg)) { + return; + } + AppUsageTime appUsageTime = mAllAppUsageTime.get(pkg); + if (appUsageTime != null) { + appUsageTimes.add(appUsageTime); + } + } + }); + if (appUsageTimes.size() == 0) { + return appUsageTimes; + } + //时间补偿 防止以后每个应用加起来时间不对的问题 + AppTimeControl appTimeControl = TimeControlManager.getInstance().getAppTimeControl(appUsageTimes.get(0).getPkg()); + long allTime = 0; + if (inWeekDay()) { + allTime = appTimeControl.getWork_time(); + } else { + allTime = appTimeControl.getRest_time(); + } + long tempTime = 0; + for (AppUsageTime appUsageTime : appUsageTimes) { + tempTime += appUsageTime.getUsageTime(); + } + appUsageTimes.sort(new Comparator() { + @Override + public int compare(AppUsageTime o1, AppUsageTime o2) { + if (o1.getUsageTime() > o2.getUsageTime()) { + return 1; + } else { + return 0; + } + } + }); + if (tempTime < allTime) { + AppUsageTime lastAppUsageTime = appUsageTimes.get(appUsageTimes.size() - 1); + appUsageTimes.get(appUsageTimes.size() - 1).setUsageTime(lastAppUsageTime.getUsageTime() + (allTime - tempTime)); + } else if (tempTime > allTime) { + AppUsageTime lastAppUsageTime = appUsageTimes.get(appUsageTimes.size() - 1); + appUsageTimes.get(appUsageTimes.size() - 1).setUsageTime(lastAppUsageTime.getUsageTime() - (tempTime - allTime)); + } + return appUsageTimes; + } + private List getAppClassificationTime(int id) { List appUsageTimes = new ArrayList<>(); - TimeControlManager.getInstance().getAppTimeControlMap().entrySet().stream().forEach((entry) -> { + HashMap appTimeControlHashMap = TimeControlManager.getInstance().getAppTimeControlMap(); + if (appTimeControlHashMap == null || appTimeControlHashMap.size() == 0) { + return appUsageTimes; + } + appTimeControlHashMap.entrySet().stream().forEach((entry) -> { if (entry.getValue().getTc_class_id() == id) { String pkg = entry.getKey(); if (TextUtils.isEmpty(pkg)) { @@ -819,6 +913,7 @@ public class RunningAppManager { appUsageTime.setAppName(getAppName(pkg)); AppRunTimeBean appRunTimeBean = mRemainingTimeMap.get(pkg); long usageTime = appRunTimeBean.getAppRunTime(); + Log.e(TAG, "getAppClassificationTime: " + pkg + ": usageTime = " + usageTime); long time; if (inWeekDay()) { time = entry.getValue().getWork_time() - usageTime; @@ -1201,7 +1296,6 @@ public class RunningAppManager { ActivityManager.RunningAppProcessInfo topAppProcess = (ActivityManager.RunningAppProcessInfo) pis.get(0); if (topAppProcess != null && topAppProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { return topAppProcess.processName; - } } else { //getRunningTasks() is deprecated since API Level 21 (Android 5.0) diff --git a/app/src/main/java/com/uiui/sn/manager/ControlManager.java b/app/src/main/java/com/uiui/sn/manager/ControlManager.java index e461ce3..5a2b095 100644 --- a/app/src/main/java/com/uiui/sn/manager/ControlManager.java +++ b/app/src/main/java/com/uiui/sn/manager/ControlManager.java @@ -70,7 +70,8 @@ public class ControlManager { } SystemSettings systemSettings = GsonUtils.toJavaObject(jsonString, SystemSettings.class); if (null != systemSettings) { - setUSBstate(systemSettings); +// setUSBstate(systemSettings); + ControlPanelManager.getInstance().setUsbStatus(systemSettings.getSetting_usb()); setPhoneList(systemSettings); setBluetooth(systemSettings); setHotspot(systemSettings); @@ -99,7 +100,8 @@ public class ControlManager { Log.e(TAG, "setSystemSetting: SystemSettings is NULL"); return; } - setUSBstate(systemSettings); +// setUSBstate(systemSettings); + ControlPanelManager.getInstance().setUsbStatus(systemSettings.getSetting_usb()); setPhoneList(systemSettings); setBluetooth(systemSettings); setHotspot(systemSettings); @@ -729,7 +731,8 @@ public class ControlManager { //仅充电:usb_charge //MTP模式:usb_mtp //Midi模式:usb_midi - String setting_usb = Settings.System.getString(mResolver, "qch_usb_choose"); +// String setting_usb = Settings.System.getString(mResolver, "qch_usb_choose"); + String setting_usb = MMKV.defaultMMKV().decodeString(ControlPanelManager.KEY_USB_STATUS, "usb_charge"); Log.e("SystemSetting", "setting_usb:" + setting_usb); String usbStatus = ""; if (TextUtils.isEmpty(setting_usb)) { diff --git a/app/src/main/java/com/uiui/sn/network/NetInterfaceManager.java b/app/src/main/java/com/uiui/sn/network/NetInterfaceManager.java index 6758463..72022b3 100644 --- a/app/src/main/java/com/uiui/sn/network/NetInterfaceManager.java +++ b/app/src/main/java/com/uiui/sn/network/NetInterfaceManager.java @@ -2013,10 +2013,10 @@ public class NetInterfaceManager { public void onNext(@NonNull BaseResponse BaseResponse) { int code = BaseResponse.code; if (code == 200) { - String data = new Gson().toJson(BaseResponse.data.getAdmin()); + String data = new Gson().toJson(BaseResponse.data.getUser()); Log.e("getSystemSettings", "onNext: " + data); ControlManager.getInstance().setSystemSetting(data); - mCacheHelper.put(UrlAddress.GET_SETTINGS, GsonUtils.toJSONString(BaseResponse.data.getAdmin())); + mCacheHelper.put(UrlAddress.GET_SETTINGS, GsonUtils.toJSONString(BaseResponse.data.getUser())); } else { ControlManager.getInstance().setDisableSetting(); mCacheHelper.put(UrlAddress.GET_SETTINGS, ""); diff --git a/app/src/main/java/com/uiui/sn/service/DownloadService.java b/app/src/main/java/com/uiui/sn/service/DownloadService.java index 57a5e88..c19fc2c 100644 --- a/app/src/main/java/com/uiui/sn/service/DownloadService.java +++ b/app/src/main/java/com/uiui/sn/service/DownloadService.java @@ -146,16 +146,16 @@ public class DownloadService extends Service { @Download.onTaskFail void taskFail(DownloadTask task, Exception e) { - Aria.download(this).resumeAllTask(); +// Aria.download(this).resumeAllTask(); final String filepath = task.getFilePath(); final String packageName = task.getExtendField(); try { - Log.e(TAG, "taskFail: " + "Exception: " + e.getLocalizedMessage()); + Log.e(TAG, "taskFail: " + "Exception: " + e.getMessage()); } catch (Exception ex) { - + Log.e(TAG, "taskFail: Exception = " + e.getMessage()); } Log.e(TAG, "taskFail: " + packageName + "filepath: " + filepath); - + Aria.download(this).load(task.getDownloadEntity().getId()).cancel(true); // Aria.download(this) // .load(task.getDownloadEntity().getRealUrl()) //读取下载地址 // .setFilePath(task.getFilePath()) diff --git a/app/src/main/java/com/uiui/sn/service/main/MainSPresenter.java b/app/src/main/java/com/uiui/sn/service/main/MainSPresenter.java index ce01f1b..190ba00 100644 --- a/app/src/main/java/com/uiui/sn/service/main/MainSPresenter.java +++ b/app/src/main/java/com/uiui/sn/service/main/MainSPresenter.java @@ -268,7 +268,7 @@ public class MainSPresenter implements MainSContact.Presenter { SPUtils.put(mContext, "is_first_connection", 0); int code = systemSettingsBaseResponse.code; if (code == 200) { - String data = new Gson().toJson(systemSettingsBaseResponse.data.getAdmin()); + String data = new Gson().toJson(systemSettingsBaseResponse.data.getUser()); ControlManager.getInstance().setSystemSetting(data); } else { ControlManager.getInstance().setDisableSetting(); diff --git a/app/src/main/java/com/uiui/sn/tpush/MessageReceiver.java b/app/src/main/java/com/uiui/sn/tpush/MessageReceiver.java index d477569..f242dac 100644 --- a/app/src/main/java/com/uiui/sn/tpush/MessageReceiver.java +++ b/app/src/main/java/com/uiui/sn/tpush/MessageReceiver.java @@ -12,9 +12,7 @@ import android.content.pm.PackageManager; import android.content.res.Resources; import android.media.AudioManager; import android.net.ConnectivityManager; -import android.net.wifi.WifiManager; import android.os.Build; -import android.os.Environment; import android.os.Handler; import android.provider.Settings; import android.text.TextUtils; @@ -24,8 +22,6 @@ import android.view.WindowManager; import android.widget.Toast; import com.android.internal.view.RotationPolicy; -import com.arialyy.aria.core.Aria; -import com.arialyy.aria.core.download.DownloadEntity; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; @@ -487,7 +483,8 @@ public class MessageReceiver extends XGPushBaseReceiver { private static final String ACTION_APP_CONTROL = "81"; /*更新白名单*/ private static final String UPDATE_WHITE_LIST = "83"; - + /*一键断网*/ + private static final String ACTION_DISABLE_NETWORK = "85"; private void processCustomMessage(Context context, XGPushTextMessage message) { if (context == null || message == null) { @@ -797,6 +794,10 @@ public class MessageReceiver extends XGPushBaseReceiver { case UPDATE_WHITE_LIST: NetInterfaceManager.getInstance().getAllappPackage(); break; + case ACTION_DISABLE_NETWORK: + ToastUtil.debugShow("收到推送消息: 一键断网"); + oneKeyNetwork(context, extras); + break; default: } } @@ -1561,4 +1562,14 @@ public class MessageReceiver extends XGPushBaseReceiver { String packeges = jsonObject.get("typewriting_app").getAsString(); JGYUtils.getInstance().setDefaultInputMethod(packeges); } + + private void oneKeyNetwork(Context context, String extras) { + JsonObject jsonObject = GsonUtils.getJsonObject(extras); + int is_network = jsonObject.get("is_network").getAsInt(); + if (is_network==1){ + JGYUtils.getInstance().oneKeyDisconnection(); + }else { + JGYUtils.getInstance().restorrNetwork(); + } + } } diff --git a/app/src/main/java/com/uiui/sn/utils/JGYUtils.java b/app/src/main/java/com/uiui/sn/utils/JGYUtils.java index c107fd1..a3d3343 100644 --- a/app/src/main/java/com/uiui/sn/utils/JGYUtils.java +++ b/app/src/main/java/com/uiui/sn/utils/JGYUtils.java @@ -45,6 +45,7 @@ import com.uiui.sn.BuildConfig; import com.uiui.sn.R; import com.uiui.sn.config.CommonConfig; import com.uiui.sn.gson.GsonUtils; +import com.uiui.sn.network.NetInterfaceManager; import com.uiui.sn.receiver.BootReceiver; import java.io.File; @@ -61,6 +62,8 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.Executor; import java.util.function.Consumer; +import java.util.function.Predicate; +import java.util.stream.Collectors; import static android.app.ActivityManager.RECENT_IGNORE_UNAVAILABLE; @@ -1265,4 +1268,25 @@ public class JGYUtils { return IMEI.toUpperCase(); } } + + public void oneKeyDisconnection() { + List thirdPartyList = ApkUtils.queryFilterAppList(mContext); + thirdPartyList.addAll(fuxiaoyingApp); + thirdPartyList.removeIf(TextUtils::isEmpty); + HashSet packageSet = thirdPartyList.stream().filter(new Predicate() { + @Override + public boolean test(String s) { + return !BuildConfig.APPLICATION_ID.equals(s); + } + }).collect(Collectors.toCollection(HashSet::new)); + String disString = String.join(",", packageSet); + Log.e(TAG, "oneKeyDisconnection: " + disString); + Settings.System.putString(mContext.getContentResolver(), CommonConfig.AOLE_ACTION_NETWORK_DISALLOW, disString); + } + + public void restorrNetwork() { + Settings.System.putString(mContext.getContentResolver(), CommonConfig.AOLE_ACTION_NETWORK_DISALLOW, ""); + NetInterfaceManager.getInstance().getAllappPackage(); + } + }