diff --git a/app/src/main/java/com/idormy/sms/forwarder/entity/action/CleanerSetting.kt b/app/src/main/java/com/idormy/sms/forwarder/entity/action/CleanerSetting.kt new file mode 100644 index 00000000..4d448ed7 --- /dev/null +++ b/app/src/main/java/com/idormy/sms/forwarder/entity/action/CleanerSetting.kt @@ -0,0 +1,8 @@ +package com.idormy.sms.forwarder.entity.action + +import java.io.Serializable + +data class CleanerSetting( + var description: String = "", //描述 + var days: Int = 0, //自动删除N天前的转发记录 +) : Serializable diff --git a/app/src/main/java/com/idormy/sms/forwarder/entity/action/HttpServerSetting.kt b/app/src/main/java/com/idormy/sms/forwarder/entity/action/HttpServerSetting.kt index 66670eb5..23e0e5e8 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/entity/action/HttpServerSetting.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/entity/action/HttpServerSetting.kt @@ -1,10 +1,18 @@ package com.idormy.sms.forwarder.entity.action +import com.idormy.sms.forwarder.utils.HttpServerUtils import java.io.Serializable data class HttpServerSetting( var description: String = "", //描述 var action: String = "start", //动作: start=启动, stop=停止 - var startUid: String = "", //手机号码 - var stopUid: String = "", //短信内容 + var enableApiClone: Boolean = HttpServerUtils.enableApiClone, //是否启用一键克隆 + var enableApiSmsSend: Boolean = HttpServerUtils.enableApiSmsSend, //是否启用远程发短信 + var enableApiSmsQuery: Boolean = HttpServerUtils.enableApiSmsQuery, //是否启用远程查短信 + var enableApiCallQuery: Boolean = HttpServerUtils.enableApiCallQuery, //是否启用远程查通话记录 + var enableApiContactQuery: Boolean = HttpServerUtils.enableApiContactQuery, //是否启用远程查联系人 + var enableApiContactAdd: Boolean = HttpServerUtils.enableApiContactAdd, //是否启用远程加联系人 + var enableApiWol: Boolean = HttpServerUtils.enableApiWol, //是否启用远程WOL + var enableApiLocation: Boolean = HttpServerUtils.enableApiLocation, //是否启用远程找手机 + var enableApiBatteryQuery: Boolean = HttpServerUtils.enableApiBatteryQuery, //是否启用远程查电量 ) : Serializable diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/TasksEditFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/TasksEditFragment.kt index 4f8aabdc..113d6a5a 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/TasksEditFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/TasksEditFragment.kt @@ -166,12 +166,19 @@ class TasksEditFragment : BaseFragment(), View.OnClic R.drawable.auto_task_icon_frpc ), PageInfo( - getString(R.string.task_server), + getString(R.string.task_http_server), "com.idormy.sms.forwarder.fragment.action.HttpServerFragment", "{\"\":\"\"}", CoreAnim.slide, R.drawable.auto_task_icon_http_server ), + PageInfo( + getString(R.string.task_cleaner), + "com.idormy.sms.forwarder.fragment.action.CleanerFragment", + "{\"\":\"\"}", + CoreAnim.slide, + R.drawable.auto_task_icon_cleaner + ), ) override fun initArgs() { diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/action/CleanerFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/action/CleanerFragment.kt new file mode 100644 index 00000000..a4c26904 --- /dev/null +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/action/CleanerFragment.kt @@ -0,0 +1,144 @@ +package com.idormy.sms.forwarder.fragment.action + +import android.annotation.SuppressLint +import android.content.Intent +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.google.gson.Gson +import com.idormy.sms.forwarder.R +import com.idormy.sms.forwarder.core.BaseFragment +import com.idormy.sms.forwarder.databinding.FragmentTasksActionCleanerBinding +import com.idormy.sms.forwarder.entity.action.CleanerSetting +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_TEST_ACTION +import com.idormy.sms.forwarder.utils.TASK_ACTION_CLEANER +import com.idormy.sms.forwarder.utils.XToastUtils +import com.jeremyliao.liveeventbus.LiveEventBus +import com.xuexiang.xaop.annotation.SingleClick +import com.xuexiang.xpage.annotation.Page +import com.xuexiang.xrouter.annotation.AutoWired +import com.xuexiang.xrouter.launcher.XRouter +import com.xuexiang.xui.utils.CountDownButtonHelper +import com.xuexiang.xui.widget.actionbar.TitleBar + +@Page(name = "Cleaner") +@Suppress("PrivatePropertyName") +class CleanerFragment : BaseFragment(), View.OnClickListener { + + private val TAG: String = CleanerFragment::class.java.simpleName + private var titleBar: TitleBar? = null + private var mCountDownHelper: CountDownButtonHelper? = null + + @JvmField + @AutoWired(name = KEY_EVENT_DATA_ACTION) + var eventData: String? = null + + override fun initArgs() { + XRouter.getInstance().inject(this) + } + + override fun viewBindingInflate( + inflater: LayoutInflater, + container: ViewGroup, + ): FragmentTasksActionCleanerBinding { + return FragmentTasksActionCleanerBinding.inflate(inflater, container, false) + } + + override fun initTitle(): TitleBar? { + titleBar = super.initTitle()!!.setImmersive(false).setTitle(R.string.task_cleaner) + return titleBar + } + + /** + * 初始化控件 + */ + override fun initViews() { + //测试按钮增加倒计时,避免重复点击 + mCountDownHelper = CountDownButtonHelper(binding!!.btnTest, 3) + mCountDownHelper!!.setOnCountDownListener(object : CountDownButtonHelper.OnCountDownListener { + override fun onCountDown(time: Int) { + binding!!.btnTest.text = String.format(getString(R.string.seconds_n), time) + } + + override fun onFinished() { + binding!!.btnTest.text = getString(R.string.test) + } + }) + + var settingVo = CleanerSetting(getString(R.string.task_cleaner_tips), 0) + Log.d(TAG, "initViews eventData:$eventData") + if (eventData != null) { + settingVo = Gson().fromJson(eventData, CleanerSetting::class.java) + Log.d(TAG, "initViews settingVo:$settingVo") + } + binding!!.xsbDays.setDefaultValue(settingVo.days) + } + + @SuppressLint("SetTextI18n") + override fun initListeners() { + binding!!.btnTest.setOnClickListener(this) + binding!!.btnDel.setOnClickListener(this) + binding!!.btnSave.setOnClickListener(this) + LiveEventBus.get(KEY_TEST_ACTION, String::class.java).observe(this) { + mCountDownHelper?.finish() + + if (it == "success") { + XToastUtils.success("测试通过", 30000) + } else { + XToastUtils.error(it, 30000) + } + } + } + + @SingleClick + override fun onClick(v: View) { + try { + when (v.id) { + R.id.btn_test -> { + mCountDownHelper?.start() + Thread { + try { + val settingVo = checkSetting() + Log.d(TAG, settingVo.toString()) + LiveEventBus.get(KEY_TEST_ACTION, String::class.java).post("success") + } catch (e: Exception) { + LiveEventBus.get(KEY_TEST_ACTION, String::class.java).post(e.message.toString()) + e.printStackTrace() + } + }.start() + return + } + + R.id.btn_del -> { + popToBack() + return + } + + R.id.btn_save -> { + val settingVo = checkSetting() + val intent = Intent() + intent.putExtra(KEY_BACK_DESCRIPTION_ACTION, settingVo.description) + intent.putExtra(KEY_BACK_DATA_ACTION, Gson().toJson(settingVo)) + setFragmentResult(TASK_ACTION_CLEANER, intent) + popToBack() + return + } + } + } catch (e: Exception) { + XToastUtils.error(e.message.toString(), 30000) + e.printStackTrace() + } + } + + //检查设置 + @SuppressLint("SetTextI18n") + private fun checkSetting(): CleanerSetting { + val days = binding!!.xsbDays.selectedNumber + val description = "自动删除${days}天前的转发记录" + return CleanerSetting(description, days) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/action/HttpServerFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/action/HttpServerFragment.kt index 79dbeb8a..14f94369 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/action/HttpServerFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/action/HttpServerFragment.kt @@ -9,9 +9,10 @@ import android.view.ViewGroup import com.google.gson.Gson import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.databinding.FragmentTasksActionSendSmsBinding -import com.idormy.sms.forwarder.entity.condition.CronSetting +import com.idormy.sms.forwarder.databinding.FragmentTasksActionHttpServerBinding +import com.idormy.sms.forwarder.entity.action.HttpServerSetting 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_TEST_ACTION import com.idormy.sms.forwarder.utils.TASK_ACTION_HTTPSERVER @@ -26,7 +27,7 @@ import com.xuexiang.xui.widget.actionbar.TitleBar @Page(name = "HttpServer") @Suppress("PrivatePropertyName") -class HttpServerFragment : BaseFragment(), View.OnClickListener { +class HttpServerFragment : BaseFragment(), View.OnClickListener { private val TAG: String = HttpServerFragment::class.java.simpleName private var titleBar: TitleBar? = null @@ -36,9 +37,6 @@ class HttpServerFragment : BaseFragment(), V @AutoWired(name = KEY_EVENT_DATA_ACTION) var eventData: String? = null - private var expression = "* * * * * ? *" - private var description = "测试描述" - override fun initArgs() { XRouter.getInstance().inject(this) } @@ -46,12 +44,12 @@ class HttpServerFragment : BaseFragment(), V override fun viewBindingInflate( inflater: LayoutInflater, container: ViewGroup, - ): FragmentTasksActionSendSmsBinding { - return FragmentTasksActionSendSmsBinding.inflate(inflater, container, false) + ): FragmentTasksActionHttpServerBinding { + return FragmentTasksActionHttpServerBinding.inflate(inflater, container, false) } override fun initTitle(): TitleBar? { - titleBar = super.initTitle()!!.setImmersive(false).setTitle(R.string.task_server) + titleBar = super.initTitle()!!.setImmersive(false).setTitle(R.string.task_http_server) return titleBar } @@ -72,10 +70,21 @@ class HttpServerFragment : BaseFragment(), V }) Log.d(TAG, "initViews eventData:$eventData") + var settingVo = HttpServerSetting(getString(R.string.task_http_server_tips)) if (eventData != null) { - val settingVo = Gson().fromJson(eventData, CronSetting::class.java) + settingVo = Gson().fromJson(eventData, HttpServerSetting::class.java) Log.d(TAG, "initViews settingVo:$settingVo") } + binding!!.rgHttpServerState.check(if (settingVo.action == "start") R.id.rb_start_server else R.id.rb_stop_server) + binding!!.sbApiClone.isChecked = settingVo.enableApiClone + binding!!.sbApiQuerySms.isChecked = settingVo.enableApiSmsQuery + binding!!.sbApiSendSms.isChecked = settingVo.enableApiSmsSend + binding!!.sbApiQueryCall.isChecked = settingVo.enableApiCallQuery + binding!!.sbApiQueryContacts.isChecked = settingVo.enableApiContactQuery + binding!!.sbApiAddContacts.isChecked = settingVo.enableApiContactAdd + binding!!.sbApiWol.isChecked = settingVo.enableApiWol + binding!!.sbApiLocation.isChecked = settingVo.enableApiLocation + binding!!.sbApiQueryBattery.isChecked = settingVo.enableApiBatteryQuery } @SuppressLint("SetTextI18n") @@ -121,6 +130,7 @@ class HttpServerFragment : BaseFragment(), V R.id.btn_save -> { val settingVo = checkSetting() val intent = Intent() + intent.putExtra(KEY_BACK_DESCRIPTION_ACTION, settingVo.description) intent.putExtra(KEY_BACK_DATA_ACTION, Gson().toJson(settingVo)) setFragmentResult(TASK_ACTION_HTTPSERVER, intent) popToBack() @@ -135,7 +145,52 @@ class HttpServerFragment : BaseFragment(), V //检查设置 @SuppressLint("SetTextI18n") - private fun checkSetting(): CronSetting { - return CronSetting(description, expression) + private fun checkSetting(): HttpServerSetting { + val enableList = mutableListOf() + val disableList = mutableListOf() + + val enableApiClone = binding!!.sbApiClone.isChecked + if (enableApiClone) enableList.add(getString(R.string.api_clone)) else disableList.add(getString(R.string.api_clone)) + + val enableApiSmsSend = binding!!.sbApiSendSms.isChecked + if (enableApiSmsSend) enableList.add(getString(R.string.api_sms_query)) else disableList.add(getString(R.string.api_sms_query)) + + val enableApiSmsQuery = binding!!.sbApiQuerySms.isChecked + if (enableApiSmsQuery) enableList.add(getString(R.string.api_sms_send)) else disableList.add(getString(R.string.api_sms_send)) + + val enableApiCallQuery = binding!!.sbApiQueryCall.isChecked + if (enableApiCallQuery) enableList.add(getString(R.string.api_call_query)) else disableList.add(getString(R.string.api_call_query)) + + val enableApiContactQuery = binding!!.sbApiQueryContacts.isChecked + if (enableApiContactQuery) enableList.add(getString(R.string.api_contact_query)) else disableList.add(getString(R.string.api_contact_query)) + + val enableApiContactAdd = binding!!.sbApiAddContacts.isChecked + if (enableApiContactAdd) enableList.add(getString(R.string.api_contact_add)) else disableList.add(getString(R.string.api_contact_add)) + + val enableApiWol = binding!!.sbApiWol.isChecked + if (enableApiWol) enableList.add(getString(R.string.api_wol)) else disableList.add(getString(R.string.api_wol)) + + val enableApiLocation = binding!!.sbApiLocation.isChecked + if (enableApiLocation) enableList.add(getString(R.string.api_location)) else disableList.add(getString(R.string.api_location)) + + val enableApiBatteryQuery = binding!!.sbApiQueryBattery.isChecked + if (enableApiBatteryQuery) enableList.add(getString(R.string.api_battery_query)) else disableList.add(getString(R.string.api_battery_query)) + + val description = StringBuilder() + val action = if (binding!!.rgHttpServerState.checkedRadioButtonId == R.id.rb_start_server) { + description.append(getString(R.string.start_server)) + if (enableList.isNotEmpty()) { + description.append(", ").append(getString(R.string.enable_function)).append(": ").append(enableList.joinToString("/")) + } + if (disableList.isNotEmpty()) { + description.append(", ").append(getString(R.string.disable_function)).append(": ").append(disableList.joinToString("/")) + } + "start" + } else { + description.append(getString(R.string.stop_server)) + "stop" + } + + return HttpServerSetting(description.toString(), action, enableApiClone, enableApiSmsSend, enableApiSmsQuery, enableApiCallQuery, enableApiContactQuery, enableApiContactAdd, enableApiWol, enableApiLocation, enableApiBatteryQuery) } } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/task/TaskUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/task/TaskUtils.kt index 6db0007b..ade441a8 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/task/TaskUtils.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/task/TaskUtils.kt @@ -18,6 +18,7 @@ import com.idormy.sms.forwarder.utils.SP_NETWORK_STATE import com.idormy.sms.forwarder.utils.SP_SIM_STATE import com.idormy.sms.forwarder.utils.SP_WIFI_SSID import com.idormy.sms.forwarder.utils.SharedPreference +import com.idormy.sms.forwarder.utils.TASK_ACTION_CLEANER 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 @@ -53,6 +54,7 @@ class TaskUtils private constructor() { TASK_ACTION_NOTIFICATION -> R.drawable.auto_task_icon_sender TASK_ACTION_FRPC -> R.drawable.auto_task_icon_frpc TASK_ACTION_HTTPSERVER -> R.drawable.auto_task_icon_http_server + TASK_ACTION_CLEANER -> R.drawable.auto_task_icon_cleaner else -> R.drawable.auto_task_icon_custom_time } } @@ -72,6 +74,7 @@ class TaskUtils private constructor() { TASK_ACTION_NOTIFICATION -> R.drawable.auto_task_icon_sender_grey TASK_ACTION_FRPC -> R.drawable.auto_task_icon_frpc_grey TASK_ACTION_HTTPSERVER -> R.drawable.auto_task_icon_http_server_grey + TASK_ACTION_CLEANER -> R.drawable.auto_task_icon_cleaner_grey else -> R.drawable.auto_task_icon_custom_time_grey } } diff --git a/app/src/main/java/com/idormy/sms/forwarder/workers/ActionWorker.kt b/app/src/main/java/com/idormy/sms/forwarder/workers/ActionWorker.kt index a5bce5b6..3d867f39 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/workers/ActionWorker.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/workers/ActionWorker.kt @@ -11,20 +11,26 @@ import androidx.work.WorkerParameters import com.google.gson.Gson import com.idormy.sms.forwarder.App import com.idormy.sms.forwarder.R +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.AppDatabase import com.idormy.sms.forwarder.database.entity.Rule import com.idormy.sms.forwarder.entity.MsgInfo import com.idormy.sms.forwarder.entity.TaskSetting +import com.idormy.sms.forwarder.entity.action.CleanerSetting 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.CacheUtils 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.HistoryUtils +import com.idormy.sms.forwarder.utils.HttpServerUtils import com.idormy.sms.forwarder.utils.PhoneUtils import com.idormy.sms.forwarder.utils.SendUtils +import com.idormy.sms.forwarder.utils.TASK_ACTION_CLEANER 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 @@ -35,6 +41,7 @@ import com.xuexiang.xrouter.utils.TextUtils import com.xuexiang.xutil.file.FileUtils import com.xuexiang.xutil.resource.ResUtils.getString import frpclib.Frpclib +import java.util.Calendar //执行每个task具体动作任务 @Suppress("PrivatePropertyName") @@ -153,6 +160,16 @@ class ActionWorker(context: Context, params: WorkerParameters) : CoroutineWorker writeLog("httpServerSetting is null") continue } + + HttpServerUtils.enableApiClone = httpServerSetting.enableApiClone + HttpServerUtils.enableApiSmsQuery = httpServerSetting.enableApiSmsQuery + HttpServerUtils.enableApiSmsSend = httpServerSetting.enableApiSmsSend + HttpServerUtils.enableApiCallQuery = httpServerSetting.enableApiCallQuery + HttpServerUtils.enableApiContactQuery = httpServerSetting.enableApiContactQuery + HttpServerUtils.enableApiContactAdd = httpServerSetting.enableApiContactAdd + HttpServerUtils.enableApiWol = httpServerSetting.enableApiWol + HttpServerUtils.enableApiLocation = httpServerSetting.enableApiLocation + HttpServerUtils.enableApiBatteryQuery = httpServerSetting.enableApiBatteryQuery Intent(App.context, HttpServerService::class.java).also { if (httpServerSetting.action == "start") { App.context.startService(it) @@ -165,6 +182,27 @@ class ActionWorker(context: Context, params: WorkerParameters) : CoroutineWorker writeLog("httpServer success", "SUCCESS") } + TASK_ACTION_CLEANER -> { + val cleanerSetting = Gson().fromJson(action.setting, CleanerSetting::class.java) + if (cleanerSetting == null) { + writeLog("cleanerSetting is null") + continue + } + if (cleanerSetting.days > 0) { + val cal = Calendar.getInstance() + cal.add(Calendar.DAY_OF_MONTH, 0 - cleanerSetting.days) + Core.msg.deleteTimeAgo(cal.timeInMillis) + } else { + Core.msg.deleteAll() + } + //清理缓存 + HistoryUtils.clearPreference() + CacheUtils.clearAllCache(App.context) + + successNum++ + writeLog("cleaner success", "SUCCESS") + } + else -> { writeLog("action.type is ${action.type}") } diff --git a/app/src/main/java/com/idormy/sms/forwarder/workers/CronWorker.kt b/app/src/main/java/com/idormy/sms/forwarder/workers/CronWorker.kt index aa5df16d..e7dde1fa 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/workers/CronWorker.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/workers/CronWorker.kt @@ -32,7 +32,7 @@ class CronWorker(context: Context, params: WorkerParameters) : CoroutineWorker(c } val task = AppDatabase.getInstance(App.context).taskDao().getOne(taskId) - if (task.status == 0) { + if (task == null || task.status == 0) { Log.d(TAG, "TASK-${task.id}:task is disabled") return Result.success() } diff --git a/app/src/main/res/drawable/auto_task_icon_cleaner.xml b/app/src/main/res/drawable/auto_task_icon_cleaner.xml new file mode 100644 index 00000000..f2f26b49 --- /dev/null +++ b/app/src/main/res/drawable/auto_task_icon_cleaner.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/auto_task_icon_cleaner_grey.xml b/app/src/main/res/drawable/auto_task_icon_cleaner_grey.xml new file mode 100644 index 00000000..34aced9e --- /dev/null +++ b/app/src/main/res/drawable/auto_task_icon_cleaner_grey.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_tasks_action_cleaner.xml b/app/src/main/res/layout/fragment_tasks_action_cleaner.xml new file mode 100644 index 00000000..1ab3f4c4 --- /dev/null +++ b/app/src/main/res/layout/fragment_tasks_action_cleaner.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_tasks_action_http_server.xml b/app/src/main/res/layout/fragment_tasks_action_http_server.xml new file mode 100644 index 00000000..5fef00c7 --- /dev/null +++ b/app/src/main/res/layout/fragment_tasks_action_http_server.xml @@ -0,0 +1,458 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 770acf04..098e2bb4 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -897,6 +897,7 @@ Copy Random Enable Function + Disable Function Select the features you want to enable remote control as needed OneKey Clone One-click cloning of the general config of the machine, sender, and rules to the new machine @@ -1169,7 +1170,10 @@ Notification Frpc Setting Control the start/stop of FRPC. - Server Setting + Server Setting + Manage HttpServer start/stop and enable/disable functions + Cleaner + Delete FW. logs older than N days, delete cache, etc. Second Minute diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 0267b653..8526cd01 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -898,6 +898,7 @@ 已复制公钥到剪贴板 已生成密钥,并复制到剪贴板 启用功能 + 禁用功能 按需选择您要启用远程控制的功能 一键换新机 一键克隆本机的通用配置、发送通道、转发规则到新机器 @@ -1170,7 +1171,10 @@ 通道推送 Frpc设置 控制内网穿透·FRPC的启动/停止 - HttpServer设置 + HttpServer设置 + 控制HttpServer的启动/停止,并支持启用/禁用功能 + 清理日志 + 批量删除N天前的转发记录、删除缓存等 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index bea5a22a..52eecdf4 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -898,6 +898,7 @@ 已複製公鑰到剪貼板 已生成密鑰,並複製到剪貼板 啟用功能 + 禁用功能 按需選擇您要啟用遠程控制的功能 一鍵換新機 一鍵克隆本機的通用配置、發送通道、轉發規則到新機器 @@ -1170,7 +1171,10 @@ 通道推送 Frpc設置 控制內網穿透·FRPC的啟動/停止 - HttpServer設置 + HttpServer設置 + 控制HttpServer的啟動/停止,並支持啟用/禁用功能 + 清理日誌 + 批量刪除N天前的轉發記錄、刪除快取等 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0f4ebd22..f7684bf4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -898,6 +898,7 @@ 已复制公钥到剪贴板 已生成密钥,并复制到剪贴板 启用功能 + 禁用功能 按需选择您要启用远程控制的功能 一键换新机 一键克隆本机的通用配置、发送通道、转发规则到新机器 @@ -1170,7 +1171,10 @@ 通道推送 Frpc设置 控制内网穿透·FRPC的启动/停止 - HttpServer设置 + HttpServer设置 + 控制HttpServer的启动/停止,并支持启用/禁用功能 + 清理日志 + 批量删除N天前的转发记录、删除缓存等