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 @@
-