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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index e6ef7f8..a7be9a3 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -3,4 +3,6 @@
#6200EE
#000000
#03DAC5
+
+ #96ffffff
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 617458e..c2fbc70 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -13,4 +13,12 @@
- true
+
+
\ No newline at end of file
diff --git a/app/src/test/java/org/yameida/worktool/ExampleUnitTest.kt b/app/src/test/java/org/yameida/worktool/ExampleUnitTest.kt
deleted file mode 100644
index f91ce77..0000000
--- a/app/src/test/java/org/yameida/worktool/ExampleUnitTest.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.yameida.worktool
-
-import org.junit.Test
-
-import org.junit.Assert.*
-
-/**
- * Example local unit test, which will execute on the development machine (host).
- *
- * See [testing documentation](http://d.android.com/tools/testing).
- */
-class ExampleUnitTest {
- @Test
- fun addition_isCorrect() {
- assertEquals(4, 2 + 2)
- }
-}
\ No newline at end of file