From fdc7b0399da9bfbc984eeb8cf62622765e4c317d Mon Sep 17 00:00:00 2001 From: pppscn <35696959@qq.com> Date: Fri, 12 Aug 2022 10:37:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9AHttpServer=E5=85=81?= =?UTF-8?q?=E8=AE=B8=E8=87=AA=E4=B8=BB=E6=8C=87=E5=AE=9AWeb=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E7=AB=AF=E7=9B=AE=E5=BD=95=EF=BC=88/sdcard/Download/?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E4=B8=8B=EF=BC=89=20#191?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sms/forwarder/fragment/ServerFragment.kt | 65 +++++++++++++++++-- .../forwarder/server/component/AppConfig.kt | 19 ++++-- .../idormy/sms/forwarder/utils/Constants.kt | 1 + .../sms/forwarder/utils/HttpServerUtils.kt | 8 +++ app/src/main/res/layout/fragment_server.xml | 50 ++++++++++---- app/src/main/res/values-en/strings.xml | 6 ++ app/src/main/res/values/strings.xml | 6 ++ 7 files changed, 135 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/ServerFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/ServerFragment.kt index 72aa4b26..3491ce5a 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/ServerFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/ServerFragment.kt @@ -1,6 +1,7 @@ package com.idormy.sms.forwarder.fragment import android.content.Intent +import android.os.Environment import android.os.Handler import android.os.Looper import android.text.Editable @@ -25,11 +26,14 @@ import com.xuexiang.xaop.annotation.SingleClick import com.xuexiang.xpage.annotation.Page import com.xuexiang.xui.widget.actionbar.TitleBar import com.xuexiang.xui.widget.button.SmoothCheckBox +import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog import com.xuexiang.xutil.app.ServiceUtils import com.xuexiang.xutil.net.NetworkUtils import com.xuexiang.xutil.system.ClipboardUtils +import java.io.File import java.net.InetAddress + @Suppress("PrivatePropertyName") @Page(name = "主动控制·服务端") class ServerFragment : BaseFragment(), View.OnClickListener { @@ -66,7 +70,7 @@ class ServerFragment : BaseFragment(), View.OnClickListe override fun initListeners() { binding!!.tvServerTips.setOnClickListener(this) binding!!.ivCopy.setOnClickListener(this) - binding!!.toggleServerBtn.setOnClickListener(this) + binding!!.btnToggleServer.setOnClickListener(this) binding!!.scbServerAutorun.isChecked = HttpServerUtils.enableServerAutorun binding!!.scbServerAutorun.setOnCheckedChangeListener { _: SmoothCheckBox, isChecked: Boolean -> @@ -76,6 +80,7 @@ class ServerFragment : BaseFragment(), View.OnClickListe handler.post(runnable) binding!!.btnSignKey.setOnClickListener(this) + binding!!.btnPathPicker.setOnClickListener(this) binding!!.etSignKey.setText(HttpServerUtils.serverSignKey) binding!!.etSignKey.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} @@ -84,6 +89,14 @@ class ServerFragment : BaseFragment(), View.OnClickListe HttpServerUtils.serverSignKey = binding!!.etSignKey.text.toString().trim() } }) + binding!!.etWebPath.setText(HttpServerUtils.serverWebPath) + binding!!.etWebPath.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} + override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {} + override fun afterTextChanged(s: Editable) { + HttpServerUtils.serverWebPath = binding!!.etWebPath.text.toString().trim() + } + }) binding!!.sbApiClone.isChecked = HttpServerUtils.enableApiClone binding!!.sbApiClone.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean -> @@ -129,7 +142,7 @@ class ServerFragment : BaseFragment(), View.OnClickListe @SingleClick override fun onClick(v: View) { when (v.id) { - R.id.toggle_server_btn -> { + R.id.btn_toggle_server -> { //检查权限是否获取 checkSendSmsPermission() checkReadSmsPermission() @@ -153,6 +166,36 @@ class ServerFragment : BaseFragment(), View.OnClickListe ClipboardUtils.copyText(url) XToastUtils.info(String.format(getString(R.string.copied_to_clipboard), url)) } + R.id.btn_path_picker -> { + val downloadPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).path + val dirList = listSubDir(downloadPath) + if (dirList.isEmpty()) { + XToastUtils.error(String.format(getString(R.string.download_first), downloadPath)) + return + } + MaterialDialog.Builder(requireContext()) + .title(getString(R.string.select_web_client_directory)) + .content(String.format(getString(R.string.root_directory), downloadPath)) + .items(dirList) + .itemsCallbackSingleChoice(0) { _: MaterialDialog?, _: View?, _: Int, text: CharSequence -> + val webPath = "$downloadPath/$text" + binding!!.etWebPath.setText(webPath) + HttpServerUtils.serverWebPath = webPath + + XToastUtils.info(getString(R.string.restarting_httpserver)) + if (ServiceUtils.isServiceRunning("com.idormy.sms.forwarder.service.HttpService")) { + appContext?.stopService(Intent(appContext, HttpService::class.java)) + appContext?.startService(Intent(appContext, HttpService::class.java)) + } else { + appContext?.startService(Intent(appContext, HttpService::class.java)) + } + refreshButtonText() + true // allow selection + } + .positiveText(R.string.select) + .negativeText(R.string.cancel) + .show() + } else -> {} } } @@ -160,7 +203,7 @@ class ServerFragment : BaseFragment(), View.OnClickListe //刷新按钮 private fun refreshButtonText() { if (ServiceUtils.isServiceRunning("com.idormy.sms.forwarder.service.HttpService")) { - binding!!.toggleServerBtn.text = resources.getText(R.string.stop_server) + binding!!.btnToggleServer.text = resources.getText(R.string.stop_server) binding!!.ivCopy.visibility = View.VISIBLE try { inetAddress = NetworkUtils.getLocalInetAddress() @@ -171,7 +214,7 @@ class ServerFragment : BaseFragment(), View.OnClickListe binding!!.tvServerTips.text = getString(R.string.http_server_running, "127.0.0.1", HTTP_SERVER_PORT) } } else { - binding!!.toggleServerBtn.text = resources.getText(R.string.start_server) + binding!!.btnToggleServer.text = resources.getText(R.string.start_server) binding!!.tvServerTips.text = getString(R.string.http_server_stopped) binding!!.ivCopy.visibility = View.GONE } @@ -282,4 +325,18 @@ class ServerFragment : BaseFragment(), View.OnClickListe handler.removeCallbacks(runnable) } + //获取Download的子目录 + private fun listSubDir(downloadPath: String): List { + val dirList = mutableListOf() + val downloadDir = File(downloadPath) + val files = downloadDir.listFiles() ?: return dirList + + for (file in files) { + if (file.isDirectory && !file.name.startsWith(".") && !file.name.startsWith("leakcanary-")) { + dirList.add(file.name) + } + } + return dirList + } + } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/server/component/AppConfig.kt b/app/src/main/java/com/idormy/sms/forwarder/server/component/AppConfig.kt index 6ae00db8..0079d07c 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/server/component/AppConfig.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/server/component/AppConfig.kt @@ -1,26 +1,35 @@ package com.idormy.sms.forwarder.server.component import android.content.Context +import com.idormy.sms.forwarder.utils.HttpServerUtils +import com.xuexiang.xrouter.utils.TextUtils import com.yanzhenjie.andserver.annotation.Config -import com.yanzhenjie.andserver.framework.config.Multipart import com.yanzhenjie.andserver.framework.config.WebConfig import com.yanzhenjie.andserver.framework.website.AssetsWebsite +import com.yanzhenjie.andserver.framework.website.StorageWebsite @Config class AppConfig : WebConfig { override fun onConfig(context: Context, delegate: WebConfig.Delegate) { - // 增加一个位于assert的Web目录网站 - delegate.addWebsite(AssetsWebsite(context, "/web/")) - delegate.setMultipart( + val serverWebPath = HttpServerUtils.serverWebPath + if (!TextUtils.isEmpty(serverWebPath)) { + // 增加一个位于/sdcard/Download/目录下的网站 + delegate.addWebsite(StorageWebsite(serverWebPath.toString())) + } else { + // 增加一个位于assets的web目录的网站 + delegate.addWebsite(AssetsWebsite(context, "/web/")) + } + + /*delegate.setMultipart( Multipart.newBuilder() .allFileMaxSize(1024 * 1024 * 20) // 单个请求所有文件总大小 .fileMaxSize(1024 * 1024 * 5) // 单个请求每个文件大小 .maxInMemorySize(1024 * 20) // 内存缓存大小 .uploadTempDir(context.cacheDir) // 上传文件保存目录 .build() - ) + )*/ } } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt index f99e41c2..d7666a59 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt @@ -235,6 +235,7 @@ const val HTTP_FAILURE_CODE: Int = 500 const val SP_ENABLE_SERVER = "enable_server" const val SP_ENABLE_SERVER_AUTORUN = "enable_server_autorun" const val SP_SERVER_SIGN_KEY = "server_sign_key" +const val SP_SERVER_WEB_PATH = "server_web_path" const val SP_ENABLE_API_CLONE = "enable_api_clone" const val SP_ENABLE_API_SMS_SEND = "enable_api_sms_send" const val SP_ENABLE_API_SMS_QUERY = "enable_api_sms_query" diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/HttpServerUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/HttpServerUtils.kt index b4049d20..108d3895 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/HttpServerUtils.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/HttpServerUtils.kt @@ -40,6 +40,14 @@ class HttpServerUtils private constructor() { MMKVUtils.put(SP_SERVER_SIGN_KEY, serverSignKey) } + //自定义web客户端目录 + @JvmStatic + var serverWebPath: String? + get() = MMKVUtils.getString(SP_SERVER_WEB_PATH, "") + set(serverWebPath) { + MMKVUtils.put(SP_SERVER_WEB_PATH, serverWebPath) + } + //服务地址 @JvmStatic var serverAddress: String? diff --git a/app/src/main/res/layout/fragment_server.xml b/app/src/main/res/layout/fragment_server.xml index bde3000c..098c368b 100644 --- a/app/src/main/res/layout/fragment_server.xml +++ b/app/src/main/res/layout/fragment_server.xml @@ -95,16 +95,6 @@ android:textSize="10sp" tools:ignore="SmallSp" /> - - + + + + + + + + + + WOL is generally sent over port 7 or port 9 Port number value range: 1~65535 ^([0-9]|[1-9]\\d|[1-9]\\d{2}|[1-9]\\d{3}|[1-5]\\d{4}|6[0-4]\\d{3}|65[0-4]\\d{2}|655[0-2]\\d|6553[0-5])$ + Select Dir + Web Client + Restarting HttpServer + Download and unzip to:\n%s + Root Directory:\n%s + Select WebClient Directory diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d446ccd0..03466761 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -902,4 +902,10 @@ 可选,WOL一般透过端口7或端口9进行发送 端口号取值范围:1~65535 ^([0-9]|[1-9]\\d|[1-9]\\d{2}|[1-9]\\d{3}|[1-5]\\d{4}|6[0-4]\\d{3}|65[0-4]\\d{2}|655[0-2]\\d|6553[0-5])$ + 选择目录 + Web客户端 + 正在重启HttpServer + 请先下载Web客户端并解压到:\n%s + 根目录:\n%s + 选择Web客户端目录