update icon;添加待办;打卡;QMUI
@@ -66,4 +66,6 @@ dependencies {
|
|||||||
implementation 'com.lzy.net:okgo:3.0.4'
|
implementation 'com.lzy.net:okgo:3.0.4'
|
||||||
//qrcode
|
//qrcode
|
||||||
implementation 'com.github.yoojia:next-qrcode:2.0-2'
|
implementation 'com.github.yoojia:next-qrcode:2.0-2'
|
||||||
|
//QMUI
|
||||||
|
implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
|
||||||
}
|
}
|
||||||
BIN
app/src/main/ic_launcher-playstore.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
@@ -13,11 +13,10 @@ import kotlinx.android.synthetic.main.activity_listen.*
|
|||||||
import org.yameida.worktool.*
|
import org.yameida.worktool.*
|
||||||
import org.yameida.worktool.service.WeworkService
|
import org.yameida.worktool.service.WeworkService
|
||||||
import org.yameida.worktool.utils.UpdateUtil
|
import org.yameida.worktool.utils.UpdateUtil
|
||||||
import android.app.Dialog
|
|
||||||
import android.content.*
|
import android.content.*
|
||||||
import android.widget.Button
|
import android.text.InputType
|
||||||
import android.widget.EditText
|
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
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.HostTestHelper
|
||||||
import org.yameida.worktool.utils.PermissionHelper
|
import org.yameida.worktool.utils.PermissionHelper
|
||||||
import org.yameida.worktool.utils.PermissionPageManagement
|
import org.yameida.worktool.utils.PermissionPageManagement
|
||||||
@@ -84,8 +83,11 @@ class ListenActivity : AppCompatActivity() {
|
|||||||
SPUtils.getInstance().put("autoReply", Constant.autoReply)
|
SPUtils.getInstance().put("autoReply", Constant.autoReply)
|
||||||
})
|
})
|
||||||
tv_host.text = Constant.host
|
tv_host.text = Constant.host
|
||||||
|
tv_host.setOnClickListener {
|
||||||
|
showSelectHostDialog()
|
||||||
|
}
|
||||||
tv_host.setOnLongClickListener {
|
tv_host.setOnLongClickListener {
|
||||||
showInputDialog()
|
showInputHostDialog()
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
val version = "${AppUtils.getAppVersionName()} Android ${DeviceUtils.getSDKVersionName()} ${DeviceUtils.getManufacturer()} ${DeviceUtils.getModel()}"
|
val version = "${AppUtils.getAppVersionName()} Android ${DeviceUtils.getSDKVersionName()} ${DeviceUtils.getManufacturer()} ${DeviceUtils.getModel()}"
|
||||||
@@ -214,21 +216,56 @@ class ListenActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showInputDialog() {
|
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()
|
||||||
|
dialog.dismiss()
|
||||||
|
}
|
||||||
|
.setCheckedIndex(hostList.indexOf(Constant.host))
|
||||||
|
.create(R.style.QMUI_Dialog)
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun showInputHostDialog() {
|
||||||
ToastUtils.showLong("请输入专线网络")
|
ToastUtils.showLong("请输入专线网络")
|
||||||
val commentDialog = Dialog(this)
|
val builder = QMUIDialog.EditTextDialogBuilder(this)
|
||||||
commentDialog.setContentView(R.layout.dialog_input)
|
builder.setTitle(getString(R.string.tip))
|
||||||
val et: EditText = commentDialog.findViewById(R.id.body) as EditText
|
.setPlaceholder(getString(R.string.input_new_host))
|
||||||
et.setText(tv_host.text)
|
.setDefaultText(tv_host.text)
|
||||||
val okBtn: Button = commentDialog.findViewById(R.id.ok) as Button
|
.setInputType(InputType.TYPE_CLASS_TEXT)
|
||||||
okBtn.setOnClickListener {
|
.addAction(getString(R.string.delete)) { dialog, index ->
|
||||||
val text = et.text.toString()
|
val hostList = SPUtils.getInstance().getStringSet("host_list", mutableSetOf(Constant.host))
|
||||||
if (text.isNotBlank()) {
|
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!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.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())) {
|
if (text.matches("ws{1,2}://[^/]+.*".toRegex())) {
|
||||||
Constant.host = text
|
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
|
tv_host.text = text
|
||||||
HostTestHelper.testWs()
|
HostTestHelper.testWs()
|
||||||
commentDialog.dismiss()
|
dialog.dismiss()
|
||||||
} else {
|
} else {
|
||||||
ToastUtils.showLong("格式异常!")
|
ToastUtils.showLong("格式异常!")
|
||||||
}
|
}
|
||||||
@@ -236,11 +273,7 @@ class ListenActivity : AppCompatActivity() {
|
|||||||
ToastUtils.showLong("请勿为空!")
|
ToastUtils.showLong("请勿为空!")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
val cancelBtn: Button = commentDialog.findViewById(R.id.cancel) as Button
|
.create(R.style.QMUI_Dialog).show()
|
||||||
cancelBtn.setOnClickListener {
|
|
||||||
commentDialog.dismiss()
|
|
||||||
}
|
|
||||||
commentDialog.show()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private var needToWork = false
|
private var needToWork = false
|
||||||
|
|||||||
@@ -34,6 +34,8 @@ public class WeworkMessageBean {
|
|||||||
* 推送文件(网络图片视频和文件等) PUSH_FILE
|
* 推送文件(网络图片视频和文件等) PUSH_FILE
|
||||||
* 解散群聊 DISMISS_GROUP
|
* 解散群聊 DISMISS_GROUP
|
||||||
* 从外部群添加好友 ADD_FRIEND_BY_GROUP
|
* 从外部群添加好友 ADD_FRIEND_BY_GROUP
|
||||||
|
* 添加待办 ADD_NEED_DEAL
|
||||||
|
* 打卡 CLOCK_IN
|
||||||
* <p>
|
* <p>
|
||||||
* 非操作类型 300
|
* 非操作类型 300
|
||||||
* 机器人普通日志记录 ROBOT_LOG
|
* 机器人普通日志记录 ROBOT_LOG
|
||||||
@@ -69,6 +71,8 @@ public class WeworkMessageBean {
|
|||||||
public static final int PUSH_FILE = 218;
|
public static final int PUSH_FILE = 218;
|
||||||
public static final int DISMISS_GROUP = 219;
|
public static final int DISMISS_GROUP = 219;
|
||||||
public static final int ADD_FRIEND_BY_GROUP = 220;
|
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_LOG = 301;
|
||||||
public static final int ROBOT_ERROR_LOG = 302;
|
public static final int ROBOT_ERROR_LOG = 302;
|
||||||
|
|||||||
@@ -150,6 +150,12 @@ object MyLooper {
|
|||||||
WeworkMessageBean.ADD_FRIEND_BY_GROUP -> {
|
WeworkMessageBean.ADD_FRIEND_BY_GROUP -> {
|
||||||
WeworkController.addFriendByGroup(message)
|
WeworkController.addFriendByGroup(message)
|
||||||
}
|
}
|
||||||
|
WeworkMessageBean.ADD_NEED_DEAL -> {
|
||||||
|
WeworkController.addNeedDeal(message)
|
||||||
|
}
|
||||||
|
WeworkMessageBean.CLOCK_IN -> {
|
||||||
|
WeworkController.clockIn(message)
|
||||||
|
}
|
||||||
WeworkMessageBean.SHOW_GROUP_INFO -> {
|
WeworkMessageBean.SHOW_GROUP_INFO -> {
|
||||||
WeworkController.showGroupInfo(message)
|
WeworkController.showGroupInfo(message)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
* @see WeworkMessageBean.PUSH_MICRO_DISK_IMAGE
|
||||||
|
|||||||
@@ -927,6 +927,110 @@ object WeworkOperationImpl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加待办
|
||||||
|
* @see WeworkMessageBean.ADD_NEED_DEAL
|
||||||
|
* @param titleList 内部用户昵称列表
|
||||||
|
* @param receivedContent 回复内容
|
||||||
|
*/
|
||||||
|
fun addNeedDeal(
|
||||||
|
message: WeworkMessageBean,
|
||||||
|
titleList: MutableList<String>,
|
||||||
|
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
|
* @see WeworkMessageBean.SHOW_GROUP_INFO
|
||||||
@@ -966,7 +1070,7 @@ object WeworkOperationImpl {
|
|||||||
* selectList 昵称或群名列表
|
* selectList 昵称或群名列表
|
||||||
* extraText 转发是否附加一条文本
|
* extraText 转发是否附加一条文本
|
||||||
*/
|
*/
|
||||||
private fun relaySelectTarget(selectList: List<String>, extraText: String? = null): Boolean {
|
private fun relaySelectTarget(selectList: List<String>, extraText: String? = null, needSend: Boolean = true): Boolean {
|
||||||
//聊天消息列表 1ListView 0RecycleView xViewGroup
|
//聊天消息列表 1ListView 0RecycleView xViewGroup
|
||||||
val list = AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView)
|
val list = AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView)
|
||||||
if (list != null) {
|
if (list != null) {
|
||||||
@@ -1019,6 +1123,9 @@ object WeworkOperationImpl {
|
|||||||
if (confirmButton != null) {
|
if (confirmButton != null) {
|
||||||
AccessibilityUtil.performClick(confirmButton)
|
AccessibilityUtil.performClick(confirmButton)
|
||||||
sleep(Constant.POP_WINDOW_INTERVAL)
|
sleep(Constant.POP_WINDOW_INTERVAL)
|
||||||
|
if (!needSend) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
if (!extraText.isNullOrBlank()) {
|
if (!extraText.isNullOrBlank()) {
|
||||||
LogUtils.d("extraText: $extraText")
|
LogUtils.d("extraText: $extraText")
|
||||||
AccessibilityUtil.findTextInput(getRoot(), extraText)
|
AccessibilityUtil.findTextInput(getRoot(), extraText)
|
||||||
|
|||||||
@@ -40,10 +40,12 @@ object HostTestHelper {
|
|||||||
|
|
||||||
override fun onMessage(webSocket: WebSocket, text: String) {
|
override fun onMessage(webSocket: WebSocket, text: String) {
|
||||||
ToastUtils.showLong("链接: ${Constant.getWsUrl()}\nonMessage\ntext:$text")
|
ToastUtils.showLong("链接: ${Constant.getWsUrl()}\nonMessage\ntext:$text")
|
||||||
|
webSocket.close(1000, "接口测试成功")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onMessage(webSocket: WebSocket, bytes: ByteString) {
|
override fun onMessage(webSocket: WebSocket, bytes: ByteString) {
|
||||||
ToastUtils.showLong("链接: ${Constant.getWsUrl()}\nonMessage\nbytes:$bytes")
|
ToastUtils.showLong("链接: ${Constant.getWsUrl()}\nonMessage\nbytes:$bytes")
|
||||||
|
webSocket.close(1000, "接口测试成功")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onClosing(webSocket: WebSocket, code: Int, reason: String) {
|
override fun onClosing(webSocket: WebSocket, code: Int, reason: String) {
|
||||||
|
|||||||
@@ -1,30 +0,0 @@
|
|||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:aapt="http://schemas.android.com/aapt"
|
|
||||||
android:width="108dp"
|
|
||||||
android:height="108dp"
|
|
||||||
android:viewportWidth="108"
|
|
||||||
android:viewportHeight="108">
|
|
||||||
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
|
|
||||||
<aapt:attr name="android:fillColor">
|
|
||||||
<gradient
|
|
||||||
android:endX="85.84757"
|
|
||||||
android:endY="92.4963"
|
|
||||||
android:startX="42.9492"
|
|
||||||
android:startY="49.59793"
|
|
||||||
android:type="linear">
|
|
||||||
<item
|
|
||||||
android:color="#44000000"
|
|
||||||
android:offset="0.0" />
|
|
||||||
<item
|
|
||||||
android:color="#00000000"
|
|
||||||
android:offset="1.0" />
|
|
||||||
</gradient>
|
|
||||||
</aapt:attr>
|
|
||||||
</path>
|
|
||||||
<path
|
|
||||||
android:fillColor="#FFFFFF"
|
|
||||||
android:fillType="nonZero"
|
|
||||||
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
|
|
||||||
android:strokeWidth="1"
|
|
||||||
android:strokeColor="#00000000" />
|
|
||||||
</vector>
|
|
||||||
@@ -1,170 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:width="108dp"
|
|
||||||
android:height="108dp"
|
|
||||||
android:viewportWidth="108"
|
|
||||||
android:viewportHeight="108">
|
|
||||||
<path
|
|
||||||
android:fillColor="#3DDC84"
|
|
||||||
android:pathData="M0,0h108v108h-108z" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M9,0L9,108"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M19,0L19,108"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M29,0L29,108"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M39,0L39,108"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M49,0L49,108"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M59,0L59,108"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M69,0L69,108"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M79,0L79,108"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M89,0L89,108"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M99,0L99,108"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M0,9L108,9"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M0,19L108,19"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M0,29L108,29"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M0,39L108,39"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M0,49L108,49"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M0,59L108,59"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M0,69L108,69"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M0,79L108,79"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M0,89L108,89"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M0,99L108,99"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M19,29L89,29"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M19,39L89,39"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M19,49L89,49"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M19,59L89,59"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M19,69L89,69"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M19,79L89,79"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M29,19L29,89"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M39,19L39,89"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M49,19L49,89"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M59,19L59,89"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M69,19L69,89"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M79,19L79,89"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
</vector>
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<background android:drawable="@drawable/ic_launcher_background" />
|
|
||||||
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
|
||||||
</adaptive-icon>
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<background android:drawable="@drawable/ic_launcher_background" />
|
|
||||||
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
|
||||||
</adaptive-icon>
|
|
||||||
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 16 KiB |
@@ -19,4 +19,12 @@
|
|||||||
<string name="update_notification_channel_id" translatable="false">update</string>
|
<string name="update_notification_channel_id" translatable="false">update</string>
|
||||||
<string name="update_notification_channel_name" translatable="false">升级通知</string>
|
<string name="update_notification_channel_name" translatable="false">升级通知</string>
|
||||||
|
|
||||||
|
<!-- UI -->
|
||||||
|
<string name="tip">提示</string>
|
||||||
|
<string name="input_new_host">请输入新的host</string>
|
||||||
|
<string name="delete">删除</string>
|
||||||
|
<string name="cancel">取消</string>
|
||||||
|
<string name="confirm">确认</string>
|
||||||
|
<string name="add">新增</string>
|
||||||
|
<string name="host_list">host列表</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<!-- Base application theme. -->
|
<!-- Base application theme. -->
|
||||||
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
|
<!-- <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">-->
|
||||||
|
<style name="AppTheme" parent="QMUI.Compat.NoActionBar">
|
||||||
<!-- Customize your theme here. -->
|
<!-- Customize your theme here. -->
|
||||||
<item name="colorPrimary">@color/colorPrimary</item>
|
<item name="colorPrimary">@color/colorPrimary</item>
|
||||||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
||||||
|
|||||||