diff --git a/app/build.gradle b/app/build.gradle index 2eeac07..556ac2d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,4 +66,6 @@ dependencies { implementation 'com.lzy.net:okgo:3.0.4' //qrcode implementation 'com.github.yoojia:next-qrcode:2.0-2' + //QMUI + implementation 'com.qmuiteam:qmui:2.0.0-alpha10' } \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..d1c93fb Binary files /dev/null and b/app/src/main/ic_launcher-playstore.png differ diff --git a/app/src/main/java/org/yameida/worktool/activity/ListenActivity.kt b/app/src/main/java/org/yameida/worktool/activity/ListenActivity.kt index b9eccb3..b903268 100644 --- a/app/src/main/java/org/yameida/worktool/activity/ListenActivity.kt +++ b/app/src/main/java/org/yameida/worktool/activity/ListenActivity.kt @@ -13,11 +13,10 @@ import kotlinx.android.synthetic.main.activity_listen.* import org.yameida.worktool.* import org.yameida.worktool.service.WeworkService import org.yameida.worktool.utils.UpdateUtil -import android.app.Dialog import android.content.* -import android.widget.Button -import android.widget.EditText +import android.text.InputType import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.qmuiteam.qmui.widget.dialog.QMUIDialog import org.yameida.worktool.utils.HostTestHelper import org.yameida.worktool.utils.PermissionHelper import org.yameida.worktool.utils.PermissionPageManagement @@ -84,8 +83,11 @@ class ListenActivity : AppCompatActivity() { SPUtils.getInstance().put("autoReply", Constant.autoReply) }) tv_host.text = Constant.host + tv_host.setOnClickListener { + showSelectHostDialog() + } tv_host.setOnLongClickListener { - showInputDialog() + showInputHostDialog() true } val version = "${AppUtils.getAppVersionName()} Android ${DeviceUtils.getSDKVersionName()} ${DeviceUtils.getManufacturer()} ${DeviceUtils.getModel()}" @@ -214,33 +216,64 @@ class ListenActivity : AppCompatActivity() { } } - private fun showInputDialog() { - ToastUtils.showLong("请输入专线网络") - val commentDialog = Dialog(this) - commentDialog.setContentView(R.layout.dialog_input) - val et: EditText = commentDialog.findViewById(R.id.body) as EditText - et.setText(tv_host.text) - val okBtn: Button = commentDialog.findViewById(R.id.ok) as Button - okBtn.setOnClickListener { - val text = et.text.toString() - if (text.isNotBlank()) { - if (text.matches("ws{1,2}://[^/]+.*".toRegex())) { - Constant.host = text - tv_host.text = text + private fun showSelectHostDialog() { + val hostList = SPUtils.getInstance().getStringSet("host_list", mutableSetOf(Constant.host)) + if (hostList.isNotEmpty()) { + val hostArray = hostList.toTypedArray() + QMUIDialog.CheckableDialogBuilder(this) + .setTitle(getString(R.string.host_list)) + .addItems(hostArray) { dialog, which -> + Constant.host = hostArray[which] + tv_host.text = hostArray[which] HostTestHelper.testWs() - commentDialog.dismiss() - } else { - ToastUtils.showLong("格式异常!") + dialog.dismiss() + } + .setCheckedIndex(hostList.indexOf(Constant.host)) + .create(R.style.QMUI_Dialog) + .show() + } + } + + private fun showInputHostDialog() { + ToastUtils.showLong("请输入专线网络") + val builder = QMUIDialog.EditTextDialogBuilder(this) + builder.setTitle(getString(R.string.tip)) + .setPlaceholder(getString(R.string.input_new_host)) + .setDefaultText(tv_host.text) + .setInputType(InputType.TYPE_CLASS_TEXT) + .addAction(getString(R.string.delete)) { dialog, index -> + val hostList = SPUtils.getInstance().getStringSet("host_list", mutableSetOf(Constant.host)) + if (hostList.size > 1) { + hostList.remove(Constant.host) + Constant.host = hostList.elementAt(0) + tv_host.text = Constant.host + HostTestHelper.testWs() + SPUtils.getInstance().put("host_list", hostList) + dialog.dismiss() + } else { + ToastUtils.showLong("至少保留一个host!") } - } else { - ToastUtils.showLong("请勿为空!") } - } - val cancelBtn: Button = commentDialog.findViewById(R.id.cancel) as Button - cancelBtn.setOnClickListener { - commentDialog.dismiss() - } - commentDialog.show() + .addAction(getString(R.string.cancel)) { dialog, index -> dialog.dismiss() } + .addAction(getString(R.string.add)) { dialog, index -> + val text = builder.editText.text + if (text != null && text.isNotEmpty()) { + if (text.matches("ws{1,2}://[^/]+.*".toRegex())) { + val hostList = SPUtils.getInstance().getStringSet("host_list", mutableSetOf(Constant.host)) + hostList.add(text.toString()) + SPUtils.getInstance().put("host_list", hostList) + Constant.host = text.toString() + tv_host.text = text + HostTestHelper.testWs() + dialog.dismiss() + } else { + ToastUtils.showLong("格式异常!") + } + } else { + ToastUtils.showLong("请勿为空!") + } + } + .create(R.style.QMUI_Dialog).show() } private var needToWork = false diff --git a/app/src/main/java/org/yameida/worktool/model/WeworkMessageBean.java b/app/src/main/java/org/yameida/worktool/model/WeworkMessageBean.java index 354267d..9136ca3 100644 --- a/app/src/main/java/org/yameida/worktool/model/WeworkMessageBean.java +++ b/app/src/main/java/org/yameida/worktool/model/WeworkMessageBean.java @@ -34,6 +34,8 @@ public class WeworkMessageBean { * 推送文件(网络图片视频和文件等) PUSH_FILE * 解散群聊 DISMISS_GROUP * 从外部群添加好友 ADD_FRIEND_BY_GROUP + * 添加待办 ADD_NEED_DEAL + * 打卡 CLOCK_IN *

* 非操作类型 300 * 机器人普通日志记录 ROBOT_LOG @@ -69,6 +71,8 @@ public class WeworkMessageBean { public static final int PUSH_FILE = 218; public static final int DISMISS_GROUP = 219; public static final int ADD_FRIEND_BY_GROUP = 220; + public static final int ADD_NEED_DEAL = 221; + public static final int CLOCK_IN = 222; public static final int ROBOT_LOG = 301; public static final int ROBOT_ERROR_LOG = 302; diff --git a/app/src/main/java/org/yameida/worktool/service/MyLooper.kt b/app/src/main/java/org/yameida/worktool/service/MyLooper.kt index 5342e05..e48a4b2 100644 --- a/app/src/main/java/org/yameida/worktool/service/MyLooper.kt +++ b/app/src/main/java/org/yameida/worktool/service/MyLooper.kt @@ -150,6 +150,12 @@ object MyLooper { WeworkMessageBean.ADD_FRIEND_BY_GROUP -> { WeworkController.addFriendByGroup(message) } + WeworkMessageBean.ADD_NEED_DEAL -> { + WeworkController.addNeedDeal(message) + } + WeworkMessageBean.CLOCK_IN -> { + WeworkController.clockIn(message) + } WeworkMessageBean.SHOW_GROUP_INFO -> { WeworkController.showGroupInfo(message) } diff --git a/app/src/main/java/org/yameida/worktool/service/WeworkController.kt b/app/src/main/java/org/yameida/worktool/service/WeworkController.kt index c952088..1dbf5ea 100644 --- a/app/src/main/java/org/yameida/worktool/service/WeworkController.kt +++ b/app/src/main/java/org/yameida/worktool/service/WeworkController.kt @@ -203,6 +203,32 @@ object WeworkController { ) } + /** + * 添加待办 + * @see WeworkMessageBean.ADD_NEED_DEAL + * @param message#titleList 内部用户昵称列表 + * @param message#receivedContent 回复内容 + */ + @RequestMapping + fun addNeedDeal(message: WeworkMessageBean): Boolean { + LogUtils.d("addNeedDeal(): ${message.titleList} ${message.receivedContent}") + return WeworkOperationImpl.addNeedDeal( + message, + message.titleList, + message.receivedContent + ) + } + + /** + * 打卡 + * @see WeworkMessageBean.CLOCK_IN + */ + @RequestMapping + fun clockIn(message: WeworkMessageBean): Boolean { + LogUtils.d("clockIn(): ") + return WeworkOperationImpl.clockIn(message) + } + /** * 推送微盘图片 * @see WeworkMessageBean.PUSH_MICRO_DISK_IMAGE 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 bc756f2..0ea844a 100644 --- a/app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt +++ b/app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt @@ -927,6 +927,110 @@ object WeworkOperationImpl { } } + /** + * 添加待办 + * @see WeworkMessageBean.ADD_NEED_DEAL + * @param titleList 内部用户昵称列表 + * @param receivedContent 回复内容 + */ + fun addNeedDeal( + message: WeworkMessageBean, + titleList: MutableList, + receivedContent: String + ): Boolean { + val startTime = System.currentTimeMillis() + goHome() + val tvDiaryFlag = AccessibilityUtil.findOneByText(getRoot(), "日程", exact = true) + if (tvDiaryFlag != null && tvDiaryFlag.parent.childCount == 2) { + 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 textViewList = + AccessibilityUtil.findAllOnceByClazz(frontNode, Views.TextView) + if (textViewList.size >= 2) { + val addButton: AccessibilityNodeInfo = textViewList[textViewList.size - 1] + AccessibilityUtil.performClick(addButton) + AccessibilityUtil.findTextInput(getRoot(), receivedContent) + AccessibilityUtil.findTextAndClick(getRoot(), "参与人") + if (relaySelectTarget(titleList, needSend = false)) { + LogUtils.e("添加参与人成功") + if (AccessibilityUtil.findTextAndClick(getRoot(), "保存并发送到聊天")) { + uploadCommandResult(message, ExecCallbackBean.SUCCESS, "", startTime) + return true + } else { + LogUtils.e("未找到保存并发送按钮") + uploadCommandResult(message, ExecCallbackBean.ERROR_BUTTON, "未找到保存并发送按钮", startTime) + return false + } + } else { + LogUtils.e("添加参与人失败") + uploadCommandResult(message, ExecCallbackBean.ERROR_RELAY, "添加参与人失败: $titleList", startTime) + return false + } + } else { + LogUtils.e("未找到添加按钮") + uploadCommandResult(message, ExecCallbackBean.ERROR_BUTTON, "未找到添加按钮", startTime) + return false + } + } else { + LogUtils.e("未找到待办列表") + uploadCommandResult(message, ExecCallbackBean.ERROR_BUTTON, "未找到待办列表", startTime) + return false + } + } else { + LogUtils.e("未找到待办按钮") + uploadCommandResult(message, ExecCallbackBean.ERROR_BUTTON, "未找到待办按钮", startTime) + return false + } + } else { + LogUtils.e("未找到日程按钮") + uploadCommandResult(message, ExecCallbackBean.ERROR_BUTTON, "未找到日程按钮", startTime) + return false + } + } + + /** + * 打卡 + * @see WeworkMessageBean.CLOCK_IN + */ + fun clockIn(message: WeworkMessageBean): Boolean { + val startTime = System.currentTimeMillis() + goHomeTab("工作台") + val node = AccessibilityUtil.scrollAndFindByText(WeworkController.weworkService, getRoot(), "打卡") + if (node != null) { + AccessibilityUtil.performClick(node) + sleep(Constant.POP_WINDOW_INTERVAL) + val clockInFlag = + AccessibilityUtil.findOneByText(getRoot(), "你已在打卡范围内", timeout = 10000) + if (clockInFlag != null) { + AccessibilityUtil.findTextAndClick(getRoot(), "上班打卡", "下班打卡") + val doneFlag = AccessibilityUtil.findOneByText(getRoot(), "上班·正常", "之后可打下班卡", "今日打卡已完成") + if (doneFlag != null) { + LogUtils.d("打卡成功") + uploadCommandResult(message, ExecCallbackBean.SUCCESS, "", startTime) + return true + } else { + LogUtils.e("未发现完成打卡") + uploadCommandResult(message, ExecCallbackBean.ERROR_BUTTON, "未发现完成打卡", startTime) + return false + } + } else { + LogUtils.e("未找到上下班打卡") + uploadCommandResult(message, ExecCallbackBean.ERROR_BUTTON, "未找到上下班打卡", startTime) + return false + } + } else { + LogUtils.e("未找到在打卡范围") + uploadCommandResult(message, ExecCallbackBean.ERROR_BUTTON, "未找到在打卡范围", startTime) + return false + } + } + /** * 展示群信息 * @see WeworkMessageBean.SHOW_GROUP_INFO @@ -966,7 +1070,7 @@ object WeworkOperationImpl { * selectList 昵称或群名列表 * extraText 转发是否附加一条文本 */ - private fun relaySelectTarget(selectList: List, extraText: String? = null): Boolean { + private fun relaySelectTarget(selectList: List, extraText: String? = null, needSend: Boolean = true): Boolean { //聊天消息列表 1ListView 0RecycleView xViewGroup val list = AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView) if (list != null) { @@ -1019,6 +1123,9 @@ object WeworkOperationImpl { if (confirmButton != null) { AccessibilityUtil.performClick(confirmButton) sleep(Constant.POP_WINDOW_INTERVAL) + if (!needSend) { + return true + } if (!extraText.isNullOrBlank()) { LogUtils.d("extraText: $extraText") AccessibilityUtil.findTextInput(getRoot(), extraText) diff --git a/app/src/main/java/org/yameida/worktool/utils/HostTestHelper.kt b/app/src/main/java/org/yameida/worktool/utils/HostTestHelper.kt index 2803e82..365fe1c 100644 --- a/app/src/main/java/org/yameida/worktool/utils/HostTestHelper.kt +++ b/app/src/main/java/org/yameida/worktool/utils/HostTestHelper.kt @@ -40,10 +40,12 @@ object HostTestHelper { override fun onMessage(webSocket: WebSocket, text: String) { ToastUtils.showLong("链接: ${Constant.getWsUrl()}\nonMessage\ntext:$text") + webSocket.close(1000, "接口测试成功") } override fun onMessage(webSocket: WebSocket, bytes: ByteString) { ToastUtils.showLong("链接: ${Constant.getWsUrl()}\nonMessage\nbytes:$bytes") + webSocket.close(1000, "接口测试成功") } override fun onClosing(webSocket: WebSocket, code: Int, reason: String) { diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index a571e60..0000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 61da551..0000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index c41dd28..0000000 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index db5080a..0000000 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 6dba46d..0000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index da31a87..0000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 15ac681..7086e43 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png index b216f2d..de12b36 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index f25a419..0000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index e96783c..0000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 86004e9..fcfb0d3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -19,4 +19,12 @@ update 升级通知 + + 提示 + 请输入新的host + 删除 + 取消 + 确认 + 新增 + host列表 \ 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 93ec80c..617458e 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,6 +1,7 @@ -