Browse Source

bug修复

yangyang 10 tháng trước cách đây
mục cha
commit
d54ee98d3a

+ 2 - 2
app/build.gradle

@@ -9,8 +9,8 @@ android {
         applicationId "com.rk.worktool"
         minSdkVersion 24
         targetSdkVersion 30
-        versionCode 20250324
-        versionName "2.9.2"
+        versionCode 20250401
+        versionName "2.9.3"
     }
 
     buildTypes {

+ 0 - 5
app/src/main/AndroidManifest.xml

@@ -54,11 +54,6 @@
             </intent-filter>
         </activity>
         <activity
-            android:name="org.yameida.worktool.activity.LoginActivity"
-            android:launchMode="singleTop"
-            android:theme="@style/AppTheme">
-        </activity>
-        <activity
             android:name="org.yameida.worktool.activity.SettingsActivity"
             android:launchMode="singleTop"
             android:theme="@style/AppTheme">

+ 7 - 3
app/src/main/java/org/yameida/worktool/Constant.kt

@@ -53,8 +53,8 @@ object Constant {
     var CHANGE_PAGE_INTERVAL = BASE_CHANGE_PAGE_INTERVAL
     var POP_WINDOW_INTERVAL = BASE_POP_WINDOW_INTERVAL
 
-//        private const val DEFAULT_HOST = "wss://assistant.flowbb.top/webSocket/"
-    private const val DEFAULT_HOST = "wss://www.mooger8.com/webSocket/"
+//            private const val DEFAULT_HOST = "wss://assistant.flowbb.top/"
+    private const val DEFAULT_HOST = "wss://www.mooger8.com/"
     var version = Int.MAX_VALUE
     var myName = ""
     var myCorp = ""
@@ -163,7 +163,7 @@ object Constant {
             SPUtils.getInstance().put("apiDuplicationFilter", value)
         }
 
-    fun getWsUrl() = host + robotId
+    fun getWsUrl() = host + "webSocket/" + robotId
 
     fun getCheckUpdateUrl() = "${getBaseUrl()}/appUpdate/checkUpdate"
 
@@ -177,6 +177,10 @@ object Constant {
 
     fun getPushLocalFileUrl() = "${getBaseUrl()}/fileUpload/upload?robotId=$robotId"
 
+    fun upgrade() = "${getBaseUrl()}/api/qwPone/upgrade"
+
+    fun saveRebot() = "${getBaseUrl()}/api/qwPone/saveRebot"
+
     private fun getBaseUrl() = host.replace(wssRegex, "https").replace(wsRegex, "http")
 
 }

+ 45 - 82
app/src/main/java/org/yameida/worktool/activity/ListenActivity.kt

@@ -1,6 +1,5 @@
 package org.yameida.worktool.activity
 
-import android.app.ActivityManager
 import android.content.BroadcastReceiver
 import android.content.ComponentName
 import android.content.Context
@@ -48,6 +47,7 @@ import org.yameida.worktool.utils.CacheUtil
 import org.yameida.worktool.utils.FloatWindowHelper
 import org.yameida.worktool.utils.FlowPermissionHelper
 import org.yameida.worktool.utils.HostTestHelper
+import org.yameida.worktool.utils.HttpCallback
 import org.yameida.worktool.utils.HttpUtil
 import org.yameida.worktool.utils.PermissionHelper
 import org.yameida.worktool.utils.PermissionPageManagement
@@ -57,7 +57,7 @@ import org.yameida.worktool.utils.envcheck.CheckHook
 import org.yameida.worktool.utils.envcheck.CheckRoot
 
 
-class ListenActivity : AppCompatActivity() {
+class ListenActivity : AppCompatActivity() , HttpCallback {
 
     var riskRetry: Int = 0
 
@@ -86,7 +86,7 @@ class ListenActivity : AppCompatActivity() {
         initOverlays()
         initData()
         initNotification()
-        PermissionUtils.permission(PermissionConstants.STORAGE,PermissionConstants.PHONE).request()
+        PermissionUtils.permission(PermissionConstants.STORAGE, PermissionConstants.PHONE).request()
         registerReceiver(openWsReceiver, IntentFilter(Constant.WEWORK_NOTIFY))
     }
 
@@ -117,14 +117,8 @@ class ListenActivity : AppCompatActivity() {
 //        tv_android_id.text = DeviceUtils.getAndroidID()
         bt_save.setOnClickListener {
             val channel = et_channel.text.toString().trim()
-            Constant.robotId = channel
-            ToastUtils.showLong("保存成功")
-            HttpUtil.upgrade(this)
-//            bt_save.postDelayed({
-//                IWWAPIUtil.sendLink("wwc1f6c9a9876411a6","1000006","https://assistant.flowbb.top/image/f22e830546cff2fdb0eeadfadd58e2bcc54dcf3d3e4088-aw7ly1_fw1200.png",
-//                    "https://wx7546b6c93955bad2-a.wxcp.qidian.com/sog/EXXfC","1","1")
-//            }, 3000)
-//            IWWAPIUtil.init(this)
+//            ToastUtils.showShort("保存中")
+            HttpUtil.saveRebot(this,this,channel)
 
         }
         tv_host.text = Constant.host
@@ -152,12 +146,14 @@ class ListenActivity : AppCompatActivity() {
                 LogUtils.e("系统检测到您尚未安装企业微信,请先安装企业微信")
                 tv_work_version.text = "检测到您尚未安装企业微信,请先安装登录!"
             }
+
             in Constant.AVAILABLE_VERSION -> {
                 LogUtils.i("当前企业微信版本已适配: $workVersionName")
                 val tip = "$workVersionName   已适配,可放心使用~"
                 tv_work_version.text = tip
                 Constant.version = Constant.AVAILABLE_VERSION_MAP[workVersionName] ?: Int.MAX_VALUE
             }
+
             else -> {
                 LogUtils.e("当前企业微信版本未兼容: $workVersionName")
                 val tip = "$workVersionName   可能存在部分兼容性问题!"
@@ -345,9 +341,7 @@ class ListenActivity : AppCompatActivity() {
             packageManager.getLaunchIntentForPackage(Constant.PACKAGE_NAMES)?.apply {
                 this.flags = Intent.FLAG_ACTIVITY_NEW_TASK
                 startActivity(this)
-                if (weComNum() == 1) {
-                    SPUtils.getInstance().put("weCom", 1)
-                    SPUtils.getInstance().put("num", 1)
+                if (SPUtils.getInstance().getInt("num") == 1) {
                     WeworkController.weworkService.webSocketManager.send(
                         WeworkMessageBean(
                             WeworkMessageBean.WE_COM_TYPE,
@@ -356,35 +350,30 @@ class ListenActivity : AppCompatActivity() {
                             null
                         )
                     )
-                } else {
+                }else{
                     bt_save.postDelayed({
                         val rootNode = WeworkController.weworkService.rootInActiveWindow
                         if (rootNode != null) {
-                            // 查找并点击第一个应用
-                            val firstAppNode: AccessibilityNodeInfo = findFirstAppNode(rootNode)!!
-                            if (firstAppNode != null) {
-                                AccessibilityUtil.performClick(firstAppNode)
-                            }
-                            SPUtils.getInstance().put("weCom", 1)
-                            SPUtils.getInstance().put("num", 2)
-//                        WeworkController.weworkService.webSocketManager.send(
-//                                WeworkMessageListBean<Any?>(
-//                                    1,
-//                                    WeworkMessageListBean.SOCKET_TYPE_INTI
-//                                )
-//                            )
-                            WeworkController.weworkService.webSocketManager.send(
-                                WeworkMessageBean(
-                                    WeworkMessageBean.WE_COM_TYPE,
-                                    SPUtils.getInstance().getInt("weCom"),
-                                    SPUtils.getInstance().getInt("num"),
-                                    null
+                            if (rootNode.packageName == "android"||rootNode.packageName=="com.miui.securitycore") {
+                                // 查找并点击第一个应用
+                                val firstAppNode: AccessibilityNodeInfo = findFirstAppNode(rootNode)!!
+                                if (firstAppNode != null) {
+                                    AccessibilityUtil.performClick(firstAppNode)
+                                }
+                                SPUtils.getInstance().put("weCom", 1)
+                                WeworkController.weworkService.webSocketManager.send(
+                                    WeworkMessageBean(
+                                        WeworkMessageBean.WE_COM_TYPE,
+                                        SPUtils.getInstance().getInt("weCom"),
+                                        SPUtils.getInstance().getInt("num"),
+                                        null
+                                    )
                                 )
-                            )
+                            }
                         }
-                    }, 500)
-                }
 
+                    }, 1000)
+                }
             }
         }, 5000)
     }
@@ -397,50 +386,6 @@ class ListenActivity : AppCompatActivity() {
         }
     }
 
-    var num: Int = 0
-
-    fun weComNum(): Int {
-//        val packageManager = packageManager
-//        val installedApps = packageManager.getInstalledPackages(0)
-//        val get = installedApps[178]
-//        for (appInfo in installedApps) {
-//            val packageName = appInfo.packageName
-//            appInfo.applicationInfo.name
-//                Log.e("aaaaa", "---------" + packageName)
-//            // 可以进一步获取其他信息,如版本号、权限等
-//        }
-
-//        val packageManager = packageManager
-//        val apps = packageManager.getInstalledApplications(PackageManager.GET_META_DATA)
-//        for (appInfo in apps) {
-//            if (appInfo.packageName.contains("com.tencent.wework")) {
-//                Log.e("AppInfo", "Installed app: " + appInfo.packageName)
-//            }
-//        }
-        num = 0;
-        val activityManager = getSystemService(ACTIVITY_SERVICE) as ActivityManager
-        val processes = activityManager.runningAppProcesses
-        for (processInfo in processes) {
-            if (processInfo.processName.contains("com.tencent.wework")) {
-                Log.e("AppInfo", "Running app process: " + processInfo.processName)
-                num++;
-            }
-        }
-        return num
-//        val packageManager = packageManager
-//        val apps = packageManager.getInstalledApplications(PackageManager.GET_META_DATA)
-//        for (appInfo in apps) {
-//            if (appInfo.packageName == "com.tencent.wework") {
-//                // 找到主应用
-//                Log.e("AppInfo", "Main app: " + appInfo.packageName)
-//            } else if (appInfo.packageName.contains("com.tencent.wework:clone")) {
-//                // 找到分身应用
-//                Log.e("AppInfo", "Clone app: " + appInfo.packageName)
-//            }
-//        }
-
-
-    }
 
     private fun findFirstAppNode(rootNode: AccessibilityNodeInfo): AccessibilityNodeInfo? {
         // 查找选择框中的第一个应用
@@ -450,6 +395,24 @@ class ListenActivity : AppCompatActivity() {
     }
 
     fun hasPermission(context: Context, permission: String): Boolean {
-        return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED
+        return ContextCompat.checkSelfPermission(
+            context,
+            permission
+        ) == PackageManager.PERMISSION_GRANTED
+    }
+
+    override fun onSuccess(result: Boolean) {
+        if (result){
+//            ToastUtils.showShort("保存成功")
+            Constant.robotId = et_channel.text.toString().trim()
+            HttpUtil.upgrade(this)
+        }else{
+            et_channel.setText("")
+//            ToastUtils.showShort("账号已存在,请确认")
+        }
+    }
+
+    override fun onError() {
+        et_channel.setText("")
     }
 }

+ 0 - 37
app/src/main/java/org/yameida/worktool/activity/LoginActivity.kt

@@ -1,37 +0,0 @@
-package org.yameida.worktool.activity
-
-import android.os.Bundle
-import android.view.WindowManager
-import androidx.appcompat.app.AppCompatActivity
-import kotlinx.android.synthetic.main.activity_login.*
-import org.yameida.worktool.R
-import java.util.*
-
-/**
- * 登录页
- */
-class LoginActivity : AppCompatActivity() {
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-
-        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
-        setContentView(R.layout.activity_login)
-
-        initView()
-    }
-
-    private fun initView() {
-        val hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY)
-        if (hour in 12..17) {
-            textView.text = "Afternoon"
-        } else if (hour in 18..24 || hour in 0..6) {
-            textView.text = "Night"
-            imageView.setImageResource(R.drawable.good_night_img)
-        }
-        tv_visitor_login.setOnClickListener {
-            ListenActivity.enterActivity(this, 0)
-            finish()
-        }
-    }
-}

+ 6 - 0
app/src/main/java/org/yameida/worktool/model/RebotBean.kt

@@ -0,0 +1,6 @@
+package org.yameida.worktool.model
+
+data class RebotBean(
+    var num: Int? = null,
+    var status:Boolean
+)

+ 11 - 0
app/src/main/java/org/yameida/worktool/model/network/SaveRebotResult.java

@@ -0,0 +1,11 @@
+package org.yameida.worktool.model.network;
+
+import org.yameida.worktool.model.RebotBean;
+
+public class SaveRebotResult {
+
+
+    public Integer code;
+    public String msg;
+    public RebotBean result;
+}

+ 52 - 31
app/src/main/java/org/yameida/worktool/service/GlobalMethod.kt

@@ -5,7 +5,12 @@ import android.content.Context
 import android.content.Intent
 import android.graphics.Rect
 import android.view.accessibility.AccessibilityNodeInfo
-import com.blankj.utilcode.util.*
+import com.blankj.utilcode.util.BarUtils
+import com.blankj.utilcode.util.GsonUtils
+import com.blankj.utilcode.util.LogUtils
+import com.blankj.utilcode.util.SPUtils
+import com.blankj.utilcode.util.ScreenUtils
+import com.blankj.utilcode.util.Utils
 import com.hjq.toast.ToastUtils
 import org.yameida.worktool.Constant
 import org.yameida.worktool.MyApplication
@@ -34,7 +39,7 @@ fun fastStartActivity(
     }
 }
 
