mirror of
https://github.com/pppscn/SmsForwarder
synced 2025-08-02 17:07:41 +08:00
新增:自动任务·快捷指令 (开发中)
This commit is contained in:
parent
0faa6bf26a
commit
bceebbddd4
@ -4,23 +4,11 @@ import android.os.Bundle
|
|||||||
import androidx.viewbinding.ViewBinding
|
import androidx.viewbinding.ViewBinding
|
||||||
import com.idormy.sms.forwarder.core.BaseActivity
|
import com.idormy.sms.forwarder.core.BaseActivity
|
||||||
import com.idormy.sms.forwarder.fragment.ClientFragment
|
import com.idormy.sms.forwarder.fragment.ClientFragment
|
||||||
import com.idormy.sms.forwarder.utils.EVENT_TOAST_ERROR
|
|
||||||
import com.idormy.sms.forwarder.utils.EVENT_TOAST_SUCCESS
|
|
||||||
import com.idormy.sms.forwarder.utils.XToastUtils
|
|
||||||
import com.jeremyliao.liveeventbus.LiveEventBus
|
|
||||||
|
|
||||||
class ClientActivity : BaseActivity<ViewBinding?>() {
|
class ClientActivity : BaseActivity<ViewBinding?>() {
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
openPage(ClientFragment::class.java)
|
openPage(ClientFragment::class.java)
|
||||||
|
|
||||||
//替换 Looper.loop() 后再 Toast 形式
|
|
||||||
LiveEventBus.get(EVENT_TOAST_SUCCESS, String::class.java).observe(this) { msg: String ->
|
|
||||||
XToastUtils.success(msg)
|
|
||||||
}
|
|
||||||
LiveEventBus.get(EVENT_TOAST_ERROR, String::class.java).observe(this) { msg: String ->
|
|
||||||
XToastUtils.error(msg, 15000)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -264,14 +264,6 @@ class MainActivity : BaseActivity<ActivityMainBinding?>(),
|
|||||||
LiveEventBus.get(EVENT_UPDATE_RULE_TYPE, String::class.java).observe(this) { type: String ->
|
LiveEventBus.get(EVENT_UPDATE_RULE_TYPE, String::class.java).observe(this) { type: String ->
|
||||||
ruleType = type
|
ruleType = type
|
||||||
}
|
}
|
||||||
|
|
||||||
//替换 Looper.loop() 后再 Toast 形式
|
|
||||||
LiveEventBus.get(EVENT_TOAST_SUCCESS, String::class.java).observe(this) { msg: String ->
|
|
||||||
XToastUtils.success(msg)
|
|
||||||
}
|
|
||||||
LiveEventBus.get(EVENT_TOAST_ERROR, String::class.java).observe(this) { msg: String ->
|
|
||||||
XToastUtils.error(msg, 15000)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -4,23 +4,11 @@ import android.os.Bundle
|
|||||||
import androidx.viewbinding.ViewBinding
|
import androidx.viewbinding.ViewBinding
|
||||||
import com.idormy.sms.forwarder.core.BaseActivity
|
import com.idormy.sms.forwarder.core.BaseActivity
|
||||||
import com.idormy.sms.forwarder.fragment.TasksFragment
|
import com.idormy.sms.forwarder.fragment.TasksFragment
|
||||||
import com.idormy.sms.forwarder.utils.EVENT_TOAST_ERROR
|
|
||||||
import com.idormy.sms.forwarder.utils.EVENT_TOAST_SUCCESS
|
|
||||||
import com.idormy.sms.forwarder.utils.XToastUtils
|
|
||||||
import com.jeremyliao.liveeventbus.LiveEventBus
|
|
||||||
|
|
||||||
class TaskActivity : BaseActivity<ViewBinding?>() {
|
class TaskActivity : BaseActivity<ViewBinding?>() {
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
openPage(TasksFragment::class.java)
|
openPage(TasksFragment::class.java)
|
||||||
|
|
||||||
//替换 Looper.loop() 后再 Toast 形式
|
|
||||||
LiveEventBus.get(EVENT_TOAST_SUCCESS, String::class.java).observe(this) { msg: String ->
|
|
||||||
XToastUtils.success(msg)
|
|
||||||
}
|
|
||||||
LiveEventBus.get(EVENT_TOAST_ERROR, String::class.java).observe(this) { msg: String ->
|
|
||||||
XToastUtils.error(msg, 15000)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -15,7 +15,7 @@ import com.idormy.sms.forwarder.R
|
|||||||
import com.idormy.sms.forwarder.adapter.TaskPagingAdapter.MyViewHolder
|
import com.idormy.sms.forwarder.adapter.TaskPagingAdapter.MyViewHolder
|
||||||
import com.idormy.sms.forwarder.database.entity.Task
|
import com.idormy.sms.forwarder.database.entity.Task
|
||||||
import com.idormy.sms.forwarder.databinding.AdapterTasksCardViewListItemBinding
|
import com.idormy.sms.forwarder.databinding.AdapterTasksCardViewListItemBinding
|
||||||
import com.idormy.sms.forwarder.entity.task.TaskSetting
|
import com.idormy.sms.forwarder.entity.TaskSetting
|
||||||
import com.xuexiang.xutil.data.DateUtils
|
import com.xuexiang.xutil.data.DateUtils
|
||||||
|
|
||||||
class TaskPagingAdapter(private val itemClickListener: OnItemClickListener) : PagingDataAdapter<Task, MyViewHolder>(diffCallback) {
|
class TaskPagingAdapter(private val itemClickListener: OnItemClickListener) : PagingDataAdapter<Task, MyViewHolder>(diffCallback) {
|
||||||
|
@ -12,7 +12,7 @@ import android.widget.TextView
|
|||||||
import androidx.recyclerview.widget.ItemTouchHelper
|
import androidx.recyclerview.widget.ItemTouchHelper
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.entity.task.TaskSetting
|
import com.idormy.sms.forwarder.entity.TaskSetting
|
||||||
|
|
||||||
class TaskSettingAdapter(
|
class TaskSettingAdapter(
|
||||||
val itemList: MutableList<TaskSetting>,
|
val itemList: MutableList<TaskSetting>,
|
||||||
|
@ -5,6 +5,12 @@ import android.os.Bundle
|
|||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.viewbinding.ViewBinding
|
import androidx.viewbinding.ViewBinding
|
||||||
|
import com.idormy.sms.forwarder.utils.EVENT_TOAST_ERROR
|
||||||
|
import com.idormy.sms.forwarder.utils.EVENT_TOAST_INFO
|
||||||
|
import com.idormy.sms.forwarder.utils.EVENT_TOAST_SUCCESS
|
||||||
|
import com.idormy.sms.forwarder.utils.EVENT_TOAST_WARNING
|
||||||
|
import com.idormy.sms.forwarder.utils.XToastUtils
|
||||||
|
import com.jeremyliao.liveeventbus.LiveEventBus
|
||||||
import com.xuexiang.xpage.base.XPageActivity
|
import com.xuexiang.xpage.base.XPageActivity
|
||||||
import com.xuexiang.xpage.base.XPageFragment
|
import com.xuexiang.xpage.base.XPageFragment
|
||||||
import com.xuexiang.xpage.core.CoreSwitchBean
|
import com.xuexiang.xpage.core.CoreSwitchBean
|
||||||
@ -47,6 +53,20 @@ open class BaseActivity<Binding : ViewBinding?> : XPageActivity() {
|
|||||||
initStatusBarStyle()
|
initStatusBarStyle()
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
registerSlideBack()
|
registerSlideBack()
|
||||||
|
|
||||||
|
//用于接收各种事件的吐司
|
||||||
|
LiveEventBus.get(EVENT_TOAST_ERROR, String::class.java).observe(this) { msg: String ->
|
||||||
|
XToastUtils.error(msg, 15000)
|
||||||
|
}
|
||||||
|
LiveEventBus.get(EVENT_TOAST_SUCCESS, String::class.java).observe(this) { msg: String ->
|
||||||
|
XToastUtils.success(msg)
|
||||||
|
}
|
||||||
|
LiveEventBus.get(EVENT_TOAST_INFO, String::class.java).observe(this) { msg: String ->
|
||||||
|
XToastUtils.info(msg)
|
||||||
|
}
|
||||||
|
LiveEventBus.get(EVENT_TOAST_WARNING, String::class.java).observe(this) { msg: String ->
|
||||||
|
XToastUtils.warning(msg, 10000)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,7 +1,13 @@
|
|||||||
package com.idormy.sms.forwarder.database.dao
|
package com.idormy.sms.forwarder.database.dao
|
||||||
|
|
||||||
import androidx.paging.PagingSource
|
import androidx.paging.PagingSource
|
||||||
import androidx.room.*
|
import androidx.room.Dao
|
||||||
|
import androidx.room.Delete
|
||||||
|
import androidx.room.Insert
|
||||||
|
import androidx.room.Query
|
||||||
|
import androidx.room.RawQuery
|
||||||
|
import androidx.room.Transaction
|
||||||
|
import androidx.room.Update
|
||||||
import androidx.sqlite.db.SupportSQLiteQuery
|
import androidx.sqlite.db.SupportSQLiteQuery
|
||||||
import com.idormy.sms.forwarder.database.entity.Frpc
|
import com.idormy.sms.forwarder.database.entity.Frpc
|
||||||
import io.reactivex.Single
|
import io.reactivex.Single
|
||||||
@ -31,6 +37,9 @@ interface FrpcDao {
|
|||||||
@Query("SELECT * FROM Frpc where autorun=1")
|
@Query("SELECT * FROM Frpc where autorun=1")
|
||||||
fun getAutorun(): List<Frpc>
|
fun getAutorun(): List<Frpc>
|
||||||
|
|
||||||
|
@Query("SELECT * FROM Frpc WHERE uid IN (:uids)")
|
||||||
|
fun getByUids(uids: List<String>): List<Frpc>
|
||||||
|
|
||||||
@Query("SELECT * FROM Frpc ORDER BY time DESC")
|
@Query("SELECT * FROM Frpc ORDER BY time DESC")
|
||||||
fun pagingSource(): PagingSource<Int, Frpc>
|
fun pagingSource(): PagingSource<Int, Frpc>
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package com.idormy.sms.forwarder.entity.task
|
package com.idormy.sms.forwarder.entity
|
||||||
|
|
||||||
import com.idormy.sms.forwarder.utils.task.TaskUtils
|
import com.idormy.sms.forwarder.utils.task.TaskUtils
|
||||||
import java.io.Serializable
|
import java.io.Serializable
|
@ -0,0 +1,9 @@
|
|||||||
|
package com.idormy.sms.forwarder.entity.action
|
||||||
|
|
||||||
|
import java.io.Serializable
|
||||||
|
|
||||||
|
data class FrpcSetting(
|
||||||
|
var description: String = "", //描述
|
||||||
|
var action: String = "start", //动作: start=启动, stop=停止
|
||||||
|
var uids: String = "", //指定配置UID,多个以半角逗号分隔
|
||||||
|
) : Serializable
|
@ -0,0 +1,10 @@
|
|||||||
|
package com.idormy.sms.forwarder.entity.action
|
||||||
|
|
||||||
|
import java.io.Serializable
|
||||||
|
|
||||||
|
data class HttpServerSetting(
|
||||||
|
var description: String = "", //描述
|
||||||
|
var action: String = "start", //动作: start=启动, stop=停止
|
||||||
|
var startUid: String = "", //手机号码
|
||||||
|
var stopUid: String = "", //短信内容
|
||||||
|
) : Serializable
|
@ -1,4 +1,4 @@
|
|||||||
package com.idormy.sms.forwarder.entity.task
|
package com.idormy.sms.forwarder.entity.action
|
||||||
|
|
||||||
import java.io.Serializable
|
import java.io.Serializable
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package com.idormy.sms.forwarder.entity.task
|
package com.idormy.sms.forwarder.entity.condition
|
||||||
|
|
||||||
import android.os.BatteryManager
|
import android.os.BatteryManager
|
||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
@ -1,4 +1,4 @@
|
|||||||
package com.idormy.sms.forwarder.entity.task
|
package com.idormy.sms.forwarder.entity.condition
|
||||||
|
|
||||||
import android.os.BatteryManager
|
import android.os.BatteryManager
|
||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
@ -1,4 +1,4 @@
|
|||||||
package com.idormy.sms.forwarder.entity.task
|
package com.idormy.sms.forwarder.entity.condition
|
||||||
|
|
||||||
import java.io.Serializable
|
import java.io.Serializable
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package com.idormy.sms.forwarder.entity.task
|
package com.idormy.sms.forwarder.entity.condition
|
||||||
|
|
||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import java.io.Serializable
|
import java.io.Serializable
|
@ -1,4 +1,4 @@
|
|||||||
package com.idormy.sms.forwarder.entity.task
|
package com.idormy.sms.forwarder.entity.condition
|
||||||
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
@ -1,4 +1,4 @@
|
|||||||
package com.idormy.sms.forwarder.entity.task
|
package com.idormy.sms.forwarder.entity.condition
|
||||||
|
|
||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.xuexiang.xutil.resource.ResUtils.getString
|
import com.xuexiang.xutil.resource.ResUtils.getString
|
@ -1,4 +1,4 @@
|
|||||||
package com.idormy.sms.forwarder.entity.task
|
package com.idormy.sms.forwarder.entity.condition
|
||||||
|
|
||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.xuexiang.xutil.resource.ResUtils.getString
|
import com.xuexiang.xutil.resource.ResUtils.getString
|
@ -24,8 +24,8 @@ import com.idormy.sms.forwarder.database.entity.Task
|
|||||||
import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory
|
import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory
|
||||||
import com.idormy.sms.forwarder.database.viewmodel.TaskViewModel
|
import com.idormy.sms.forwarder.database.viewmodel.TaskViewModel
|
||||||
import com.idormy.sms.forwarder.databinding.FragmentTasksEditBinding
|
import com.idormy.sms.forwarder.databinding.FragmentTasksEditBinding
|
||||||
import com.idormy.sms.forwarder.entity.task.CronSetting
|
import com.idormy.sms.forwarder.entity.TaskSetting
|
||||||
import com.idormy.sms.forwarder.entity.task.TaskSetting
|
import com.idormy.sms.forwarder.entity.condition.CronSetting
|
||||||
import com.idormy.sms.forwarder.service.LocationService
|
import com.idormy.sms.forwarder.service.LocationService
|
||||||
import com.idormy.sms.forwarder.utils.*
|
import com.idormy.sms.forwarder.utils.*
|
||||||
import com.idormy.sms.forwarder.utils.task.CronJobScheduler
|
import com.idormy.sms.forwarder.utils.task.CronJobScheduler
|
||||||
|
@ -9,9 +9,10 @@ import android.view.ViewGroup
|
|||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.core.BaseFragment
|
import com.idormy.sms.forwarder.core.BaseFragment
|
||||||
import com.idormy.sms.forwarder.databinding.FragmentTasksActionSendSmsBinding
|
import com.idormy.sms.forwarder.databinding.FragmentTasksActionFrpcBinding
|
||||||
import com.idormy.sms.forwarder.entity.task.CronSetting
|
import com.idormy.sms.forwarder.entity.action.FrpcSetting
|
||||||
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_ACTION
|
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_ACTION
|
||||||
|
import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_ACTION
|
||||||
import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_ACTION
|
import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_ACTION
|
||||||
import com.idormy.sms.forwarder.utils.KEY_TEST_ACTION
|
import com.idormy.sms.forwarder.utils.KEY_TEST_ACTION
|
||||||
import com.idormy.sms.forwarder.utils.TASK_ACTION_FRPC
|
import com.idormy.sms.forwarder.utils.TASK_ACTION_FRPC
|
||||||
@ -26,7 +27,7 @@ import com.xuexiang.xui.widget.actionbar.TitleBar
|
|||||||
|
|
||||||
@Page(name = "Frpc")
|
@Page(name = "Frpc")
|
||||||
@Suppress("PrivatePropertyName")
|
@Suppress("PrivatePropertyName")
|
||||||
class FrpcFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.OnClickListener {
|
class FrpcFragment : BaseFragment<FragmentTasksActionFrpcBinding?>(), View.OnClickListener {
|
||||||
|
|
||||||
private val TAG: String = FrpcFragment::class.java.simpleName
|
private val TAG: String = FrpcFragment::class.java.simpleName
|
||||||
private var titleBar: TitleBar? = null
|
private var titleBar: TitleBar? = null
|
||||||
@ -36,7 +37,6 @@ class FrpcFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.On
|
|||||||
@AutoWired(name = KEY_EVENT_DATA_ACTION)
|
@AutoWired(name = KEY_EVENT_DATA_ACTION)
|
||||||
var eventData: String? = null
|
var eventData: String? = null
|
||||||
|
|
||||||
private var expression = "* * * * * ? *"
|
|
||||||
private var description = "测试描述"
|
private var description = "测试描述"
|
||||||
|
|
||||||
override fun initArgs() {
|
override fun initArgs() {
|
||||||
@ -46,8 +46,8 @@ class FrpcFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.On
|
|||||||
override fun viewBindingInflate(
|
override fun viewBindingInflate(
|
||||||
inflater: LayoutInflater,
|
inflater: LayoutInflater,
|
||||||
container: ViewGroup,
|
container: ViewGroup,
|
||||||
): FragmentTasksActionSendSmsBinding {
|
): FragmentTasksActionFrpcBinding {
|
||||||
return FragmentTasksActionSendSmsBinding.inflate(inflater, container, false)
|
return FragmentTasksActionFrpcBinding.inflate(inflater, container, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun initTitle(): TitleBar? {
|
override fun initTitle(): TitleBar? {
|
||||||
@ -71,9 +71,26 @@ class FrpcFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.On
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
binding!!.rgFrpcState.setOnCheckedChangeListener { _, checkedId ->
|
||||||
|
when (checkedId) {
|
||||||
|
R.id.rb_start_server -> {
|
||||||
|
binding!!.layoutStartServer.visibility = View.VISIBLE
|
||||||
|
binding!!.layoutStopServer.visibility = View.GONE
|
||||||
|
}
|
||||||
|
|
||||||
|
R.id.rb_stop_server -> {
|
||||||
|
binding!!.layoutStartServer.visibility = View.GONE
|
||||||
|
binding!!.layoutStopServer.visibility = View.VISIBLE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Log.d(TAG, "initViews eventData:$eventData")
|
Log.d(TAG, "initViews eventData:$eventData")
|
||||||
if (eventData != null) {
|
if (eventData != null) {
|
||||||
val settingVo = Gson().fromJson(eventData, CronSetting::class.java)
|
val settingVo = Gson().fromJson(eventData, FrpcSetting::class.java)
|
||||||
|
binding!!.etStartUid.setText(settingVo.uids)
|
||||||
|
binding!!.etStopUid.setText(settingVo.uids)
|
||||||
|
binding!!.rgFrpcState.check(if (settingVo.action == "start") R.id.rb_start_server else R.id.rb_stop_server)
|
||||||
Log.d(TAG, "initViews settingVo:$settingVo")
|
Log.d(TAG, "initViews settingVo:$settingVo")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -121,6 +138,7 @@ class FrpcFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.On
|
|||||||
R.id.btn_save -> {
|
R.id.btn_save -> {
|
||||||
val settingVo = checkSetting()
|
val settingVo = checkSetting()
|
||||||
val intent = Intent()
|
val intent = Intent()
|
||||||
|
intent.putExtra(KEY_BACK_DESCRIPTION_ACTION, description)
|
||||||
intent.putExtra(KEY_BACK_DATA_ACTION, Gson().toJson(settingVo))
|
intent.putExtra(KEY_BACK_DATA_ACTION, Gson().toJson(settingVo))
|
||||||
setFragmentResult(TASK_ACTION_FRPC, intent)
|
setFragmentResult(TASK_ACTION_FRPC, intent)
|
||||||
popToBack()
|
popToBack()
|
||||||
@ -135,7 +153,20 @@ class FrpcFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.On
|
|||||||
|
|
||||||
//检查设置
|
//检查设置
|
||||||
@SuppressLint("SetTextI18n")
|
@SuppressLint("SetTextI18n")
|
||||||
private fun checkSetting(): CronSetting {
|
private fun checkSetting(): FrpcSetting {
|
||||||
return CronSetting(description, expression)
|
val startUid = binding!!.etStartUid.text.toString().trim()
|
||||||
|
val stopUid = binding!!.etStopUid.text.toString().trim()
|
||||||
|
val action: String
|
||||||
|
val uids: String
|
||||||
|
if (binding!!.rgFrpcState.checkedRadioButtonId == R.id.rb_start_server) {
|
||||||
|
description = if (startUid == "") "启动全部自启动的Frpc" else "启动UID为${startUid}的Frpc"
|
||||||
|
action = "start"
|
||||||
|
uids = startUid
|
||||||
|
} else {
|
||||||
|
description = if (stopUid == "") "停止全部自启动的Frpc" else "停止UID为${stopUid}的Frpc"
|
||||||
|
action = "stop"
|
||||||
|
uids = stopUid
|
||||||
|
}
|
||||||
|
return FrpcSetting(description, action, uids)
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -10,7 +10,7 @@ import com.google.gson.Gson
|
|||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.core.BaseFragment
|
import com.idormy.sms.forwarder.core.BaseFragment
|
||||||
import com.idormy.sms.forwarder.databinding.FragmentTasksActionSendSmsBinding
|
import com.idormy.sms.forwarder.databinding.FragmentTasksActionSendSmsBinding
|
||||||
import com.idormy.sms.forwarder.entity.task.CronSetting
|
import com.idormy.sms.forwarder.entity.condition.CronSetting
|
||||||
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_ACTION
|
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_ACTION
|
||||||
import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_ACTION
|
import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_ACTION
|
||||||
import com.idormy.sms.forwarder.utils.KEY_TEST_ACTION
|
import com.idormy.sms.forwarder.utils.KEY_TEST_ACTION
|
||||||
|
@ -18,7 +18,7 @@ import com.idormy.sms.forwarder.App
|
|||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.core.BaseFragment
|
import com.idormy.sms.forwarder.core.BaseFragment
|
||||||
import com.idormy.sms.forwarder.databinding.FragmentTasksActionSendSmsBinding
|
import com.idormy.sms.forwarder.databinding.FragmentTasksActionSendSmsBinding
|
||||||
import com.idormy.sms.forwarder.entity.task.SmsSetting
|
import com.idormy.sms.forwarder.entity.action.SmsSetting
|
||||||
import com.idormy.sms.forwarder.server.model.ConfigData
|
import com.idormy.sms.forwarder.server.model.ConfigData
|
||||||
import com.idormy.sms.forwarder.utils.EVENT_KEY_PHONE_NUMBERS
|
import com.idormy.sms.forwarder.utils.EVENT_KEY_PHONE_NUMBERS
|
||||||
import com.idormy.sms.forwarder.utils.EVENT_KEY_SIM_SLOT
|
import com.idormy.sms.forwarder.utils.EVENT_KEY_SIM_SLOT
|
||||||
|
@ -11,7 +11,7 @@ import com.google.gson.Gson
|
|||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.core.BaseFragment
|
import com.idormy.sms.forwarder.core.BaseFragment
|
||||||
import com.idormy.sms.forwarder.databinding.FragmentTasksConditionBatteryBinding
|
import com.idormy.sms.forwarder.databinding.FragmentTasksConditionBatteryBinding
|
||||||
import com.idormy.sms.forwarder.entity.task.BatterySetting
|
import com.idormy.sms.forwarder.entity.condition.BatterySetting
|
||||||
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION
|
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION
|
||||||
import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_CONDITION
|
import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_CONDITION
|
||||||
import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_CONDITION
|
import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_CONDITION
|
||||||
|
@ -10,7 +10,7 @@ import com.google.gson.Gson
|
|||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.core.BaseFragment
|
import com.idormy.sms.forwarder.core.BaseFragment
|
||||||
import com.idormy.sms.forwarder.databinding.FragmentTasksConditionChargeBinding
|
import com.idormy.sms.forwarder.databinding.FragmentTasksConditionChargeBinding
|
||||||
import com.idormy.sms.forwarder.entity.task.ChargeSetting
|
import com.idormy.sms.forwarder.entity.condition.ChargeSetting
|
||||||
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION
|
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION
|
||||||
import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_CONDITION
|
import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_CONDITION
|
||||||
import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_CONDITION
|
import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_CONDITION
|
||||||
|
@ -14,7 +14,7 @@ import com.google.gson.Gson
|
|||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.core.BaseFragment
|
import com.idormy.sms.forwarder.core.BaseFragment
|
||||||
import com.idormy.sms.forwarder.databinding.FragmentTasksConditionCronBinding
|
import com.idormy.sms.forwarder.databinding.FragmentTasksConditionCronBinding
|
||||||
import com.idormy.sms.forwarder.entity.task.CronSetting
|
import com.idormy.sms.forwarder.entity.condition.CronSetting
|
||||||
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION
|
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION
|
||||||
import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_CONDITION
|
import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_CONDITION
|
||||||
import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_CONDITION
|
import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_CONDITION
|
||||||
|
@ -13,7 +13,7 @@ import com.idormy.sms.forwarder.App
|
|||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.core.BaseFragment
|
import com.idormy.sms.forwarder.core.BaseFragment
|
||||||
import com.idormy.sms.forwarder.databinding.FragmentTasksConditionLeaveAddressBinding
|
import com.idormy.sms.forwarder.databinding.FragmentTasksConditionLeaveAddressBinding
|
||||||
import com.idormy.sms.forwarder.entity.task.LocationSetting
|
import com.idormy.sms.forwarder.entity.condition.LocationSetting
|
||||||
import com.idormy.sms.forwarder.service.LocationService
|
import com.idormy.sms.forwarder.service.LocationService
|
||||||
import com.idormy.sms.forwarder.utils.HttpServerUtils
|
import com.idormy.sms.forwarder.utils.HttpServerUtils
|
||||||
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION
|
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION
|
||||||
|
@ -10,7 +10,7 @@ import com.google.gson.Gson
|
|||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.core.BaseFragment
|
import com.idormy.sms.forwarder.core.BaseFragment
|
||||||
import com.idormy.sms.forwarder.databinding.FragmentTasksConditionLockScreenBinding
|
import com.idormy.sms.forwarder.databinding.FragmentTasksConditionLockScreenBinding
|
||||||
import com.idormy.sms.forwarder.entity.task.LockScreenSetting
|
import com.idormy.sms.forwarder.entity.condition.LockScreenSetting
|
||||||
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION
|
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION
|
||||||
import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_CONDITION
|
import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_CONDITION
|
||||||
import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_CONDITION
|
import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_CONDITION
|
||||||
|
@ -12,7 +12,7 @@ import com.google.gson.Gson
|
|||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.core.BaseFragment
|
import com.idormy.sms.forwarder.core.BaseFragment
|
||||||
import com.idormy.sms.forwarder.databinding.FragmentTasksConditionNetworkBinding
|
import com.idormy.sms.forwarder.databinding.FragmentTasksConditionNetworkBinding
|
||||||
import com.idormy.sms.forwarder.entity.task.NetworkSetting
|
import com.idormy.sms.forwarder.entity.condition.NetworkSetting
|
||||||
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION
|
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION
|
||||||
import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_CONDITION
|
import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_CONDITION
|
||||||
import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_CONDITION
|
import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_CONDITION
|
||||||
|
@ -10,7 +10,7 @@ import com.google.gson.Gson
|
|||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.core.BaseFragment
|
import com.idormy.sms.forwarder.core.BaseFragment
|
||||||
import com.idormy.sms.forwarder.databinding.FragmentTasksConditionSimBinding
|
import com.idormy.sms.forwarder.databinding.FragmentTasksConditionSimBinding
|
||||||
import com.idormy.sms.forwarder.entity.task.SimSetting
|
import com.idormy.sms.forwarder.entity.condition.SimSetting
|
||||||
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION
|
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION
|
||||||
import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_CONDITION
|
import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_CONDITION
|
||||||
import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_CONDITION
|
import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_CONDITION
|
||||||
|
@ -13,7 +13,7 @@ import com.idormy.sms.forwarder.App
|
|||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.core.BaseFragment
|
import com.idormy.sms.forwarder.core.BaseFragment
|
||||||
import com.idormy.sms.forwarder.databinding.FragmentTasksConditionToAddressBinding
|
import com.idormy.sms.forwarder.databinding.FragmentTasksConditionToAddressBinding
|
||||||
import com.idormy.sms.forwarder.entity.task.LocationSetting
|
import com.idormy.sms.forwarder.entity.condition.LocationSetting
|
||||||
import com.idormy.sms.forwarder.service.LocationService
|
import com.idormy.sms.forwarder.service.LocationService
|
||||||
import com.idormy.sms.forwarder.utils.HttpServerUtils
|
import com.idormy.sms.forwarder.utils.HttpServerUtils
|
||||||
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION
|
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_CONDITION
|
||||||
|
@ -355,6 +355,8 @@ const val KEY_URL = "key_url"
|
|||||||
//吐司监听
|
//吐司监听
|
||||||
const val EVENT_TOAST_SUCCESS = "key_toast_success"
|
const val EVENT_TOAST_SUCCESS = "key_toast_success"
|
||||||
const val EVENT_TOAST_ERROR = "key_toast_error"
|
const val EVENT_TOAST_ERROR = "key_toast_error"
|
||||||
|
const val EVENT_TOAST_INFO = "key_toast_info"
|
||||||
|
const val EVENT_TOAST_WARNING = "key_toast_warning"
|
||||||
|
|
||||||
//主页监听时间
|
//主页监听时间
|
||||||
const val EVENT_UPDATE_LOGS_TYPE = "key_logs_type"
|
const val EVENT_UPDATE_LOGS_TYPE = "key_logs_type"
|
||||||
|
@ -49,39 +49,20 @@ class SmsCommandUtils {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TextUtils.isEmpty(param)) {
|
GlobalScope.async(Dispatchers.IO) {
|
||||||
GlobalScope.async(Dispatchers.IO) {
|
val frpcList = if (param.isEmpty()) {
|
||||||
val frpcList = AppDatabase.getInstance(App.context).frpcDao().getAutorun()
|
AppDatabase.getInstance(App.context).frpcDao().getAutorun()
|
||||||
|
} else {
|
||||||
if (frpcList.isEmpty()) {
|
val uids = param.split(",")
|
||||||
Log.d(TAG, "没有自启动的Frpc")
|
AppDatabase.getInstance(App.context).frpcDao().getByUids(uids)
|
||||||
return@async
|
|
||||||
}
|
|
||||||
|
|
||||||
for (frpc in frpcList) {
|
|
||||||
if (action == "start") {
|
|
||||||
if (!Frpclib.isRunning(frpc.uid)) {
|
|
||||||
val error = Frpclib.runContent(frpc.uid, frpc.config)
|
|
||||||
if (!TextUtils.isEmpty(error)) {
|
|
||||||
Log.e(TAG, error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (action == "stop") {
|
|
||||||
if (Frpclib.isRunning(frpc.uid)) {
|
|
||||||
Frpclib.close(frpc.uid)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
GlobalScope.async(Dispatchers.IO) {
|
|
||||||
val frpc = AppDatabase.getInstance(App.context).frpcDao().getOne(param)
|
|
||||||
|
|
||||||
if (frpc.uid.isEmpty()) {
|
if (frpcList.isEmpty()) {
|
||||||
Log.d(TAG, "没有找到指定的Frpc")
|
Log.d(TAG, "没有需要操作的Frpc")
|
||||||
return@async
|
return@async
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (frpc in frpcList) {
|
||||||
if (action == "start") {
|
if (action == "start") {
|
||||||
if (!Frpclib.isRunning(frpc.uid)) {
|
if (!Frpclib.isRunning(frpc.uid)) {
|
||||||
val error = Frpclib.runContent(frpc.uid, frpc.config)
|
val error = Frpclib.runContent(frpc.uid, frpc.config)
|
||||||
|
@ -3,14 +3,14 @@ package com.idormy.sms.forwarder.utils.task
|
|||||||
import android.os.BatteryManager
|
import android.os.BatteryManager
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import com.idormy.sms.forwarder.entity.task.BatterySetting
|
import com.idormy.sms.forwarder.entity.TaskSetting
|
||||||
import com.idormy.sms.forwarder.entity.task.ChargeSetting
|
import com.idormy.sms.forwarder.entity.condition.BatterySetting
|
||||||
import com.idormy.sms.forwarder.entity.task.CronSetting
|
import com.idormy.sms.forwarder.entity.condition.ChargeSetting
|
||||||
import com.idormy.sms.forwarder.entity.task.LocationSetting
|
import com.idormy.sms.forwarder.entity.condition.CronSetting
|
||||||
import com.idormy.sms.forwarder.entity.task.LockScreenSetting
|
import com.idormy.sms.forwarder.entity.condition.LocationSetting
|
||||||
import com.idormy.sms.forwarder.entity.task.NetworkSetting
|
import com.idormy.sms.forwarder.entity.condition.LockScreenSetting
|
||||||
import com.idormy.sms.forwarder.entity.task.SimSetting
|
import com.idormy.sms.forwarder.entity.condition.NetworkSetting
|
||||||
import com.idormy.sms.forwarder.entity.task.TaskSetting
|
import com.idormy.sms.forwarder.entity.condition.SimSetting
|
||||||
import com.idormy.sms.forwarder.utils.DELAY_TIME_AFTER_SIM_READY
|
import com.idormy.sms.forwarder.utils.DELAY_TIME_AFTER_SIM_READY
|
||||||
import com.idormy.sms.forwarder.utils.TASK_CONDITION_BATTERY
|
import com.idormy.sms.forwarder.utils.TASK_CONDITION_BATTERY
|
||||||
import com.idormy.sms.forwarder.utils.TASK_CONDITION_CHARGE
|
import com.idormy.sms.forwarder.utils.TASK_CONDITION_CHARGE
|
||||||
|
@ -2,6 +2,7 @@ package com.idormy.sms.forwarder.workers
|
|||||||
|
|
||||||
import android.Manifest
|
import android.Manifest
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.core.app.ActivityCompat
|
import androidx.core.app.ActivityCompat
|
||||||
@ -10,26 +11,40 @@ import androidx.work.WorkerParameters
|
|||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import com.idormy.sms.forwarder.App
|
import com.idormy.sms.forwarder.App
|
||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
|
import com.idormy.sms.forwarder.database.AppDatabase
|
||||||
import com.idormy.sms.forwarder.database.entity.Rule
|
import com.idormy.sms.forwarder.database.entity.Rule
|
||||||
import com.idormy.sms.forwarder.entity.MsgInfo
|
import com.idormy.sms.forwarder.entity.MsgInfo
|
||||||
import com.idormy.sms.forwarder.entity.task.SmsSetting
|
import com.idormy.sms.forwarder.entity.TaskSetting
|
||||||
import com.idormy.sms.forwarder.entity.task.TaskSetting
|
import com.idormy.sms.forwarder.entity.action.FrpcSetting
|
||||||
|
import com.idormy.sms.forwarder.entity.action.HttpServerSetting
|
||||||
|
import com.idormy.sms.forwarder.entity.action.SmsSetting
|
||||||
|
import com.idormy.sms.forwarder.service.HttpServerService
|
||||||
|
import com.idormy.sms.forwarder.utils.EVENT_TOAST_ERROR
|
||||||
|
import com.idormy.sms.forwarder.utils.EVENT_TOAST_INFO
|
||||||
|
import com.idormy.sms.forwarder.utils.EVENT_TOAST_SUCCESS
|
||||||
|
import com.idormy.sms.forwarder.utils.EVENT_TOAST_WARNING
|
||||||
import com.idormy.sms.forwarder.utils.PhoneUtils
|
import com.idormy.sms.forwarder.utils.PhoneUtils
|
||||||
import com.idormy.sms.forwarder.utils.SendUtils
|
import com.idormy.sms.forwarder.utils.SendUtils
|
||||||
|
import com.idormy.sms.forwarder.utils.TASK_ACTION_FRPC
|
||||||
|
import com.idormy.sms.forwarder.utils.TASK_ACTION_HTTPSERVER
|
||||||
import com.idormy.sms.forwarder.utils.TASK_ACTION_NOTIFICATION
|
import com.idormy.sms.forwarder.utils.TASK_ACTION_NOTIFICATION
|
||||||
import com.idormy.sms.forwarder.utils.TASK_ACTION_SENDSMS
|
import com.idormy.sms.forwarder.utils.TASK_ACTION_SENDSMS
|
||||||
import com.idormy.sms.forwarder.utils.TaskWorker
|
import com.idormy.sms.forwarder.utils.TaskWorker
|
||||||
|
import com.jeremyliao.liveeventbus.LiveEventBus
|
||||||
|
import com.xuexiang.xrouter.utils.TextUtils
|
||||||
import com.xuexiang.xui.utils.ResUtils
|
import com.xuexiang.xui.utils.ResUtils
|
||||||
import com.xuexiang.xutil.XUtil
|
import com.xuexiang.xutil.file.FileUtils
|
||||||
|
import frpclib.Frpclib
|
||||||
|
|
||||||
//执行每个task具体动作任务
|
//执行每个task具体动作任务
|
||||||
@Suppress("PrivatePropertyName", "DEPRECATION")
|
@Suppress("PrivatePropertyName", "DEPRECATION")
|
||||||
class ActionWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {
|
class ActionWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {
|
||||||
|
|
||||||
private val TAG: String = ActionWorker::class.java.simpleName
|
private val TAG: String = ActionWorker::class.java.simpleName
|
||||||
|
private var taskId = -1L
|
||||||
|
|
||||||
override suspend fun doWork(): Result {
|
override suspend fun doWork(): Result {
|
||||||
val taskId = inputData.getLong(TaskWorker.taskId, -1L)
|
taskId = inputData.getLong(TaskWorker.taskId, -1L)
|
||||||
val taskActionsJson = inputData.getString(TaskWorker.taskActions)
|
val taskActionsJson = inputData.getString(TaskWorker.taskActions)
|
||||||
val msgInfoJson = inputData.getString(TaskWorker.msgInfo)
|
val msgInfoJson = inputData.getString(TaskWorker.msgInfo)
|
||||||
Log.d(TAG, "taskId: $taskId, taskActionsJson: $taskActionsJson, msgInfoJson: $msgInfoJson")
|
Log.d(TAG, "taskId: $taskId, taskActionsJson: $taskActionsJson, msgInfoJson: $msgInfoJson")
|
||||||
@ -40,13 +55,13 @@ class ActionWorker(context: Context, params: WorkerParameters) : CoroutineWorker
|
|||||||
|
|
||||||
val actionList = Gson().fromJson(taskActionsJson, Array<TaskSetting>::class.java).toMutableList()
|
val actionList = Gson().fromJson(taskActionsJson, Array<TaskSetting>::class.java).toMutableList()
|
||||||
if (actionList.isEmpty()) {
|
if (actionList.isEmpty()) {
|
||||||
Log.d(TAG, "任务$taskId:actionList is empty")
|
writeLog("actionList is empty")
|
||||||
return Result.failure()
|
return Result.failure()
|
||||||
}
|
}
|
||||||
|
|
||||||
val msgInfo = Gson().fromJson(msgInfoJson, MsgInfo::class.java)
|
val msgInfo = Gson().fromJson(msgInfoJson, MsgInfo::class.java)
|
||||||
if (msgInfo == null) {
|
if (msgInfo == null) {
|
||||||
Log.d(TAG, "任务$taskId:msgInfo is null")
|
writeLog("msgInfo is null")
|
||||||
return Result.failure()
|
return Result.failure()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,7 +72,7 @@ class ActionWorker(context: Context, params: WorkerParameters) : CoroutineWorker
|
|||||||
TASK_ACTION_SENDSMS -> {
|
TASK_ACTION_SENDSMS -> {
|
||||||
val smsSetting = Gson().fromJson(action.setting, SmsSetting::class.java)
|
val smsSetting = Gson().fromJson(action.setting, SmsSetting::class.java)
|
||||||
if (smsSetting == null) {
|
if (smsSetting == null) {
|
||||||
Log.d(TAG, "任务$taskId:smsSetting is null")
|
writeLog("smsSetting is null")
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
//获取卡槽信息
|
//获取卡槽信息
|
||||||
@ -71,14 +86,14 @@ class ActionWorker(context: Context, params: WorkerParameters) : CoroutineWorker
|
|||||||
//TODO:取不到卡槽信息时,采用默认卡槽发送
|
//TODO:取不到卡槽信息时,采用默认卡槽发送
|
||||||
val mSubscriptionId: Int = App.SimInfoList[simSlotIndex]?.mSubscriptionId ?: -1
|
val mSubscriptionId: Int = App.SimInfoList[simSlotIndex]?.mSubscriptionId ?: -1
|
||||||
|
|
||||||
val msg = if (ActivityCompat.checkSelfPermission(XUtil.getContext(), Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
|
val msg = if (ActivityCompat.checkSelfPermission(App.context, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
|
||||||
ResUtils.getString(R.string.no_sms_sending_permission)
|
ResUtils.getString(R.string.no_sms_sending_permission)
|
||||||
} else {
|
} else {
|
||||||
PhoneUtils.sendSms(mSubscriptionId, smsSetting.phoneNumbers, smsSetting.msgContent)
|
PhoneUtils.sendSms(mSubscriptionId, smsSetting.phoneNumbers, smsSetting.msgContent)
|
||||||
successNum++
|
successNum++
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.d(TAG, "任务$taskId:send sms result: $msg")
|
writeLog("send sms result: $msg")
|
||||||
}
|
}
|
||||||
|
|
||||||
TASK_ACTION_NOTIFICATION -> {
|
TASK_ACTION_NOTIFICATION -> {
|
||||||
@ -88,17 +103,107 @@ class ActionWorker(context: Context, params: WorkerParameters) : CoroutineWorker
|
|||||||
successNum++
|
successNum++
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TASK_ACTION_FRPC -> {
|
||||||
|
if (!FileUtils.isFileExists(App.context.filesDir?.absolutePath + "/libs/libgojni.so")) {
|
||||||
|
writeLog("还未下载Frpc库")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
val frpcSetting = Gson().fromJson(action.setting, FrpcSetting::class.java)
|
||||||
|
if (frpcSetting == null) {
|
||||||
|
writeLog("frpcSetting is null")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
val frpcList = if (frpcSetting.uids.isEmpty()) {
|
||||||
|
AppDatabase.getInstance(App.context).frpcDao().getAutorun()
|
||||||
|
} else {
|
||||||
|
val uids = frpcSetting.uids.split(",")
|
||||||
|
AppDatabase.getInstance(App.context).frpcDao().getByUids(uids)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (frpcList.isEmpty()) {
|
||||||
|
writeLog("没有需要操作的Frpc")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
for (frpc in frpcList) {
|
||||||
|
if (frpcSetting.action == "start") {
|
||||||
|
if (!Frpclib.isRunning(frpc.uid)) {
|
||||||
|
val error = Frpclib.runContent(frpc.uid, frpc.config)
|
||||||
|
if (!TextUtils.isEmpty(error)) {
|
||||||
|
Log.e(TAG, error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (frpcSetting.action == "stop") {
|
||||||
|
if (Frpclib.isRunning(frpc.uid)) {
|
||||||
|
Frpclib.close(frpc.uid)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TASK_ACTION_HTTPSERVER -> {
|
||||||
|
val httpServerSetting = Gson().fromJson(action.setting, HttpServerSetting::class.java)
|
||||||
|
if (httpServerSetting == null) {
|
||||||
|
writeLog("httpServerSetting is null")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
Intent(App.context, HttpServerService::class.java).also {
|
||||||
|
if (httpServerSetting.action == "start") {
|
||||||
|
App.context.startService(it)
|
||||||
|
} else if (httpServerSetting.action == "stop") {
|
||||||
|
App.context.stopService(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
Log.d(TAG, "任务$taskId:action.type is ${action.type}")
|
writeLog("action.type is ${action.type}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
Log.d(TAG, "任务$taskId:action.type is ${action.type}, exception: ${e.message}")
|
writeLog("action.type is ${action.type}, exception: ${e.message}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return if (successNum == actionList.size) Result.success() else Result.failure()
|
return if (successNum == actionList.size) Result.success() else Result.failure()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun writeLog(msg: String, level: String = "DEBUG") {
|
||||||
|
val key = when (level) {
|
||||||
|
"INFO" -> {
|
||||||
|
Log.i(TAG, "TASK-$taskId:$msg")
|
||||||
|
EVENT_TOAST_INFO
|
||||||
|
}
|
||||||
|
|
||||||
|
"WARN" -> {
|
||||||
|
Log.w(TAG, "TASK-$taskId:$msg")
|
||||||
|
EVENT_TOAST_WARNING
|
||||||
|
}
|
||||||
|
|
||||||
|
"ERROR" -> {
|
||||||
|
Log.e(TAG, "TASK-$taskId:$msg")
|
||||||
|
EVENT_TOAST_ERROR
|
||||||
|
}
|
||||||
|
|
||||||
|
"SUCCESS" -> {
|
||||||
|
Log.d(TAG, "TASK-$taskId:$msg")
|
||||||
|
EVENT_TOAST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> {
|
||||||
|
Log.d(TAG, "TASK-$taskId:$msg")
|
||||||
|
""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (taskId == 0L && key.isNotEmpty()) {
|
||||||
|
LiveEventBus.get(key, String::class.java).post(msg)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: 写入日志
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -11,9 +11,9 @@ import com.google.gson.Gson
|
|||||||
import com.idormy.sms.forwarder.App
|
import com.idormy.sms.forwarder.App
|
||||||
import com.idormy.sms.forwarder.database.AppDatabase
|
import com.idormy.sms.forwarder.database.AppDatabase
|
||||||
import com.idormy.sms.forwarder.entity.MsgInfo
|
import com.idormy.sms.forwarder.entity.MsgInfo
|
||||||
import com.idormy.sms.forwarder.entity.task.BatterySetting
|
import com.idormy.sms.forwarder.entity.TaskSetting
|
||||||
import com.idormy.sms.forwarder.entity.task.ChargeSetting
|
import com.idormy.sms.forwarder.entity.condition.BatterySetting
|
||||||
import com.idormy.sms.forwarder.entity.task.TaskSetting
|
import com.idormy.sms.forwarder.entity.condition.ChargeSetting
|
||||||
import com.idormy.sms.forwarder.utils.TASK_CONDITION_BATTERY
|
import com.idormy.sms.forwarder.utils.TASK_CONDITION_BATTERY
|
||||||
import com.idormy.sms.forwarder.utils.TASK_CONDITION_CHARGE
|
import com.idormy.sms.forwarder.utils.TASK_CONDITION_CHARGE
|
||||||
import com.idormy.sms.forwarder.utils.TaskWorker
|
import com.idormy.sms.forwarder.utils.TaskWorker
|
||||||
|
@ -11,8 +11,8 @@ import com.google.gson.Gson
|
|||||||
import com.idormy.sms.forwarder.App
|
import com.idormy.sms.forwarder.App
|
||||||
import com.idormy.sms.forwarder.database.AppDatabase
|
import com.idormy.sms.forwarder.database.AppDatabase
|
||||||
import com.idormy.sms.forwarder.entity.MsgInfo
|
import com.idormy.sms.forwarder.entity.MsgInfo
|
||||||
import com.idormy.sms.forwarder.entity.task.CronSetting
|
import com.idormy.sms.forwarder.entity.TaskSetting
|
||||||
import com.idormy.sms.forwarder.entity.task.TaskSetting
|
import com.idormy.sms.forwarder.entity.condition.CronSetting
|
||||||
import com.idormy.sms.forwarder.utils.TaskWorker
|
import com.idormy.sms.forwarder.utils.TaskWorker
|
||||||
import com.idormy.sms.forwarder.utils.task.ConditionUtils
|
import com.idormy.sms.forwarder.utils.task.ConditionUtils
|
||||||
import com.idormy.sms.forwarder.utils.task.CronJobScheduler
|
import com.idormy.sms.forwarder.utils.task.CronJobScheduler
|
||||||
|
@ -13,8 +13,8 @@ import com.idormy.sms.forwarder.R
|
|||||||
import com.idormy.sms.forwarder.database.AppDatabase
|
import com.idormy.sms.forwarder.database.AppDatabase
|
||||||
import com.idormy.sms.forwarder.entity.LocationInfo
|
import com.idormy.sms.forwarder.entity.LocationInfo
|
||||||
import com.idormy.sms.forwarder.entity.MsgInfo
|
import com.idormy.sms.forwarder.entity.MsgInfo
|
||||||
import com.idormy.sms.forwarder.entity.task.LocationSetting
|
import com.idormy.sms.forwarder.entity.TaskSetting
|
||||||
import com.idormy.sms.forwarder.entity.task.TaskSetting
|
import com.idormy.sms.forwarder.entity.condition.LocationSetting
|
||||||
import com.idormy.sms.forwarder.utils.TASK_CONDITION_LEAVE_ADDRESS
|
import com.idormy.sms.forwarder.utils.TASK_CONDITION_LEAVE_ADDRESS
|
||||||
import com.idormy.sms.forwarder.utils.TASK_CONDITION_TO_ADDRESS
|
import com.idormy.sms.forwarder.utils.TASK_CONDITION_TO_ADDRESS
|
||||||
import com.idormy.sms.forwarder.utils.TaskWorker
|
import com.idormy.sms.forwarder.utils.TaskWorker
|
||||||
|
@ -12,8 +12,8 @@ import com.google.gson.Gson
|
|||||||
import com.idormy.sms.forwarder.App
|
import com.idormy.sms.forwarder.App
|
||||||
import com.idormy.sms.forwarder.database.AppDatabase
|
import com.idormy.sms.forwarder.database.AppDatabase
|
||||||
import com.idormy.sms.forwarder.entity.MsgInfo
|
import com.idormy.sms.forwarder.entity.MsgInfo
|
||||||
import com.idormy.sms.forwarder.entity.task.LockScreenSetting
|
import com.idormy.sms.forwarder.entity.TaskSetting
|
||||||
import com.idormy.sms.forwarder.entity.task.TaskSetting
|
import com.idormy.sms.forwarder.entity.condition.LockScreenSetting
|
||||||
import com.idormy.sms.forwarder.utils.TaskWorker
|
import com.idormy.sms.forwarder.utils.TaskWorker
|
||||||
import com.idormy.sms.forwarder.utils.task.ConditionUtils
|
import com.idormy.sms.forwarder.utils.task.ConditionUtils
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
|
@ -12,8 +12,8 @@ import com.idormy.sms.forwarder.App
|
|||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.database.AppDatabase
|
import com.idormy.sms.forwarder.database.AppDatabase
|
||||||
import com.idormy.sms.forwarder.entity.MsgInfo
|
import com.idormy.sms.forwarder.entity.MsgInfo
|
||||||
import com.idormy.sms.forwarder.entity.task.NetworkSetting
|
import com.idormy.sms.forwarder.entity.TaskSetting
|
||||||
import com.idormy.sms.forwarder.entity.task.TaskSetting
|
import com.idormy.sms.forwarder.entity.condition.NetworkSetting
|
||||||
import com.idormy.sms.forwarder.utils.PhoneUtils
|
import com.idormy.sms.forwarder.utils.PhoneUtils
|
||||||
import com.idormy.sms.forwarder.utils.TaskWorker
|
import com.idormy.sms.forwarder.utils.TaskWorker
|
||||||
import com.idormy.sms.forwarder.utils.task.ConditionUtils
|
import com.idormy.sms.forwarder.utils.task.ConditionUtils
|
||||||
|
@ -13,8 +13,8 @@ import com.idormy.sms.forwarder.App
|
|||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.database.AppDatabase
|
import com.idormy.sms.forwarder.database.AppDatabase
|
||||||
import com.idormy.sms.forwarder.entity.MsgInfo
|
import com.idormy.sms.forwarder.entity.MsgInfo
|
||||||
import com.idormy.sms.forwarder.entity.task.SimSetting
|
import com.idormy.sms.forwarder.entity.TaskSetting
|
||||||
import com.idormy.sms.forwarder.entity.task.TaskSetting
|
import com.idormy.sms.forwarder.entity.condition.SimSetting
|
||||||
import com.idormy.sms.forwarder.utils.PhoneUtils
|
import com.idormy.sms.forwarder.utils.PhoneUtils
|
||||||
import com.idormy.sms.forwarder.utils.TaskWorker
|
import com.idormy.sms.forwarder.utils.TaskWorker
|
||||||
import com.idormy.sms.forwarder.utils.task.ConditionUtils
|
import com.idormy.sms.forwarder.utils.task.ConditionUtils
|
||||||
|
181
app/src/main/res/layout/fragment_tasks_action_frpc.xml
Normal file
181
app/src/main/res/layout/fragment_tasks_action_frpc.xml
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="?attr/xui_config_color_background"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<androidx.core.widget.NestedScrollView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:overScrollMode="never">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="5dp"
|
||||||
|
android:gravity="center_horizontal"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.AppCompatImageView
|
||||||
|
android:layout_width="120dp"
|
||||||
|
android:layout_height="120dp"
|
||||||
|
android:layout_margin="10dp"
|
||||||
|
android:contentDescription="@string/task_frpc"
|
||||||
|
app:srcCompat="@drawable/auto_task_icon_frpc"
|
||||||
|
tools:ignore="ImageContrastCheck" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
style="@style/taskBarStyle"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/task_frpc"
|
||||||
|
android:textSize="18sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_description"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/task_frpc_tips"
|
||||||
|
android:textSize="10sp"
|
||||||
|
tools:ignore="SmallSp" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="1dp"
|
||||||
|
android:layout_marginTop="5dp"
|
||||||
|
android:layout_marginBottom="5dp"
|
||||||
|
android:background="?attr/xui_config_color_separator_light" />
|
||||||
|
|
||||||
|
<RadioGroup
|
||||||
|
android:id="@+id/rg_frpc_state"
|
||||||
|
style="@style/rg_style"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingBottom="@dimen/config_padding_5dp">
|
||||||
|
|
||||||
|
<RadioButton
|
||||||
|
android:id="@+id/rb_start_server"
|
||||||
|
style="@style/rg_rb_style_match"
|
||||||
|
android:checked="true"
|
||||||
|
android:text="@string/start_server"
|
||||||
|
tools:ignore="TouchTargetSizeCheck" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/layout_start_server"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="@dimen/config_margin_10dp"
|
||||||
|
android:layout_marginEnd="@dimen/config_margin_10dp"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:text="@string/specified_uid"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/et_start_uid"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_marginStart="5dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:hint="@string/specified_uid_hint"
|
||||||
|
android:importantForAutofill="no"
|
||||||
|
tools:ignore="TextContrastCheck,TextFields,TouchTargetSizeCheck" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<RadioButton
|
||||||
|
android:id="@+id/rb_stop_server"
|
||||||
|
style="@style/rg_rb_style_match"
|
||||||
|
android:text="@string/stop_server"
|
||||||
|
tools:ignore="TouchTargetSizeCheck" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/layout_stop_server"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="@dimen/config_margin_10dp"
|
||||||
|
android:layout_marginEnd="@dimen/config_margin_10dp"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:visibility="gone">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:text="@string/specified_uid"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/et_stop_uid"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_marginStart="5dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:hint="@string/specified_uid_hint"
|
||||||
|
android:importantForAutofill="no"
|
||||||
|
tools:ignore="TextContrastCheck,TextFields,TouchTargetSizeCheck" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</RadioGroup>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</androidx.core.widget.NestedScrollView>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:padding="10dp">
|
||||||
|
|
||||||
|
<com.xuexiang.xui.widget.textview.supertextview.SuperButton
|
||||||
|
android:id="@+id/btn_del"
|
||||||
|
style="@style/SuperButton.Gray.Icon"
|
||||||
|
android:drawableStart="@drawable/icon_delete"
|
||||||
|
android:paddingStart="15dp"
|
||||||
|
android:text="@string/discard"
|
||||||
|
android:textSize="11sp"
|
||||||
|
tools:ignore="RtlSymmetry,TextContrastCheck,TouchTargetSizeCheck" />
|
||||||
|
|
||||||
|
<com.xuexiang.xui.widget.textview.supertextview.SuperButton
|
||||||
|
android:id="@+id/btn_save"
|
||||||
|
style="@style/SuperButton.Blue.Icon"
|
||||||
|
android:layout_marginStart="10dp"
|
||||||
|
android:drawableStart="@drawable/icon_save"
|
||||||
|
android:paddingStart="15dp"
|
||||||
|
android:text="@string/submit"
|
||||||
|
android:textSize="11sp"
|
||||||
|
tools:ignore="RtlSymmetry,TextContrastCheck,TouchTargetSizeCheck" />
|
||||||
|
|
||||||
|
<com.xuexiang.xui.widget.textview.supertextview.SuperButton
|
||||||
|
android:id="@+id/btn_test"
|
||||||
|
style="@style/SuperButton.Green.Icon"
|
||||||
|
android:layout_marginStart="10dp"
|
||||||
|
android:drawableStart="@drawable/icon_test"
|
||||||
|
android:paddingStart="15dp"
|
||||||
|
android:text="@string/test"
|
||||||
|
android:textSize="11sp"
|
||||||
|
tools:ignore="RtlSymmetry,TextContrastCheck,TouchTargetSizeCheck" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
@ -1147,6 +1147,7 @@
|
|||||||
<string name="task_sendsms">Send Sms</string>
|
<string name="task_sendsms">Send Sms</string>
|
||||||
<string name="task_notification">Notification</string>
|
<string name="task_notification">Notification</string>
|
||||||
<string name="task_frpc">Frpc Setting</string>
|
<string name="task_frpc">Frpc Setting</string>
|
||||||
|
<string name="task_frpc_tips">Control the start/stop of FRPC.</string>
|
||||||
<string name="task_server">Server Setting</string>
|
<string name="task_server">Server Setting</string>
|
||||||
|
|
||||||
<string name="second">Second</string>
|
<string name="second">Second</string>
|
||||||
@ -1252,4 +1253,7 @@
|
|||||||
<string name="current_address">Current Address: %s</string>
|
<string name="current_address">Current Address: %s</string>
|
||||||
<string name="location_failed">Location failed. Please try again later.</string>
|
<string name="location_failed">Location failed. Please try again later.</string>
|
||||||
<string name="current_distance_from_center">, %s meters from the center.</string>
|
<string name="current_distance_from_center">, %s meters from the center.</string>
|
||||||
|
|
||||||
|
<string name="specified_uid">Specified Uid</string>
|
||||||
|
<string name="specified_uid_hint">Enter FRPC config UIDs, separate with commas.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -1148,6 +1148,7 @@
|
|||||||
<string name="task_sendsms">发送短信</string>
|
<string name="task_sendsms">发送短信</string>
|
||||||
<string name="task_notification">通道推送</string>
|
<string name="task_notification">通道推送</string>
|
||||||
<string name="task_frpc">Frpc设置</string>
|
<string name="task_frpc">Frpc设置</string>
|
||||||
|
<string name="task_frpc_tips">控制内网穿透·FRPC的启动/停止</string>
|
||||||
<string name="task_server">HttpServer设置</string>
|
<string name="task_server">HttpServer设置</string>
|
||||||
|
|
||||||
<string name="second">秒</string>
|
<string name="second">秒</string>
|
||||||
@ -1253,4 +1254,7 @@
|
|||||||
<string name="current_address">当前地址:%s</string>
|
<string name="current_address">当前地址:%s</string>
|
||||||
<string name="location_failed">定位失败,请稍后重试</string>
|
<string name="location_failed">定位失败,请稍后重试</string>
|
||||||
<string name="current_distance_from_center">, 当前距离中心%s米</string>
|
<string name="current_distance_from_center">, 当前距离中心%s米</string>
|
||||||
|
|
||||||
|
<string name="specified_uid">指定配置</string>
|
||||||
|
<string name="specified_uid_hint">填写frpc的uid,多个以半角逗号分隔</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user