version:1.2.4

fix:
update:增加时间管控
This commit is contained in:
2026-02-07 09:53:16 +08:00
parent 5f91f83530
commit 626d61d7b3
12 changed files with 1852 additions and 46 deletions

View File

@@ -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"

View File

@@ -9,6 +9,7 @@
</queries>
<!-- 清单文件中, 申明监听通话精确状态权限该权限需要android:sharedUserId="android.uid.system" -->
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.READ_PRECISE_PHONE_STATE" />
<uses-permission android:name="android.permission.DELETE_PACKAGES" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />

View File

@@ -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<ActivityHomeBinding, ActivityEv
Log.e("getSystemSettings", "onNext: " + systemSettingsBaseResponse);
if (systemSettingsBaseResponse.code == 200) {
SystemSettings systemSettings = systemSettingsBaseResponse.data;
ControlManager.getInstance().setSystemSetting(systemSettings);
mMMKV.encode(CommonConfig.APP_INSTALLATION, systemSettings.getSetting_other_appInstaller());
mSystemSettingsMutableLiveData.setValue(systemSettings);
}else {
ControlManager.getInstance().setDisableSetting();
}
}

View File

@@ -93,6 +93,12 @@ public class AppAdapter extends RecyclerView.Adapter<AppAdapter.AppHolder> {
@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);

View File

@@ -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();

View File

@@ -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() {

View File

@@ -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;
}
}

View File

@@ -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";
}

View File

@@ -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<String> types = new HashSet<>(Arrays.asList(qch_tfmedia_filetypes.split(",")));
types.removeIf(new Predicate<String>() {
@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() {
}
}

View File

@@ -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);

View File

@@ -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<String> 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<String> 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;

View File

@@ -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<ContralTime> 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<List<TimeControl>>() {
}.getType();
try {
List<TimeControl> timeControls = gson.fromJson(listJsonString, listType);
List<ContralTime> contralTimes = timeControls.stream().map(new Function<TimeControl, ContralTime>() {
@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<ContralTime> 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<Boolean> 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<ContralTime> 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);
}
}
}