From 626d61d7b3d77ff144373b40f690c2fbc7d8abcb Mon Sep 17 00:00:00 2001 From: tongtongstudio Date: Sat, 7 Feb 2026 09:53:16 +0800 Subject: [PATCH] =?UTF-8?q?version:1.2.4=20fix:=20update:=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=97=B6=E9=97=B4=E7=AE=A1=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 1 + .../xwad/os/activity/home/HomeViewModel.java | 4 + .../java/com/xwad/os/adapter/AppAdapter.java | 6 + .../com/xwad/os/base/BaseApplication.java | 2 + .../java/com/xwad/os/bean/SystemSettings.java | 104 ++- .../java/com/xwad/os/bean/TimeControl.java | 53 ++ .../java/com/xwad/os/config/CommonConfig.java | 66 ++ .../com/xwad/os/manager/ControlManager.java | 871 ++++++++++++++++++ .../java/com/xwad/os/push/PushManager.java | 67 ++ .../java/com/xwad/os/utils/OpenApkUtils.java | 36 +- .../java/com/xwad/os/utils/TimeUtils.java | 684 +++++++++++++- 12 files changed, 1852 insertions(+), 46 deletions(-) create mode 100644 app/src/main/java/com/xwad/os/bean/TimeControl.java create mode 100644 app/src/main/java/com/xwad/os/manager/ControlManager.java diff --git a/app/build.gradle b/app/build.gradle index 851cbae..9cc2ed0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { minSdkVersion 23 targetSdkVersion 29 - versionCode 24 - versionName "1.2.3" + versionCode 25 + versionName "1.2.4" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 86bdb75..d930a6a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + diff --git a/app/src/main/java/com/xwad/os/activity/home/HomeViewModel.java b/app/src/main/java/com/xwad/os/activity/home/HomeViewModel.java index 6eff509..70c44fb 100644 --- a/app/src/main/java/com/xwad/os/activity/home/HomeViewModel.java +++ b/app/src/main/java/com/xwad/os/activity/home/HomeViewModel.java @@ -23,6 +23,7 @@ import com.xwad.os.bean.UserInfo; import com.xwad.os.config.CommonConfig; import com.xwad.os.databinding.ActivityHomeBinding; import com.xwad.os.jxw.SPUtils; +import com.xwad.os.manager.ControlManager; import com.xwad.os.manager.DeviceSNManager; import com.xwad.os.network.NetInterfaceManager; import com.xwad.os.utils.ActivationUtil; @@ -108,8 +109,11 @@ public class HomeViewModel extends BaseViewModel { @Override public void onClick(View view) { Log.e(TAG, "onClick: " + pkg); + + if (OpenApkUtils.getInstance().getDisallowedRunningAppSet().contains(pkg)) { + Toaster.show("应用已禁止打开"); + return; + } + if (TextUtils.isEmpty(pkg)) { Toaster.show("应用未安装"); OpenApkUtils.getInstance().showDownloadDialog(mContext, pkg, lable); diff --git a/app/src/main/java/com/xwad/os/base/BaseApplication.java b/app/src/main/java/com/xwad/os/base/BaseApplication.java index 760cb3a..17d1336 100644 --- a/app/src/main/java/com/xwad/os/base/BaseApplication.java +++ b/app/src/main/java/com/xwad/os/base/BaseApplication.java @@ -23,6 +23,7 @@ import com.xwad.os.alarm.AlarmUtils; import com.xwad.os.manager.AmapManager; import com.xwad.os.manager.AppManager; import com.xwad.os.manager.ConnectManager; +import com.xwad.os.manager.ControlManager; import com.xwad.os.manager.DeviceSNManager; import com.xwad.os.manager.RemoteManager; import com.xwad.os.network.NetInterfaceManager; @@ -96,6 +97,7 @@ public class BaseApplication extends Application { AppUsedTimeUtils.init(this); OpenApkUtils.init(this); ConnectManager.init(this); + ControlManager.init(this); NetInterfaceManager.init(this); // startService(new Intent(this, MainService.class)); registAppReceive(); diff --git a/app/src/main/java/com/xwad/os/bean/SystemSettings.java b/app/src/main/java/com/xwad/os/bean/SystemSettings.java index 426bb37..9b78770 100644 --- a/app/src/main/java/com/xwad/os/bean/SystemSettings.java +++ b/app/src/main/java/com/xwad/os/bean/SystemSettings.java @@ -1,6 +1,5 @@ package com.xwad.os.bean; - import com.google.gson.Gson; import com.google.gson.JsonParser; @@ -70,32 +69,13 @@ public class SystemSettings implements Serializable { int is_top_notify; int is_bottom_bar; int is_notify_bar_show; + int browser_down; int voice_assistant; - - public int getQch_restore() { - return qch_restore; - } - - public void setQch_restore(int qch_restore) { - this.qch_restore = qch_restore; - } - - public int getSetting_browserInput() { - return setting_browserInput; - } - - public void setSetting_browserInput(int setting_browserInput) { - this.setting_browserInput = setting_browserInput; - } - - public int getDev_mode() { - return dev_mode; - } - - public void setDev_mode(int dev_mode) { - this.dev_mode = dev_mode; - } - + int is_browser_network; + int photo_answer_display; + int ai_teacher; + int photo_search_questions; + int ai_question_test; public int getSetting_call() { return setting_call; @@ -273,6 +253,30 @@ public class SystemSettings implements Serializable { this.setting_hotspot = setting_hotspot; } + public int getQch_restore() { + return qch_restore; + } + + public void setQch_restore(int qch_restore) { + this.qch_restore = qch_restore; + } + + public int getSetting_browserInput() { + return setting_browserInput; + } + + public void setSetting_browserInput(int setting_browserInput) { + this.setting_browserInput = setting_browserInput; + } + + public int getDev_mode() { + return dev_mode; + } + + public void setDev_mode(int dev_mode) { + this.dev_mode = dev_mode; + } + public String getSetting_sos() { return setting_sos; } @@ -513,6 +517,14 @@ public class SystemSettings implements Serializable { this.is_notify_bar_show = is_notify_bar_show; } + public int getBrowser_down() { + return browser_down; + } + + public void setBrowser_down(int browser_down) { + this.browser_down = browser_down; + } + public int getVoice_assistant() { return voice_assistant; } @@ -521,6 +533,46 @@ public class SystemSettings implements Serializable { this.voice_assistant = voice_assistant; } + public int getIs_browser_network() { + return is_browser_network; + } + + public void setIs_browser_network(int is_browser_network) { + this.is_browser_network = is_browser_network; + } + + public int getPhoto_answer_display() { + return photo_answer_display; + } + + public void setPhoto_answer_display(int photo_answer_display) { + this.photo_answer_display = photo_answer_display; + } + + public int getAi_teacher() { + return ai_teacher; + } + + public void setAi_teacher(int ai_teacher) { + this.ai_teacher = ai_teacher; + } + + public int getPhoto_search_questions() { + return photo_search_questions; + } + + public void setPhoto_search_questions(int photo_search_questions) { + this.photo_search_questions = photo_search_questions; + } + + public int getAi_question_test() { + return ai_question_test; + } + + public void setAi_question_test(int ai_question_test) { + this.ai_question_test = ai_question_test; + } + @NotNull @Override public String toString() { diff --git a/app/src/main/java/com/xwad/os/bean/TimeControl.java b/app/src/main/java/com/xwad/os/bean/TimeControl.java new file mode 100644 index 0000000..f318bb0 --- /dev/null +++ b/app/src/main/java/com/xwad/os/bean/TimeControl.java @@ -0,0 +1,53 @@ +package com.xwad.os.bean; + +import java.io.Serializable; + +public class TimeControl implements Serializable { + private static final long serialVersionUID = 8400702243953866327L; + + int id; + int user_id; + String sn; + String start_time; + String end_time; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getUser_id() { + return user_id; + } + + public void setUser_id(int user_id) { + this.user_id = user_id; + } + + public String getSn() { + return sn; + } + + public void setSn(String sn) { + this.sn = sn; + } + + public String getStart_time() { + return start_time; + } + + public void setStart_time(String start_time) { + this.start_time = start_time; + } + + public String getEnd_time() { + return end_time; + } + + public void setEnd_time(String end_time) { + this.end_time = end_time; + } +} diff --git a/app/src/main/java/com/xwad/os/config/CommonConfig.java b/app/src/main/java/com/xwad/os/config/CommonConfig.java index 1e76ce0..4f9c3b2 100644 --- a/app/src/main/java/com/xwad/os/config/CommonConfig.java +++ b/app/src/main/java/com/xwad/os/config/CommonConfig.java @@ -4,6 +4,9 @@ public class CommonConfig { public static final String MMKV_ID = "InterProcessKV"; public static final String CLOUD_LESSON_SETTINGS_KEY = "cloud_lesson_settings_key"; + public static final String DISALLOWED_RUNNING_APP_KEY = "disallowed_running_app"; + + public static final String ALIYUN_PUSH_ID = "aliyun_push_id_key"; @Deprecated public static final String isLogined = "isLogined"; @@ -12,6 +15,9 @@ public class CommonConfig { public static final String LOCK_SCREEN_PASSWORD ="Iflytek_lockScreenPasswordKey"; public static final String DEFAULT_PASSWORD = "666666"; + public static final String SCREEN_LOCK_PWD = "screen_lock_passwd"; + public static final String SUPER_PASSWORD = "0728"; + /*保存个人基本信息*/ /*性别*/ public static final String UIUI_USER_GENDER_KEY = "USER_INFO_GENDER"; @@ -41,6 +47,10 @@ public class CommonConfig { /*保存激活码*/ public static final String ACTIVATIONBEAN_CODE_KEY = "UIUI_ACTIVATIONBEAN_CODE"; + public static final String INSTALL_SD_APKS = "install_sd_apks"; + /*是否显示通知栏,以及增强模式*/ + public static final String NOTIFY_BAR_SHOW_KEY = "is_notify_bar_show_key"; + /*是否显示返回Android按钮*/ public static final String UIUI_RETURN_ANDROID_KEY = "iflytek_uiui_is_return_android"; @@ -51,8 +61,18 @@ public class CommonConfig { public static final String MAP_LONGITUDE_KEY = "map_longitude_key"; public static final String MAP_LATITUDE_KEY = "map_latitude_key"; public static final String MAP_ADDRESS_KEY = "map_address_key"; + public static final String MAP_PROVINCE_KEY = "map_province_key"; + public static final String MAP_CITY_KEY = "map_city_key"; + public static final String MAP_DISTRICT_KEY = "map_district_key"; + public static final String MAP_STREET_KEY = "map_street_key"; + public static final String MAP_LOCATION_DESCRIBE_KEY = "map_locationDescribe_key"; public static final String MAP_ERROR_KEY = "map_error_key"; + public static final String MAP_onLocationChanged_time_KEY = "map_onLocationChanged_time_key"; + + public static final String MAP_BEAN = "MapBean"; + + public static final String SETTING_OTHER_APPINSTALLER_KEY = "iflytek_setting_other_appInstaller"; /*应用市场的app列表*/ public final static String ADMIN_APP_LIST = "only_admin_app_list"; @@ -80,4 +100,50 @@ public class CommonConfig { /*是否为管理员app*/ public static final String APP_ADMIN = "iflytek_setting_admin_app"; + + /*禁止联网应用*/ + public final static String AOLE_ACTION_NETWORK_DISALLOW = "aole_network_disallow"; + + + /*通话白名单开关*/ + public final static String STRANGE_PHONE_DENY = "strange_phone_deny"; + /*通话白名单*/ + public static final String NUMBER_BLACK_WHITE_LIST = "mdm_call_black_and_white_list"; + + /*app安装白名单开关*/ + public static final String APP_WHITELIST_CONTROL = "app_whitelist_control"; + + /*通知栏常驻*/ + public static final String NOTI_BAR_PERMANENT_KEY = "notification_bar_permanent"; + public static final String NOTI_BAR_PERMANENT_ACTION = "notification_bar_permanent_action"; + /*是否允许通知*/ + public static final String ALLOW_NOTIFICATION = "allow_notification"; + + /*默认桌面key*/ + public final static String DESKTOP_APP_KEY = "desktop_app_key"; + public final static String BROWSER_APP_KEY = "browser_app_key"; + public final static String TYPEWRITING_APP_KEY = "typewriting_app_key"; + + /** + * 管控系统指令 + */ + + /*USB模式-充电*/ + public final static String AOLE_ACTION_USB_USB_CHARGE = "aole_action_usb_usb_charge"; + /*USB模式-MTP*/ + public final static String AOLE_ACTION_USB_USB_MTP = "aole_action_usb_usb_mtp"; + /*USB模式-MIDI*/ + public final static String AOLE_ACTION_USB_USB_MIDI = "aole_action_usb_usb_midi"; + + /*应用安装白名单总开关*/ + public final static String AOLE_APP_ALLOW_INSTALL = "aole_app_allow_install"; + /*应用安装白名单*/ + public final static String AOLE_ACTION_APP_FORBID = "aole_app_forbid"; + /*强制安装应用,禁止卸载*/ + public final static String AOLE_ACTION_FORCE_APP = "aole_force_app"; + + /*应用ID管控*/ + public final static String AOLE_ACTION_APP_FORBID_ID = "aole_app_forbid_id"; + /*应用ID管控*/ + public final static String AOLE_ACTION_APP_FORBID_ARRAY = "DeselectViewArray"; } diff --git a/app/src/main/java/com/xwad/os/manager/ControlManager.java b/app/src/main/java/com/xwad/os/manager/ControlManager.java new file mode 100644 index 0000000..3673f81 --- /dev/null +++ b/app/src/main/java/com/xwad/os/manager/ControlManager.java @@ -0,0 +1,871 @@ +package com.xwad.os.manager; + +import android.annotation.SuppressLint; +import android.bluetooth.BluetoothAdapter; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.provider.Settings; +import android.text.TextUtils; +import android.util.Log; + +import com.google.gson.JsonObject; +import com.hjq.toast.Toaster; +import com.tencent.mmkv.MMKV; +import com.xwad.os.BuildConfig; +import com.xwad.os.bean.SystemSettings; +import com.xwad.os.config.CommonConfig; +import com.xwad.os.gson.GsonUtils; +import com.xwad.os.utils.OpenApkUtils; +import com.xwad.os.utils.TimeUtils; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.function.Predicate; + +/** + * 系统管理处理 + * 所有数据 后台1是0否,底层0是1否 + * + * @author jgy02 + */ +public class ControlManager { + private static final String TAG = "ControlManager"; + + @SuppressLint("StaticFieldLeak") + private static ControlManager sInstance; + private Context mContext; + private ContentResolver mResolver; + private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + + private ControlManager(Context context) { + if (context == null) { + throw new RuntimeException("Context is NULL"); + } + this.mContext = context; + this.mResolver = context.getContentResolver(); + } + + public static void init(Context context) { + if (sInstance == null) { + sInstance = new ControlManager(context); + } + } + + public static ControlManager getInstance() { + if (sInstance == null) { + throw new IllegalStateException("You must be init ControlManager first"); + } + return sInstance; + } + +// private int changeNum(int status) { +// return status == 0 ? 1 : 0; +// } + + private boolean isDebugMode() { + return BuildConfig.DEBUG; + } + + public void setSystemSetting(String jsonString) { + if (TextUtils.isEmpty(jsonString)) { + return; + } + SystemSettings systemSettings = GsonUtils.toJavaObject(jsonString, SystemSettings.class); + if (null != systemSettings) { + setUSBstate(systemSettings); +// setPhoneList(systemSettings); +// setBluetooth(systemSettings); +// setHotspot(systemSettings); + setBar(systemSettings); + setCamera(systemSettings); +// setTF(systemSettings); + setIcon(systemSettings); + setCanReset(systemSettings); + setDeveloperOptions(systemSettings); +// setSearchTopic(systemSettings); + setSOSNumber(systemSettings); + setAppstoreAdmin(systemSettings); + setDefaultApp(systemSettings); + setIsControl(systemSettings); + setOtherAppInstaller(systemSettings); + setQuickApp(systemSettings); + setTimeControl(systemSettings); + setBrowserInput(systemSettings); + + setZhuangyuanSetting(systemSettings); + setDisallowedRunningApp(systemSettings); + } + } + + public void setSystemSetting(SystemSettings systemSettings) { + if (null != systemSettings) { + setUSBstate(systemSettings); +// setPhoneList(systemSettings); +// setBluetooth(systemSettings); +// setHotspot(systemSettings); + setBar(systemSettings); + setCamera(systemSettings); +// setTF(systemSettings); + setIcon(systemSettings); + setCanReset(systemSettings); + setDeveloperOptions(systemSettings); +// setSearchTopic(systemSettings); + setSOSNumber(systemSettings); + setAppstoreAdmin(systemSettings); + setDefaultApp(systemSettings); + setIsControl(systemSettings); + setOtherAppInstaller(systemSettings); + setQuickApp(systemSettings); + setTimeControl(systemSettings); + setBrowserInput(systemSettings); + + setZhuangyuanSetting(systemSettings); + setDisallowedRunningApp(systemSettings); + } + } + + /** + * 关闭所有功能 + */ + public void setDisableSetting() { + Log.e("setDisableSetting", "Close all settings: "); +// setUSBstate(1); +// setPhoneList(1); +// setBluetooth(0); +// setHotspot(0); + setCamera(1); +// setTF(1); + setIcon(1); + setWallpaper(0); + setCanReset(1); + setBrowserInput(1); + if (!isDebugMode()) { +// setDeveloperOptions(1); + } +// setSearchTopic(0); + setTimeControlClose(); + setDisallowedRunningApp(); + } + + /** + * usb连接模式管控 + * + * @param settings + */ + private void setUSBstate(SystemSettings settings) { + //USB数据功能管控 + //仅充电:usb_charge + //MTP模式:usb_mtp + //Midi模式:usb_midi + String setting_usb = settings.getSetting_usb(); + Log.e("SystemSetting", "setting_usb:" + setting_usb); + + } + + + /** + * usb连接模式管控 + * + * @param state + */ + public void setUSBstate(int state) { + //USB数据功能管控 + //仅充电:usb_charge + //MTP模式:usb_mtp + //Midi模式:usb_midi + if (!isDebugMode()) { + try { +// boolean qch_usb_choose = Settings.System.putString(mResolver, "qch_usb_choose", "usb_charge"); +// Log.e(TAG, "qch_usb_choose:" + qch_usb_choose); + String usbStatus = CommonConfig.AOLE_ACTION_USB_USB_CHARGE; + Intent usbIntent = new Intent(usbStatus).setPackage("com.android.settings"); + mContext.sendBroadcast(usbIntent); + } catch (Exception e) { + Log.e(TAG, "setUSBstate: " + e.getMessage()); + } + } + } + + /** + * usb连接模式管控 + */ + public void setUSBstate(String action) { + //USB数据功能管控 + //仅充电:usb_charge + //MTP模式:usb_mtp + //Midi模式:usb_midi + if (!isDebugMode()) { + Log.e(TAG, "qch_usb_choose:" + action); + } + } + + private void setPhoneList(SystemSettings settings) { + //设置电话功能,电话白名单 +// int setting_call = changeNum(settings.getSetting_call()); +// boolean qch_call_forbid = Settings.System.putInt(mResolver, "qch_call_forbid", setting_call); +// Log.e("SystemSetting", "qch_call_forbid: " + setting_call); + +// int setting_phone = changeNum(settings.getSetting_phone()); +// boolean aole_white_list_on = Settings.System.putInt(mResolver, CommonConfig.AOLE_ACTION_WHITE_LIST_ON, setting_phone); +// Log.e("SystemSetting", "aole_white_list_on: " + setting_phone); + +// String setting_phones = settings.getSetting_phones(); +// boolean aole_white_list_Array = Settings.System.putString(mResolver, CommonConfig.AOLE_ACTION_WHITE_LIST_ARRAY, setting_phones); +// Log.e("SystemSetting", "aole_white_list_Array: " + aole_white_list_Array + "=" + setting_phones); + +// int setting_memory = changeNum(settings.getSetting_memory()); +// boolean aole_sdcard_forbid_on = Settings.System.putInt(mResolver, CommonConfig.AOLE_ACTION_SDCARD_FORBID_ON, setting_memory); +// Log.e("SystemSetting", "aole_sdcard_forbid_on: " + setting_memory); + } + + private void setPhoneList(int state) { + try { + //设置电话功能,电话白名单 +// boolean qch_call_forbid = Settings.System.putInt(mResolver, "qch_call_forbid", state); +// Log.e(TAG, "qch_call_forbid:" + qch_call_forbid); + +// boolean aole_white_list_on = Settings.System.putInt(mResolver, CommonConfig.AOLE_ACTION_WHITE_LIST_ON, state); +// Log.e(TAG, "aole_white_list_on:" + aole_white_list_on); + +// boolean aole_white_list_Array = Settings.System.putString(mResolver, CommonConfig.AOLE_ACTION_WHITE_LIST_ARRAY, ""); + // ToastTool.show("qch_call_forbid::"+setting_call+"----setting_phones::"+setting_phones+"----"+aole_white_list_Array+"---"+qch_call_forbid); +// Log.e(TAG, "aole_white_list_Array:" + aole_white_list_Array + "---" + aole_white_list_Array); + +// boolean aole_sdcard_forbid_on = Settings.System.putInt(mResolver, CommonConfig.AOLE_ACTION_SDCARD_FORBID_ON, state); +// Log.e(TAG, "aole_sdcard_forbid_on:" + aole_sdcard_forbid_on); + } catch (Exception e) { + Log.e(TAG, "setPhoneList: " + e.getMessage()); + } + } + + private void setBluetooth(SystemSettings settings) { + try { + //蓝牙开关 +// int setting_bht = changeNum(settings.getSetting_bht()); + //总开关 +// int setting_bhtvideo = changeNum(settings.getSetting_bhtvideo()); + //蓝牙音频开关 +// int setting_bluetooth = changeNum(settings.getSetting_bluetooth()); + //蓝牙传输开关 +// boolean aole_bht_forbid_on = Settings.System.putInt(mResolver, CommonConfig.AOLE_ACTION_BHT_FORBID_ON, setting_bht); + //写入系统数据库 +// Log.e("SystemSetting", "aole_bht_forbid_on:" + aole_bht_forbid_on); + BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); +// if (aole_bht_forbid_on) { +// //成功 +// if (null == mBluetoothAdapter) { +// mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); +// //获取默认蓝牙适配器 +// } +// if (setting_bht == 0) { +// //蓝牙总开关开启 +// String setting_context = settings.getSetting_context(); +// if (setting_bhtvideo == 0) { +// if (null != setting_context && !"".equals(setting_context) && !" ".equals(setting_context) && !"null".equals(setting_context)) { +// Log.e("SystemSetting", "setting_context:" + setting_context); +//// Settings.System.putString(mResolver, CommonConfig.AOLE_ACTION_BHTVIDEO_FORBID_ON, setting_context); +// } else { +//// Settings.System.putString(mResolver, CommonConfig.AOLE_ACTION_BHTVIDEO_FORBID_ON, "Empty"); +// } +// } else if (setting_bhtvideo == 1) { +//// Settings.System.putString(mResolver, CommonConfig.AOLE_ACTION_BHTVIDEO_FORBID_ON, "Empty"); +// } +//// Settings.System.putInt(mResolver, CommonConfig.AOLE_ACTION_BT_FORBID_ON, setting_bluetooth); +// } else { +// mBluetoothAdapter.disable(); +// //设置关闭时关闭蓝牙 +// } +// } + } catch (Exception e) { + Log.e(TAG, "setBluetooth: " + e.getMessage()); + } + } + + private void setBluetooth(int state) { + try { +// boolean aole_bht_forbid_on = Settings.System.putInt(mResolver, CommonConfig.AOLE_ACTION_BHT_FORBID_ON, state); + //写入系统数据库 +// Log.e(TAG, "aole_bht_forbid_on:" + aole_bht_forbid_on); + BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); +// if (aole_bht_forbid_on) { +// //成功 +// if (null == mBluetoothAdapter) { +// mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); +// //获取默认蓝牙适配器 +// } +// //蓝牙总开关开启 +//// Settings.System.putString(mResolver, CommonConfig.AOLE_ACTION_BHTVIDEO_FORBID_ON, "Empty"); +//// Settings.System.putInt(mResolver, CommonConfig.AOLE_ACTION_BT_FORBID_ON, state); +// mBluetoothAdapter.disable(); +// //设置关闭时关闭蓝牙 +// } + } catch (Exception e) { + Log.e(TAG, "setBluetooth: " + e.getMessage()); + } + } + + private void setHotspot(SystemSettings settings) { + try { +// int setting_hotspot = changeNum(settings.getSetting_hotspot());//热点 +// if (setting_hotspot == 1) { +// Intent intent = new Intent(); +// intent.setAction("qch_hotspot_close"); +// intent.setPackage("com.android.settings"); +// mContext.sendStickyBroadcast(intent); +// } +// boolean aole_hotspot_forbid_on = Settings.System.putInt(mResolver, CommonConfig.AOLE_ACTION_HOTSPOT_FORBID_ON, setting_hotspot);//写入系统数据库 +// Log.e("SystemSetting", "aole_hotspot_forbid_on:" + setting_hotspot); +// Log.e("SystemSetting", "aole_hotspot_forbid_on:" + aole_hotspot_forbid_on); + } catch (Exception e) { + Log.e(TAG, "setHotspot: " + e.getMessage()); + } + } + + private void setHotspot(int state) { + try { + Intent intent = new Intent(); + intent.setAction("qch_hotspot_close"); + intent.setPackage("com.android.settings"); + mContext.sendStickyBroadcast(intent); +// boolean aole_hotspot_forbid_on = Settings.System.putInt(mResolver, CommonConfig.AOLE_ACTION_HOTSPOT_FORBID_ON, state); +// Log.e(TAG, "aole_hotspot_forbid_on:" + aole_hotspot_forbid_on); + } catch (Exception e) { + Log.e(TAG, "setHotspot: " + e.getMessage()); + } + } + + private void setBar(SystemSettings settings) { + //系统导航条显示开关 + int setting_navigation = settings.getSetting_navigation(); + Log.e(TAG, "setBar: setting_navigation = " + setting_navigation); + + //状态栏显示开关 + int setting_statusbar = settings.getSetting_statusbar(); + Log.e(TAG, "setBar: setting_statusbar = " + setting_statusbar); + } + + @Deprecated + private void setCamera(SystemSettings settings) { + try { + //摄像头开关 + int setting_camera = (settings.getSetting_camera()); +// Settings.System.putInt(mResolver, "qch_app_camera", setting_camera); +// ApkUtils.hideSystemSettingAPP(mContext, "com.mediatek.camera"); + Log.e("SystemSetting", "setting_camera:" + setting_camera); + String cameraStatus = ""; + switch (setting_camera) { + case 0: + cameraStatus = "qch_camera_open"; + break; + case 1: + cameraStatus = "qch_camera_forbid"; + break; + } + } catch (Exception e) { + Log.e(TAG, "setCamera: " + e.getMessage()); + } + } + + @Deprecated + private void setCamera(int state) { + try { + //摄像头开关 +// boolean qch_app_camera = Settings.System.putInt(mResolver, "qch_app_camera", state); + Log.e(TAG, "qch_app_camera1:" + state); +// ApkUtils.hideSystemSettingAPP(mContext, "com.mediatek.camera"); +// Log.e(TAG, "setting_camera---------" + qch_app_camera); + String cameraStatus = "qch_camera_forbid"; + switch (state) { + case 0: + cameraStatus = "qch_camera_open"; + break; + case 1: + cameraStatus = "qch_camera_forbid"; + break; + } + Intent cameraIntent = new Intent(cameraStatus).setPackage("com.android.settings"); + mContext.sendBroadcast(cameraIntent); + } catch (Exception e) { + Log.e(TAG, "setCamera: " + e.getMessage()); + } + } + + @SuppressLint("NewApi") + private void setTF(SystemSettings settings) { + //tfmedia开关 + int setting_tfmedia = (settings.getSetting_tfmedia()); +// boolean qch_tfmedia_forbid = Settings.System.putInt(mResolver, "qch_tfmedia_forbid", setting_tfmedia); +// Log.e("SystemSetting", "setting_tfmedia:" + qch_tfmedia_forbid); + String tfmediaStatus = ""; + switch (setting_tfmedia) { + case 0: + tfmediaStatus = "qch_tfmedia_open"; + break; + case 1: + tfmediaStatus = "qch_tfmedia_forbid"; + break; + default: + break; + } + Intent tfmediaIntent = new Intent(tfmediaStatus).setPackage("com.android.settings"); + mContext.sendBroadcast(tfmediaIntent); + if (setting_tfmedia == 1) { + String qch_tfmedia_filetypes = settings.getSetting_tfmedia_format(); + if (TextUtils.isEmpty(qch_tfmedia_filetypes)) { +// Settings.System.putString(mResolver, "qch_tfmedia_filetypes", "");//影音管控 + } else { + HashSet types = new HashSet<>(Arrays.asList(qch_tfmedia_filetypes.split(","))); + types.removeIf(new Predicate() { + @Override + public boolean test(String s) { + return TextUtils.isEmpty(s); + } + }); + String typesString = String.join(",", types); +// Settings.System.putString(mResolver, "qch_tfmedia_filetypes", typesString);//影音管控 + Log.e("SystemSetting", "qch_tfmedia_filetypes :" + typesString); + } + } else { +// Settings.System.putInt(mResolver, "qch_tfmedia_forbid", 0); + } + } + + private void setTF(int state) { + try { + //tfmedia开关 +// int setting_tfmedia = 1; +// boolean qch_tfmedia_forbid = Settings.System.putInt(mResolver, "qch_tfmedia_forbid", state); +// Log.e(TAG, "setting_tfmedia---------" + qch_tfmedia_forbid); + String tfmediaStatus = ""; + switch (state) { + case 0: + tfmediaStatus = "qch_tfmedia_open"; + break; + case 1: + tfmediaStatus = "qch_tfmedia_forbid"; + break; + } + Intent tfmediaIntent = new Intent(tfmediaStatus).setPackage("com.android.settings"); + mContext.sendBroadcast(tfmediaIntent); + if (state == 1) { +// boolean qch_tfmedia_filetypes = Settings.System.putString(mResolver, "qch_tfmedia_filetypes", "Empty");//影音管控 +// Log.e(TAG, "qch_tfmedia_filetypes:" + qch_tfmedia_filetypes); + } else { +// Settings.System.putInt(mResolver, "qch_tfmedia_forbid", 0); + } + } catch (Exception e) { + Log.e(TAG, "setTF: " + e.getMessage()); + } + } + + @Deprecated + private void setIcon(SystemSettings settings) { + try { + int deskclock = (settings.getSetting_clock()); + Log.e("SystemSetting", "qch_app_deskclock:" + deskclock); + //录音机 + int soundrecorder = (settings.getSetting_recording()); + Log.e("SystemSetting", "qch_app_soundrecorder:" + soundrecorder); + //音乐 + int music = (settings.getSetting_music()); + Log.e("SystemSetting", "qch_app_music:" + music); + //图库 + int gallery = (settings.getSetting_picture()); + Log.e("SystemSetting", "qch_app_gallery:" + gallery); + //壁纸 + int wallpaper = (settings.getSetting_wallpaper()); + Log.e("SystemSetting", "qch_app_wallpaper:" + wallpaper); + //文件管理器 + int filemanager = (settings.getSetting_file()); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { +// ApkUtils.hideSystemSettingAPP(mContext, "com.mediatek.filemanager"); + } else { +// ApkUtils.hideSystemSettingAPP(mContext, "com.android.documentsui"); + } + Log.e("SystemSetting", "qch_app_filemanager:" + filemanager); + //浏览器 + int browser = (settings.getSetting_browser()); + Log.e(TAG, "qch_app_browser" + browser); + } catch (Exception e) { + Log.e(TAG, "setIcon: " + e.getMessage()); + } + } + + @Deprecated + private void setIcon(int state) { + try { + + //时钟 +// int deskclock = 1; +// ApkUtils.hideSystemSettingAPP(mContext, "com.android.deskclock"); + Log.e(TAG, "qch_app_deskclock" + state); + //录音机 +// int soundrecorder = 1; +// ApkUtils.hideSystemSettingAPP(mContext, "com.android.soundrecorder"); + Log.e(TAG, "qch_app_soundrecorder" + state); + //音乐 +// int music = 1; +// ApkUtils.hideSystemSettingAPP(mContext, "com.android.music"); + Log.e(TAG, "qch_app_music" + state); + //图库 +// int gallery = 1; +// ApkUtils.hideSystemSettingAPP(mContext, "com.android.gallery3d"); + Log.e(TAG, "qch_app_gallery" + state); + //文件管理器 +// int filemanager = 1; + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { +// ApkUtils.hideSystemSettingAPP(mContext, "com.mediatek.filemanager"); + } else { +// ApkUtils.hideSystemSettingAPP(mContext, "com.android.documentsui"); + } + Log.e(TAG, "qch_app_filemanager" + state); + //浏览器 + Log.e(TAG, "qch_app_browser" + state); + } catch (Exception e) { + Log.e(TAG, "setIcon: " + e.getMessage()); + } + } + + private void setWallpaper(int state) { + //壁纸 +// int wallpaper = 1; +// Settings.System.putInt(mResolver, "qch_app_wallpaper", state); + Log.e(TAG, "qch_app_wallpaper" + state); + } + + private void setCanReset(SystemSettings settings) { + int qch_restore = settings.getQch_restore(); + Log.e(TAG, "setCanReset: qch_restore = " + qch_restore); + } + + private void setCanReset(int state) { + Log.e(TAG, "setCanReset: state = " + state); + } + + /** + * 置浏览器禁止输入,默认打开 + * + * @param state + */ + @Deprecated + private void setBrowserInput(int state) { +// Settings.System.putInt(mResolver, "qch_Browser_input", 0); + } + + @Deprecated + private void setBrowserInput(SystemSettings systemSettings) { + int setting_browserInput = (systemSettings.getSetting_browserInput()); +// Settings.System.putInt(mResolver, "qch_Browser_input", setting_browserInput); + } + + public void setDeveloperOptions(SystemSettings systemSettings) { + int dev_mode = systemSettings.getDev_mode(); + Log.e(TAG, "setDeveloperOptions: " + dev_mode); + if (!isDebugMode()) { + setDeveloperMode(dev_mode); + } + } + + public void setDeveloperOptions(String jsonString) { + JsonObject jsonObject = GsonUtils.getJsonObject(jsonString); + int dev_mode = (jsonObject.get("dev_mode").getAsInt()); + Log.e(TAG, "setDeveloperOptions: " + dev_mode); + if (!isDebugMode()) { +// Settings.System.putInt(mResolver, "qch_Developeroptions", dev_mode); + int old_dev_enabled = Settings.Global.getInt(mResolver, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0); + Log.e(TAG, "setDeveloperOptions: " + old_dev_enabled); + int new_state = (dev_mode == 1 ? 0 : 1); + if (old_dev_enabled != new_state) { +// Settings.Global.putInt(mResolver, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, new_state); +// Settings.Global.putInt(mResolver, Settings.Global.ADB_ENABLED, new_state); + } +// Settings.System.putInt(mResolver, CommonConfig.AOLE_ACTION_DEVELOPER_OPTIONS, dev_mode); + if (dev_mode == 1) { + Intent intent = new Intent(); + intent.setAction("qch_developeroptions_close"); + intent.setPackage("com.android.settings"); + mContext.sendBroadcast(intent); + Log.e(TAG, "setDeveloperOptions: " + "关闭开发者模式"); + Toaster.debugShow("关闭开发者模式"); + } else { + Log.e(TAG, "setDeveloperOptions: " + "打开开发者模式"); + Toaster.debugShow("打开开发者模式"); + } + } + } + + public void setDeveloperOptions(int state) { + Log.e(TAG, "setDeveloperOptions: " + state); + if (!isDebugMode()) { +// Settings.System.putInt(mResolver, "qch_Developeroptions", state); + int old_dev_enabled = Settings.Global.getInt(mResolver, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0); + Log.e(TAG, "setDeveloperOptions: " + old_dev_enabled); + int new_state = (state == 1 ? 0 : 1); + if (old_dev_enabled != new_state) { +// Settings.Global.putInt(mResolver, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, new_state); +// Settings.Global.putInt(mResolver, Settings.Global.ADB_ENABLED, new_state); + } +// Settings.System.putInt(mResolver, CommonConfig.AOLE_ACTION_DEVELOPER_OPTIONS, state); + if (state == 1) { + Intent intent = new Intent(); + intent.setAction("qch_developeroptions_close"); + intent.setPackage("com.android.settings"); + mContext.sendBroadcast(intent); + Log.e(TAG, "setDeveloperOptions: " + "关闭开发者模式"); + } else { + Log.e(TAG, "setDeveloperOptions: " + "打开开发者模式"); +// Toaster.show("打开开发者模式"); + } + } + } + + public void setSearchTopic(String jsonString) { + JsonObject jsonObject = GsonUtils.getJsonObject(jsonString); + if (jsonObject.get("search_topic") == null) return; + int mode = jsonObject.get("search_topic").getAsInt(); + mMMKV.encode("search_topic", mode); + Log.e(TAG, "setSearchTopic:" + mode); + } + + public void setSearchTopic(int state) { + mMMKV.encode("search_topic", state); + Log.e(TAG, "setSearchTopic:" + state); + } + + /** + * 开机管控usb + */ + public void setDefaultUSBstate() { + //USB数据功能管控 + //仅充电:usb_charge + //MTP模式:usb_mtp + //Midi模式:usb_midi + String setting_usb = Settings.System.getString(mResolver, "qch_usb_choose"); + Log.e("SystemSetting", "setting_usb:" + setting_usb); + String usbStatus = ""; + if (TextUtils.isEmpty(setting_usb)) { + usbStatus = CommonConfig.AOLE_ACTION_USB_USB_CHARGE; + } else { + if (!isDebugMode()) { + switch (setting_usb) { + case "usb_charge": + usbStatus = CommonConfig.AOLE_ACTION_USB_USB_CHARGE; + break; + case "usb_mtp": + usbStatus = CommonConfig.AOLE_ACTION_USB_USB_MTP; + break; +// case "usb_midi": +// usbStatus = CommonConfig.AOLE_ACTION_USB_USB_MIDI; +// break; + default: + usbStatus = CommonConfig.AOLE_ACTION_USB_USB_CHARGE; + break; + } + } + } + Intent usbIntent = new Intent(usbStatus).setPackage("com.android.settings"); + mContext.sendBroadcast(usbIntent); + } + + @Deprecated + private void setSOSNumber(SystemSettings settings) { + String setting_sos = settings.getSetting_sos(); + Log.e(TAG, "setSOSNumber: setting_sos = " + setting_sos); + } + + @Deprecated + private void setAppstoreAdmin(SystemSettings settings) { + int setting_admin_app = settings.getSetting_admin_app(); + mMMKV.encode(CommonConfig.APP_ADMIN, setting_admin_app); + int isReturnAndroid = settings.getIs_return_android(); + mMMKV.encode(CommonConfig.UIUI_RETURN_ANDROID_KEY, isReturnAndroid); + } + + private void setSetting(SystemSettings settings) { + String setting_volume = settings.getSetting_volume(); + String setting_luminance = settings.getSetting_luminance(); + String setting_typeface = settings.getSetting_typeface(); + } + + private void setScreenShared(SystemSettings settings) { + int projection_screen = settings.getProjection_screen(); + setScreenShared(projection_screen); + } + + private void setScreenShared(int state) { +// Settings.System.putInt(mResolver, "projection_screen", state); + } + + private void setHotPoint(SystemSettings settings) { + int hot_point = settings.getHot_point(); + setScreenShared(hot_point); + } + + private void setHotPoint(int state) { +// Settings.System.putInt(mResolver, "hot_point", state); + } + + private void setDefaultApp(SystemSettings settings) { + String desktop_app = settings.getDesktop_app(); + Log.e(TAG, "setDefaultApp: desktop_app = " + desktop_app); + if (!TextUtils.isEmpty(desktop_app)) { + mMMKV.encode(CommonConfig.DESKTOP_APP_KEY, desktop_app); + } else { + mMMKV.encode(CommonConfig.DESKTOP_APP_KEY, ""); + } + String browser_app = settings.getBrowser_app(); + Log.e(TAG, "setDefaultApp: browser_app = " + browser_app); + if (!TextUtils.isEmpty(browser_app)) { + mMMKV.encode(CommonConfig.BROWSER_APP_KEY, browser_app); + } else { + mMMKV.encode(CommonConfig.BROWSER_APP_KEY, ""); + } + String typewriting_app = settings.getTypewriting_app(); + Log.e(TAG, "setDefaultApp: typewriting_app = " + typewriting_app); + if (!TextUtils.isEmpty(typewriting_app)) { + mMMKV.encode(CommonConfig.TYPEWRITING_APP_KEY, typewriting_app); + } else { + mMMKV.encode(CommonConfig.TYPEWRITING_APP_KEY, ""); + } + } + + /** + * 应用安装之后重新设置 + */ + public void setDefaultApp() { + String desktop_app = mMMKV.decodeString(CommonConfig.DESKTOP_APP_KEY, ""); + Log.e(TAG, "setDefaultApp: desktop_app = " + desktop_app); + if (!TextUtils.isEmpty(desktop_app)) { + } + String browser_app = mMMKV.decodeString(CommonConfig.BROWSER_APP_KEY, ""); + Log.e(TAG, "setDefaultApp: browser_app = " + browser_app); + if (!TextUtils.isEmpty(browser_app)) { + } + String typewriting_app = mMMKV.decodeString(CommonConfig.TYPEWRITING_APP_KEY, ""); + Log.e(TAG, "setDefaultApp: typewriting_app = " + typewriting_app); + if (!TextUtils.isEmpty(typewriting_app)) { + } + } + + private void setIsControl(SystemSettings settings) { + int is_control = settings.getIs_control(); + setIsControl(is_control); + } + + private void setIsControl(int state) { +// Settings.System.putInt(mResolver, CommonConfig.KEY_IS_CONTROL, state); + //关闭 + if (state == 0) { +// setBluetooth(0); +// setHotspot(0); + setUSBstate(CommonConfig.AOLE_ACTION_USB_USB_MTP); + } + } + + @Deprecated + private void setOtherAppInstaller(SystemSettings settings) { + int is_storeinstall = settings.getIs_storeinstall(); + mMMKV.encode(CommonConfig.APP_STORE_INSTALL, is_storeinstall); + int setting_other_appInstaller = settings.getSetting_other_appInstaller(); + mMMKV.encode(CommonConfig.APP_INSTALLATION, setting_other_appInstaller); + } + + @Deprecated + public void setOtherAppInstaller(int status) { + mMMKV.encode(CommonConfig.APP_STORE_INSTALL, status); + mMMKV.encode(CommonConfig.APP_INSTALLATION, status); + mMMKV.encode(CommonConfig.AOLE_APP_ALLOW_INSTALL, status); + } + + + public static final String QUICK_APP_KEY = "QuickAppPackageKey"; + public static final String QUICK_APP_REFRESH_KEY = "QuickAppRefreshKey"; + public static final String QUICK_APP_ENABLED_KEY = "QuickAppEnabledKey"; + + @Deprecated + private void setQuickApp(SystemSettings settings) { + if (settings.getIs_quickapp() == 1) { + String pkg = settings.getQuickapp(); +// Settings.Global.putString(mContext.getContentResolver(), QUICK_APP_KEY, pkg); +// Settings.Global.putInt(mContext.getContentResolver(), QUICK_APP_ENABLED_KEY, 1); + } else { +// Settings.Global.putInt(mContext.getContentResolver(), QUICK_APP_ENABLED_KEY, 0); + } + } + + private void setTimeControl(SystemSettings settings) { + int is_timecontrol = settings.getIs_timecontrol(); + mMMKV.encode(TimeUtils.AOLELEARN_TIME_CONTROL_KEY, is_timecontrol); + +// String timecontrol_start = settings.getTimecontrol_start(); +// mMMKV.encode(TimeUtils.AOLELEARN_TTIMECONTROL_START_KEY, timecontrol_start); +// String timecontrol_end = settings.getTimecontrol_start(); +// mMMKV.encode(TimeUtils.AOLELEARN_TTIMECONTROL_END_KEY, timecontrol_end); + } + + private void setTimeControlClose() { + mMMKV.encode(TimeUtils.AOLELEARN_TIME_CONTROL_KEY, 0); +// mMMKV.encode(TimeUtils.AOLELEARN_TTIMECONTROL_START_KEY, ""); +// mMMKV.encode(TimeUtils.AOLELEARN_TTIMECONTROL_END_KEY, ""); + } + + private void setZhuangyuanSetting(SystemSettings setting) { + setBluetoothShare((setting.getIs_bluetooth_share())); + setDeveloperMode((setting.getIs_developer_mode())); + setDeviceRecover((setting.getIs_device_recover())); + setTopNotify(setting.getIs_top_notify()); + setBottomBar(setting.getIs_bottom_bar()); + } + + public void setBluetoothShare(int status) { + Log.e(TAG, "setBluetoothShare: " + status); +// AdminManager.getInstance().setBluetoothDataTransferDisable(status == 0); + } + + public void setDeveloperMode(int status) { + Log.e(TAG, "setDeveloperMode: " + status); +// AdminManager.getInstance().turnOnUsbDebugMode(status); + } + + public void setDeviceRecover(int status) { + Log.e(TAG, "setDeviceRecover: " + status); +// AdminManager.getInstance().setRestoreFactoryDisabled(status); + } + + public void setTopNotify(int status) { + Log.e(TAG, "setTopNotify: " + status); +// AdminManager.getInstance().setStatusBarExpandPanelDisabled(status); + } + + public void setBottomBar(int status) { + Log.e(TAG, "setBottomBar: " + status); +// AdminManager.getInstance().setNavigationBarDisabled(status); + } + + public void setDisallowedRunningApp(SystemSettings setting) { + if (setting.getAi_teacher() == 0) { + OpenApkUtils.getInstance().addDisallowedRunningApp("com.jxw.aijtjs"); + } else { + OpenApkUtils.getInstance().removeDisallowedRunningApp("com.jxw.aijtjs"); + } + + if (setting.getPhoto_search_questions() == 0) { + OpenApkUtils.getInstance().addDisallowedRunningApp("com.jxw.souti"); + } else { + OpenApkUtils.getInstance().removeDisallowedRunningApp("com.jxw.souti"); + } + + if (setting.getAi_question_test() == 0) { + OpenApkUtils.getInstance().addDisallowedRunningApp("com.jxw.aizndy"); + } else { + OpenApkUtils.getInstance().removeDisallowedRunningApp("com.jxw.aizndy"); + } + + } + + public void setDisallowedRunningApp() { + + } +} diff --git a/app/src/main/java/com/xwad/os/push/PushManager.java b/app/src/main/java/com/xwad/os/push/PushManager.java index be2a6ee..1dc917a 100644 --- a/app/src/main/java/com/xwad/os/push/PushManager.java +++ b/app/src/main/java/com/xwad/os/push/PushManager.java @@ -4,12 +4,17 @@ import android.annotation.SuppressLint; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; +import android.util.Log; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import com.xwad.os.activity.home.HomeActivity; import com.xwad.os.disklrucache.CacheHelper; import com.xwad.os.fragment.user.UserFragment; +import com.xwad.os.gson.GsonUtils; import com.xwad.os.network.NetInterfaceManager; import com.hjq.toast.Toaster; +import com.xwad.os.utils.OpenApkUtils; public class PushManager { private static final String TAG = "PushManager"; @@ -56,6 +61,13 @@ public class PushManager { /*爱的鼓励*/ private static final String LOVE_ENCOURAGEMENT = "121"; + /*AI家庭教师开关*/ + private static final String AI_Tutor = "123"; + /*拍照搜题*/ + private static final String PHOTO_SEARCH_QUESTIONS = "124"; + /*AI答疑测试*/ + private static final String AI_QA_TEST = "125"; + public void setPushContent(String title, String extras) { switch (title) { @@ -76,10 +88,65 @@ public class PushManager { case LOVE_ENCOURAGEMENT: Toaster.debugShow("收到推送消息: 爱的鼓励"); sendEncouragement(extras); + break; + case AI_Tutor: + setAiTeacher(extras); + break; + case PHOTO_SEARCH_QUESTIONS: + setPhotoSearchQuestions(extras); + break; + case AI_QA_TEST: + setAiQuestionTest(extras); + break; default: } } + private void setAiTeacher(String extras) { + JsonObject jsonObject = GsonUtils.getJsonObject(extras); + JsonElement jsonElement = jsonObject.get("ai_teacher"); + if (jsonElement == null || jsonElement.isJsonNull()) { + Log.e(TAG, "setAiTeacher: jsonElement is null"); + return; + } + int ai_teacher = jsonElement.getAsInt(); + if (ai_teacher == 0) { + OpenApkUtils.getInstance().addDisallowedRunningApp("com.jxw.aijtjs"); + } else { + OpenApkUtils.getInstance().removeDisallowedRunningApp("com.jxw.aijtjs"); + } + } + + private void setPhotoSearchQuestions(String extras) { + JsonObject jsonObject = GsonUtils.getJsonObject(extras); + JsonElement jsonElement = jsonObject.get("photo_search_questions"); + if (jsonElement == null || jsonElement.isJsonNull()) { + Log.e(TAG, "setPhotoSearchQuestions: jsonElement is null"); + return; + } + int photo_search_questions = jsonElement.getAsInt(); + if (photo_search_questions == 0) { + OpenApkUtils.getInstance().addDisallowedRunningApp("com.jxw.souti"); + } else { + OpenApkUtils.getInstance().removeDisallowedRunningApp("com.jxw.souti"); + } + } + + private void setAiQuestionTest(String extras) { + JsonObject jsonObject = GsonUtils.getJsonObject(extras); + JsonElement jsonElement = jsonObject.get("ai_question_test"); + if (jsonElement == null || jsonElement.isJsonNull()) { + Log.e(TAG, "setAiQuestionTest: jsonElement is null"); + return; + } + int ai_question_test = jsonElement.getAsInt(); + if (ai_question_test == 0) { + OpenApkUtils.getInstance().addDisallowedRunningApp("com.jxw.aizndy"); + } else { + OpenApkUtils.getInstance().removeDisallowedRunningApp("com.jxw.aizndy"); + } + } + private void startHome() { Intent intent = new Intent(mContext, HomeActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); diff --git a/app/src/main/java/com/xwad/os/utils/OpenApkUtils.java b/app/src/main/java/com/xwad/os/utils/OpenApkUtils.java index cf16262..1521fa8 100644 --- a/app/src/main/java/com/xwad/os/utils/OpenApkUtils.java +++ b/app/src/main/java/com/xwad/os/utils/OpenApkUtils.java @@ -23,7 +23,6 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.hjq.toast.Toaster; import com.tencent.mmkv.MMKV; -import com.xwad.os.BuildConfig; import com.xwad.os.R; import com.xwad.os.activity.activation.ActivationActivity; import com.xwad.os.activity.login.LoginActivity; @@ -65,12 +64,15 @@ public class OpenApkUtils { private LessonJson mLessonJson; private TimeUtils.ContralTime mContralTime; + private Set mDisallowedRunningAppSet; + private OpenApkUtils(Context context) { if (context == null) { throw new RuntimeException("Context is NULL"); } this.mContext = context; this.mResolver = context.getContentResolver(); + mDisallowedRunningAppSet = mMMKV.decodeStringSet(CommonConfig.DISALLOWED_RUNNING_APP_KEY, new HashSet<>()); refresh(); } @@ -87,6 +89,31 @@ public class OpenApkUtils { return sInstance; } + public Set getDisallowedRunningAppSet() { + if (mDisallowedRunningAppSet == null) { + mDisallowedRunningAppSet = new HashSet<>(); + } + return mDisallowedRunningAppSet; + } + + public void addDisallowedRunningApp(String pkg) { + Log.e(TAG, "addDisallowedRunningApp: " + pkg); + if (mDisallowedRunningAppSet == null) { + mDisallowedRunningAppSet = new HashSet<>(); + } + mDisallowedRunningAppSet.add(pkg); + mMMKV.encode(CommonConfig.DISALLOWED_RUNNING_APP_KEY, mDisallowedRunningAppSet); + } + + public void removeDisallowedRunningApp(String pkg) { + Log.e(TAG, "removeDisallowedRunningApp: " + pkg); + if (mDisallowedRunningAppSet == null) { + mDisallowedRunningAppSet = new HashSet<>(); + } + mDisallowedRunningAppSet.remove(pkg); + mMMKV.encode(CommonConfig.DISALLOWED_RUNNING_APP_KEY, mDisallowedRunningAppSet); + } + private boolean checkActivation() { if (!ApkUtils.isAvailable(mContext, "com.uiui.zy")) { return true; @@ -716,6 +743,13 @@ public class OpenApkUtils { Log.d(TAG, "包名:" + packageName + "\n类名:" + className + "\n第四项:" + fourthParam + "\n应用名:" + appName); + Log.e(TAG, "openJxwApp: " + getDisallowedRunningAppSet()); + + if (mDisallowedRunningAppSet.contains(packageName)) { + Toaster.show("应用已禁止打开"); + return; + } + if (!ApkUtils.isAvailable(mContext, packageName)) { showDownloadDialog(activity, packageName, appName); return; diff --git a/app/src/main/java/com/xwad/os/utils/TimeUtils.java b/app/src/main/java/com/xwad/os/utils/TimeUtils.java index 0523d15..9ba673d 100644 --- a/app/src/main/java/com/xwad/os/utils/TimeUtils.java +++ b/app/src/main/java/com/xwad/os/utils/TimeUtils.java @@ -1,44 +1,85 @@ package com.xwad.os.utils; import android.content.Context; +import android.content.Intent; import android.os.Build; +import android.os.SystemClock; import android.text.TextUtils; import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.tencent.mmkv.MMKV; +import com.xwad.os.bean.TimeControl; +import com.xwad.os.config.CommonConfig; + +import java.lang.reflect.Type; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; import java.util.Date; +import java.util.List; import java.util.Locale; +import java.util.Objects; +import java.util.TimeZone; +import java.util.function.Function; +import java.util.stream.Collectors; public class TimeUtils { private static final String TAG = "TimeUtils"; + private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); - private static DateFormat df = new SimpleDateFormat("HH:mm", Locale.getDefault()); + private static DateFormat df = new SimpleDateFormat("HH:mm", Locale.CHINA); public static final long DAY_TIME = 60 * 60 * 24 * 1000; public static final long MINUTE_TIME = 60 * 1000; - @RequiresApi(api = Build.VERSION_CODES.O) - public static boolean isTodayTime(long timeStamp) { - String time = transferLongToDate(timeStamp); - DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - LocalDateTime localTime = LocalDateTime.parse(time, dtf); - LocalDateTime startTime = LocalDate.now().atTime(0, 0, 0); - LocalDateTime endTime = LocalDate.now().atTime(23, 59, 59); - return localTime.isAfter(startTime) && localTime.isBefore(endTime); + public static final String START_TIME_KEY = "START_TIME"; + public static final String END_TIME_KEY = "END_TIME"; + public static final String WEEK_START_TIME_KEY = "WEEK_START_TIME"; + public static final String WEEK_END_TIME_KEY = "WEEK_END_TIME"; + + /*新增 时间控制开关*/ + public static final String AOLELEARN_TIME_CONTROL_KEY = "aolelearn_time_control"; + /*多个时间段*/ + public static final String AOLELEARN_TTIMECONTROL_LIST_KEY = "aolelearn_timecontrol_list"; + + /*可以使用时间开始*/ + @Deprecated + public static final String AOLELEARN_TTIMECONTROL_START_KEY = "aolelearn_timecontrol_start"; + /*可以使用时间结束*/ + @Deprecated + public static final String AOLELEARN_TTIMECONTROL_END_KEY = "aolelearn_timecontrol_end"; + + + public static String getNowTime() { + long nowTime = System.currentTimeMillis(); + DateFormat df = ContralTime.getDf(); + return df.format(nowTime); } - public static String transferLongToDate(Long millisecond) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - Date date = new Date(millisecond); +// public static boolean CurrentInTimeScope(ContralTime contralTime) { +// boolean result = true; +// final long aDayInMillis = 1000 * 60 * 60 * 24; +// long currentTimeMillis = System.currentTimeMillis(); +// +// } + + public static String transferLongToDate(Long millSec) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); + Date date = new Date(millSec); return sdf.format(date); } @@ -55,6 +96,28 @@ public class TimeUtils { return dateString + "\t" + getWeek(); } + + public static String transferSecondToDate(long second) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日"); + + Date date = new Date(second * 1000); + return sdf.format(date); + } + + public static String transferSecond(long second) { + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); + Date date = new Date(second * 1000); + return sdf.format(date); + } + + public static String getPhotoDate() { + long millisecond = System.currentTimeMillis(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + Date date = new Date(millisecond); + return sdf.format(date); + } + public static String getHomeworkTime(String timeString) { SimpleDateFormat old = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); @@ -168,6 +231,244 @@ public class TimeUtils { return String.format("%d小时%d分", hour, min); } + private static final long ONE_DAY_TIME_OF_SECOND = 24 * 60 * 60; + + public static long timestampInterval(long nowTime, long expireTime) { + long num = expireTime - nowTime;//时间戳相差的毫秒数 + long day = num / ONE_DAY_TIME_OF_SECOND; + return day; + } + + @RequiresApi(api = Build.VERSION_CODES.O) + public static boolean isTodayTime(long timeStamp) { + String time = transferLongToDate(timeStamp); + DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + LocalDateTime localTime = LocalDateTime.parse(time, dtf); + LocalDateTime startTime = LocalDate.now().atTime(0, 0, 0); + LocalDateTime endTime = LocalDate.now().atTime(23, 59, 59); + return localTime.isAfter(startTime) && localTime.isBefore(endTime); + } + + public static ContralTime String2WorkingTime(Context context, @NonNull String timeText) { + MMKV mmkv = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + DateFormat df = ContralTime.getDf(); + String[] time = timeText.trim().split("-"); + if (time.length != 2) { +// return null; + throw new RuntimeException("Time format error!" + Arrays.toString(time)); + } + try { + mmkv.encode(START_TIME_KEY, time[0].trim()); + mmkv.encode(END_TIME_KEY, time[1].trim()); + Date startDate = df.parse(time[0].trim()); + Date endDate = df.parse(time[1].trim()); + ContralTime contralTime = new ContralTime(); +// if (date1.getTime() < date2.getTime()) { + contralTime.setStartTime(df.format(startDate)); + contralTime.setEndTime(df.format(endDate)); +// } else { +// contralTime.setStartTime(df.format(date2)); +// contralTime.setEndTime(df.format(date1)); +// } + return contralTime; + } catch (ParseException e) { + e.printStackTrace(); + return null; + } + } + + /** + * @param context + * @param timeText HH:mm-HH:mm 格式转化为ContralTime + * @return + */ + public static ContralTime string2WeekTime(Context context, @NonNull String timeText) { + MMKV mmkv = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + DateFormat df = ContralTime.getDf(); + String[] time = timeText.trim().split("-"); + if (time.length != 2) { +// return null; + throw new RuntimeException("Time format error!" + Arrays.toString(time)); + } + try { + mmkv.encode(WEEK_START_TIME_KEY, time[0].trim()); + mmkv.encode(WEEK_END_TIME_KEY, time[1].trim()); + Date startDate = df.parse(time[0].trim()); + Date endDate = df.parse(time[1].trim()); + ContralTime contralTime = new ContralTime(); +// if (date1.getTime() < date2.getTime()) { + contralTime.setStartTime(df.format(startDate)); + contralTime.setEndTime(df.format(endDate)); +// } else { +// contralTime.setStartTime(df.format(date2)); +// contralTime.setEndTime(df.format(date1)); +// } + return contralTime; + } catch (ParseException e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取工作日时间控制 + * + * @param context + * @return + */ + @Deprecated + public static ContralTime getWorkingDayContralTime(Context context) { + MMKV mmkv = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + String startTime = mmkv.decodeString(START_TIME_KEY, "00:00"); + String endTime = mmkv.decodeString(END_TIME_KEY, "00:00"); + return getContralTime(context, startTime, endTime); + } + + /** + * 获取休息日时间控制 + * + * @param context + * @return + */ + @Deprecated + public static ContralTime getWeekDayContralTime(Context context) { + MMKV mmkv = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + String startTime = mmkv.decodeString(WEEK_START_TIME_KEY, "00:00"); + String endTime = mmkv.decodeString(WEEK_END_TIME_KEY, "00:00"); + return getContralTime(context, startTime, endTime); + } + + /** + * 是否在管控时间内 + * + * @param workingTime + * @param weekTime + * @return + */ + @Deprecated + public static boolean inContralTime(ContralTime workingTime, ContralTime weekTime) { + if (inWeekDay()) { + if (weekTime == null) { + return false; + } else { + return weekTime.inControlTime(); + } + } else { + if (workingTime == null) { + return false; + } else { + return workingTime.inControlTime(); + } + } + } + + /** + * 获取新的时间管控 + * + * @param context + * @return + */ + @Deprecated + public static ContralTime getDayContralTime(Context context) { + MMKV mmkv = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + String timecontrol_start = mmkv.decodeString(AOLELEARN_TTIMECONTROL_START_KEY, "00:00"); + String timecontrol_end = mmkv.decodeString(AOLELEARN_TTIMECONTROL_END_KEY, "00:00"); + return getContralTime(context, timecontrol_start, timecontrol_end); + } + + @Deprecated + public static boolean inDayContralTime(ContralTime contralTime) { + MMKV mmkv = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + int is_timecontrol = mmkv.decodeInt(TimeUtils.AOLELEARN_TIME_CONTROL_KEY, 0); + if (is_timecontrol == 0) { + return false; + } + if (contralTime == null) { + return false; + } + if ("00:00".equals(contralTime.getStartTime()) && "00:00".equals(contralTime.getEndTime()) + || "00:00".equals(contralTime.getStartTime()) && "24:00".equals(contralTime.getEndTime()) + || "24:00".equals(contralTime.getStartTime()) && "00:00".equals(contralTime.getEndTime()) + || Objects.equals(contralTime.getStartTime(), contralTime.getEndTime()) + ) { + return false; + } + return contralTime.inControlTime(); + } + + public static List getDayContralTimeList(Context context) { + MMKV mmkv = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + String listJsonString = mmkv.decodeString(AOLELEARN_TTIMECONTROL_LIST_KEY, ""); + if (!TextUtils.isEmpty(listJsonString)) { + Gson gson = new Gson(); + Type listType = new TypeToken>() { + }.getType(); + try { + List timeControls = gson.fromJson(listJsonString, listType); + List contralTimes = timeControls.stream().map(new Function() { + @Override + public ContralTime apply(TimeControl timeControl) { + return getContralTime(context, timeControl.getStart_time(), timeControl.getEnd_time()); + } + }).collect(Collectors.toList()); + return contralTimes; + } catch (Exception e) { + Log.e(TAG, "getDayContralTimeList: " + e.getMessage()); + mmkv.remove(AOLELEARN_TTIMECONTROL_LIST_KEY); + } + } + return null; + } + + public static boolean inDayContralTime(List contralTimes) { + Log.e(TAG, "inDayContralTime: " + contralTimes); + if (contralTimes == null || contralTimes.isEmpty()) { + Log.e(TAG, "inDayContralTime: isEmpty"); + return false; + } + MMKV mmkv = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + int is_timecontrol = mmkv.decodeInt(TimeUtils.AOLELEARN_TIME_CONTROL_KEY, 0); + if (is_timecontrol == 0) { + Log.e(TAG, "inDayContralTime: false"); + return false; + } + List booleans = new ArrayList<>(); + for (ContralTime contralTime : contralTimes) { + if (contralTime == null) { + continue; + } + if ("00:00".equals(contralTime.getStartTime()) && "00:00".equals(contralTime.getEndTime()) + || "00:00".equals(contralTime.getStartTime()) && "24:00".equals(contralTime.getEndTime()) + || "24:00".equals(contralTime.getStartTime()) && "00:00".equals(contralTime.getEndTime()) + || Objects.equals(contralTime.getStartTime(), contralTime.getEndTime()) + ) { + continue; + } + booleans.add(contralTime.inControlTime()); +// if (!contralTime.inControlTime()) { +// Log.e(TAG, "inDayContralTime: " + contralTime + " true"); +// return true; +// } + } + Log.e(TAG, "inDayContralTime: " + booleans); + return !booleans.contains(false); +// Log.e(TAG, "inDayContralTime: false"); +// return false; + } + + public static String getDayTimeString(Context context) { +// ContralTime contralTime = getDayContralTime(context); + List contralTimes = TimeUtils.getDayContralTimeList(context); + StringBuilder stringBuilder = new StringBuilder(); + if (contralTimes != null) { + for (ContralTime contralTime : contralTimes) { + stringBuilder.append(contralTime).append("\t"); + } + } + return stringBuilder.toString(); + } + + /** * 是否在管控时间内 * @@ -194,7 +495,6 @@ public class TimeUtils { } } - /** * @return 根据日期取得星期几 */ @@ -210,6 +510,141 @@ public class TimeUtils { return weeks[weekIndex]; } + /** + * 获取控制时间文本 + * + * @param context + * @return + */ + @Deprecated + public static String getNowTimeString(Context context) { + ContralTime work = getWorkingDayContralTime(context); + ContralTime week = getWeekDayContralTime(context); + StringBuilder stringBuilder = new StringBuilder(); + if (work != null) { + stringBuilder.append("周一至周五:").append(work).append("\n"); + } + if (week != null) { + stringBuilder.append("周末:").append(week); + } + return stringBuilder.toString(); + } + + /** + * 设置为空 + * + * @param context + */ + public static void setEmpty(Context context) { + MMKV mmkv = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + mmkv.encode(START_TIME_KEY, "00:00"); + mmkv.encode(END_TIME_KEY, "00:00"); + mmkv.encode(WEEK_START_TIME_KEY, "00:00"); + mmkv.encode(WEEK_END_TIME_KEY, "00:00"); + +// Intent intent = new Intent(); +// intent.setAction(ManagerService.ACTION_UPDATE); +// context.sendBroadcast(intent); + } + + /** + * 获取格式化后的时间 + * + * @param time 时间戳 + * @return 时间戳格式化文本 + */ + public static String getDate(long time) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String finaWayDate = sdf.format(time); + Log.e(TAG, "getDate: " + finaWayDate); + return finaWayDate; + } + + /** + * 获取周几 + * + * @return 周几的数字 + */ + public static int getWeekDay() { + long time = System.currentTimeMillis(); + Log.e(TAG, "getWeekDay: " + time); + return getWeekDay(time); + } + + /** + * 获取周几 + * + * @param time 时间戳 + * @return 周几的数字 1-7 + */ + public static int getWeekDay(long time) { + getDate(time); + Calendar now = Calendar.getInstance(); + now.setTimeInMillis(time); + //一周第一天是否为星期天 + boolean isFirstSunday = (now.getFirstDayOfWeek() == Calendar.SUNDAY); + //获取周几 + int weekDay = now.get(Calendar.DAY_OF_WEEK); + //若一周第一天为星期天,则-1 + if (isFirstSunday) { + weekDay = weekDay - 1; + if (weekDay == 0) { + weekDay = 7; + } + } + return weekDay; + } + + private String[] weekDays = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"}; + + /** + * 获取星期几 + * + * @return 星期的文本 + */ + public String getWeekDayString() { + return weekDays[getWeekDay() - 1]; + } + + /** + * 获取星期几 + * + * @param time 时间戳 + * @return 星期的文本 + */ + public String getWeekDayString(long time) { + return weekDays[getWeekDay(time) - 1]; + } + + /** + * 是否未周末 + * + * @return 周末返回ture 工作日返回false + */ + public static boolean inWeekDay() { + long time = System.currentTimeMillis(); + return inWeekDay(time); + } + + /** + * 是否未周末 + * + * @param time 时间戳 + * @return 周末返回ture 工作日返回false + */ + public static boolean inWeekDay(long time) { + int weekDay = getWeekDay(time); + if (weekDay > 5) { + return true; + } else { + return false; + } + } + + public static void setSystemTime(long time) { + SystemClock.setCurrentTimeMillis(time); + } + public static class ContralTime { //format HH:mm String startTime; @@ -253,13 +688,16 @@ public class TimeUtils { return df.format(new Date(time)); } + public boolean inControlTime() { long time = System.currentTimeMillis(); return inControlTime(time); } public boolean inControlTime(long time) { - return inControlTime(df.format(new Date(time))); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); + sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); + return inControlTime(sdf.format(new Date(time))); } public boolean inControlTime(String time) { @@ -280,8 +718,7 @@ public class TimeUtils { } Log.e(TAG, "inControlTime: " + (startDate.getTime() - MINUTE_TIME)); assert nowDate != null; -// if (nowDate.getTime() <= startDate.getTime() - MINUTE_TIME || nowDate.getTime() >= endDate.getTime()) { - if (nowDate.getTime() >= startDate.getTime() && nowDate.getTime() <= endDate.getTime()) { + if (nowDate.getTime() <= startDate.getTime() - MINUTE_TIME || nowDate.getTime() >= endDate.getTime()) { return true; } else { return false; @@ -295,8 +732,221 @@ public class TimeUtils { @NonNull @Override public String toString() { - return startTime + "\t-\t" + endTime; + return startTime + " - " + endTime; } } + private static SntpClient mNtpClient; + + public static long getTimeFromNtpServer(String hostAddress) { + Log.d(TAG, "getTimeFromNtpServer()"); + if (TextUtils.isEmpty(hostAddress)) { + Log.e(TAG, "Ntp host is null."); + return -1; + } + if (mNtpClient == null) { + mNtpClient = new SntpClient(); + } + boolean isSuccessful = mNtpClient.requestTime(hostAddress, 20000); + Log.e(TAG, "requestTime:" + isSuccessful); + if (isSuccessful) { + long now = mNtpClient.getNtpTime();//now就是获取的时间 + return now; + } else { + + } + return -1; + } + + public static class SntpClient { + private static final String TAG = "SntpClient"; + + private static final int REFERENCE_TIME_OFFSET = 16; + private static final int ORIGINATE_TIME_OFFSET = 24; + private static final int RECEIVE_TIME_OFFSET = 32; + private static final int TRANSMIT_TIME_OFFSET = 40; + private static final int NTP_PACKET_SIZE = 48; + + private static final int NTP_PORT = 123; + private static final int NTP_MODE_CLIENT = 3; + private static final int NTP_VERSION = 3; + + // Number of seconds between Jan 1, 1900 and Jan 1, 1970 + // 70 years plus 17 leap days + private static final long OFFSET_1900_TO_1970 = ((365L * 70L) + 17L) * 24L * 60L * 60L; + + // system time computed from NTP server response + private long mNtpTime; + + // value of SystemClock.elapsedRealtime() corresponding to mNtpTime + private long mNtpTimeReference; + + // round trip time in milliseconds + private long mRoundTripTime; + + /** + * Sends an SNTP request to the given host and processes the response. + * + * @param host host name of the server. + * @param timeout network timeout in milliseconds. + * @return true if the transaction was successful. + */ + public boolean requestTime(String host, int timeout) { + DatagramSocket socket = null; + try { + socket = new DatagramSocket(); + socket.setSoTimeout(timeout); + InetAddress address = InetAddress.getByName(host); + byte[] buffer = new byte[NTP_PACKET_SIZE]; + DatagramPacket request = new DatagramPacket(buffer, + buffer.length, address, NTP_PORT); + + // set mode = 3 (client) and version = 3 + // mode is in low 3 bits of first byte + // version is in bits 3-5 of first byte + buffer[0] = NTP_MODE_CLIENT | (NTP_VERSION << 3); + + // get current time and write it to the request packet + long requestTime = System.currentTimeMillis(); + Log.d(TAG, "RequestTime:" + new Date(requestTime)); + long requestTicks = SystemClock.elapsedRealtime(); + writeTimeStamp(buffer, TRANSMIT_TIME_OFFSET, requestTime); + + socket.send(request); + + // read the response + DatagramPacket response = new DatagramPacket(buffer, + buffer.length); + socket.receive(response); + long responseTicks = SystemClock.elapsedRealtime(); + long responseTime = requestTime + + (responseTicks - requestTicks); + + // extract the results + long originateTime = readTimeStamp(buffer, + ORIGINATE_TIME_OFFSET); + long receiveTime = readTimeStamp(buffer, RECEIVE_TIME_OFFSET); + long transmitTime = readTimeStamp(buffer, TRANSMIT_TIME_OFFSET); + long roundTripTime = responseTicks - requestTicks + - (transmitTime - receiveTime); + // receiveTime = originateTime + transit + skew + // responseTime = transmitTime + transit - skew + // clockOffset = ((receiveTime - originateTime) + (transmitTime + // - responseTime))/2 + // = ((originateTime + transit + skew - originateTime) + + // (transmitTime - (transmitTime + transit - skew)))/2 + // = ((transit + skew) + (transmitTime - transmitTime - transit + // + skew))/2 + // = (transit + skew - transit + skew)/2 + // = (2 * skew)/2 = skew + long clockOffset = ((receiveTime - requestTime) + (transmitTime - System.currentTimeMillis())) / 2; + // if (false) Log.d(TAG, "round trip: " + roundTripTime + + // " ms"); + // if (false) Log.d(TAG, "clock offset: " + clockOffset + + // " ms"); + + // save our results - use the times on this side of the network + // latency + // (response rather than request time) + mNtpTime = System.currentTimeMillis() + clockOffset; +// mNtpTime = transmitTime; + mNtpTimeReference = responseTicks; + mRoundTripTime = roundTripTime; + } catch (Exception e) { + if (false) + Log.e(TAG, "request time failed:" + e); + e.printStackTrace(); + return false; + } finally { + if (socket != null) { + socket.close(); + } + } + + return true; + } + + /** + * Returns the time computed from the NTP transaction. + * + * @return time value computed from NTP server response. + */ + public long getNtpTime() { + return mNtpTime; + } + + /** + * Returns the reference clock value (value of + * SystemClock.elapsedRealtime()) corresponding to the NTP time. + * + * @return reference clock corresponding to the NTP time. + */ + public long getNtpTimeReference() { + return mNtpTimeReference; + } + + /** + * Returns the round trip time of the NTP transaction + * + * @return round trip time in milliseconds. + */ + public long getRoundTripTime() { + return mRoundTripTime; + } + + /** + * Reads an unsigned 32 bit big endian number from the given offset in + * the buffer. + */ + private long read32(byte[] buffer, int offset) { + byte b0 = buffer[offset]; + byte b1 = buffer[offset + 1]; + byte b2 = buffer[offset + 2]; + byte b3 = buffer[offset + 3]; + + // convert signed bytes to unsigned values + int i0 = ((b0 & 0x80) == 0x80 ? (b0 & 0x7F) + 0x80 : b0); + int i1 = ((b1 & 0x80) == 0x80 ? (b1 & 0x7F) + 0x80 : b1); + int i2 = ((b2 & 0x80) == 0x80 ? (b2 & 0x7F) + 0x80 : b2); + int i3 = ((b3 & 0x80) == 0x80 ? (b3 & 0x7F) + 0x80 : b3); + + return ((long) i0 << 24) + ((long) i1 << 16) + ((long) i2 << 8) + + (long) i3; + } + + /** + * Reads the NTP time stamp at the given offset in the buffer and + * returns it as a system time (milliseconds since January 1, 1970). + */ + private long readTimeStamp(byte[] buffer, int offset) { + long seconds = read32(buffer, offset); + long fraction = read32(buffer, offset + 4); + return ((seconds - OFFSET_1900_TO_1970) * 1000) + + ((fraction * 1000L) / 0x100000000L); + } + + /** + * Writes system time (milliseconds since January 1, 1970) as an NTP + * time stamp at the given offset in the buffer. + */ + private void writeTimeStamp(byte[] buffer, int offset, long time) { + long seconds = time / 1000L; + long milliseconds = time - seconds * 1000L; + seconds += OFFSET_1900_TO_1970; + + // write seconds in big endian format + buffer[offset++] = (byte) (seconds >> 24); + buffer[offset++] = (byte) (seconds >> 16); + buffer[offset++] = (byte) (seconds >> 8); + buffer[offset++] = (byte) (seconds >> 0); + + long fraction = milliseconds * 0x100000000L / 1000L; + // write fraction in big endian format + buffer[offset++] = (byte) (fraction >> 24); + buffer[offset++] = (byte) (fraction >> 16); + buffer[offset++] = (byte) (fraction >> 8); + // low order bits should be random data + buffer[offset++] = (byte) (Math.random() * 255.0); + } + } }