mirror of
https://github.com/pppscn/SmsForwarder
synced 2025-08-02 17:07:41 +08:00
整理:中英文语言包
This commit is contained in:
parent
628b704d02
commit
5712c32ff3
@ -158,7 +158,7 @@ class MainActivity : BaseActivity<ActivityMainBinding?>(),
|
||||
R.id.nav_logcat -> openNewPage(LogcatFragment::class.java)
|
||||
R.id.nav_help -> AgentWebActivity.goWeb(this, getString(R.string.url_help))
|
||||
R.id.nav_about -> openNewPage(AboutFragment::class.java)
|
||||
else -> XToastUtils.toast("点击了:" + menuItem.title)
|
||||
else -> XToastUtils.toast("Click:" + menuItem.title)
|
||||
}
|
||||
}
|
||||
true
|
||||
|
@ -27,7 +27,7 @@ abstract class NoTipCallBack<T> : SimpleCallBack<T> {
|
||||
|
||||
override fun onError(e: ApiException) {
|
||||
if (!StringUtils.isEmpty(mUrl)) {
|
||||
Logger.e("网络请求的url:$mUrl", e)
|
||||
Logger.e("Request Url: $mUrl", e)
|
||||
} else {
|
||||
Logger.e(e)
|
||||
}
|
||||
|
@ -29,7 +29,7 @@ abstract class TipCallBack<T> : SimpleCallBack<T> {
|
||||
override fun onError(e: ApiException) {
|
||||
XToastUtils.error(e)
|
||||
if (!StringUtils.isEmpty(mUrl)) {
|
||||
Logger.e("网络请求的url:$mUrl", e)
|
||||
Logger.e("Request Url: $mUrl", e)
|
||||
} else {
|
||||
Logger.e(e)
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ abstract class TipProgressLoadingCallBack<T> : ProgressLoadingCallBack<T> {
|
||||
super.onError(e)
|
||||
XToastUtils.error(e)
|
||||
if (!StringUtils.isEmpty(mUrl)) {
|
||||
Logger.e("网络请求的url:$mUrl", e)
|
||||
Logger.e("Request Url: $mUrl", e)
|
||||
} else {
|
||||
Logger.e(e)
|
||||
}
|
||||
|
@ -13,7 +13,7 @@ import com.xuexiang.xui.widget.dialog.MiniLoadingDialog
|
||||
*/
|
||||
class MiniLoadingDialogLoader @JvmOverloads constructor(
|
||||
context: Context?,
|
||||
msg: String? = "请求中...",
|
||||
msg: String? = "Loading...",
|
||||
) : IProgressLoader {
|
||||
/**
|
||||
* 进度loading弹窗
|
||||
|
@ -27,7 +27,7 @@ abstract class NoTipRequestSubscriber<T> : BaseSubscriber<T> {
|
||||
|
||||
public override fun onError(e: ApiException) {
|
||||
if (!StringUtils.isEmpty(mUrl)) {
|
||||
Logger.e("网络请求的url:$mUrl", e)
|
||||
Logger.e("Request Url: $mUrl", e)
|
||||
} else {
|
||||
Logger.e(e)
|
||||
}
|
||||
|
@ -34,7 +34,7 @@ abstract class TipProgressLoadingSubscriber<T> : ProgressLoadingSubscriber<T> {
|
||||
super.onError(e)
|
||||
XToastUtils.error(e)
|
||||
if (!StringUtils.isEmpty(mUrl)) {
|
||||
Logger.e("网络请求的url:$mUrl", e)
|
||||
Logger.e("Request Url: $mUrl", e)
|
||||
} else {
|
||||
Logger.e(e)
|
||||
}
|
||||
|
@ -29,7 +29,7 @@ abstract class TipRequestSubscriber<T> : BaseSubscriber<T> {
|
||||
public override fun onError(e: ApiException) {
|
||||
XToastUtils.error(e)
|
||||
if (!StringUtils.isEmpty(mUrl)) {
|
||||
Logger.e("网络请求的url:$mUrl", e)
|
||||
Logger.e("Request Url: $mUrl", e)
|
||||
} else {
|
||||
Logger.e(e)
|
||||
}
|
||||
|
@ -43,7 +43,7 @@ class WebViewInterceptDialog : AppCompatActivity(), DialogInterface.OnDismissLis
|
||||
private fun getOpenTitle(url: String): String {
|
||||
val scheme = getScheme(url)
|
||||
return if ("mqqopensdkapi" == scheme) {
|
||||
"是否允许页面打开\"QQ\"?"
|
||||
ResUtils.getString(R.string.lab_open_qq_app)
|
||||
} else {
|
||||
ResUtils.getString(R.string.lab_open_third_app)
|
||||
}
|
||||
|
@ -2,6 +2,8 @@ package com.idormy.sms.forwarder.entity
|
||||
|
||||
import android.util.Patterns
|
||||
import com.google.gson.annotations.SerializedName
|
||||
import com.idormy.sms.forwarder.R
|
||||
import com.xuexiang.xui.utils.ResUtils.getString
|
||||
import java.io.Serializable
|
||||
import java.util.*
|
||||
|
||||
@ -17,6 +19,6 @@ data class ContactInfo(
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return String.format("姓名:%s\n号码:%s", name, phoneNumber)
|
||||
return String.format(getString(R.string.contact_info), name, phoneNumber)
|
||||
}
|
||||
}
|
@ -17,6 +17,7 @@ import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener
|
||||
import com.xuexiang.xaop.annotation.SingleClick
|
||||
import com.xuexiang.xpage.annotation.Page
|
||||
import com.xuexiang.xui.utils.DensityUtils
|
||||
import com.xuexiang.xui.utils.ResUtils
|
||||
import com.xuexiang.xui.utils.ThemeUtils
|
||||
import com.xuexiang.xui.utils.WidgetUtils
|
||||
import com.xuexiang.xui.widget.actionbar.TitleBar
|
||||
@ -73,7 +74,7 @@ class AppListFragment : BaseFragment<FragmentAppListBinding?>() {
|
||||
val cm = requireContext().getSystemService(AppCompatActivity.CLIPBOARD_SERVICE) as ClipboardManager
|
||||
val mClipData = ClipData.newPlainText("pkgName", item?.packageName)
|
||||
cm.setPrimaryClip(mClipData)
|
||||
XToastUtils.toast("已复制包名:" + item?.packageName, 2000)
|
||||
XToastUtils.toast(ResUtils.getString(R.string.package_name_copied) + item?.packageName, 2000)
|
||||
}
|
||||
|
||||
//设置刷新加载时禁止所有列表操作
|
||||
|
@ -107,7 +107,7 @@ class ClientFragment : BaseFragment<FragmentClientBinding?>(),
|
||||
when (v.id) {
|
||||
R.id.btn_server_test -> {
|
||||
if (!CommonUtils.checkUrl(HttpServerUtils.serverAddress)) {
|
||||
XToastUtils.error("请输入有效的服务地址")
|
||||
XToastUtils.error(getString(R.string.invalid_service_address))
|
||||
return
|
||||
}
|
||||
queryConfig(true)
|
||||
@ -119,12 +119,12 @@ class ClientFragment : BaseFragment<FragmentClientBinding?>(),
|
||||
override fun onItemClick(itemView: View, item: PageInfo, position: Int) {
|
||||
try {
|
||||
if (!CommonUtils.checkUrl(HttpServerUtils.serverAddress)) {
|
||||
XToastUtils.error("请输入有效的服务地址")
|
||||
XToastUtils.error(getString(R.string.invalid_service_address))
|
||||
serverConfig = null
|
||||
return
|
||||
}
|
||||
if (serverConfig == null && item.name != ResUtils.getString(R.string.api_clone)) {
|
||||
XToastUtils.error("请先点击【测试接口】按钮")
|
||||
XToastUtils.error(getString(R.string.click_test_button_first))
|
||||
return
|
||||
}
|
||||
if (serverConfig != null && (
|
||||
@ -135,7 +135,7 @@ class ClientFragment : BaseFragment<FragmentClientBinding?>(),
|
||||
|| (item.name == ResUtils.getString(R.string.api_battery_query) && !serverConfig!!.enableApiBatteryQuery)
|
||||
)
|
||||
) {
|
||||
XToastUtils.error("服务端未开启此功能")
|
||||
XToastUtils.error(getString(R.string.disabled_on_the_server))
|
||||
return
|
||||
}
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
|
@ -117,7 +117,7 @@ class FrpcFragment : BaseFragment<FragmentFrpcsBinding?>(), FrpcPagingAdapter.On
|
||||
|
||||
//运行出错时间
|
||||
LiveEventBus.get(EVENT_FRPC_RUNNING_ERROR, String::class.java).observe(this) {
|
||||
XToastUtils.error("Frpc运行失败")
|
||||
XToastUtils.error(getString(R.string.frpc_failed_to_run))
|
||||
//FrpcUtils.checkAndStopService(requireContext())
|
||||
adapter.refresh()
|
||||
}
|
||||
@ -190,7 +190,7 @@ class FrpcFragment : BaseFragment<FragmentFrpcsBinding?>(), FrpcPagingAdapter.On
|
||||
try {
|
||||
viewModel.delete(item)
|
||||
LiveEventBus.get<Frpc>(EVENT_FRPC_DELETE_CONFIG).post(item)
|
||||
XToastUtils.success("删除成功")
|
||||
XToastUtils.success(getString(R.string.successfully_deleted))
|
||||
} catch (e: Exception) {
|
||||
e.message?.let { XToastUtils.error(it) }
|
||||
}
|
||||
|
@ -339,7 +339,7 @@ class RulesEditFragment : BaseFragment<FragmentRulesEditBinding?>(), View.OnClic
|
||||
)
|
||||
binding!!.tvSenderName.text = sender.title
|
||||
if (STATUS_OFF == sender.status) {
|
||||
XToastUtils.warning("【注意】该发送通道已经禁用,其关联的规则即便匹配上也不会发送!")
|
||||
XToastUtils.warning(getString(R.string.sender_disabled_tips))
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
XToastUtils.error(e.message.toString())
|
||||
@ -557,7 +557,7 @@ class RulesEditFragment : BaseFragment<FragmentRulesEditBinding?>(), View.OnClic
|
||||
val testSim = "SIM" + (simSlot + 1)
|
||||
val ruleSim: String = rule.simSlot
|
||||
if (ruleSim != "ALL" && ruleSim != testSim) {
|
||||
throw java.lang.Exception("卡槽未匹配中规则")
|
||||
throw java.lang.Exception(getString(R.string.card_slot_does_not_match))
|
||||
}
|
||||
|
||||
//获取卡槽信息
|
||||
@ -569,7 +569,7 @@ class RulesEditFragment : BaseFragment<FragmentRulesEditBinding?>(), View.OnClic
|
||||
|
||||
val msgInfo = MsgInfo(ruleType, etFrom.text.toString(), etContent.text.toString(), Date(), simInfo, simSlot)
|
||||
if (!rule.checkMsg(msgInfo)) {
|
||||
throw java.lang.Exception("未匹配中规则")
|
||||
throw java.lang.Exception(getString(R.string.unmatched_rule))
|
||||
}
|
||||
|
||||
AppDatabase.getInstance(requireContext())
|
||||
|
@ -144,7 +144,7 @@ class ServerFragment : BaseFragment<FragmentServerBinding?>(), View.OnClickListe
|
||||
if (inetAddress != null) {
|
||||
val url = "http://${inetAddress!!.hostAddress}:5000"
|
||||
ClipboardUtils.copyText(url)
|
||||
XToastUtils.info("已复制到剪贴板:$url")
|
||||
XToastUtils.info(String.format(getString(R.string.copied_to_clipboard), url))
|
||||
}
|
||||
}
|
||||
else -> {}
|
||||
|
@ -99,15 +99,15 @@ class CallQueryFragment : BaseFragment<FragmentClientCallQueryBinding?>() {
|
||||
holder.image(R.id.iv_call, R.drawable.ic_phone_out)
|
||||
holder.image(R.id.iv_reply, R.drawable.ic_reply)
|
||||
holder.click(R.id.iv_copy) {
|
||||
XToastUtils.info("已经复制到剪贴板!\n$from")
|
||||
XToastUtils.info(String.format(getString(R.string.copied_to_clipboard), from))
|
||||
ClipboardUtils.copyText(from)
|
||||
}
|
||||
holder.click(R.id.iv_call) {
|
||||
XToastUtils.info("本地呼叫:" + model.number)
|
||||
XToastUtils.info(getString(R.string.local_call) + model.number)
|
||||
PhoneUtils.dial(model.number)
|
||||
}
|
||||
holder.click(R.id.iv_reply) {
|
||||
XToastUtils.info("远程发短信:" + model.number)
|
||||
XToastUtils.info(getString(R.string.remote_sms) + model.number)
|
||||
LiveEventBus.get<Int>(EVENT_KEY_SIM_SLOT).post(model.simId)
|
||||
LiveEventBus.get<String>(EVENT_KEY_PHONE_NUMBERS).post(model.number)
|
||||
PageOption.to(SmsSendFragment::class.java).setNewActivity(true).open((context as XPageActivity?)!!)
|
||||
@ -146,9 +146,9 @@ class CallQueryFragment : BaseFragment<FragmentClientCallQueryBinding?>() {
|
||||
binding!!.searchView.setSuggestions(resources.getStringArray(R.array.query_suggestions))
|
||||
binding!!.searchView.setOnQueryTextListener(object : MaterialSearchView.OnQueryTextListener {
|
||||
override fun onQueryTextSubmit(query: String): Boolean {
|
||||
SnackbarUtils.Indefinite(view, "搜索关键字: $query").info()
|
||||
SnackbarUtils.Indefinite(view, String.format(getString(R.string.search_keyword), query)).info()
|
||||
.actionColor(ResUtils.getColor(R.color.xui_config_color_white))
|
||||
.setAction("清除") {
|
||||
.setAction(getString(R.string.clear)) {
|
||||
keyword = ""
|
||||
loadRemoteData(true)
|
||||
}.show()
|
||||
|
@ -86,7 +86,7 @@ class CloneFragment : BaseFragment<FragmentClientCloneBinding?>(), View.OnClickL
|
||||
} else {
|
||||
XToastUtils.error(R.string.toast_denied)
|
||||
}
|
||||
binding!!.tvBackupPath.text = "未授权储存权限,该功能无法使用!"
|
||||
binding!!.tvBackupPath.text = getString(R.string.storage_permission_tips)
|
||||
}
|
||||
})
|
||||
|
||||
@ -169,13 +169,13 @@ class CloneFragment : BaseFragment<FragmentClientCloneBinding?>(), View.OnClickL
|
||||
val cloneInfo = HttpServerUtils.exportSettings()
|
||||
val jsonStr = Gson().toJson(cloneInfo)
|
||||
if (FileIOUtils.writeFileFromString(file, jsonStr)) {
|
||||
XToastUtils.success("导出配置成功!")
|
||||
XToastUtils.success(getString(R.string.export_succeeded))
|
||||
} else {
|
||||
binding!!.tvExport.text = "导出失败,请检查写入权限!"
|
||||
XToastUtils.error("导出失败,请检查写入权限!")
|
||||
binding!!.tvExport.text = getString(R.string.export_failed)
|
||||
XToastUtils.error(getString(R.string.export_failed))
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
XToastUtils.error("导出失败:" + e.message)
|
||||
XToastUtils.error(String.format(getString(R.string.export_failed_tips), e.message))
|
||||
}
|
||||
}
|
||||
//导入配置
|
||||
@ -185,14 +185,14 @@ class CloneFragment : BaseFragment<FragmentClientCloneBinding?>(), View.OnClickL
|
||||
val file = File(backupPath + File.separator + backupFile)
|
||||
//判断文件是否存在
|
||||
if (!FileUtils.isFileExists(file)) {
|
||||
XToastUtils.error("导入失败:本地备份文件不存在!")
|
||||
XToastUtils.error(getString(R.string.import_failed_file_not_exist))
|
||||
return
|
||||
}
|
||||
|
||||
val jsonStr = FileIOUtils.readFile2String(file)
|
||||
Log.d(TAG, "jsonStr = $jsonStr")
|
||||
if (TextUtils.isEmpty(jsonStr)) {
|
||||
XToastUtils.error("导入失败:请检查是否有外部存储访问权限!")
|
||||
XToastUtils.error(getString(R.string.import_failed))
|
||||
return
|
||||
}
|
||||
|
||||
@ -207,12 +207,12 @@ class CloneFragment : BaseFragment<FragmentClientCloneBinding?>(), View.OnClickL
|
||||
HttpServerUtils.compareVersion(cloneInfo)
|
||||
|
||||
if (HttpServerUtils.restoreSettings(cloneInfo)) {
|
||||
XToastUtils.success("导入配置成功!")
|
||||
XToastUtils.success(getString(R.string.import_succeeded))
|
||||
} else {
|
||||
XToastUtils.error("导入失败")
|
||||
XToastUtils.error(getString(R.string.import_failed))
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
XToastUtils.error("导入失败:" + e.message)
|
||||
XToastUtils.error(String.format(getString(R.string.import_failed_tips), e.message))
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -329,7 +329,7 @@ class CloneFragment : BaseFragment<FragmentClientCloneBinding?>(), View.OnClickL
|
||||
HttpServerUtils.compareVersion(cloneInfo)
|
||||
|
||||
if (HttpServerUtils.restoreSettings(cloneInfo)) {
|
||||
XToastUtils.success("导入配置成功!")
|
||||
XToastUtils.success(getString(R.string.import_succeeded))
|
||||
}
|
||||
} else {
|
||||
XToastUtils.error(ResUtils.getString(R.string.request_failed) + resp.msg)
|
||||
|
@ -95,15 +95,15 @@ class ContactQueryFragment : BaseFragment<FragmentClientContactQueryBinding?>()
|
||||
holder.image(R.id.iv_reply, R.drawable.ic_reply)
|
||||
holder.click(R.id.iv_copy) {
|
||||
val str = model.toString()
|
||||
XToastUtils.info("已经复制到剪贴板!\n$str")
|
||||
XToastUtils.info(String.format(getString(R.string.copied_to_clipboard), str))
|
||||
ClipboardUtils.copyText(str)
|
||||
}
|
||||
holder.click(R.id.iv_call) {
|
||||
XToastUtils.info("本地呼叫:" + model.phoneNumber)
|
||||
XToastUtils.info(getString(R.string.local_call) + model.phoneNumber)
|
||||
PhoneUtils.dial(model.phoneNumber)
|
||||
}
|
||||
holder.click(R.id.iv_reply) {
|
||||
XToastUtils.info("远程发短信:" + model.phoneNumber)
|
||||
XToastUtils.info(getString(R.string.remote_sms) + model.phoneNumber)
|
||||
/*val params = Bundle()
|
||||
params.putString(KEY_PHONE_NUMBERS, model.phoneNumber)
|
||||
openPage(SmsSendFragment::class.java, params)*/
|
||||
@ -133,9 +133,9 @@ class ContactQueryFragment : BaseFragment<FragmentClientContactQueryBinding?>()
|
||||
binding!!.searchView.setSuggestions(resources.getStringArray(R.array.query_suggestions))
|
||||
binding!!.searchView.setOnQueryTextListener(object : MaterialSearchView.OnQueryTextListener {
|
||||
override fun onQueryTextSubmit(query: String): Boolean {
|
||||
SnackbarUtils.Indefinite(view, "搜索关键字: $query").info()
|
||||
SnackbarUtils.Indefinite(view, String.format(getString(R.string.search_keyword), query)).info()
|
||||
.actionColor(ResUtils.getColor(R.color.xui_config_color_white))
|
||||
.setAction("清除") {
|
||||
.setAction(getString(R.string.clear)) {
|
||||
keyword = ""
|
||||
loadRemoteData()
|
||||
}.show()
|
||||
|
@ -98,7 +98,7 @@ class SmsQueryFragment : BaseFragment<FragmentClientSmsQueryBinding?>() {
|
||||
holder.text(R.id.tv_content, model.content)
|
||||
holder.image(R.id.iv_reply, R.drawable.ic_reply)
|
||||
holder.click(R.id.iv_reply) {
|
||||
XToastUtils.info("远程回短信:" + model.number)
|
||||
XToastUtils.info(getString(R.string.remote_sms) + model.number)
|
||||
LiveEventBus.get<Int>(EVENT_KEY_SIM_SLOT).post(model.simId)
|
||||
LiveEventBus.get<String>(EVENT_KEY_PHONE_NUMBERS).post(model.number)
|
||||
PageOption.to(SmsSendFragment::class.java).setNewActivity(true).open((context as XPageActivity?)!!)
|
||||
@ -136,9 +136,9 @@ class SmsQueryFragment : BaseFragment<FragmentClientSmsQueryBinding?>() {
|
||||
binding!!.searchView.setSuggestions(resources.getStringArray(R.array.query_suggestions))
|
||||
binding!!.searchView.setOnQueryTextListener(object : MaterialSearchView.OnQueryTextListener {
|
||||
override fun onQueryTextSubmit(query: String): Boolean {
|
||||
SnackbarUtils.Indefinite(view, "搜索关键字: $query").info()
|
||||
SnackbarUtils.Indefinite(view, String.format(getString(R.string.search_keyword), query)).info()
|
||||
.actionColor(ResUtils.getColor(R.color.xui_config_color_white))
|
||||
.setAction("清除") {
|
||||
.setAction(getString(R.string.clear)) {
|
||||
keyword = ""
|
||||
loadRemoteData(true)
|
||||
}.show()
|
||||
|
@ -1,7 +1,9 @@
|
||||
package com.idormy.sms.forwarder.server.component
|
||||
|
||||
import android.util.Log
|
||||
import com.idormy.sms.forwarder.R
|
||||
import com.idormy.sms.forwarder.utils.HttpServerUtils
|
||||
import com.xuexiang.xui.utils.ResUtils.getString
|
||||
import com.yanzhenjie.andserver.annotation.Interceptor
|
||||
import com.yanzhenjie.andserver.error.HttpException
|
||||
import com.yanzhenjie.andserver.framework.HandlerInterceptor
|
||||
@ -39,7 +41,7 @@ class LoggerInterceptor : HandlerInterceptor {
|
||||
|| (httpPath.startsWith("/contact/query") && !HttpServerUtils.enableApiContactQuery)
|
||||
|| (httpPath.startsWith("/battery/query") && !HttpServerUtils.enableApiBatteryQuery)
|
||||
) {
|
||||
throw HttpException(500, "服务端未开启此功能")
|
||||
throw HttpException(500, getString(R.string.disabled_on_the_server))
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1,9 +1,11 @@
|
||||
package com.idormy.sms.forwarder.server.controller
|
||||
|
||||
import android.util.Log
|
||||
import com.idormy.sms.forwarder.R
|
||||
import com.idormy.sms.forwarder.entity.CloneInfo
|
||||
import com.idormy.sms.forwarder.server.model.BaseRequest
|
||||
import com.idormy.sms.forwarder.utils.HttpServerUtils
|
||||
import com.xuexiang.xui.utils.ResUtils.getString
|
||||
import com.yanzhenjie.andserver.annotation.*
|
||||
|
||||
@Suppress("PrivatePropertyName")
|
||||
@ -36,7 +38,7 @@ class CloneController {
|
||||
|
||||
HttpServerUtils.compareVersion(cloneInfo)
|
||||
|
||||
return if (HttpServerUtils.restoreSettings(cloneInfo)) "success" else "还原失败"
|
||||
return if (HttpServerUtils.restoreSettings(cloneInfo)) "success" else getString(R.string.restore_failed)
|
||||
}
|
||||
|
||||
}
|
@ -12,6 +12,7 @@ import androidx.work.OneTimeWorkRequestBuilder
|
||||
import androidx.work.WorkManager
|
||||
import androidx.work.workDataOf
|
||||
import com.google.gson.Gson
|
||||
import com.idormy.sms.forwarder.R
|
||||
import com.idormy.sms.forwarder.entity.MsgInfo
|
||||
import com.idormy.sms.forwarder.utils.BatteryUtils
|
||||
import com.idormy.sms.forwarder.utils.SettingUtils
|
||||
@ -66,19 +67,19 @@ class BatteryService : Service() {
|
||||
val levelMin: Int = SettingUtils.batteryLevelMin
|
||||
val levelMax: Int = SettingUtils.batteryLevelMax
|
||||
if (SettingUtils.batteryLevelOnce && levelMin > 0 && levelPre > levelCur && levelCur <= levelMin) { //电量下降到下限
|
||||
msg = "【电量预警】已低于电量预警下限,请及时充电!$msg"
|
||||
msg = String.format(getString(R.string.below_level_min), msg)
|
||||
sendMessage(context, msg)
|
||||
return
|
||||
} else if (SettingUtils.batteryLevelOnce && levelMax > 0 && levelPre < levelCur && levelCur >= levelMax) { //电量上升到上限
|
||||
msg = "【电量预警】已高于电量预警上限,请拔掉充电器!$msg"
|
||||
msg = String.format(getString(R.string.over_level_max), msg)
|
||||
sendMessage(context, msg)
|
||||
return
|
||||
} else if (!SettingUtils.batteryLevelOnce && levelMin > 0 && levelPre > levelCur && levelCur == levelMin) { //电量下降到下限
|
||||
msg = "【电量预警】已到达电量预警下限,请及时充电!$msg"
|
||||
msg = String.format(getString(R.string.reach_level_min), msg)
|
||||
sendMessage(context, msg)
|
||||
return
|
||||
} else if (!SettingUtils.batteryLevelOnce && levelMax > 0 && levelPre < levelCur && levelCur == levelMax) { //电量上升到上限
|
||||
msg = "【电量预警】已到达电量预警上限,请拔掉充电器!$msg"
|
||||
msg = String.format(getString(R.string.reach_level_max), msg)
|
||||
sendMessage(context, msg)
|
||||
return
|
||||
}
|
||||
@ -91,7 +92,7 @@ class BatteryService : Service() {
|
||||
if (status != oldStatus) {
|
||||
var msg: String = BatteryUtils.getBatteryInfo(intent).toString()
|
||||
SettingUtils.batteryStatus = status
|
||||
msg = "【充电状态】发生变化:" + BatteryUtils.getStatus(oldStatus) + " → " + BatteryUtils.getStatus(status) + msg
|
||||
msg = getString(R.string.battery_status_changed) + BatteryUtils.getStatus(oldStatus) + " → " + BatteryUtils.getStatus(status) + msg
|
||||
sendMessage(context, msg)
|
||||
}
|
||||
}
|
||||
@ -102,7 +103,7 @@ class BatteryService : Service() {
|
||||
private fun sendMessage(context: Context, msg: String) {
|
||||
Log.i(TAG, msg)
|
||||
try {
|
||||
val msgInfo = MsgInfo("app", "88888888", msg, Date(), "电池状态监听", -1)
|
||||
val msgInfo = MsgInfo("app", "88888888", msg, Date(), getString(R.string.battery_status_monitor), -1)
|
||||
val request = OneTimeWorkRequestBuilder<SendWorker>()
|
||||
.setInputData(
|
||||
workDataOf(
|
||||
|
@ -236,11 +236,16 @@ class CommonUtils private constructor() {
|
||||
}
|
||||
|
||||
//是否合法的url
|
||||
fun checkUrl(urls: String, emptyResult: Boolean): Boolean {
|
||||
fun checkUrl(urls: String?): Boolean {
|
||||
return checkUrl(urls, false)
|
||||
}
|
||||
|
||||
//是否合法的url
|
||||
fun checkUrl(urls: String?, emptyResult: Boolean): Boolean {
|
||||
if (TextUtils.isEmpty(urls)) return emptyResult
|
||||
val regex = "(ht|f)tp(s?)\\:\\/\\/[\\da-zA-Z]([-.\\w]*[\\da-zA-Z])*(:(0-9)*)*(\\/?)([a-zA-Z\\d\\-\\.\\?\\,\\'\\/\\\\&%\\+\\$#_=]*)?"
|
||||
val pat = Pattern.compile(regex)
|
||||
val mat = pat.matcher(urls.trim())
|
||||
val mat = pat.matcher(urls?.trim() ?: "")
|
||||
return mat.matches()
|
||||
}
|
||||
|
||||
|
@ -4,9 +4,11 @@ package com.idormy.sms.forwarder.utils
|
||||
import android.text.TextUtils
|
||||
import android.util.Base64
|
||||
import com.google.gson.Gson
|
||||
import com.idormy.sms.forwarder.R
|
||||
import com.idormy.sms.forwarder.core.Core
|
||||
import com.idormy.sms.forwarder.entity.CloneInfo
|
||||
import com.idormy.sms.forwarder.server.model.BaseRequest
|
||||
import com.xuexiang.xui.utils.ResUtils.getString
|
||||
import com.xuexiang.xutil.app.AppUtils
|
||||
import com.yanzhenjie.andserver.error.HttpException
|
||||
import java.net.URLEncoder
|
||||
@ -116,26 +118,26 @@ class HttpServerUtils private constructor() {
|
||||
val signSecret = serverSignKey
|
||||
if (TextUtils.isEmpty(signSecret)) return
|
||||
|
||||
if (TextUtils.isEmpty(req.sign)) throw HttpException(500, "服务端启用签名密钥,sign节点必传")
|
||||
if (req.timestamp == 0L) throw HttpException(500, "服务端启用签名密钥,timestamp节点必传")
|
||||
if (TextUtils.isEmpty(req.sign)) throw HttpException(500, getString(R.string.sign_required))
|
||||
if (req.timestamp == 0L) throw HttpException(500, getString(R.string.timestamp_required))
|
||||
|
||||
val timestamp = System.currentTimeMillis()
|
||||
val diffTime = kotlin.math.abs(timestamp - req.timestamp)
|
||||
if (diffTime > 3600000L) {
|
||||
throw HttpException(500, "timestamp校验失败,与服务器时间($timestamp)误差不能超过1小时(diffTime=$diffTime)")
|
||||
throw HttpException(500, String.format(getString(R.string.timestamp_verify_failed), timestamp, diffTime))
|
||||
}
|
||||
|
||||
val sign = calcSign(req.timestamp.toString(), signSecret.toString())
|
||||
if (sign != req.sign) throw HttpException(500, "签名校验失败")
|
||||
if (sign != req.sign) throw HttpException(500, getString(R.string.sign_verify_failed))
|
||||
}
|
||||
|
||||
//判断版本是否一致
|
||||
@Throws(HttpException::class)
|
||||
fun compareVersion(cloneInfo: CloneInfo) {
|
||||
val versionCodeRequest = cloneInfo.versionCode
|
||||
if (versionCodeRequest == 0) throw HttpException(500, "version_code节点必传")
|
||||
if (versionCodeRequest == 0) throw HttpException(500, getString(R.string.version_code_required))
|
||||
val versionCodeLocal = AppUtils.getAppVersionCode().toString().substring(1)
|
||||
if (!versionCodeRequest.toString().endsWith(versionCodeLocal)) throw HttpException(500, "客户端与服务端的App版本不一致")
|
||||
if (!versionCodeRequest.toString().endsWith(versionCodeLocal)) throw HttpException(500, getString(R.string.inconsistent_version))
|
||||
}
|
||||
|
||||
//导出设置
|
||||
|
@ -1,7 +1,9 @@
|
||||
package com.idormy.sms.forwarder.utils
|
||||
|
||||
import android.util.Log
|
||||
import com.idormy.sms.forwarder.R
|
||||
import com.idormy.sms.forwarder.entity.MsgInfo
|
||||
import com.xuexiang.xui.utils.ResUtils.getString
|
||||
import java.util.*
|
||||
|
||||
@Suppress("unused")
|
||||
@ -45,7 +47,7 @@ object RuleLineUtils {
|
||||
if (lineNum == 0) {
|
||||
//第一行不允许缩进
|
||||
if (line.startsWith(" ")) {
|
||||
throw Exception("第一行不允许缩进")
|
||||
throw Exception(getString(R.string.no_indentation_allowed_on_the_first_line))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -18,6 +18,7 @@ import com.xuexiang.xhttp2.cache.model.CacheMode
|
||||
import com.xuexiang.xhttp2.callback.SimpleCallBack
|
||||
import com.xuexiang.xhttp2.exception.ApiException
|
||||
import com.xuexiang.xui.utils.ResUtils
|
||||
import com.xuexiang.xui.utils.ResUtils.getString
|
||||
|
||||
@Suppress("PrivatePropertyName", "UNUSED_PARAMETER")
|
||||
class WeworkAgentUtils private constructor() {
|
||||
@ -65,7 +66,7 @@ class WeworkAgentUtils private constructor() {
|
||||
MMKVUtils.put("expires_in_" + setting.agentID, System.currentTimeMillis() + ((resp.expires_in ?: 7200) - 120) * 1000L) //提前2分钟过期
|
||||
sendTextMsg(setting, msgInfo, rule, logId)
|
||||
} else {
|
||||
XToastUtils.error("请求失败:$response")
|
||||
XToastUtils.error(String.format(getString(R.string.request_failed_tips), response))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -12,12 +12,12 @@
|
||||
<TextView
|
||||
android:id="@+id/tv_title"
|
||||
style="@style/TextStyle.Title"
|
||||
tools:text="主标题" />
|
||||
tools:text="@string/main_title" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_sub_title"
|
||||
style="@style/TextStyle.Explain"
|
||||
android:layout_marginTop="4dp"
|
||||
tools:text="副标题" />
|
||||
tools:text="@string/subtitle" />
|
||||
|
||||
</LinearLayout>
|
@ -67,7 +67,7 @@
|
||||
android:paddingBottom="@dimen/config_margin_10dp"
|
||||
android:singleLine="false"
|
||||
android:textColor="@color/xui_config_color_primary_text"
|
||||
tools:text="获取更多资讯,欢迎关注我的微信公众号:【我的Android开源之旅】" />
|
||||
tools:text="" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
|
@ -26,14 +26,14 @@
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="服务端设置"
|
||||
android:text="@string/server_settings"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="10dp"
|
||||
android:text="按照主动控制·服务端的配置填写以下两项,签名密钥可选"
|
||||
android:text="@string/server_settings_tips2"
|
||||
android:textSize="10sp"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
@ -49,7 +49,7 @@
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="服务地址"
|
||||
android:text="@string/service_address"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<com.xuexiang.xui.widget.edittext.ClearEditText
|
||||
@ -58,7 +58,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="5dp"
|
||||
android:layout_weight="1"
|
||||
android:hint="例如:http://127.0.0.1:5000" />
|
||||
android:hint="@string/service_address_hint" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
@ -72,7 +72,7 @@
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="签名密钥"
|
||||
android:text="@string/sign_key"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<com.xuexiang.xui.widget.edittext.ClearEditText
|
||||
@ -108,14 +108,14 @@
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="功能列表"
|
||||
android:text="@string/features_list"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="10dp"
|
||||
android:text="请先点击【测试接口】按钮,获取服务端已启用的功能列表"
|
||||
android:text="@string/click_test_button_first"
|
||||
android:textSize="10sp"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
|
@ -12,7 +12,7 @@
|
||||
android:id="@+id/search_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:hint="输入关键字模糊匹配手机号码" />
|
||||
android:hint="@string/call_keyword_hint" />
|
||||
|
||||
<com.xuexiang.xui.widget.tabbar.EasyIndicator
|
||||
android:id="@+id/tabBar"
|
||||
|
@ -12,7 +12,7 @@
|
||||
android:id="@+id/search_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:hint="纯数字匹配号码/非数字匹配姓名" />
|
||||
android:hint="@string/contact_keyword_hint" />
|
||||
|
||||
<com.scwang.smartrefresh.layout.SmartRefreshLayout
|
||||
android:id="@+id/refreshLayout"
|
||||
|
@ -12,7 +12,7 @@
|
||||
android:id="@+id/search_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:hint="输入关键字模糊匹配短信内容" />
|
||||
android:hint="@string/sms_keyword_hint" />
|
||||
|
||||
<com.xuexiang.xui.widget.tabbar.EasyIndicator
|
||||
android:id="@+id/tabBar"
|
||||
|
@ -105,7 +105,7 @@
|
||||
app:met_maxCharacters="390"
|
||||
app:met_regexp="@string/msg_content_regex"
|
||||
app:met_validateOnFocusLost="true"
|
||||
app:mlet_hintText="请输入短信内容,70个字以内算一条,超过每增加64字加一条" />
|
||||
app:mlet_hintText="@string/msg_content_hint" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -55,6 +55,7 @@
|
||||
|
||||
<string name="lab_yes">Yes</string>
|
||||
<string name="lab_no">No</string>
|
||||
<string name="lab_open_qq_app">Allow pages to open QQ apps?</string>
|
||||
<string name="lab_open_third_app">Allow pages to open third-party apps?</string>
|
||||
|
||||
<!-- 隐私政策弹窗 -->
|
||||
@ -703,6 +704,7 @@
|
||||
<string name="other_login_methods">Other login methods</string>
|
||||
<string name="request_succeeded">Request succeeded</string>
|
||||
<string name="request_failed">Request failed: </string>
|
||||
<string name="request_failed_tips">Request failed: %s</string>
|
||||
<string name="no_sms_sending_permission">No SMS sending permission</string>
|
||||
<string name="frpclib_download_title">Missing FrpcLib v%s</string>
|
||||
<string name="frpclib_download_content">Downloading, please wait…</string>
|
||||
@ -802,5 +804,52 @@
|
||||
<string name="battery_status">Status: %s</string>
|
||||
<string name="battery_health">Health: %s</string>
|
||||
<string name="battery_plugged">Plugged: %s</string>
|
||||
|
||||
<string name="server_test">Server Test</string>
|
||||
<string name="invalid_service_address">Invalid service address</string>
|
||||
<string name="click_test_button_first">Click the test button first, to get the list of features enabled by the server</string>
|
||||
<string name="disabled_on_the_server">Disable this feature on the server</string>
|
||||
<string name="frpc_failed_to_run">Frpc failed to run</string>
|
||||
<string name="successfully_deleted">Successfully deleted</string>
|
||||
<string name="sender_disabled_tips">[Note] The sending channel has been disabled, and its associated rules will not be sent even if they match!</string>
|
||||
<string name="local_call">Local Call:</string>
|
||||
<string name="remote_sms">Remote SMS:</string>
|
||||
<string name="clear">Clear</string>
|
||||
<string name="storage_permission_tips">Unauthorized storage permission, this function cannot be used!</string>
|
||||
<string name="contact_info">Name:%s\nPhone:%s</string>
|
||||
<string name="card_slot_does_not_match">Card slot does not match the rule</string>
|
||||
<string name="unmatched_rule">Unmatched rule</string>
|
||||
<string name="copied_to_clipboard">Copied to clipboard:\n%s</string>
|
||||
<string name="search_keyword">Search Keyword: %s</string>
|
||||
<string name="export_succeeded">Export configuration succeeded!</string>
|
||||
<string name="export_failed">Export failed, please check write permission!</string>
|
||||
<string name="export_failed_tips">Export failed: %s</string>
|
||||
<string name="import_failed">Import failed: Please check for external storage access!</string>
|
||||
<string name="import_failed_file_not_exist">Import failed: local backup file does not exist</string>
|
||||
<string name="import_succeeded">Import configuration successful!</string>
|
||||
<string name="import_failed_tips">Import failed: %s</string>
|
||||
<string name="restore_failed">Restore failed</string>
|
||||
<string name="battery_status_monitor">Battery Status Monitor</string>
|
||||
<string name="below_level_min">[Battery Warning] The battery has been lower than the lower limit of the battery warning, please charge it in time!%s</string>
|
||||
<string name="over_level_max">[Battery Warning] The battery warning limit has been exceeded, please unplug the charger!%s</string>
|
||||
<string name="reach_level_min">[Battery Warning] The lower limit of the battery warning has been reached, please charge it in time!%s</string>
|
||||
<string name="reach_level_max">[Battery Warning] The upper limit of battery warning has been reached, please unplug the charger!%s</string>
|
||||
<string name="battery_status_changed">【充电状态】发生变化:</string>
|
||||
<string name="no_indentation_allowed_on_the_first_line">第一行不允许缩进</string>
|
||||
<string name="sign_required">The server enables the signing key, and the sign node required</string>
|
||||
<string name="timestamp_required">The server enables the signing key, and the timestamp node required</string>
|
||||
<string name="sign_verify_failed">Sign verify failed</string>
|
||||
<string name="version_code_required">version_code required</string>
|
||||
<string name="inconsistent_version">The app versions of the client and server are inconsistent</string>
|
||||
<string name="timestamp_verify_failed">The timestamp verification failed, and the difference with the server time (%s) cannot exceed 1 hour (diffTime=%s)</string>
|
||||
|
||||
<string name="main_title">Main title</string>
|
||||
<string name="subtitle">Subtitle</string>
|
||||
<string name="sms_keyword_hint">Input keywords to fuzzy match SMS content</string>
|
||||
<string name="contact_keyword_hint">Pure numbers match numbers / non-numbers match names</string>
|
||||
<string name="call_keyword_hint">Input keyword to fuzzy match mobile phone number</string>
|
||||
<string name="server_settings_tips2">Fill two items according to the config of server, the signature key is optional</string>
|
||||
<string name="service_address">Service Address</string>
|
||||
<string name="service_address_hint">E.g: http://127.0.0.1:5000</string>
|
||||
<string name="features_list">Features List</string>
|
||||
</resources>
|
||||
|
@ -55,6 +55,7 @@
|
||||
|
||||
<string name="lab_yes">是</string>
|
||||
<string name="lab_no">否</string>
|
||||
<string name="lab_open_qq_app">是否允许页面打开"QQ"?</string>
|
||||
<string name="lab_open_third_app">是否允许页面打开第三方应用?</string>
|
||||
|
||||
<!-- 隐私政策弹窗 -->
|
||||
@ -704,6 +705,7 @@
|
||||
<string name="other_login_methods">其他登录方式</string>
|
||||
<string name="request_succeeded">请求成功</string>
|
||||
<string name="request_failed">请求失败:</string>
|
||||
<string name="request_failed_tips">请求失败:%s</string>
|
||||
<string name="no_sms_sending_permission">没有短信发送权限</string>
|
||||
<string name="frpclib_download_title">缺少 FrpcLib v%s 动态库</string>
|
||||
<string name="frpclib_download_content">正在下载中,请稍后……</string>
|
||||
@ -803,5 +805,52 @@
|
||||
<string name="battery_status">电池状态:%s</string>
|
||||
<string name="battery_health">健康度:%s</string>
|
||||
<string name="battery_plugged">充电器:%s</string>
|
||||
|
||||
<string name="server_test">测试接口</string>
|
||||
<string name="invalid_service_address">无效的服务地址</string>
|
||||
<string name="click_test_button_first">请先点击【测试接口】按钮,获取服务端已启用的功能列表</string>
|
||||
<string name="disabled_on_the_server">服务端禁用此功能</string>
|
||||
<string name="frpc_failed_to_run">Frpc运行失败</string>
|
||||
<string name="successfully_deleted">删除成功</string>
|
||||
<string name="sender_disabled_tips">【注意】该发送通道已经禁用,其关联的规则即便匹配上也不会发送!</string>
|
||||
<string name="local_call">本地呼叫:</string>
|
||||
<string name="remote_sms">远程发短信:</string>
|
||||
<string name="clear">清除</string>
|
||||
<string name="storage_permission_tips">未授权储存权限,该功能无法使用!</string>
|
||||
<string name="contact_info">姓名:%s\n号码:%s</string>
|
||||
<string name="card_slot_does_not_match">卡槽未匹配中规则</string>
|
||||
<string name="unmatched_rule">未匹配中规则</string>
|
||||
<string name="copied_to_clipboard">已复制到剪贴板:\n%s</string>
|
||||
<string name="search_keyword">搜索关键字: %s</string>
|
||||
<string name="export_succeeded">导出配置成功!</string>
|
||||
<string name="export_failed">导出失败,请检查写入权限!</string>
|
||||
<string name="export_failed_tips">导出失败: %s</string>
|
||||
<string name="import_failed">导入失败:请检查是否有外部存储访问权限!</string>
|
||||
<string name="import_failed_file_not_exist">导入失败:本地备份文件不存在!</string>
|
||||
<string name="import_succeeded">导入配置成功!</string>
|
||||
<string name="import_failed_tips">导入失败: %s</string>
|
||||
<string name="restore_failed">还原失败</string>
|
||||
<string name="battery_status_monitor">电池状态监听</string>
|
||||
<string name="below_level_min">【电量预警】已低于电量预警下限,请及时充电!%s</string>
|
||||
<string name="over_level_max">【电量预警】已高于电量预警上限,请拔掉充电器!%s</string>
|
||||
<string name="reach_level_min">【电量预警】已低于电量预警下限,请及时充电!%s</string>
|
||||
<string name="reach_level_max">【电量预警】已高于电量预警上限,请拔掉充电器!%s</string>
|
||||
<string name="battery_status_changed">【充电状态】发生变化:</string>
|
||||
<string name="no_indentation_allowed_on_the_first_line">第一行不允许缩进</string>
|
||||
<string name="sign_required">服务端启用签名密钥,sign节点必传</string>
|
||||
<string name="timestamp_required">服务端启用签名密钥,timestamp节点必传</string>
|
||||
<string name="sign_verify_failed">签名校验失败</string>
|
||||
<string name="version_code_required">version_code节点必传</string>
|
||||
<string name="inconsistent_version">客户端与服务端的App版本不一致</string>
|
||||
<string name="timestamp_verify_failed">timestamp校验失败,与服务器时间(%s)误差不能超过1小时(diffTime=%s)</string>
|
||||
|
||||
<string name="main_title">主标题</string>
|
||||
<string name="subtitle">副标题</string>
|
||||
<string name="sms_keyword_hint">输入关键字模糊匹配短信内容</string>
|
||||
<string name="contact_keyword_hint">纯数字匹配号码/非数字匹配姓名</string>
|
||||
<string name="call_keyword_hint">输入关键字模糊匹配手机号码</string>
|
||||
<string name="server_settings_tips2">按照主动控制·服务端的配置填写以下两项,签名密钥可选</string>
|
||||
<string name="service_address">服务地址</string>
|
||||
<string name="service_address_hint">例如:http://127.0.0.1:5000</string>
|
||||
<string name="features_list">功能列表</string>
|
||||
</resources>
|
||||
|
Loading…
x
Reference in New Issue
Block a user