update icon;添加待办;打卡;QMUI
@@ -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'
|
||||
}
|
||||
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.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,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("请输入专线网络")
|
||||
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()) {
|
||||
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!")
|
||||
}
|
||||
}
|
||||
.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())) {
|
||||
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
|
||||
HostTestHelper.testWs()
|
||||
commentDialog.dismiss()
|
||||
dialog.dismiss()
|
||||
} else {
|
||||
ToastUtils.showLong("格式异常!")
|
||||
}
|
||||
@@ -236,11 +273,7 @@ class ListenActivity : AppCompatActivity() {
|
||||
ToastUtils.showLong("请勿为空!")
|
||||
}
|
||||
}
|
||||
val cancelBtn: Button = commentDialog.findViewById(R.id.cancel) as Button
|
||||
cancelBtn.setOnClickListener {
|
||||
commentDialog.dismiss()
|
||||
}
|
||||
commentDialog.show()
|
||||
.create(R.style.QMUI_Dialog).show()
|
||||
}
|
||||
|
||||
private var needToWork = false
|
||||
|
||||
@@ -34,6 +34,8 @@ public class WeworkMessageBean {
|
||||
* 推送文件(网络图片视频和文件等) PUSH_FILE
|
||||
* 解散群聊 DISMISS_GROUP
|
||||
* 从外部群添加好友 ADD_FRIEND_BY_GROUP
|
||||
* 添加待办 ADD_NEED_DEAL
|
||||
* 打卡 CLOCK_IN
|
||||
* <p>
|
||||
* 非操作类型 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;
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -966,7 +1070,7 @@ object WeworkOperationImpl {
|
||||
* selectList 昵称或群名列表
|
||||
* 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
|
||||
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)
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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_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>
|
||||
@@ -1,6 +1,7 @@
|
||||
<resources>
|
||||
<!-- 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. -->
|
||||
<item name="colorPrimary">@color/colorPrimary</item>
|
||||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
||||
|
||||