-var completeMap = mutableMapOf<String,String>()
+var completeMap = mutableMapOf<String, String>()
 
 /**
  * 进入首页-消息页
@@ -78,7 +83,12 @@ fun goHomeTab(title: String): Boolean {
             } else {
                 backPress()
                 //如果在登录页面就提示关闭worktool主功能
-                if (AccessibilityUtil.findOnceByText(getRoot(), "手机号登录", exact = true) != null) {
+                if (AccessibilityUtil.findOnceByText(
+                        getRoot(),
+                        "手机号登录",
+                        exact = true
+                    ) != null
+                ) {
                     LogUtils.e("登录前请先关闭WorkTool主功能!")
                     ToastUtils.show("登录前请先关闭WorkTool主功能!")
                     WeworkController.weworkService.webSocketManager.send(
@@ -140,7 +150,8 @@ fun getRoot(ignoreCheck: Boolean, share: Boolean = false): AccessibilityNodeInfo
             } else {
                 LogUtils.e("当前不在企业微信: ${root.packageName}")
                 if (root.packageName == "com.android.systemui") {
-                    val tvProjection = AccessibilityUtil.findOnceByText(root, "立即开始", exact = true)
+                    val tvProjection =
+                        AccessibilityUtil.findOnceByText(root, "立即开始", exact = true)
                     if (tvProjection != null) {
                         AccessibilityUtil.performClick(tvProjection)
                         LogUtils.i("点击立即开始投屏")
@@ -149,7 +160,8 @@ fun getRoot(ignoreCheck: Boolean, share: Boolean = false): AccessibilityNodeInfo
                 }
                 if (root.packageName == "android") {
                     val tvANR = AccessibilityUtil.findOnceByText(root, "关闭应用", exact = true)
-                    val tvANRTow = AccessibilityUtil.findOnceByText(root, "企业微信没有响应", exact = true)
+                    val tvANRTow =
+                        AccessibilityUtil.findOnceByText(root, "企业微信没有响应", exact = true)
                     if (tvANR != null) {
                         AccessibilityUtil.performClick(tvANR)
                         LogUtils.e("点击关闭应用ANR")
@@ -177,22 +189,24 @@ fun getRoot(ignoreCheck: Boolean, share: Boolean = false): AccessibilityNodeInfo
                                 ?.apply {
                                     this.flags = Intent.FLAG_ACTIVITY_NEW_TASK
                                     Utils.getApp().startActivity(this)
-                                }
-                            //TODO 点击跳转
-                            if (SPUtils.getInstance().getInt("num") == 2) {
-                                sleep(Constant.BASE_POP_WINDOW_INTERVAL)
-                                val rootNode = WeworkController.weworkService.rootInActiveWindow
-                                val firstAppNode: AccessibilityNodeInfo =
-                                    if (SPUtils.getInstance().getInt("weCom") == 1) {
-                                        AccessibilityUtil.findAllByClazz(rootNode, Views.ImageView)
-                                            .firstOrNull()!!
-                                    } else {
-                                        AccessibilityUtil.findAllByClazz(rootNode, Views.ImageView)
-                                            .lastOrNull()!!
+                                    //TODO 点击跳转
+                                    if (SPUtils.getInstance().getInt("num") == 2) {
+                                        sleep(Constant.BASE_GENERAL_INTERVAL)
+                                        val rootNode =
+                                            WeworkController.weworkService.rootInActiveWindow
+                                        var findAllByClazz = AccessibilityUtil.findAllByClazz(
+                                            rootNode,
+                                            Views.ImageView
+                                        )
+                                        if (findAllByClazz.size == 2) {
+                                            if (SPUtils.getInstance().getInt("weCom") == 1) {
+                                                AccessibilityUtil.performClick(findAllByClazz.firstOrNull())
+                                            } else {
+                                                AccessibilityUtil.performClick(findAllByClazz.lastOrNull())
+                                            }
+                                        }
                                     }
-                                AccessibilityUtil.performClick(firstAppNode)
-                            }
-
+                                }
                         }
                     }
                 }
@@ -263,7 +277,12 @@ fun backPress() {
                     AccessibilityUtil.performClick(confirm)
                 } else {
                     val stayButton =
-                        AccessibilityUtil.findOnceByText(getRoot(true), "关闭应用", "等待", exact = true)
+                        AccessibilityUtil.findOnceByText(
+                            getRoot(true),
+                            "关闭应用",
+                            "等待",
+                            exact = true
+                        )
                     if (stayButton != null) {
                         LogUtils.d("疑似ANR 尝试点击等待")
                         AccessibilityUtil.performClick(stayButton)
@@ -312,16 +331,18 @@ fun uploadCommandResult(
     if ((message.fileBase64?.length ?: 0) > 100) {
         message.fileBase64 = message.fileBase64.substring(0, 100)
     }
-    completeMap[message.messageId] = GsonUtils.toJson( ExecCallbackBean(
-        GsonUtils.toJson(message),
-        errorCode,
-        errorReason,
-        startTime,
-        (System.currentTimeMillis() - startTime) / 1000.0,
-        successList,
-        failList,
-        metaJson
-    ))
+    completeMap[message.messageId] = GsonUtils.toJson(
+        ExecCallbackBean(
+            GsonUtils.toJson(message),
+            errorCode,
+            errorReason,
+            startTime,
+            (System.currentTimeMillis() - startTime) / 1000.0,
+            successList,
+            failList,
+            metaJson
+        )
+    )
     WeworkController.weworkService.webSocketManager.send(
         WeworkMessageListBean(
             ExecCallbackBean(

+ 49 - 27
app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt

@@ -260,6 +260,7 @@ object WeworkOperationImpl {
                         )
                     ) {
                         LogUtils.d("开始转发")
+                        sleep(Constant.CHANGE_PAGE_INTERVAL)
                         val relaySelectResult =
                             newRelaySelectTarget(nameList, extraText, isRelay = true)
                         if (relaySelectResult.result) {
@@ -4171,7 +4172,7 @@ object WeworkOperationImpl {
         val selectResult = SelectResult()
         if (!isRelay) {
             if (SPUtils.getInstance().getInt("num") == 2) {
-                sleep(Constant.POP_WINDOW_INTERVAL)
+                sleep(Constant.BASE_GENERAL_INTERVAL)
                 val aList = AccessibilityUtil.findAllByText(
                     WeworkController.weworkService.rootInActiveWindow,
                     "企业微信"
@@ -6749,32 +6750,49 @@ object WeworkOperationImpl {
                 startActivity(this)
                 sleep(Constant.BASE_GENERAL_INTERVAL)
                 // 查找并点击第一个应用
-                val rootNode = WeworkController.weworkService.rootInActiveWindow
-                var aa = AccessibilityUtil.findAllByClazz(rootNode, Views.ImageView)
-                val firstAppNode: AccessibilityNodeInfo = if (message.weCom == 1) {
-                    AccessibilityUtil.findAllByClazz(rootNode, Views.ImageView).firstOrNull()!!
-                } else {
-                    AccessibilityUtil.findAllByClazz(rootNode, Views.ImageView).lastOrNull()!!
-                }
-                AccessibilityUtil.performClick(firstAppNode)
-                if (!message.isRelay) {
-                    uploadCommandResult(
-                        message,
-                        ExecCallbackBean.SUCCESS,
-                        "",
-                        System.currentTimeMillis()
+                if (SPUtils.getInstance().getInt("num") == 2) {
+                    var aa = AccessibilityUtil.findAllByClazz(
+                        getRoot(ignoreCheck = true, share = true),
+                        Views.ImageView
                     )
-                    sleep(Constant.POP_WINDOW_INTERVAL)
+                    if (aa.size != 2 && aa.lastOrNull()!!.contentDescription != "双开企业微信") {
+                        sleep(Constant.BASE_GENERAL_INTERVAL)
+                    }
+                    val firstAppNode: AccessibilityNodeInfo = if (message.weCom == 1) {
+                        AccessibilityUtil.findAllByClazz(
+                            getRoot(ignoreCheck = true, share = true),
+                            Views.ImageView
+                        ).firstOrNull()!!
+                    } else {
+                        AccessibilityUtil.findAllByClazz(
+                            getRoot(ignoreCheck = true, share = true),
+                            Views.ImageView
+                        ).lastOrNull()!!
+                    }
+                    if (firstAppNode != null && (
+                                firstAppNode.contentDescription == "双开企业微信" || firstAppNode.contentDescription == "企业微信")
+                    ) {
+                        AccessibilityUtil.performClick(firstAppNode)
+                    }
+                    if (!message.isRelay) {
+                        uploadCommandResult(
+                            message,
+                            ExecCallbackBean.SUCCESS,
+                            "",
+                            System.currentTimeMillis()
+                        )
+                        sleep(Constant.POP_WINDOW_INTERVAL)
+                        SPUtils.getInstance().put("weCom", message.weCom)
+                        WeworkController.weworkService.webSocketManager.send(
+                            WeworkMessageBean(
+                                WeworkMessageBean.WE_COM_TYPE,
+                                SPUtils.getInstance().getInt("weCom"),
+                                null,
+                                null
+                            )
+                        )
+                    }
                 }
-                SPUtils.getInstance().put("weCom", message.weCom)
-                WeworkController.weworkService.webSocketManager.send(
-                    WeworkMessageBean(
-                        WeworkMessageBean.WE_COM_TYPE,
-                        SPUtils.getInstance().getInt("weCom"),
-                        null,
-                        null
-                    )
-                )
                 return true
             }
         return false
@@ -6795,8 +6813,12 @@ object WeworkOperationImpl {
         return true
     }
 
-    fun sendGroupChat(message: WeworkMessageBean):Boolean{
-        if (WeworkRoomUtil.intoGroupChat("群发助手") || WeworkRoomUtil.intoGroupChat("群发助手", fastIn = false)) {
+    fun sendGroupChat(message: WeworkMessageBean): Boolean {
+        if (WeworkRoomUtil.intoGroupChat("群发助手") || WeworkRoomUtil.intoGroupChat(
+                "群发助手",
+                fastIn = false
+            )
+        ) {
             Constant.lastUseMultiSender = System.currentTimeMillis()
             val list = AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView)
             if (list != null) {

+ 3 - 2
app/src/main/java/org/yameida/worktool/service/WeworkService.kt

@@ -131,7 +131,7 @@ class WeworkService : AccessibilityService() {
             val workVersion = SPUtils.getInstance().getString("workVersion", "")
             val deviceRooted = SPUtils.getInstance().getBoolean("deviceRooted", false)
             val hook = SPUtils.getInstance().getBoolean("hook", false)
-            if (WeworkController.weworkService.rootInActiveWindow != null && WeworkController.weworkService.rootInActiveWindow.packageName == Constant.PACKAGE_NAMES) {
+            if (WeworkController.weworkService.rootInActiveWindow != null) {
                 WeworkController.weworkService.webSocketManager.send(
                     WeworkMessageBean(
                         WeworkMessageBean.WE_COM_TYPE,
@@ -148,6 +148,7 @@ class WeworkService : AccessibilityService() {
         }
 
         override fun onMessage(webSocket: WebSocket, text: String) {
+            webSocketManager.setLastMessageTime(System.currentTimeMillis())
             LogUtils.i(
                 "onMessage: ${
                     if (text.length > 1000) (text.substring(
@@ -156,7 +157,7 @@ class WeworkService : AccessibilityService() {
                     ) + "...") else text
                 }"
             )
-            if ("{\"type\":11}"==text){
+            if ("{\"type\":11}" == text) {
                 return
             }
             try {

+ 2 - 3
app/src/main/java/org/yameida/worktool/utils/FloatWindowHelper.kt

@@ -19,14 +19,13 @@ import org.yameida.floatwindow.FloatWindowManager
 import org.yameida.floatwindow.listener.OnClickListener
 import org.yameida.worktool.Constant
 import org.yameida.worktool.R
-import org.yameida.worktool.activity.ListenActivity
 import org.yameida.worktool.model.WeworkMessageBean
 import org.yameida.worktool.service.MyLooper
 import org.yameida.worktool.service.WeworkController
 import org.yameida.worktool.service.getRoot
 import java.io.File
 import java.text.SimpleDateFormat
-import java.util.*
+import java.util.Date
 import kotlin.concurrent.thread
 
 object FloatWindowHelper {
@@ -136,7 +135,7 @@ object FloatWindowHelper {
                             }
                         }
                         4 -> {
-                            ListenActivity.enterActivity(Utils.getApp(), 0)
+//                            ListenActivity.enterActivity(Utils.getApp(), 0)
                         }
                     }
                 }

+ 6 - 0
app/src/main/java/org/yameida/worktool/utils/HttpCallback.kt

@@ -0,0 +1,6 @@
+package org.yameida.worktool.utils
+
+interface HttpCallback {
+    fun onSuccess(result: Boolean)
+    fun onError()
+}

+ 42 - 3
app/src/main/java/org/yameida/worktool/utils/HttpUtil.kt

@@ -2,7 +2,14 @@ package org.yameida.worktool.utils
 
 import android.content.Context
 import android.util.Log
-import com.blankj.utilcode.util.*
+import com.blankj.utilcode.util.AppUtils
+import com.blankj.utilcode.util.DeviceUtils
+import com.blankj.utilcode.util.EncodeUtils
+import com.blankj.utilcode.util.GsonUtils
+import com.blankj.utilcode.util.LogUtils
+import com.blankj.utilcode.util.SPUtils
+import com.blankj.utilcode.util.TimeUtils
+import com.blankj.utilcode.util.ToastUtils
 import com.lzy.okgo.OkGo
 import com.lzy.okgo.callback.StringCallback
 import com.lzy.okgo.model.Response
@@ -13,6 +20,7 @@ import org.yameida.worktool.Constant
 import org.yameida.worktool.R
 import org.yameida.worktool.model.network.CheckUpdateResult
 import org.yameida.worktool.model.network.GetMyConfigResult
+import org.yameida.worktool.model.network.SaveRebotResult
 import org.yameida.worktool.model.network.UpgradeResult
 import org.yameida.worktool.service.log
 import org.yameida.worktool.utils.envcheck.CheckRoot
@@ -201,7 +209,7 @@ object HttpUtil {
         json.put("meid", Constant.robotId)
         json.put("version", DeviceUtils.getSDKVersionName())
         json.put("model", DeviceUtils.getModel())
-        OkGo.post<String>("https://www.mooger8.com/api/qwPone/upgrade")
+        OkGo.post<String>(Constant.upgrade())
             .upJson(json)
             .execute(object : StringCallback() {
                 override fun onSuccess(response: Response<String>) {
@@ -212,7 +220,7 @@ object HttpUtil {
                             UpgradeResult::class.java
                         )
                     if (commonResult.code == 100) {
-                        if (commonResult.result){
+                        if (commonResult.result) {
                             XUpdate.newBuild(context)
                                 .param("appRegion", "workTool")
                                 .updateUrl(Constant.updateBaseUrl)
@@ -228,4 +236,35 @@ object HttpUtil {
                 }
             })
     }
+
+    fun saveRebot(context: Context, callback: HttpCallback, channel: String) {
+        val json = JSONObject()
+        json.put("rebotId", channel)
+        OkGo.post<String>(Constant.saveRebot())
+            .upJson(json)
+            .execute(object : StringCallback() {
+                override fun onSuccess(response: Response<String>) {
+                    Log.d("TAG", "onSuccess: ")
+                    val commonResult =
+                        GsonUtils.fromJson(
+                            response.body(),
+                            SaveRebotResult::class.java
+                        )
+                    ToastUtils.showLong(commonResult.msg)
+                    commonResult.result.num?.let { SPUtils.getInstance().put("num", it) }
+                    if (commonResult.code == 100) {
+                        callback.onSuccess(commonResult.result.status)
+                    } else {
+                        callback.onError()
+                    }
+                }
+
+                override fun onError(response: Response<String>) {
+                    ToastUtils.showLong("系统内部错误")
+                    callback.onError()
+                }
+            })
+    }
+
+
 }

+ 19 - 1
app/src/main/java/org/yameida/worktool/utils/WebSocketManager.java

@@ -42,6 +42,10 @@ public class WebSocketManager {
     private WebSocketListener listener;
     private boolean connecting = false;
     private long lastConnectedTime = 0L;
+
+    private static final long HEARTBEAT_INTERVAL = 60000;
+
+    private long lastMessage = 0L;
 //    private Handler handler = new Handler();
 //    Runnable tasks = new Runnable() {
 //        @Override
@@ -176,7 +180,17 @@ public class WebSocketManager {
                 reConnect();
                 //重连后刷新连接时间
                 lastConnectedTime = System.currentTimeMillis();
-            } else if (System.currentTimeMillis() % 1000 == 0) {
+            }
+//            else if (!connecting && lastMessage != 0L && (System.currentTimeMillis() - lastMessage) > HEARTBEAT_INTERVAL) {
+//                //断开链接后关闭新消息接收
+//                WeworkController.INSTANCE.setEnableLoopRunning(false);
+//                //断开链接后进入重连
+//                reConnect();
+//                //重连后刷新连接时间
+//                lastConnectedTime = System.currentTimeMillis();
+//                lastMessage = 0L;
+//            }
+            else if (System.currentTimeMillis() % 1000 == 0) {
                 socket.send("{\"td\":" + System.currentTimeMillis() + "}");
             }
             if (!Constant.INSTANCE.getEnableMediaProject()) {
@@ -193,4 +207,8 @@ public class WebSocketManager {
     public static WebSocketManager getWebSocketManager(String id) {
         return webSocketManager.get(id);
     }
+
+    public void setLastMessageTime(Long lastMessageTime) {
+        lastMessage = lastMessageTime;
+    }
 }

+ 7 - 2
app/src/main/java/org/yameida/worktool/utils/WeworkTextUtil.kt

@@ -382,7 +382,8 @@ object WeworkTextUtil {
         replyTextType: Int,
         replyNick: String?,
         replyContent: String,
-        vararg key: String
+        vararg key: String,
+        num: Int = 2
     ): Boolean {
         if (node == null) return false
         for (i in 0 until node.childCount) {
@@ -494,6 +495,9 @@ object WeworkTextUtil {
                 }
             }
         }
+        if (num == 2) {
+            longClickMessageItem(node, replyTextType, replyNick, replyContent, *key, num = 1)
+        }
         return false
     }
 
@@ -569,7 +573,7 @@ object WeworkTextUtil {
             return AccessibilityUtil.clickByNode(WeworkController.weworkService, backNode)
         }
         AccessibilityUtil.performLongClickWithSon(backNode)
-        sleep(Constant.POP_WINDOW_INTERVAL)
+        sleep(Constant.CHANGE_PAGE_INTERVAL)
         val optionRvList = findAllByClazz(getRoot(), Views.RecyclerView, Views.ViewGroup)
         for (optionRv in optionRvList) {
             val keyTv = AccessibilityUtil.findOnceByText(optionRv, *key, exact = true)
@@ -577,6 +581,7 @@ object WeworkTextUtil {
                 AccessibilityUtil.performClick(keyTv)
                 return true
             }
+
         }
         return false
     }