diff --git a/app/build.gradle b/app/build.gradle index 556ac2d..c165448 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -36,12 +36,6 @@ dependencies { implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'com.google.android.material:material:1.4.0' - implementation 'androidx.constraintlayout:constraintlayout:2.1.0' - implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5' - implementation 'androidx.navigation:navigation-ui-ktx:2.3.5' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.3' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' //工具集 implementation 'com.blankj:utilcodex:1.31.0' diff --git a/app/src/androidTest/java/org/yameida/worktool/ExampleInstrumentedTest.kt b/app/src/androidTest/java/org/yameida/worktool/ExampleInstrumentedTest.kt deleted file mode 100644 index 7c2e9d6..0000000 --- a/app/src/androidTest/java/org/yameida/worktool/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package org.yameida.worktool - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("org.yameida.worktool", appContext.packageName) - } -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7205f54..75987d3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -35,16 +35,18 @@ - + + 0 + return list.count { it.parent?.parent?.parent?.childCount == 5 } > 0 } /** @@ -146,11 +143,19 @@ fun backPress() { if (confirm != null) { LogUtils.d("尝试点击确定/我知道了/暂不进入") AccessibilityUtil.performClick(confirm) + } else { + LogUtils.d("未找到对话框 点击bar中心") + AccessibilityUtil.performXYClick(WeworkController.weworkService, ScreenUtils.getScreenWidth() / 2F, BarUtils.getStatusBarHeight() * 2F) + sleep(Constant.POP_WINDOW_INTERVAL) + val firstEmptyTextView = AccessibilityUtil.findAllByClazz(getRoot(), Views.TextView).firstOrNull { it.text.isNullOrEmpty() } + if (firstEmptyTextView != null && firstEmptyTextView.isClickable) { + AccessibilityUtil.performClick(firstEmptyTextView) + } } } } } - sleep(500) + sleep(Constant.POP_WINDOW_INTERVAL) } /** diff --git a/app/src/main/java/org/yameida/worktool/service/WeworkGetImpl.kt b/app/src/main/java/org/yameida/worktool/service/WeworkGetImpl.kt index e333863..8be45ea 100644 --- a/app/src/main/java/org/yameida/worktool/service/WeworkGetImpl.kt +++ b/app/src/main/java/org/yameida/worktool/service/WeworkGetImpl.kt @@ -157,7 +157,7 @@ object WeworkGetImpl { val groupNameTv = AccessibilityUtil.findOnceByText(getRoot(), "群聊名称", exact = true) if (groupNameTv != null) { val tvList = AccessibilityUtil.findAllOnceByClazz( - groupNameTv.parent.parent.parent, + groupNameTv.parent?.parent?.parent, Views.TextView ) if (tvList.size >= 2) { diff --git a/app/src/main/java/org/yameida/worktool/service/WeworkLoopImpl.kt b/app/src/main/java/org/yameida/worktool/service/WeworkLoopImpl.kt index ddb95d9..7a13884 100644 --- a/app/src/main/java/org/yameida/worktool/service/WeworkLoopImpl.kt +++ b/app/src/main/java/org/yameida/worktool/service/WeworkLoopImpl.kt @@ -50,8 +50,8 @@ object WeworkLoopImpl { fun getFriendRequest(): Boolean { val list = AccessibilityUtil.findAllOnceByText(getRoot(), "通讯录", exact = true) for (item in list) { - if (item.parent.parent.parent.childCount == 5) { - if (item.parent.childCount > 1) { + if (item.parent?.parent?.parent?.childCount == 5) { + if (item.parent != null && item.parent.childCount > 1) { LogUtils.d("通讯录有红点") AccessibilityUtil.performClick(item) val hasRecommendFriend = AccessibilityUtil.findOneByText(getRoot(), "可能的", timeout = Constant.POP_WINDOW_INTERVAL) @@ -99,8 +99,10 @@ object WeworkLoopImpl { * 聊天页 * 1.获取群名 * 2.获取消息列表 + * @param needInfer 是否需要推断@me并等待回复 + * @param timeout 在房间内等待回复的时长 */ - fun getChatMessageList(timeout: Long = 3000): Boolean { + fun getChatMessageList(needInfer: Boolean = true, timeout: Long = 3000): Boolean { if (Constant.autoReply == 0) return true AccessibilityUtil.performScrollDown(getRoot(), 0) val roomType = WeworkRoomUtil.getRoomType() @@ -133,24 +135,32 @@ object WeworkLoopImpl { null ) ) - val lastMessage = messageList.lastOrNull { it.sender == 0 } - if (lastMessage != null) { - var tempContent = "" - for (itemMessage in lastMessage.itemMessageList) { - if (itemMessage.text.contains("@" + Constant.myName) - || itemMessage.text.isDigitsOnly()) { - tempContent = itemMessage.text + //推测是否回复并在房间等待指令 + if (needInfer) { + val lastMessage = messageList.lastOrNull { it.sender == 0 } + if (lastMessage != null) { + var tempContent = "" + for (itemMessage in lastMessage.itemMessageList) { + if (itemMessage.text.contains("@" + Constant.myName) + || itemMessage.text.isDigitsOnly() + ) { + tempContent = itemMessage.text + } } - } - if (roomType == WeworkMessageBean.ROOM_TYPE_EXTERNAL_CONTACT - || roomType == WeworkMessageBean.ROOM_TYPE_INTERNAL_CONTACT - || tempContent.isNotBlank()) { - LogUtils.v("推测需要回复: $tempContent") - val startTime = System.currentTimeMillis() - var currentTime = startTime - while (mainLoopRunning && currentTime - startTime <= timeout) { - sleep(Constant.POP_WINDOW_INTERVAL / 5) - currentTime = System.currentTimeMillis() + if (roomType == WeworkMessageBean.ROOM_TYPE_EXTERNAL_CONTACT + || roomType == WeworkMessageBean.ROOM_TYPE_INTERNAL_CONTACT + || tempContent.isNotBlank() + ) { + LogUtils.v("推测需要回复: $tempContent") + val startTime = System.currentTimeMillis() + var currentTime = startTime + while (mainLoopRunning && currentTime - startTime < timeout) { + sleep(Constant.POP_WINDOW_INTERVAL / 5) + currentTime = System.currentTimeMillis() + } + if (mainLoopRunning) { + return getChatMessageList(needInfer = false) + } } } } @@ -175,6 +185,10 @@ object WeworkLoopImpl { if (filter.isNotEmpty()) { val tvNick = filter[0] LogUtils.d("好友请求: " + tvNick.text) + //设置标签 + if (AccessibilityUtil.findTextAndClick(getRoot(), "标签")) { + WeworkOperationImpl.setFriendTags(arrayListOf("worktool自动通过")) + } AccessibilityUtil.findTextAndClick(getRoot(), "通过验证") AccessibilityUtil.findTextAndClick(getRoot(), "完成") if (AccessibilityUtil.findTextAndClick(getRoot(), "确定")) { @@ -211,8 +225,8 @@ object WeworkLoopImpl { val list = AccessibilityUtil.findAllOnceByText(getRoot(), "消息", exact = true) for (item in list) { - if (item.parent.parent.parent.childCount == 5) { - if (item.parent.childCount > 1) { + if (item.parent?.parent?.parent?.childCount == 5) { + if (item.parent != null && item.parent.childCount > 1) { LogUtils.d("消息有红点") AccessibilityUtil.clickByNode(WeworkController.weworkService, item) sleep(100) diff --git a/app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt b/app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt index 0ea844a..5b1a12f 100644 --- a/app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt +++ b/app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt @@ -675,50 +675,15 @@ object WeworkOperationImpl { //如果已经是好友的可以传name修改好友信息 if (friend.phone == null && friend.name != null) { if (getFriendInfo(friend.name)) { - if (AccessibilityUtil.findOneByText(getRoot(), "标签", "电话", "描述", "设置备注和描述", exact = true) != null) { - var markTv = - AccessibilityUtil.findOnceByText(getRoot(), "设置备注和描述", exact = true) - if (markTv == null) { - markTv = AccessibilityUtil.findOnceByText(getRoot(), "企业", exact = true) - } - if (markTv == null) { - markTv = AccessibilityUtil.findOnceByText(getRoot(), "描述", exact = true) - } - //设置备注 - if (markTv != null && (friend.markName != null - || friend.markCorp != null || friend.markExtra != null) - ) { - AccessibilityUtil.performClick(markTv) - val etList = - AccessibilityUtil.findAllByClazz(getRoot(), Views.EditText, minSize = 5) - if (etList.size >= 5) { - if (friend.markName != null) { - AccessibilityUtil.editTextInput(etList[0], friend.markName) - } - if (friend.markCorp != null) { - AccessibilityUtil.editTextInput(etList[1], friend.markCorp) - } - if (friend.markExtra != null) { - AccessibilityUtil.editTextInput(etList[4], friend.markExtra) - } - } - AccessibilityUtil.findTextAndClick(getRoot(), "保存") - } - //设置标签 - if (!friend.tagList.isNullOrEmpty()) { - if (AccessibilityUtil.findTextAndClick(getRoot(), "标签")) { - setFriendTags(friend.tagList) - } - } + if (modifyFriendInfo(friend, addFriend = false)) { + LogUtils.d("修改好友信息成功: ${friend.name}") + uploadCommandResult(message, ExecCallbackBean.SUCCESS, "", startTime) + return true } else { - LogUtils.e("未找到标签") - uploadCommandResult(message, ExecCallbackBean.ERROR_BUTTON, "未找到标签", startTime) + LogUtils.e("修改用户信息失败: ${friend.name}") + uploadCommandResult(message, ExecCallbackBean.ERROR_BUTTON, "修改用户信息失败: ${friend.name}", startTime) return false } - LogUtils.d("修改好友信息成功: ${friend.name}") - uploadCommandResult(message, ExecCallbackBean.SUCCESS, "", startTime) - sleep(3000) - return true } else { LogUtils.e("未找到用户: ${friend.name}") uploadCommandResult(message, ExecCallbackBean.ERROR_TARGET, "未找到用户: ${friend.name}", startTime) @@ -844,7 +809,7 @@ object WeworkOperationImpl { //消息页搜索结果列表 val selectListView = AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView) val reverseRegexTitle = RegexHelper.reverseRegexTitle(trimTitle) - val regex1 = "^$reverseRegexTitle" + if (needTrim) ".*?" else "(-.*)?(…)?(\\(.*?\\))?$" + val regex1 = "^(微信昵称:)?$reverseRegexTitle" + if (needTrim) ".*?" else "(-.*)?(…)?(\\(.*?\\))?$" val regex2 = ".*?\\($reverseRegexTitle\\)$" val regex = "($regex1)|($regex2)" val matchSelect = AccessibilityUtil.findOneByTextRegex( @@ -858,7 +823,7 @@ object WeworkOperationImpl { val item = selectListView.getChild(i) val searchResult = AccessibilityUtil.findOnceByTextRegex(item, regex) //过滤异常好友 - if (searchResult != null && searchResult.parent.childCount < 3) { + if (searchResult?.parent != null && searchResult.parent.childCount < 3) { item.refresh() val imageView = AccessibilityUtil.findOneByClazz(item, Views.ImageView, root = false) @@ -941,15 +906,15 @@ object WeworkOperationImpl { val startTime = System.currentTimeMillis() goHome() val tvDiaryFlag = AccessibilityUtil.findOneByText(getRoot(), "日程", exact = true) - if (tvDiaryFlag != null && tvDiaryFlag.parent.childCount == 2) { + if (tvDiaryFlag != null && (tvDiaryFlag.parent?.childCount == 2 || tvDiaryFlag.parent?.childCount == 3)) { AccessibilityUtil.performClick(tvDiaryFlag) val tvNeedDealFlag = AccessibilityUtil.findOneByTextRegex(getRoot(), "^待办( · .*?)?$") if (tvNeedDealFlag != null) { AccessibilityUtil.performClick(tvNeedDealFlag) sleep(Constant.POP_WINDOW_INTERVAL) - val rv = AccessibilityUtil.findOneByClazz(getRoot(), Views.RecyclerView) - if (rv != null) { - val frontNode = AccessibilityUtil.findFrontNode(rv.parent) + val list = AccessibilityUtil.findOneByClazz(getRoot(), Views.RecyclerView, Views.ViewGroup, minChildCount = 2) + if (list != null) { + val frontNode = AccessibilityUtil.findFrontNode(if (list.className == Views.RecyclerView) list.parent else list) val textViewList = AccessibilityUtil.findAllOnceByClazz(frontNode, Views.TextView) if (textViewList.size >= 2) { @@ -959,7 +924,7 @@ object WeworkOperationImpl { AccessibilityUtil.findTextAndClick(getRoot(), "参与人") if (relaySelectTarget(titleList, needSend = false)) { LogUtils.e("添加参与人成功") - if (AccessibilityUtil.findTextAndClick(getRoot(), "保存并发送到聊天")) { + if (AccessibilityUtil.findTextAndClick(getRoot(), "保存并发送到聊天", "保存并建群发送")) { uploadCommandResult(message, ExecCallbackBean.SUCCESS, "", startTime) return true } else { @@ -1088,7 +1053,7 @@ object WeworkOperationImpl { sleep(Constant.CHANGE_PAGE_INTERVAL) val selectListView = AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView, Views.RecyclerView, Views.ViewGroup, minChildCount = 2) val reverseRegexTitle = RegexHelper.reverseRegexTitle(trimTitle) - val regex1 = "^$reverseRegexTitle" + if (needTrim) ".*?" else "(-.*)?(…)?(\\(.*?\\))?$" + val regex1 = "^(微信昵称:)?$reverseRegexTitle" + if (needTrim) ".*?" else "(-.*)?(…)?(\\(.*?\\))?$" val regex2 = ".*?\\($reverseRegexTitle\\)$" val regex = "($regex1)|($regex2)" val matchSelect = AccessibilityUtil.findOneByTextRegex( @@ -1102,7 +1067,7 @@ object WeworkOperationImpl { val item = selectListView.getChild(i) val searchResult = AccessibilityUtil.findOnceByTextRegex(item, regex) //过滤已退出的群聊 - if (searchResult != null && searchResult.parent.childCount < 3) { + if (searchResult?.parent != null && searchResult.parent.childCount < 3) { item.refresh() val imageView = AccessibilityUtil.findOneByClazz(item, Views.ImageView, root = false) @@ -1246,6 +1211,7 @@ object WeworkOperationImpl { val textViewList = AccessibilityUtil.findAllOnceByClazz(frontNode, Views.TextView) if (textViewList.size >= 2) { val multiButton = textViewList.lastOrNull() + var count = 0 for (select in selectList) { val needTrim = select.contains(Constant.regTrimTitle) val trimTitle = select.replace(Constant.regTrimTitle, "") @@ -1254,7 +1220,7 @@ object WeworkOperationImpl { sleep(Constant.POP_WINDOW_INTERVAL) val selectListView = AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView, Views.RecyclerView, Views.ViewGroup, minChildCount = 2, firstChildClazz = Views.TextView) val reverseRegexTitle = RegexHelper.reverseRegexTitle(trimTitle) - val regex1 = "^$reverseRegexTitle" + if (needTrim) ".*?" else "(-.*)?(…)?(\\(.*?\\))?$" + val regex1 = "^(微信昵称:)?$reverseRegexTitle" + if (needTrim) ".*?" else "(-.*)?(…)?(\\(.*?\\))?$" val regex2 = ".*?\\($reverseRegexTitle\\)$" val regex = "($regex1)|($regex2)" val matchSelect = AccessibilityUtil.findOneByTextRegex( @@ -1272,8 +1238,11 @@ object WeworkOperationImpl { item.refresh() val imageView = AccessibilityUtil.findOneByClazz(item, Views.ImageView, root = false) - if (AccessibilityUtil.performClick(imageView)) { + if (imageView != null && !imageView.isEnabled) { flag = true + } else if (AccessibilityUtil.performClick(imageView)) { + flag = true + count += 1 } } } @@ -1293,6 +1262,13 @@ object WeworkOperationImpl { if (Constant.groupStrict) return false } } + if (count == 0) { + while (AccessibilityUtil.findOnceByText(getRoot(), "全部群成员", "微信用户创建") == null && !isAtHome()) { + backPress() + } + LogUtils.d("拉入0人") + return true + } if (showMessageHistory) { AccessibilityUtil.findTextAndClick(getRoot(), "聊天记录") } @@ -1300,6 +1276,7 @@ object WeworkOperationImpl { AccessibilityUtil.findOneByTextRegex(getRoot(), "^确定(\\(.*?\\))?\$") if (confirmButton != null) { AccessibilityUtil.performClick(confirmButton) + return true } else { LogUtils.e("未发现确认按钮") return false @@ -1312,8 +1289,10 @@ object WeworkOperationImpl { LogUtils.e("未找到成员列表") return false } + } else { + LogUtils.e("进入群详情失败") + return false } - return true } /** @@ -1328,6 +1307,7 @@ object WeworkOperationImpl { .filter { it.text == null }.size LogUtils.v("tvEmptySize: $tvEmptySize") if (tvEmptySize <= 1) { + LogUtils.e("未找到踢人按钮") return true } else if (tvEmptySize == 2) { AccessibilityUtil.performClick(gridView.getChild(gridView.childCount - 1)) @@ -1343,6 +1323,7 @@ object WeworkOperationImpl { val textViewList = AccessibilityUtil.findAllOnceByClazz(frontNode, Views.TextView) if (textViewList.size >= 2) { val multiButton = textViewList.lastOrNull() + var count = 0 for (select in removeList) { val needTrim = select.contains(Constant.regTrimTitle) val trimTitle = select.replace(Constant.regTrimTitle, "") @@ -1351,7 +1332,7 @@ object WeworkOperationImpl { sleep(Constant.POP_WINDOW_INTERVAL) val selectListView = AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView, Views.RecyclerView, Views.ViewGroup, minChildCount = 2, firstChildClazz = Views.RelativeLayout) val reverseRegexTitle = RegexHelper.reverseRegexTitle(trimTitle) - val regex1 = "^$reverseRegexTitle" + if (needTrim) ".*?" else "(-.*)?(…)?(\\(.*?\\))?$" + val regex1 = "^(微信昵称:)?$reverseRegexTitle" + if (needTrim) ".*?" else "(-.*)?(…)?(\\(.*?\\))?$" val regex2 = ".*?\\($reverseRegexTitle\\)$" val regex = "($regex1)|($regex2)" val matchSelect = AccessibilityUtil.findOneByTextRegex( @@ -1368,7 +1349,9 @@ object WeworkOperationImpl { item.refresh() val imageView = AccessibilityUtil.findOneByClazz(item, Views.ImageView, root = false) - AccessibilityUtil.performClick(imageView) + if (AccessibilityUtil.performClick(imageView)) { + count += 1 + } } } } @@ -1381,13 +1364,22 @@ object WeworkOperationImpl { LogUtils.d("找到搜索结果: $select") } else { LogUtils.e("未搜索到结果: $select") - if (Constant.groupStrict) return false + //待踢人已经不在群里的不算失败 +// if (Constant.groupStrict) return false } } + if (count == 0) { + while (AccessibilityUtil.findOnceByText(getRoot(), "全部群成员", "微信用户创建") == null && !isAtHome()) { + backPress() + } + LogUtils.d("移出0人") + return true + } val confirmButton = AccessibilityUtil.findOneByText(getRoot(), "移出(") if (confirmButton != null) { AccessibilityUtil.performClick(confirmButton) + return true } else { LogUtils.e("未发现移出按钮") return false @@ -1400,8 +1392,10 @@ object WeworkOperationImpl { LogUtils.e("未找到成员列表") return false } + } else { + LogUtils.e("进入群详情失败") + return false } - return true } /** @@ -1522,13 +1516,14 @@ object WeworkOperationImpl { * 发送消息+@at */ private fun sendChatMessage(text: String, at: String? = null, atList: List? = null, reply: Boolean? = false): Boolean { + val roomType = WeworkRoomUtil.getRoomType() val voiceFlag = AccessibilityUtil.findOnceByText(getRoot(), "按住 说话", "按住说话", exact = true) if (voiceFlag != null) { AccessibilityUtil.performClickWithSon(AccessibilityUtil.findFrontNode(voiceFlag)) } var atFailed = false val atList = if (!at.isNullOrEmpty()) listOf(at) else atList - if (!atList.isNullOrEmpty()) { + if (!atList.isNullOrEmpty() && (roomType == WeworkMessageBean.ROOM_TYPE_INTERNAL_GROUP || roomType == WeworkMessageBean.ROOM_TYPE_EXTERNAL_GROUP)) { atList.forEachIndexed { index, at -> if (index == 0) { AccessibilityUtil.findTextInput(getRoot(), "@") @@ -1572,6 +1567,7 @@ object WeworkOperationImpl { } } } + LogUtils.v("atFailed: $atFailed") val content = if (atFailed) "@${atList?.joinToString()} $text" else text val append = (reply == true) || (!atList.isNullOrEmpty() && !atFailed) if (AccessibilityUtil.findTextInput(getRoot(), content, append = append)) { @@ -1614,7 +1610,7 @@ object WeworkOperationImpl { //消息页搜索结果列表 val selectListView = AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView) val reverseRegexTitle = RegexHelper.reverseRegexTitle(trimTitle) - val regex1 = "^$reverseRegexTitle" + if (needTrim) ".*?" else "(-.*)?(…)?(\\(.*?\\))?$" + val regex1 = "^(微信昵称:)?$reverseRegexTitle" + if (needTrim) ".*?" else "(-.*)?(…)?(\\(.*?\\))?$" val regex2 = ".*?\\($reverseRegexTitle\\)$" val regex = "($regex1)|($regex2)" val matchSelect = AccessibilityUtil.findOneByTextRegex( @@ -1628,7 +1624,7 @@ object WeworkOperationImpl { val item = selectListView.getChild(i) val searchResult = AccessibilityUtil.findOnceByTextRegex(item, regex) //过滤异常好友 - if (searchResult != null && searchResult.parent.childCount < 3) { + if (searchResult?.parent != null && searchResult.parent.childCount < 3) { item.refresh() val imageView = AccessibilityUtil.findOneByClazz(item, Views.ImageView, root = false) @@ -1651,7 +1647,7 @@ object WeworkOperationImpl { /** * 修改好友信息 */ - private fun modifyFriendInfo(friend: WeworkMessageBean.Friend): Boolean { + private fun modifyFriendInfo(friend: WeworkMessageBean.Friend, addFriend: Boolean = true): Boolean { if (AccessibilityUtil.findOneByText(getRoot(), "标签", "电话", "描述", "设置备注和描述", exact = true) != null) { var markTv = AccessibilityUtil.findOnceByText(getRoot(), "设置备注和描述", exact = true) if (markTv == null) { @@ -1667,7 +1663,7 @@ object WeworkOperationImpl { AccessibilityUtil.performClick(markTv) val etList = AccessibilityUtil.findAllByClazz(getRoot(), Views.EditText, minSize = 2) - if (etList.size >= 5) { + if (etList.size >= 4) { //微信用户 备注/企业/电话/电话/描述 if (friend.markName != null) { AccessibilityUtil.editTextInput(etList[0], friend.markName) @@ -1676,7 +1672,7 @@ object WeworkOperationImpl { AccessibilityUtil.editTextInput(etList[1], friend.markCorp) } if (friend.markExtra != null) { - AccessibilityUtil.editTextInput(etList[4], friend.markExtra) + AccessibilityUtil.editTextInput(etList[etList.size - 1], friend.markExtra) } } else if (etList.size == 2) { //同企业内部用户 备注/描述 @@ -1684,7 +1680,7 @@ object WeworkOperationImpl { AccessibilityUtil.editTextInput(etList[0], friend.markName) } if (friend.markExtra != null) { - AccessibilityUtil.editTextInput(etList[1], friend.markExtra) + AccessibilityUtil.editTextInput(etList[etList.size - 1], friend.markExtra) } } else if (etList.size == 3) { //外部企业用户 备注/电话/描述 @@ -1692,7 +1688,7 @@ object WeworkOperationImpl { AccessibilityUtil.editTextInput(etList[0], friend.markName) } if (friend.markExtra != null) { - AccessibilityUtil.editTextInput(etList[2], friend.markExtra) + AccessibilityUtil.editTextInput(etList[etList.size - 1], friend.markExtra) } } AccessibilityUtil.findTextAndClick(getRoot(), "保存") @@ -1703,6 +1699,9 @@ object WeworkOperationImpl { setFriendTags(friend.tagList) } } + if (!addFriend) { + return true + } //添加联系人 val imageView = AccessibilityUtil.findOneByClazz(getRoot(), Views.ImageView) @@ -1732,7 +1731,7 @@ object WeworkOperationImpl { /** * 设置好友标签 */ - private fun setFriendTags(tagList: List): Boolean { + fun setFriendTags(tagList: List): Boolean { val tagList = if (tagList.size > 5) tagList.subList(0, 5) else tagList val tvTag = AccessibilityUtil.findAllByText(getRoot(), "个人标签").lastOrNull() val oldTagList = arrayListOf() diff --git a/app/src/main/java/org/yameida/worktool/utils/AccessibilityUtil.kt b/app/src/main/java/org/yameida/worktool/utils/AccessibilityUtil.kt index dd3669d..c1dc28a 100644 --- a/app/src/main/java/org/yameida/worktool/utils/AccessibilityUtil.kt +++ b/app/src/main/java/org/yameida/worktool/utils/AccessibilityUtil.kt @@ -838,8 +838,9 @@ object AccessibilityUtil { */ fun clickByNode( service: AccessibilityService, - nodeInfo: AccessibilityNodeInfo + nodeInfo: AccessibilityNodeInfo? ): Boolean { + if (nodeInfo == null) return false nodeInfo.refresh() val rect = Rect() nodeInfo.getBoundsInScreen(rect) @@ -869,8 +870,9 @@ object AccessibilityUtil { */ fun scrollDownByNode( service: AccessibilityService, - nodeInfo: AccessibilityNodeInfo + nodeInfo: AccessibilityNodeInfo? ): Boolean { + if (nodeInfo == null) return false val rect = Rect() nodeInfo.getBoundsInScreen(rect) val x: Int = (rect.left + rect.right) / 2 @@ -900,10 +902,11 @@ object AccessibilityUtil { */ fun scrollByNode( service: AccessibilityService, - nodeInfo: AccessibilityNodeInfo, + nodeInfo: AccessibilityNodeInfo?, distanceX: Int = 0, distanceY: Int = 0 ): Boolean { + if (nodeInfo == null) return false val rect = Rect() nodeInfo.getBoundsInScreen(rect) val point = Point((rect.left + rect.right) / 2, (rect.top + rect.bottom) / 2) diff --git a/app/src/main/java/org/yameida/worktool/utils/FloatWindowHelper.kt b/app/src/main/java/org/yameida/worktool/utils/FloatWindowHelper.kt new file mode 100644 index 0000000..e5cb8c8 --- /dev/null +++ b/app/src/main/java/org/yameida/worktool/utils/FloatWindowHelper.kt @@ -0,0 +1,12 @@ +package org.yameida.worktool.utils + +import com.blankj.utilcode.util.LogUtils + +object FloatWindowHelper { + + fun showWindow() { + LogUtils.d("FloatWindowHelper.showWindow()") + + } + +} \ No newline at end of file diff --git a/app/src/main/java/org/yameida/worktool/utils/WeworkRoomUtil.kt b/app/src/main/java/org/yameida/worktool/utils/WeworkRoomUtil.kt index 3e81faf..ffd6f05 100644 --- a/app/src/main/java/org/yameida/worktool/utils/WeworkRoomUtil.kt +++ b/app/src/main/java/org/yameida/worktool/utils/WeworkRoomUtil.kt @@ -57,7 +57,7 @@ object WeworkRoomUtil { //聊天消息列表 1ListView 0RecycleView xViewGroup val list = AccessibilityUtil.findOnceByClazz(getRoot(), Views.ListView) if (list != null) { - val frontNode = findFrontNode(list.parent.parent) + val frontNode = findFrontNode(list.parent?.parent) val textViewList = findAllOnceByClazz(frontNode, Views.TextView) for (textView in textViewList) { if (!textView.text.isNullOrBlank()) { @@ -105,7 +105,7 @@ object WeworkRoomUtil { //消息页搜索结果列表 val selectListView = findOneByClazz(getRoot(), Views.ListView) val reverseRegexTitle = RegexHelper.reverseRegexTitle(trimTitle) - val regex1 = "^$reverseRegexTitle" + if (needTrim) ".*?" else "(-.*)?(…)?(\\(.*?\\))?$" + val regex1 = "^(微信昵称:)?$reverseRegexTitle" + if (needTrim) ".*?" else "(-.*)?(…)?(\\(.*?\\))?$" val regex2 = ".*?\\($reverseRegexTitle\\)$" val regex = "($regex1)|($regex2)" val searchResult = AccessibilityUtil.findAllByTextRegex( @@ -117,7 +117,7 @@ object WeworkRoomUtil { if (searchResult.isNotEmpty()) { //过滤已退出的群聊 val searchItem = searchResult.firstOrNull { - it.parent.childCount < 3 + it.parent != null && it.parent.childCount < 3 } if (searchItem != null) { AccessibilityUtil.performClick(searchItem) @@ -150,7 +150,7 @@ object WeworkRoomUtil { //群详情列表 val list = findOneByClazz(getRoot(), Views.ListView) if (list != null) { - val frontNode = AccessibilityUtil.findFrontNode(list.parent.parent) + val frontNode = AccessibilityUtil.findFrontNode(list.parent?.parent) val textViewList = findAllOnceByClazz(frontNode, Views.TextView) if (textViewList.size >= 2) { val multiButton = textViewList.lastOrNull() @@ -175,7 +175,7 @@ object WeworkRoomUtil { //同群详情列表 val list = findOneByClazz(getRoot(), Views.ListView) if (list != null) { - val frontNode = AccessibilityUtil.findFrontNode(list.parent.parent) + val frontNode = AccessibilityUtil.findFrontNode(list.parent?.parent) val textViewList = findAllOnceByClazz(frontNode, Views.TextView) if (textViewList.size >= 2) { val multiButton = textViewList.lastOrNull() diff --git a/app/src/main/java/org/yameida/worktool/utils/WeworkTextUtil.kt b/app/src/main/java/org/yameida/worktool/utils/WeworkTextUtil.kt index 8b3b68d..1fe5a1b 100644 --- a/app/src/main/java/org/yameida/worktool/utils/WeworkTextUtil.kt +++ b/app/src/main/java/org/yameida/worktool/utils/WeworkTextUtil.kt @@ -212,7 +212,8 @@ object WeworkTextUtil { tvCount == 1 && ivCount == 0 -> WeworkMessageBean.TEXT_TYPE_PLAIN tvCount == 0 && ivCount == 1 -> WeworkMessageBean.TEXT_TYPE_IMAGE tvCount == 2 && ivCount == 2 -> { - if (tvList[0].parent.childCount > 3) { + val parent = tvList[0].parent + if (parent != null && parent.childCount > 3) { WeworkMessageBean.TEXT_TYPE_VIDEO } else { WeworkMessageBean.TEXT_TYPE_OFFICE diff --git a/app/src/main/res/drawable-xxhdpi/good_morning_img.png b/app/src/main/res/drawable-xxhdpi/good_morning_img.png new file mode 100644 index 0000000..9306bf7 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/good_morning_img.png differ diff --git a/app/src/main/res/drawable-xxhdpi/good_night_img.png b/app/src/main/res/drawable-xxhdpi/good_night_img.png new file mode 100644 index 0000000..915a8cb Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/good_night_img.png differ diff --git a/app/src/main/res/drawable/buttonshapewhitebg.xml b/app/src/main/res/drawable/buttonshapewhitebg.xml new file mode 100644 index 0000000..4059089 --- /dev/null +++ b/app/src/main/res/drawable/buttonshapewhitebg.xml @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_email_white_24dp.xml b/app/src/main/res/drawable/ic_email_white_24dp.xml new file mode 100644 index 0000000..ce9eb45 --- /dev/null +++ b/app/src/main/res/drawable/ic_email_white_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_lock_white_24dp.xml b/app/src/main/res/drawable/ic_lock_white_24dp.xml new file mode 100644 index 0000000..a2066ed --- /dev/null +++ b/app/src/main/res/drawable/ic_lock_white_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/font/calibri.ttf b/app/src/main/res/font/calibri.ttf new file mode 100644 index 0000000..2fede68 Binary files /dev/null and b/app/src/main/res/font/calibri.ttf differ diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml new file mode 100644 index 0000000..305f9ec --- /dev/null +++ b/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +