diff --git a/app/build.gradle b/app/build.gradle index c305569..f0c1944 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -29,8 +29,8 @@ android { defaultConfig { applicationId "com.aoleyun.sn" - versionCode 186 - versionName "1.5.0714" + versionCode 187 + versionName "1.5.0719" //There are no CERT files because If the mini sdk version is 23+, the AGP will ignore the V1 scheme signature. minSdkVersion 24 @@ -47,7 +47,7 @@ android { buildConfigField "String", "ROOT_URL", '"https://led.aoleyun.cn/api/"' buildConfigField "String", "SCREEN_BASE_URL", '"https://led.aoleyun.cn:2018/"' buildConfigField "String", "SCREEN_URL", '"https://led.aoleyun.cn:2018/wm/is_online"' - buildConfigField "String", "WebsocketURL", '"wss://led.aoleyun.cn:2018"' + buildConfigField "String", "WEBSOCKET_URL", '"wss://led.aoleyun.cn/wss/"' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ea689ba..503c162 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -397,7 +397,7 @@ ()); JgyUtils.getInstance().setAppRestriction(0); + JgyUtils.getInstance().setDeveloperOptions(1); } } else if (response.code == NOTFOUND) { Settings.System.putInt(mContext.getContentResolver(), JGYActions.ACTION_QCH_UNLOCK_IPAD, JGYActions.FRAME_CODE_LOCKED); @@ -3040,7 +3041,7 @@ public class NetInterfaceManager { public void onNext(BaseResponse browserDataBaseResponse) { Log.e("setBrowserBlackList", "onNext: "); String homePage = Settings.System.getString(mContext.getContentResolver(), "homepagURL"); - setBlackWhiteLis(browserDataBaseResponse, homePage); + setBlackWhiteList(browserDataBaseResponse, homePage); } @Override @@ -3091,7 +3092,7 @@ public class NetInterfaceManager { } setBrowserBookmarks(browserBookmarksBaseResponse); - setBlackWhiteLis(browserDataBaseResponse, homePage); + setBlackWhiteList(browserDataBaseResponse, homePage); return homePage; } }) @@ -3135,7 +3136,7 @@ public class NetInterfaceManager { } setBrowserBookmarks(browserBookmarksBaseResponse); - setBlackWhiteLis(browserDataBaseResponse, homePage); + setBlackWhiteList(browserDataBaseResponse, homePage); return homePage; } }) @@ -3261,7 +3262,7 @@ public class NetInterfaceManager { } } - private void setBlackWhiteLis(BaseResponse browserDataBaseResponse, String homePage) { + private void setBlackWhiteList(BaseResponse browserDataBaseResponse, String homePage) { //黑白名单 if (browserDataBaseResponse.code == 200) { BrowserData browserData = browserDataBaseResponse.data; @@ -3280,6 +3281,10 @@ public class NetInterfaceManager { if (!TextUtils.isEmpty(black)) { boolean qch_webblack_url = Settings.System.putString(mContext.getContentResolver(), "qch_webblack_url", black); Log.e("setBrowserBlackList", "setBrowserList black = " + black + ":" + qch_webblack_url); + if (JgyUtils.isAllWinnerDevice()) { + List componentNames = new ArrayList<>(Arrays.asList(black.split(","))); + AllwinnerCubeMdmManager.getInstance().setComponentDisable(componentNames, true); + } } else { Settings.System.putString(mContext.getContentResolver(), "qch_webblack_url", " "); } diff --git a/app/src/main/java/com/aoleyun/sn/push/PushManager.java b/app/src/main/java/com/aoleyun/sn/push/PushManager.java index a26961a..245f26e 100644 --- a/app/src/main/java/com/aoleyun/sn/push/PushManager.java +++ b/app/src/main/java/com/aoleyun/sn/push/PushManager.java @@ -549,6 +549,8 @@ public class PushManager { NetInterfaceManager.getInstance().getAppLimit(); break; case UPDATE_BATCH: + Utils.doMasterClear(mContext); + break; case UPDATE_CHILD_BATCH: Toaster.debugShow("收到管控:更换批次不恢复出厂设置"); NetInterfaceManager.getInstance().setPushTags(); diff --git a/app/src/main/java/com/aoleyun/sn/service/StepService.java b/app/src/main/java/com/aoleyun/sn/service/StepService.java index 79ab427..38c7bfd 100644 --- a/app/src/main/java/com/aoleyun/sn/service/StepService.java +++ b/app/src/main/java/com/aoleyun/sn/service/StepService.java @@ -10,18 +10,17 @@ import android.content.ServiceConnection; import android.os.Binder; import android.os.Handler; import android.os.IBinder; -import android.os.PowerManager; import android.text.TextUtils; import android.util.Log; import androidx.annotation.Nullable; import com.aoleyun.sn.BuildConfig; -import com.aoleyun.sn.utils.JgyUtils; -import com.blankj.utilcode.util.NetworkUtils; import com.aoleyun.sn.KeepAliveConnection; +import com.aoleyun.sn.utils.JgyUtils; import com.aoleyun.sn.utils.ServiceAliveUtils; import com.aoleyun.sn.utils.Utils; +import com.blankj.utilcode.util.NetworkUtils; import com.google.gson.JsonObject; import org.java_websocket.handshake.ServerHandshake; @@ -40,6 +39,11 @@ public class StepService extends Service implements NetworkUtils.OnNetworkStatus public JWebSocketClient client; private JWebSocketClientBinder mBinder = new JWebSocketClientBinder(); + // 新增防抖控制变量 + private static final long MIN_MESSAGE_INTERVAL = 15 * 1000; // 15秒最小消息间隔 + private volatile long lastMessageTime = 0; + private final Object sendLock = new Object(); + @Override public void onDisconnected() { @@ -135,15 +139,17 @@ public class StepService extends Service implements NetworkUtils.OnNetworkStatus case Intent.ACTION_BOOT_COMPLETED: case Intent.ACTION_USER_PRESENT: case Intent.ACTION_SCREEN_ON: + mHandler.removeCallbacks(heartBeatRunnable); mHandler.post(heartBeatRunnable);//开启心跳检测 - sendMsg(1); + sendMsg(); break; case Intent.ACTION_SCREEN_OFF: case Intent.ACTION_SHUTDOWN: case Intent.ACTION_REBOOT: case Intent.ACTION_FACTORY_RESET: case Intent.ACTION_MASTER_CLEAR: - sendMsg(2); + mHandler.removeCallbacks(heartBeatRunnable); + closeConnect(); break; default: break; @@ -165,9 +171,7 @@ public class StepService extends Service implements NetworkUtils.OnNetworkStatus * 初始化websocket连接 */ private void initSocketClient() { - URI uri = URI.create(BuildConfig.WebsocketURL); -// URI uri = URI.create("ws://echo.websocket.org"); -// URI uri = URI.create("ws://123.207.136.134:9010/ajaxchattest"); + URI uri = URI.create(BuildConfig.WEBSOCKET_URL + "device?sn=" + Utils.getSerial(StepService.this)); client = new JWebSocketClient(uri) { @Override public void onMessage(String message) { @@ -178,7 +182,9 @@ public class StepService extends Service implements NetworkUtils.OnNetworkStatus public void onOpen(ServerHandshake handshakedata) { super.onOpen(handshakedata); Log.i("JWebSocketClientService", "websocket连接成功"); - sendMsg(1); + mHandler.postDelayed(() -> { + if (isOpen()) sendMsg(); + }, 1000); } @Override @@ -231,19 +237,26 @@ public class StepService extends Service implements NetworkUtils.OnNetworkStatus * 发送消息 */ public void sendMsg() { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("sn", Utils.getSerial(this)); - PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); - if (!pm.isScreenOn()) { - jsonObject.addProperty("online", 2); - //熄屏状态 - } else { - jsonObject.addProperty("online", 1); - } - if (null != client) { + synchronized (sendLock) { + long currentTime = System.currentTimeMillis(); + // 检查时间间隔和连接状态 + if (currentTime - lastMessageTime < MIN_MESSAGE_INTERVAL) { + Log.w("JWebSocketClientService", "消息发送过于频繁,已忽略"); + return; + } + if (client == null || !client.isOpen()) { + Log.w("JWebSocketClientService", "连接未建立,取消发送"); + return; + } + + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("type", "ping"); + jsonObject.addProperty("sn", Utils.getSerial(this)); + Log.i("JWebSocketClientService", "发送的消息:" + jsonObject.toString()); try { client.send(jsonObject.toString()); + lastMessageTime = currentTime; // 更新最后发送时间 } catch (Exception e) { Log.e(TAG, "sendMsg: " + e.getMessage()); } @@ -251,22 +264,6 @@ public class StepService extends Service implements NetworkUtils.OnNetworkStatus } } - public void sendMsg(int state) { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("sn", Utils.getSerial(this)); - jsonObject.addProperty("online", state); - try { - if (null != client) { - Log.i("JWebSocketClientService", "发送的消息:" + jsonObject.toString()); - client.send(jsonObject.toString()); - } else { - Log.i("JWebSocketClientService", "未连接"); - } - } catch (Exception e) { - Log.e(TAG, "sendMsg: " + e.getMessage()); - } - } - /** * 断开连接 */ @@ -289,23 +286,23 @@ public class StepService extends Service implements NetworkUtils.OnNetworkStatus @Override public void run() { Log.i("JWebSocketClientService", "心跳包检测websocket连接状态"); - if (client != null) { - if (client.isOpen()) { - Log.i("JWebSocketClientService", "websocket已连接"); - sendMsg(); - } else if (client.isClosed()) { - Log.i("JWebSocketClientService", "websocket重连中"); - if (JgyUtils.getInstance().isScreenOn()) { - reconnectWs(); - } else { - Log.i("JWebSocketClientService", "reconnectWs off"); - } - } - } else { - //如果client已为空,重新初始化连接 - client = null; + if (client == null) { initSocketClient(); + return; } + + if (client.isOpen()) { + Log.i("JWebSocketClientService", "websocket已连接"); + sendMsg(); + } else if (client.isClosed()) { + Log.i("JWebSocketClientService", "websocket重连中"); + if (JgyUtils.getInstance().isScreenOn()) { + reconnectWs(); + } else { + Log.i("JWebSocketClientService", "reconnectWs off"); + } + } + //每隔一定的时间,对长连接进行一次心跳检测 if (JgyUtils.getInstance().isScreenOn()) { mHandler.postDelayed(this, HEART_BEAT_RATE); diff --git a/app/src/main/java/com/aoleyun/sn/utils/JgyUtils.java b/app/src/main/java/com/aoleyun/sn/utils/JgyUtils.java index 3068a88..45f2050 100644 --- a/app/src/main/java/com/aoleyun/sn/utils/JgyUtils.java +++ b/app/src/main/java/com/aoleyun/sn/utils/JgyUtils.java @@ -804,6 +804,9 @@ public class JgyUtils { } else { Settings.System.putString(context.getContentResolver(), "aole_app_info", String.join(",", pkgSet)); } + if (JgyUtils.isAllWinnerDevice()) { + AllwinnerCubeMdmManager.getInstance().setDisallowNotification(new ArrayList<>(pkgSet)); + } } public void setAllowPermissionsPackage() { @@ -816,6 +819,9 @@ public class JgyUtils { } else { Settings.System.putString(crv, "aole_app_privilege", String.join(",", pkgSet)); } + if (JgyUtils.isAllWinnerDevice()) { + AllwinnerCubeMdmManager.getInstance().setDefaultPermissions(new ArrayList<>(pkgSet)); + } } public static final Set DEFAULT_ALLOW_NETWORK_APP_SET = new HashSet() {{ @@ -1384,7 +1390,10 @@ public class JgyUtils { public void SettingSysData(String data) { if (TextUtils.isEmpty(data)) { Log.e(TAG, "SettingSysData: " + "data is empty"); - SysSettingUtils.setDisableSetting(mContext); + int locked = Settings.System.getInt(crv, JGYActions.ACTION_QCH_UNLOCK_IPAD, JGYActions.FRAME_CODE_LOCKED); + if (locked==JGYActions.FRAME_CODE_LOCKED) { + SysSettingUtils.setDisableSetting(mContext); + } SPUtils.put(mContext, JGYActions.ACTION_STATUSBAR_STATUS, ""); } else { if (JgyUtils.getInstance().getAppPlatform().equals(JgyUtils.ZR6016Tag)) { @@ -3705,7 +3714,7 @@ public class JgyUtils { } Log.e(TAG, "setAllwinnerDefaulBrowser: " + pkg); if (JgyUtils.isAllWinnerDevice()) { - AllwinnerCubeMdmManager.getInstance().setDefaultInputMethod(pkg); + AllwinnerCubeMdmManager.getInstance().setDefaultBrowser(pkg); } } } diff --git a/app/src/main/java/com/aoleyun/sn/utils/SysSettingUtils.java b/app/src/main/java/com/aoleyun/sn/utils/SysSettingUtils.java index 1d0154e..0ffde6e 100644 --- a/app/src/main/java/com/aoleyun/sn/utils/SysSettingUtils.java +++ b/app/src/main/java/com/aoleyun/sn/utils/SysSettingUtils.java @@ -115,11 +115,12 @@ public class SysSettingUtils { */ public static void setEnableSetting(Context context) { Toaster.debugShow("打开所有功能"); + Log.e(TAG, "setEnableSetting: "); setPhoneList(context, 0); if (JgyUtils.C2Tag.equalsIgnoreCase(JgyUtils.getInstance().getAppPlatform())) { openMtp(context); } - // setUSBstate(context, 0); + setUsbStatus(context, 0); setBluetooth(context, 0); setHotspot(context, 0); setBar(context, 0); @@ -191,19 +192,21 @@ public class SysSettingUtils { } private static void setUsbStatus(Context context, int state) { + Log.e(TAG, "setUsbStatus: " + state); //USB数据功能管控 //仅充电:usb_charge //MTP模式:usb_mtp //Midi模式:usb_midi - if (!BuildConfig.DEBUG) { - if (JgyUtils.isCubeDevice()) { - if (JgyUtils.isAllWinnerDevice()) { - AllwinnerCubeMdmManager.getInstance().setUsbStatus(state); - } else { - SuperPower mService = (SuperPower) context.getSystemService("mdm"); - mService.setUsbDataDisabled(true); - } +// if (!BuildConfig.DEBUG) { + if (JgyUtils.isCubeDevice()) { + if (JgyUtils.isAllWinnerDevice()) { + AllwinnerCubeMdmManager.getInstance().setUsbStatus(state); } else { + SuperPower mService = (SuperPower) context.getSystemService("mdm"); + mService.setUsbDataDisabled(true); + } + } else { + if (state == 0) { String oldUsb = Settings.System.getString(context.getContentResolver(), "aole_usb_choose"); if ("usb_charge".equals(oldUsb)) { Log.e(TAG, "setUsbStatus: oldUsb = " + oldUsb + " no changed , skip"); @@ -211,30 +214,35 @@ public class SysSettingUtils { } boolean aole_usb_choose = Settings.System.putString(context.getContentResolver(), "aole_usb_choose", "usb_charge"); Log.e("setUsbStatus", "aole_usb_choose: " + aole_usb_choose); - String usbStatus; - switch (state) { - default: - case 0: - usbStatus = CommonConfig.AOLE_ACTION_USB_USB_CHARGE; - JgyUtils.getInstance().setMtpEnable(false); - break; - case 1: - usbStatus = CommonConfig.AOLE_ACTION_USB_USB_MTP; - JgyUtils.getInstance().setMtpEnable(true); - break; - } - if (JgyUtils.getInstance().checkAppPlatform() == JgyUtils.AH6016Platform) { - usbStatus = CommonConfig.AOLE_ACTION_USB_USB_MTP; - } - Intent usbIntent = new Intent(usbStatus); - if (JgyUtils.getInstance().checkAppPlatform() == JgyUtils.TeclastP20sPlatform - || JgyUtils.getInstance().checkAppPlatform() == JgyUtils.AH6016Platform - ) { - usbIntent.setPackage("com.android.settings"); - } - context.sendBroadcast(usbIntent); + } else { + boolean aole_usb_choose = Settings.System.putString(context.getContentResolver(), "aole_usb_choose", "usb_mtp"); + Log.e("setUsbStatus", "aole_usb_choose: " + aole_usb_choose); } + String usbStatus; + switch (state) { + default: + case 0: + usbStatus = CommonConfig.AOLE_ACTION_USB_USB_CHARGE; + JgyUtils.getInstance().setMtpEnable(false); + break; + case 1: + usbStatus = CommonConfig.AOLE_ACTION_USB_USB_MTP; + JgyUtils.getInstance().setMtpEnable(true); + break; + } + if (JgyUtils.getInstance().checkAppPlatform() == JgyUtils.AH6016Platform) { + usbStatus = CommonConfig.AOLE_ACTION_USB_USB_MTP; + } + Intent usbIntent = new Intent(usbStatus); + if (JgyUtils.getInstance().checkAppPlatform() == JgyUtils.TeclastP20sPlatform + || JgyUtils.getInstance().checkAppPlatform() == JgyUtils.AH6016Platform + || JgyUtils.getInstance().checkAppPlatform() == JgyUtils.seewoPlatform + ) { + usbIntent.setPackage("com.android.settings"); + } + context.sendBroadcast(usbIntent); } +// } } private static void setUsbStatus(Context context, JsonObject jsonObject) { @@ -867,6 +875,10 @@ public class SysSettingUtils { } what |= integer; } + if (JgyUtils.isAllWinnerDevice()) { + AllwinnerCubeMdmManager.getInstance().setHomeEnable(home == 1); + AllwinnerCubeMdmManager.getInstance().setRecentsEnable(taskbar == 1); + } StatusBarManager mStatusBarManager = (StatusBarManager) context.getSystemService(Context.STATUS_BAR_SERVICE); mStatusBarManager.disable(what); } @@ -879,6 +891,10 @@ public class SysSettingUtils { StatusBarManager mStatusBarManager = (StatusBarManager) context.getSystemService(Context.STATUS_BAR_SERVICE); mStatusBarManager.disable(StatusBarManager.DISABLE_BACK | StatusBarManager.DISABLE_RECENT | StatusBarManager.DISABLE_HOME); mStatusBarManager.disable(StatusBarManager.DISABLE_NONE);//显示隐藏的虚拟按键 + if (JgyUtils.isAllWinnerDevice()) { + AllwinnerCubeMdmManager.getInstance().setHomeEnable(true); + AllwinnerCubeMdmManager.getInstance().setRecentsEnable(true); + } } @@ -888,33 +904,19 @@ public class SysSettingUtils { * @param context * @param jsonObject */ - // TODO: 2025/7/14 待优化,逻辑太差了 private static void setBrowserInput(Context context, JsonObject jsonObject) { - int state = 1; - try { - state = jsonObject.get("setting_browserInput").getAsInt(); - Log.e(TAG, "setBrowserInput: setting_browserInput = " + state); - String json = jsonObject.get("setting_browserInput").getAsString(); - if (TextUtils.isEmpty(json)) { - state = 1; - } - } catch (Exception e) { - Log.e(TAG, "setBrowserInput: e: " + e.getMessage()); - } - Log.e(TAG, "setBrowserInput: " + state); - //后台没有这个选项默认打开 - if (state == 0) { - Settings.System.putInt(context.getContentResolver(), "qch_Browser_input", 1); - } else { - Settings.System.putInt(context.getContentResolver(), "qch_Browser_input", 0); - } - if (jsonObject.get("is_browser_network") != null) { int is_browser_network = jsonObject.get("is_browser_network").getAsInt(); Log.e(TAG, "setBrowserInput: is_browser_network = " + is_browser_network); Settings.Global.putInt(context.getContentResolver(), "is_browser_network", is_browser_network); } + if (jsonObject.get("setting_browserInput") != null) { + int qch_Browser_input = jsonObject.get("setting_browserInput").getAsInt(); + Log.e(TAG, "setBrowserInput: qch_Browser_input = " + qch_Browser_input); + Settings.System.putInt(context.getContentResolver(), "qch_Browser_input", qch_Browser_input); + } + if (jsonObject.get("browser_down") != null) { int browser_down = jsonObject.get("browser_down").getAsInt(); Settings.System.putInt(context.getContentResolver(), "aoleyun_browser_down", browser_down); @@ -928,8 +930,8 @@ public class SysSettingUtils { * @param state */ private static void setBrowserInput(Context context, int state) { - Settings.System.putInt(context.getContentResolver(), "qch_Browser_input", 0); - Settings.Global.putInt(context.getContentResolver(), "is_browser_network", changeNum(state)); + Settings.System.putInt(context.getContentResolver(), "qch_Browser_input", state); + Settings.Global.putInt(context.getContentResolver(), "is_browser_network", state); Settings.System.putInt(context.getContentResolver(), "aoleyun_browser_down", state); } @@ -1225,6 +1227,9 @@ public class SysSettingUtils { break; } context.sendBroadcast(intent); + if (JgyUtils.isAllWinnerDevice()) { + AllwinnerCubeMdmManager.getInstance().setNotificationEnable(status == 1); + } } private static void setPanelShow(Context context, JsonObject jsonObject) { diff --git a/app/src/main/res/drawable/ic_device_lock.xml b/app/src/main/res/drawable/ic_device_lock.xml new file mode 100644 index 0000000..e210686 --- /dev/null +++ b/app/src/main/res/drawable/ic_device_lock.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout-land/activity_main.xml b/app/src/main/res/layout-land/activity_main.xml index 471ccb5..edc88c6 100644 --- a/app/src/main/res/layout-land/activity_main.xml +++ b/app/src/main/res/layout-land/activity_main.xml @@ -117,6 +117,19 @@ android:layout_weight="2" android:background="@drawable/card_background"> + + + +