新增:多语言切换设置适应国际化 #378

整理:code review
pull/408/head
pppscn 10 months ago
parent 2b4468b669
commit 1da0257c8c

@ -37,6 +37,7 @@ import com.idormy.sms.forwarder.fragment.ServerFragment
import com.idormy.sms.forwarder.fragment.SettingsFragment
import com.idormy.sms.forwarder.fragment.TasksFragment
import com.idormy.sms.forwarder.service.ForegroundService
import com.idormy.sms.forwarder.utils.EVENT_LOAD_APP_LIST
import com.idormy.sms.forwarder.utils.FRPC_LIB_DOWNLOAD_URL
import com.idormy.sms.forwarder.utils.FRPC_LIB_VERSION
import com.idormy.sms.forwarder.utils.SettingUtils
@ -44,6 +45,7 @@ import com.idormy.sms.forwarder.utils.XToastUtils
import com.idormy.sms.forwarder.utils.sdkinit.XUpdateInit
import com.idormy.sms.forwarder.widget.GuideTipsDialog.Companion.showTips
import com.idormy.sms.forwarder.workers.LoadAppListWorker
import com.jeremyliao.liveeventbus.LiveEventBus
import com.xuexiang.xhttp2.XHttp
import com.xuexiang.xhttp2.callback.DownloadProgressCallBack
import com.xuexiang.xhttp2.exception.ApiException
@ -78,6 +80,7 @@ class MainActivity : BaseActivity<ActivityMainBinding?>(), DrawerAdapter.OnItemS
private val POS_APPS = 9
private val POS_HELP = 11 //10为空行
private val POS_ABOUT = 12
private var needToAppListFragment = false
private lateinit var mTabLayout: TabLayout
private lateinit var mSlidingRootNav: SlidingRootNav
@ -126,6 +129,13 @@ class MainActivity : BaseActivity<ActivityMainBinding?>(), DrawerAdapter.OnItemS
}
}
})
//监听已安装App信息列表加载完成事件
LiveEventBus.get(EVENT_LOAD_APP_LIST, String::class.java).observe(this) {
if (needToAppListFragment) {
openNewPage(AppListFragment::class.java)
}
}
}
override val isSupportSlideBack: Boolean
@ -146,6 +156,7 @@ class MainActivity : BaseActivity<ActivityMainBinding?>(), DrawerAdapter.OnItemS
switchPage(LogsFragment::class.java)
mTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
needToAppListFragment = false
mAdapter.setSelected(tab.position)
when (tab.position) {
POS_LOG -> switchPage(LogsFragment::class.java)
@ -255,6 +266,7 @@ class MainActivity : BaseActivity<ActivityMainBinding?>(), DrawerAdapter.OnItemS
}
override fun onItemSelected(position: Int) {
needToAppListFragment = false
when (position) {
POS_LOG, POS_RULE, POS_SENDER, POS_SETTING -> {
val tab = mTabLayout.getTabAt(position)
@ -293,6 +305,7 @@ class MainActivity : BaseActivity<ActivityMainBinding?>(), DrawerAdapter.OnItemS
XToastUtils.info(getString(R.string.loading_app_list))
val request = OneTimeWorkRequestBuilder<LoadAppListWorker>().build()
WorkManager.getInstance(this).enqueue(request)
needToAppListFragment = true
return
}
openNewPage(AppListFragment::class.java)

@ -1,9 +1,9 @@
package com.idormy.sms.forwarder.adapter.spinner
import android.graphics.drawable.Drawable
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xutil.resource.ResUtils
@Suppress("unused", "DEPRECATION")
@Suppress("unused")
class AppListAdapterItem {
var name: String = ""

@ -2,9 +2,10 @@ package com.idormy.sms.forwarder.adapter.spinner
import android.content.Context
import android.graphics.drawable.Drawable
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xutil.resource.ResUtils.getDrawable
import com.xuexiang.xutil.resource.ResUtils.getString
@Suppress("unused", "DEPRECATION")
@Suppress("unused")
class SenderAdapterItem {
//标题内容
@ -41,15 +42,15 @@ class SenderAdapterItem {
this.status = status
}
constructor(title: CharSequence, drawableId: Int) : this(title, ResUtils.getDrawable(drawableId))
constructor(title: CharSequence, drawableId: Int, id: Long) : this(title, ResUtils.getDrawable(drawableId), id)
constructor(title: CharSequence, drawableId: Int, id: Long, status: Int) : this(title, ResUtils.getDrawable(drawableId), id, status)
constructor(context: Context?, titleId: Int, drawableId: Int) : this(ResUtils.getString(titleId), ResUtils.getDrawable(context, drawableId))
constructor(context: Context?, titleId: Int, drawableId: Int, id: Long) : this(ResUtils.getString(titleId), ResUtils.getDrawable(context, drawableId), id)
constructor(context: Context?, titleId: Int, drawableId: Int, id: Long, status: Int) : this(ResUtils.getString(titleId), ResUtils.getDrawable(context, drawableId), id, status)
constructor(context: Context?, title: CharSequence, drawableId: Int) : this(title, ResUtils.getDrawable(context, drawableId))
constructor(context: Context?, title: CharSequence, drawableId: Int, id: Long) : this(title, ResUtils.getDrawable(context, drawableId), id)
constructor(context: Context?, title: CharSequence, drawableId: Int, id: Long, status: Int) : this(title, ResUtils.getDrawable(context, drawableId), id, status)
constructor(title: CharSequence, drawableId: Int) : this(title, getDrawable(drawableId))
constructor(title: CharSequence, drawableId: Int, id: Long) : this(title, getDrawable(drawableId), id)
constructor(title: CharSequence, drawableId: Int, id: Long, status: Int) : this(title, getDrawable(drawableId), id, status)
constructor(context: Context?, titleId: Int, drawableId: Int) : this(getString(titleId), getDrawable(context, drawableId))
constructor(context: Context?, titleId: Int, drawableId: Int, id: Long) : this(getString(titleId), getDrawable(context, drawableId), id)
constructor(context: Context?, titleId: Int, drawableId: Int, id: Long, status: Int) : this(getString(titleId), getDrawable(context, drawableId), id, status)
constructor(context: Context?, title: CharSequence, drawableId: Int) : this(title, getDrawable(context, drawableId))
constructor(context: Context?, title: CharSequence, drawableId: Int, id: Long) : this(title, getDrawable(context, drawableId), id)
constructor(context: Context?, title: CharSequence, drawableId: Int, id: Long, status: Int) : this(title, getDrawable(context, drawableId), id, status)
fun setStatus(status: Int): SenderAdapterItem {
this.status = status

@ -16,9 +16,9 @@ import androidx.annotation.DrawableRes
import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.utils.STATUS_OFF
import com.xuexiang.xui.utils.CollectionUtils
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.widget.spinner.editspinner.BaseEditSpinnerAdapter
import com.xuexiang.xui.widget.spinner.editspinner.EditSpinnerFilter
import com.xuexiang.xutil.resource.ResUtils.getDrawable
@Suppress("unused", "NAME_SHADOWING", "DEPRECATION")
class SenderSpinnerAdapter<T> : BaseEditSpinnerAdapter<T>, EditSpinnerFilter {
@ -74,7 +74,7 @@ class SenderSpinnerAdapter<T> : BaseEditSpinnerAdapter<T>, EditSpinnerFilter {
val item = CollectionUtils.getListItem(mDataSource, mIndexs[position]) as SenderAdapterItem
holder.iconView.setImageDrawable(item.icon)
holder.statusView.setImageDrawable(
ResUtils.getDrawable(
getDrawable(
when (item.status) {
STATUS_OFF -> R.drawable.ic_stop
else -> R.drawable.ic_start

@ -17,8 +17,8 @@ import com.xuexiang.xpage.base.XPageFragment
import com.xuexiang.xpage.core.CoreSwitchBean
import com.xuexiang.xrouter.facade.service.SerializationService
import com.xuexiang.xrouter.launcher.XRouter
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.widget.slideback.SlideBack
import com.xuexiang.xutil.resource.ResUtils.isRtl
/**
* 基础容器Activity
@ -144,7 +144,7 @@ open class BaseActivity<Binding : ViewBinding?> : XPageActivity() {
if (isSupportSlideBack) {
SlideBack.with(this)
.haveScroll(true)
.edgeMode(if (ResUtils.isRtl()) SlideBack.EDGE_RIGHT else SlideBack.EDGE_LEFT)
.edgeMode(if (isRtl()) SlideBack.EDGE_RIGHT else SlideBack.EDGE_LEFT)
.callBack { popPage() }
.register()
}

@ -10,7 +10,7 @@ import androidx.annotation.RequiresApi
import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.core.webview.WebViewInterceptDialog.Companion.show
import com.just.agentweb.core.client.MiddlewareWebClientBase
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xutil.resource.ResUtils.getStringArray
import java.util.Locale
/**
@ -121,7 +121,7 @@ open class MiddlewareWebViewClient : MiddlewareWebClientBase() {
* @return
*/
private fun hasAdUrl(url: String): Boolean {
val adUrls = ResUtils.getStringArray(R.array.adBlockUrl)
val adUrls = getStringArray(R.array.adBlockUrl)
for (adUrl in adUrls) {
if (url.contains(adUrl)) {
return true

@ -8,7 +8,6 @@ import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.utils.XToastUtils
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.widget.dialog.DialogLoader
import com.xuexiang.xutil.XUtil
import com.xuexiang.xutil.app.ActivityUtils
@ -28,7 +27,7 @@ class WebViewInterceptDialog : AppCompatActivity(), DialogInterface.OnDismissLis
DialogLoader.getInstance().showConfirmDialog(
this,
getOpenTitle(url),
ResUtils.getString(R.string.lab_yes),
getString(R.string.lab_yes),
{ dialog: DialogInterface, _: Int ->
dialog.dismiss()
if (isAppLink(url)) {
@ -37,16 +36,16 @@ class WebViewInterceptDialog : AppCompatActivity(), DialogInterface.OnDismissLis
openApp(url)
}
},
ResUtils.getString(R.string.lab_no)
getString(R.string.lab_no)
) { dialog: DialogInterface, _: Int -> dialog.dismiss() }.setOnDismissListener(this)
}
private fun getOpenTitle(url: String): String {
val scheme = getScheme(url)
return if ("mqqopensdkapi" == scheme) {
ResUtils.getString(R.string.lab_open_qq_app)
getString(R.string.lab_open_qq_app)
} else {
ResUtils.getString(R.string.lab_open_third_app)
getString(R.string.lab_open_third_app)
}
}

@ -7,13 +7,12 @@ import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.database.ext.ConvertersSenderList
import com.idormy.sms.forwarder.entity.MsgInfo
import com.idormy.sms.forwarder.utils.*
import com.xuexiang.xui.utils.ResUtils.getString
import com.xuexiang.xutil.resource.ResUtils.getString
import kotlinx.parcelize.Parcelize
import java.util.*
import java.util.regex.Pattern
import java.util.regex.PatternSyntaxException
@Suppress("DEPRECATION")
@Parcelize
@Entity(
tableName = "Rule",
@ -56,6 +55,47 @@ data class Rule(
companion object {
val TAG: String = Rule::class.java.simpleName
//通话类型1.来电挂机 2.去电挂机 3.未接来电 4.来电提醒 5.来电接通 6.去电拨出
val CALL_TYPE_MAP = mapOf(
//"0" to getString(R.string.unknown_call),
"1" to getString(R.string.incoming_call_ended),
"2" to getString(R.string.outgoing_call_ended),
"3" to getString(R.string.missed_call),
"4" to getString(R.string.incoming_call_received),
"5" to getString(R.string.incoming_call_answered),
"6" to getString(R.string.outgoing_call_started),
)
val FILED_MAP = object : HashMap<String, String>() {
init {
put("transpond_all", getString(R.string.rule_transpond_all))
put("phone_num", getString(R.string.rule_phone_num))
put("msg_content", getString(R.string.rule_msg_content))
put("multi_match", getString(R.string.rule_multi_match))
put("package_name", getString(R.string.rule_package_name))
put("inform_content", getString(R.string.rule_inform_content))
put("call_type", getString(R.string.rule_call_type))
put("uid", getString(R.string.rule_uid))
}
}
val CHECK_MAP = object : HashMap<String, String>() {
init {
put("is", getString(R.string.rule_is))
put("notis", getString(R.string.rule_notis))
put("contain", getString(R.string.rule_contain))
put("startwith", getString(R.string.rule_startwith))
put("endwith", getString(R.string.rule_endwith))
put("notcontain", getString(R.string.rule_notcontain))
put("regex", getString(R.string.rule_regex))
}
}
val SIM_SLOT_MAP = object : HashMap<String, String>() {
init {
put("ALL", getString(R.string.rule_all))
put("SIM1", "SIM1")
put("SIM2", "SIM2")
}
}
fun getRuleMatch(filed: String?, check: String?, value: String?, simSlot: String?): Any {
val sb = StringBuilder()
sb.append(SIM_SLOT_MAP[simSlot]).append(getString(R.string.rule_card))

@ -1,10 +1,9 @@
package com.idormy.sms.forwarder.entity
import com.idormy.sms.forwarder.R
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xutil.resource.ResUtils.getString
import java.io.Serializable
@Suppress("DEPRECATION")
data class BatteryInfo(
var level: String = "",
var scale: String = "",
@ -16,13 +15,13 @@ data class BatteryInfo(
) : Serializable {
override fun toString(): String {
var msg = ""
msg += "\n" + String.format(ResUtils.getString(R.string.battery_level), level)
if (scale != "") msg += "\n" + String.format(ResUtils.getString(R.string.battery_scale), scale)
if (voltage != "") msg += "\n" + String.format(ResUtils.getString(R.string.battery_voltage), voltage)
if (temperature != "") msg += "\n" + String.format(ResUtils.getString(R.string.battery_temperature), temperature)
msg += "\n" + String.format(ResUtils.getString(R.string.battery_status), status)
msg += "\n" + String.format(ResUtils.getString(R.string.battery_health), health)
msg += "\n" + String.format(ResUtils.getString(R.string.battery_plugged), plugged)
msg += "\n" + String.format(getString(R.string.battery_level), level)
if (scale != "") msg += "\n" + String.format(getString(R.string.battery_scale), scale)
if (voltage != "") msg += "\n" + String.format(getString(R.string.battery_voltage), voltage)
if (temperature != "") msg += "\n" + String.format(getString(R.string.battery_temperature), temperature)
msg += "\n" + String.format(getString(R.string.battery_status), status)
msg += "\n" + String.format(getString(R.string.battery_health), health)
msg += "\n" + String.format(getString(R.string.battery_plugged), plugged)
return msg
}
}

@ -3,11 +3,10 @@ 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 com.xuexiang.xutil.resource.ResUtils.getString
import java.io.Serializable
import java.util.*
@Suppress("DEPRECATION")
data class ContactInfo(
val name: String = "",
@SerializedName("phone_number")

@ -4,8 +4,8 @@ import android.graphics.Rect
import android.os.Parcel
import android.os.Parcelable.Creator
import com.idormy.sms.forwarder.R
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.widget.imageview.preview.enitity.IPreviewInfo
import com.xuexiang.xutil.resource.ResUtils.getString
/**
* 图片预览实体类
@ -20,7 +20,7 @@ data class ImageInfo(
//记录坐标
var mBounds: Rect? = null,
var mVideoUrl: String? = null,
var description: String? = ResUtils.getString(R.string.description),
var description: String? = getString(R.string.description),
) : IPreviewInfo {
constructor(url: String) : this(mUrl = url)

@ -1,10 +1,9 @@
package com.idormy.sms.forwarder.entity
import com.idormy.sms.forwarder.R
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xutil.resource.ResUtils.getString
import java.io.Serializable
@Suppress("DEPRECATION")
data class LocationInfo(
var longitude: Double = 0.0,
var latitude: Double = 0.0,
@ -15,11 +14,11 @@ data class LocationInfo(
override fun toString(): String {
var msg = ""
msg += "\n" + String.format(ResUtils.getString(R.string.location_longitude), longitude)
msg += "\n" + String.format(ResUtils.getString(R.string.location_latitude), latitude)
if (address != "") msg += "\n" + String.format(ResUtils.getString(R.string.location_address), address)
if (time != "") msg += "\n" + String.format(ResUtils.getString(R.string.location_time), time)
if (provider != "") msg += "\n" + String.format(ResUtils.getString(R.string.location_provider), provider)
msg += "\n" + String.format(getString(R.string.location_longitude), longitude)
msg += "\n" + String.format(getString(R.string.location_latitude), latitude)
if (address != "") msg += "\n" + String.format(getString(R.string.location_address), address)
if (time != "") msg += "\n" + String.format(getString(R.string.location_time), time)
if (provider != "") msg += "\n" + String.format(getString(R.string.location_provider), provider)
return msg + "\n"
}

@ -6,20 +6,19 @@ import android.util.Log
import com.idormy.sms.forwarder.App
import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.utils.BatteryUtils
import com.idormy.sms.forwarder.utils.CALL_TYPE_MAP
import com.idormy.sms.forwarder.utils.HttpServerUtils
import com.idormy.sms.forwarder.utils.SettingUtils
import com.idormy.sms.forwarder.utils.SettingUtils.Companion.enableSmsTemplate
import com.idormy.sms.forwarder.utils.SettingUtils.Companion.extraDeviceMark
import com.idormy.sms.forwarder.utils.SettingUtils.Companion.smsTemplate
import com.idormy.sms.forwarder.utils.task.TaskUtils
import com.xuexiang.xui.utils.ResUtils.getString
import com.xuexiang.xutil.app.AppUtils
import com.xuexiang.xutil.resource.ResUtils.getString
import java.io.Serializable
import java.text.SimpleDateFormat
import java.util.*
@Suppress("unused", "DEPRECATION")
@Suppress("unused")
data class MsgInfo(
var type: String = "sms",
var from: String,
@ -32,9 +31,20 @@ data class MsgInfo(
var uid: Int = 0, //APP通知的UID
) : Serializable {
val titleForSend: String
private val titleForSend: String
get() = getTitleForSend("", "")
//通话类型1.来电挂机 2.去电挂机 3.未接来电 4.来电提醒 5.来电接通 6.去电拨出
private val callTypeMap = mapOf(
//"0" to getString(R.string.unknown_call),
"1" to getString(R.string.incoming_call_ended),
"2" to getString(R.string.outgoing_call_ended),
"3" to getString(R.string.missed_call),
"4" to getString(R.string.incoming_call_received),
"5" to getString(R.string.incoming_call_answered),
"6" to getString(R.string.outgoing_call_started),
)
fun getTitleForSend(titleTemplate: String): String {
return getTitleForSend(titleTemplate, "")
}
@ -61,7 +71,7 @@ data class MsgInfo(
.replace(getString(R.string.tag_current_time), SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date()))
.replace(getString(R.string.tag_device_name), deviceMark)
.replace(getString(R.string.tag_app_version), versionName)
.replace(getString(R.string.tag_call_type), CALL_TYPE_MAP[callType.toString()] ?: getString(R.string.unknown_call))
.replace(getString(R.string.tag_call_type), callTypeMap[callType.toString()] ?: getString(R.string.unknown_call))
.trim()
return replaceLocationTag(replaceAppName(regexReplace(titleForSend, regexReplace), from))
}
@ -110,7 +120,7 @@ data class MsgInfo(
.replace(getString(R.string.tag_current_time), SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date()))
.replace(getString(R.string.tag_device_name), deviceMark)
.replace(getString(R.string.tag_app_version), versionName)
.replace(getString(R.string.tag_call_type), CALL_TYPE_MAP[callType.toString()] ?: getString(R.string.unknown_call))
.replace(getString(R.string.tag_call_type), callTypeMap[callType.toString()] ?: getString(R.string.unknown_call))
.replace(getString(R.string.tag_battery_pct), TaskUtils.batteryPct.toString())
.replace(getString(R.string.tag_battery_status), BatteryUtils.getStatus(TaskUtils.batteryStatus))
.replace(getString(R.string.tag_battery_plugged), BatteryUtils.getPlugged(TaskUtils.batteryPlugged))

@ -2,11 +2,9 @@ package com.idormy.sms.forwarder.entity.condition
import android.os.BatteryManager
import com.idormy.sms.forwarder.R
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xutil.resource.ResUtils.getString
import java.io.Serializable
@Suppress("DEPRECATION")
data class ChargeSetting(
var description: String = "", //描述
var status: Int = BatteryManager.BATTERY_STATUS_UNKNOWN, //状态
@ -34,12 +32,12 @@ data class ChargeSetting(
private fun getStatusStr(status: Int): String {
return when (status) {
BatteryManager.BATTERY_STATUS_CHARGING -> ResUtils.getString(R.string.battery_charging)
BatteryManager.BATTERY_STATUS_DISCHARGING -> ResUtils.getString(R.string.battery_discharging)
BatteryManager.BATTERY_STATUS_NOT_CHARGING -> ResUtils.getString(R.string.battery_not_charging)
BatteryManager.BATTERY_STATUS_FULL -> ResUtils.getString(R.string.battery_full)
BatteryManager.BATTERY_STATUS_UNKNOWN -> ResUtils.getString(R.string.battery_unknown)
else -> ResUtils.getString(R.string.battery_unknown)
BatteryManager.BATTERY_STATUS_CHARGING -> getString(R.string.battery_charging)
BatteryManager.BATTERY_STATUS_DISCHARGING -> getString(R.string.battery_discharging)
BatteryManager.BATTERY_STATUS_NOT_CHARGING -> getString(R.string.battery_not_charging)
BatteryManager.BATTERY_STATUS_FULL -> getString(R.string.battery_full)
BatteryManager.BATTERY_STATUS_UNKNOWN -> getString(R.string.battery_unknown)
else -> getString(R.string.battery_unknown)
}
}
@ -56,10 +54,10 @@ data class ChargeSetting(
private fun getPluggedStr(plugged: Int): String {
return when (plugged) {
BatteryManager.BATTERY_PLUGGED_AC -> ResUtils.getString(R.string.battery_ac)
BatteryManager.BATTERY_PLUGGED_USB -> ResUtils.getString(R.string.battery_usb)
BatteryManager.BATTERY_PLUGGED_WIRELESS -> ResUtils.getString(R.string.battery_wireless)
else -> ResUtils.getString(R.string.battery_unknown)
BatteryManager.BATTERY_PLUGGED_AC -> getString(R.string.battery_ac)
BatteryManager.BATTERY_PLUGGED_USB -> getString(R.string.battery_usb)
BatteryManager.BATTERY_PLUGGED_WIRELESS -> getString(R.string.battery_wireless)
else -> getString(R.string.battery_unknown)
}
}

@ -25,11 +25,11 @@ 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
import com.xuexiang.xutil.XUtil
import com.xuexiang.xutil.resource.ResUtils.getStringArray
@Suppress("PrivatePropertyName", "DEPRECATION")
@Page(name = "应用列表")
@ -69,7 +69,7 @@ class AppListFragment : BaseFragment<FragmentAppListBinding?>() {
WidgetUtils.initRecyclerView(binding!!.recyclerView, DensityUtils.dp2px(5f), ThemeUtils.resolveColor(context, R.attr.xui_config_color_background))
binding!!.recyclerView.adapter = AppListAdapter(true).also { appListAdapter = it }
binding!!.tabBar.setTabTitles(ResUtils.getStringArray(R.array.app_type_option))
binding!!.tabBar.setTabTitles(getStringArray(R.array.app_type_option))
binding!!.tabBar.setOnTabClickListener { _, position ->
//XToastUtils.toast("点击了$title--$position")
currentType = when (position) {
@ -101,7 +101,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(ResUtils.getString(R.string.package_name_copied) + item?.packageName, 2000)
XToastUtils.toast(getString(R.string.package_name_copied) + item?.packageName, 2000)
}
//设置刷新加载时禁止所有列表操作

@ -17,7 +17,6 @@ import com.idormy.sms.forwarder.databinding.FragmentClientBinding
import com.idormy.sms.forwarder.server.model.BaseResponse
import com.idormy.sms.forwarder.server.model.ConfigData
import com.idormy.sms.forwarder.utils.Base64
import com.idormy.sms.forwarder.utils.CLIENT_FRAGMENT_LIST
import com.idormy.sms.forwarder.utils.CommonUtils
import com.idormy.sms.forwarder.utils.HttpServerUtils
import com.idormy.sms.forwarder.utils.RSACrypt
@ -32,18 +31,19 @@ import com.xuexiang.xhttp2.exception.ApiException
import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xpage.base.XPageFragment
import com.xuexiang.xpage.core.PageOption
import com.xuexiang.xpage.enums.CoreAnim
import com.xuexiang.xpage.model.PageInfo
import com.xuexiang.xrouter.utils.TextUtils
import com.xuexiang.xui.adapter.recyclerview.RecyclerViewHolder
import com.xuexiang.xui.utils.CountDownButtonHelper
import com.xuexiang.xui.utils.DensityUtils
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.utils.WidgetUtils
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
import com.xuexiang.xutil.XUtil
import com.xuexiang.xutil.data.ConvertTools
import com.xuexiang.xutil.resource.ResUtils.getColors
@Suppress("PrivatePropertyName", "DEPRECATION")
@Page(name = "主动控制·客户端")
@ -54,6 +54,71 @@ class ClientFragment : BaseFragment<FragmentClientBinding?>(), View.OnClickListe
private var serverConfig: ConfigData? = null
private var serverHistory: MutableMap<String, String> = mutableMapOf()
private var mCountDownHelper: CountDownButtonHelper? = null
private var CLIENT_FRAGMENT_LIST = listOf(
PageInfo(
getString(R.string.api_clone),
"com.idormy.sms.forwarder.fragment.client.CloneFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_api_clone
),
PageInfo(
getString(R.string.api_sms_query),
"com.idormy.sms.forwarder.fragment.client.SmsQueryFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_api_sms_query
),
PageInfo(
getString(R.string.api_sms_send),
"com.idormy.sms.forwarder.fragment.client.SmsSendFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_api_sms_send
),
PageInfo(
getString(R.string.api_call_query),
"com.idormy.sms.forwarder.fragment.client.CallQueryFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_api_call_query
),
PageInfo(
getString(R.string.api_contact_query),
"com.idormy.sms.forwarder.fragment.client.ContactQueryFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_api_contact_query
),
PageInfo(
getString(R.string.api_contact_add),
"com.idormy.sms.forwarder.fragment.client.ContactAddFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_api_contact_add
),
PageInfo(
getString(R.string.api_wol),
"com.idormy.sms.forwarder.fragment.client.WolSendFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_api_wol
),
PageInfo(
getString(R.string.api_location),
"com.idormy.sms.forwarder.fragment.client.LocationFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_api_location
),
PageInfo(
getString(R.string.api_battery_query),
"com.idormy.sms.forwarder.fragment.client.BatteryQueryFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_api_battery_query
),
)
override fun initViews() {
appContext = requireActivity().application as App
@ -249,7 +314,7 @@ class ClientFragment : BaseFragment<FragmentClientBinding?>(), View.OnClickListe
}
}
true // allow selection
}.positiveText(R.string.select).negativeText(R.string.cancel).neutralText(R.string.clear_history).neutralColor(ResUtils.getColors(R.color.red)).onNeutral { _: MaterialDialog?, _: DialogAction? ->
}.positiveText(R.string.select).negativeText(R.string.cancel).neutralText(R.string.clear_history).neutralColor(getColors(R.color.red)).onNeutral { _: MaterialDialog?, _: DialogAction? ->
serverHistory.clear()
HttpServerUtils.serverHistory = ""
}.show()
@ -269,16 +334,16 @@ class ClientFragment : BaseFragment<FragmentClientBinding?>(), View.OnClickListe
override fun onItemClick(itemView: View, item: PageInfo, position: Int) {
try {
if (item.name != ResUtils.getString(R.string.api_clone) && !CommonUtils.checkUrl(HttpServerUtils.serverAddress)) {
if (item.name != getString(R.string.api_clone) && !CommonUtils.checkUrl(HttpServerUtils.serverAddress)) {
XToastUtils.error(getString(R.string.invalid_service_address))
serverConfig = null
return
}
if (serverConfig == null && item.name != ResUtils.getString(R.string.api_clone)) {
if (serverConfig == null && item.name != getString(R.string.api_clone)) {
XToastUtils.error(getString(R.string.click_test_button_first))
return
}
if (serverConfig != null && ((item.name == ResUtils.getString(R.string.api_sms_send) && !serverConfig!!.enableApiSmsSend) || (item.name == ResUtils.getString(R.string.api_sms_query) && !serverConfig!!.enableApiSmsQuery) || (item.name == ResUtils.getString(R.string.api_call_query) && !serverConfig!!.enableApiCallQuery) || (item.name == ResUtils.getString(R.string.api_contact_query) && !serverConfig!!.enableApiContactQuery) || (item.name == ResUtils.getString(R.string.api_contact_add) && !serverConfig!!.enableApiContactAdd) || (item.name == ResUtils.getString(R.string.api_battery_query) && !serverConfig!!.enableApiBatteryQuery) || (item.name == ResUtils.getString(R.string.api_wol) && !serverConfig!!.enableApiWol) || (item.name == ResUtils.getString(R.string.api_location) && !serverConfig!!.enableApiLocation))) {
if (serverConfig != null && ((item.name == getString(R.string.api_sms_send) && !serverConfig!!.enableApiSmsSend) || (item.name == getString(R.string.api_sms_query) && !serverConfig!!.enableApiSmsQuery) || (item.name == getString(R.string.api_call_query) && !serverConfig!!.enableApiCallQuery) || (item.name == getString(R.string.api_contact_query) && !serverConfig!!.enableApiContactQuery) || (item.name == getString(R.string.api_contact_add) && !serverConfig!!.enableApiContactAdd) || (item.name == getString(R.string.api_battery_query) && !serverConfig!!.enableApiBatteryQuery) || (item.name == getString(R.string.api_wol) && !serverConfig!!.enableApiWol) || (item.name == getString(R.string.api_location) && !serverConfig!!.enableApiLocation))) {
XToastUtils.error(getString(R.string.disabled_on_the_server))
return
}
@ -324,7 +389,7 @@ class ClientFragment : BaseFragment<FragmentClientBinding?>(), View.OnClickListe
requestMsg = RSACrypt.encryptByPublicKey(requestMsg, publicKey)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
if (needToast) XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
if (needToast) XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -339,7 +404,7 @@ class ClientFragment : BaseFragment<FragmentClientBinding?>(), View.OnClickListe
requestMsg = ConvertTools.bytes2HexString(encryptCBC)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
if (needToast) XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
if (needToast) XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -375,7 +440,7 @@ class ClientFragment : BaseFragment<FragmentClientBinding?>(), View.OnClickListe
val resp: BaseResponse<ConfigData> = Gson().fromJson(json, object : TypeToken<BaseResponse<ConfigData>>() {}.type)
if (resp.code == 200) {
serverConfig = resp.data!!
if (needToast) XToastUtils.success(ResUtils.getString(R.string.request_succeeded))
if (needToast) XToastUtils.success(getString(R.string.request_succeeded))
//删除3.0.8之前保存的记录
serverHistory.remove(HttpServerUtils.serverAddress)
//添加到历史记录
@ -388,13 +453,13 @@ class ClientFragment : BaseFragment<FragmentClientBinding?>(), View.OnClickListe
HttpServerUtils.serverHistory = Gson().toJson(serverHistory)
HttpServerUtils.serverConfig = Gson().toJson(serverConfig)
} else {
if (needToast) XToastUtils.error(ResUtils.getString(R.string.request_failed) + resp.msg)
if (needToast) XToastUtils.error(getString(R.string.request_failed) + resp.msg)
}
if (needToast) mCountDownHelper?.finish()
} catch (e: Exception) {
e.printStackTrace()
if (needToast) {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + response)
XToastUtils.error(getString(R.string.request_failed) + response)
mCountDownHelper?.finish()
}
}

@ -19,13 +19,13 @@ 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.xui.utils.ResUtils
import com.xuexiang.xui.utils.ThemeUtils
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xui.widget.button.switchbutton.SwitchButton
import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
import com.xuexiang.xui.widget.edittext.materialedittext.MaterialEditText
import com.xuexiang.xutil.resource.ResUtils.getColors
@Suppress("DEPRECATION")
@Page(name = "Frp内网穿透·编辑配置")
@ -88,13 +88,13 @@ class FrpcEditFragment : BaseFragment<FragmentFrpcEditBinding?>() {
.cancelable(false)
.autoDismiss(false)
.neutralText(R.string.action_quit)
.neutralColor(ResUtils.getColors(R.color.red))
.neutralColor(getColors(R.color.red))
.onNeutral { dialog: MaterialDialog?, _: DialogAction? ->
dialog?.dismiss()
activity?.onBackPressed()
}
.negativeText(R.string.action_back)
.negativeColor(ResUtils.getColors(R.color.colorBlueGrey))
.negativeColor(getColors(R.color.colorBlueGrey))
.onNegative { dialog: MaterialDialog?, _: DialogAction? ->
dialog?.dismiss()
}

@ -21,17 +21,17 @@ import com.idormy.sms.forwarder.database.entity.Rule
import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory
import com.idormy.sms.forwarder.database.viewmodel.MsgViewModel
import com.idormy.sms.forwarder.databinding.FragmentLogsBinding
import com.idormy.sms.forwarder.utils.FORWARD_STATUS_MAP
import com.idormy.sms.forwarder.utils.SendUtils
import com.idormy.sms.forwarder.utils.XToastUtils
import com.scwang.smartrefresh.layout.api.RefreshLayout
import com.xuexiang.xaop.annotation.SingleClick
import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
import com.xuexiang.xutil.data.DateUtils
import com.xuexiang.xutil.resource.ResUtils.getColors
import com.xuexiang.xutil.resource.ResUtils.getStringArray
import io.reactivex.CompletableObserver
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
@ -41,7 +41,7 @@ import kotlinx.coroutines.launch
import java.text.SimpleDateFormat
import java.util.*
@Suppress("PrivatePropertyName", "DEPRECATION")
@Suppress("PrivatePropertyName")
@Page(name = "转发日志")
class LogsFragment : BaseFragment<FragmentLogsBinding?>(), MsgPagingAdapter.OnItemClickListener {
@ -50,6 +50,13 @@ class LogsFragment : BaseFragment<FragmentLogsBinding?>(), MsgPagingAdapter.OnIt
private var adapter = MsgPagingAdapter(this)
private val viewModel by viewModels<MsgViewModel> { BaseViewModelFactory(context) }
private var currentType: String = "sms"
private val FORWARD_STATUS_MAP = object : HashMap<Int, String>() {
init {
put(0, getString(R.string.failed))
put(1, getString(R.string.processing))
put(2, getString(R.string.success))
}
}
override fun viewBindingInflate(
inflater: LayoutInflater,
@ -63,12 +70,6 @@ class LogsFragment : BaseFragment<FragmentLogsBinding?>(), MsgPagingAdapter.OnIt
titleBar!!.setLeftImageResource(R.drawable.ic_action_menu)
titleBar!!.setTitle(R.string.menu_logs)
titleBar!!.setLeftClickListener { getContainer()?.openMenu() }
/*titleBar!!.addAction(object : TitleBar.ImageAction(R.drawable.ic_menu_notifications_white) {
@SingleClick
override fun performAction(view: View) {
showTipsForce(requireContext())
}
})*/
titleBar!!.addAction(object : TitleBar.ImageAction(R.drawable.ic_delete) {
@SingleClick
override fun performAction(view: View) {
@ -114,7 +115,7 @@ class LogsFragment : BaseFragment<FragmentLogsBinding?>(), MsgPagingAdapter.OnIt
viewPool.setMaxRecycledViews(0, 10)
binding!!.recyclerView.isFocusableInTouchMode = false
binding!!.tabBar.setTabTitles(ResUtils.getStringArray(R.array.type_param_option))
binding!!.tabBar.setTabTitles(getStringArray(R.array.type_param_option))
binding!!.tabBar.setOnTabClickListener { _, position ->
//XToastUtils.toast("点击了$title--$position")
currentType = when (position) {
@ -147,22 +148,22 @@ class LogsFragment : BaseFragment<FragmentLogsBinding?>(), MsgPagingAdapter.OnIt
Log.d(TAG, "item: $item")
val detailStr = StringBuilder()
detailStr.append(ResUtils.getString(R.string.from)).append(item.msg.from).append("\n\n")
detailStr.append(getString(R.string.from)).append(item.msg.from).append("\n\n")
if (!TextUtils.isEmpty(item.msg.simInfo)) {
if (item.msg.type == "app") {
val splitSimInfo = item.msg.simInfo.split("#####")
val title = splitSimInfo.getOrElse(0) { item.msg.simInfo }
val scheme = splitSimInfo.getOrElse(1) { "" }
detailStr.append(ResUtils.getString(R.string.title)).append(title).append("\n\n")
detailStr.append(ResUtils.getString(R.string.msg)).append(item.msg.content).append("\n\n")
if (!TextUtils.isEmpty(scheme) && scheme != "null") detailStr.append(ResUtils.getString(R.string.scheme)).append(scheme).append("\n\n")
detailStr.append(getString(R.string.title)).append(title).append("\n\n")
detailStr.append(getString(R.string.msg)).append(item.msg.content).append("\n\n")
if (!TextUtils.isEmpty(scheme) && scheme != "null") detailStr.append(getString(R.string.scheme)).append(scheme).append("\n\n")
} else {
detailStr.append(ResUtils.getString(R.string.msg)).append(item.msg.content).append("\n\n")
detailStr.append(ResUtils.getString(R.string.slot)).append(item.msg.simInfo).append("\n\n")
detailStr.append(getString(R.string.msg)).append(item.msg.content).append("\n\n")
detailStr.append(getString(R.string.slot)).append(item.msg.simInfo).append("\n\n")
}
}
@SuppressLint("SimpleDateFormat") val utcFormatter = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
detailStr.append(ResUtils.getString(R.string.time)).append(DateUtils.date2String(item.msg.time, utcFormatter))
detailStr.append(getString(R.string.time)).append(DateUtils.date2String(item.msg.time, utcFormatter))
MaterialDialog.Builder(requireContext())
.iconRes(item.msg.simImageId)
@ -175,7 +176,7 @@ class LogsFragment : BaseFragment<FragmentLogsBinding?>(), MsgPagingAdapter.OnIt
XToastUtils.success(R.string.delete_log_toast)
}
.neutralText(R.string.rematch)
.neutralColor(ResUtils.getColors(R.color.red))
.neutralColor(getColors(R.color.red))
.onNeutral { _: MaterialDialog?, _: DialogAction? ->
XToastUtils.toast(R.string.rematch_toast)
SendUtils.rematchSendMsg(item)
@ -188,10 +189,10 @@ class LogsFragment : BaseFragment<FragmentLogsBinding?>(), MsgPagingAdapter.OnIt
val ruleStr = StringBuilder()
ruleStr.append(Rule.getRuleMatch(item.ruleFiled, item.ruleCheck, item.ruleValue, item.ruleSimSlot)).append(item.senderName)
val detailStr = StringBuilder()
detailStr.append(ResUtils.getString(R.string.rule)).append(ruleStr.toString()).append("\n\n")
detailStr.append(getString(R.string.rule)).append(ruleStr.toString()).append("\n\n")
@SuppressLint("SimpleDateFormat") val utcFormatter = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
detailStr.append(ResUtils.getString(R.string.time)).append(DateUtils.date2String(item.time, utcFormatter)).append("\n\n")
detailStr.append(ResUtils.getString(R.string.result)).append(FORWARD_STATUS_MAP[item.forwardStatus]).append("\n--------------------\n").append(item.forwardResponse)
detailStr.append(getString(R.string.time)).append(DateUtils.date2String(item.time, utcFormatter)).append("\n\n")
detailStr.append(getString(R.string.result)).append(FORWARD_STATUS_MAP[item.forwardStatus]).append("\n--------------------\n").append(item.forwardResponse)
MaterialDialog.Builder(requireContext())
.title(R.string.details)

@ -32,7 +32,6 @@ import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xrouter.annotation.AutoWired
import com.xuexiang.xrouter.launcher.XRouter
import com.xuexiang.xrouter.utils.TextUtils
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
@ -40,6 +39,8 @@ import com.xuexiang.xui.widget.picker.widget.builder.OptionsPickerBuilder
import com.xuexiang.xui.widget.picker.widget.listener.OnOptionsSelectListener
import com.xuexiang.xui.widget.spinner.materialspinner.MaterialSpinner
import com.xuexiang.xutil.XUtil
import com.xuexiang.xutil.resource.ResUtils.getColors
import com.xuexiang.xutil.resource.ResUtils.getDrawable
import io.reactivex.SingleObserver
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
@ -48,13 +49,24 @@ import kotlinx.coroutines.*
import java.util.*
@Page(name = "转发规则·编辑器")
@Suppress("PrivatePropertyName", "DEPRECATION")
@Suppress("PrivatePropertyName")
class RulesEditFragment : BaseFragment<FragmentRulesEditBinding?>(), View.OnClickListener, CompoundButton.OnCheckedChangeListener {
private val TAG: String = RulesEditFragment::class.java.simpleName
private var titleBar: TitleBar? = null
private val viewModel by viewModels<RuleViewModel> { BaseViewModelFactory(context) }
//通话类型1.来电挂机 2.去电挂机 3.未接来电 4.来电提醒 5.来电接通 6.去电拨出
private val CALL_TYPE_MAP = mapOf(
//"0" to getString(R.string.unknown_call),
"1" to getString(R.string.incoming_call_ended),
"2" to getString(R.string.outgoing_call_ended),
"3" to getString(R.string.missed_call),
"4" to getString(R.string.incoming_call_received),
"5" to getString(R.string.incoming_call_answered),
"6" to getString(R.string.outgoing_call_started),
)
private var callType = 1
private var callTypeIndex = 0
@ -412,8 +424,6 @@ class RulesEditFragment : BaseFragment<FragmentRulesEditBinding?>(), View.OnClic
senderSpinnerList.add(SenderAdapterItem(name, sender.imageId, sender.id, sender.status))
}
senderSpinnerAdapter = SenderSpinnerAdapter(senderSpinnerList)
//.setTextColor(ResUtils.getColor(R.color.green))
//.setTextSize(12F)
.setIsFilterKey(true).setFilterColor("#EF5362").setBackgroundSelector(R.drawable.selector_custom_spinner_bg)
binding!!.spSender.setAdapter(senderSpinnerAdapter)
@ -474,7 +484,7 @@ class RulesEditFragment : BaseFragment<FragmentRulesEditBinding?>(), View.OnClic
val tvSenderName = layoutSenderItem.findViewById<TextView>(R.id.tv_sender_name)
ivSenderImage.setImageDrawable(sender.icon)
ivSenderStatus.setImageDrawable(ResUtils.getDrawable(if (STATUS_OFF == sender.status) R.drawable.ic_stop else R.drawable.ic_start))
ivSenderStatus.setImageDrawable(getDrawable(if (STATUS_OFF == sender.status) R.drawable.ic_stop else R.drawable.ic_start))
val senderItemId = sender.id as Long
tvSenderName.text = "ID-$senderItemId${sender.title}"
@ -762,7 +772,7 @@ class RulesEditFragment : BaseFragment<FragmentRulesEditBinding?>(), View.OnClic
spCallType.selectedIndex = callTypeIndexTest
}
MaterialDialog.Builder(requireContext()).iconRes(android.R.drawable.ic_dialog_email).title(R.string.rule_tester).customView(dialogTest, true).cancelable(false).autoDismiss(false).neutralText(R.string.action_back).neutralColor(ResUtils.getColors(R.color.darkGrey)).onNeutral { dialog: MaterialDialog?, _: DialogAction? ->
MaterialDialog.Builder(requireContext()).iconRes(android.R.drawable.ic_dialog_email).title(R.string.rule_tester).customView(dialogTest, true).cancelable(false).autoDismiss(false).neutralText(R.string.action_back).neutralColor(getColors(R.color.darkGrey)).onNeutral { dialog: MaterialDialog?, _: DialogAction? ->
dialog?.dismiss()
}.positiveText(R.string.action_test).onPositive { _: MaterialDialog?, _: DialogAction? ->
try {
@ -794,10 +804,10 @@ class RulesEditFragment : BaseFragment<FragmentRulesEditBinding?>(), View.OnClic
if (ruleType == "call") {
val phoneNumber = etFrom.text.toString()
val contacts = PhoneUtils.getContactByNumber(phoneNumber)
val contactName = if (contacts.isNotEmpty()) contacts[0].name else ResUtils.getString(R.string.unknown_number)
msg.append(ResUtils.getString(R.string.contact)).append(contactName).append("\n")
msg.append(ResUtils.getString(R.string.mandatory_type))
msg.append(CALL_TYPE_MAP[callType.toString()] ?: ResUtils.getString(R.string.unknown_call))
val contactName = if (contacts.isNotEmpty()) contacts[0].name else getString(R.string.unknown_number)
msg.append(getString(R.string.contact)).append(contactName).append("\n")
msg.append(getString(R.string.mandatory_type))
msg.append(CALL_TYPE_MAP[callType.toString()] ?: getString(R.string.unknown_call))
} else {
msg.append(etContent.text.toString())
}

@ -23,14 +23,13 @@ import com.scwang.smartrefresh.layout.api.RefreshLayout
import com.xuexiang.xaop.annotation.SingleClick
import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xpage.core.PageOption
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
import com.xuexiang.xutil.resource.ResUtils.getStringArray
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
@Suppress("DEPRECATION")
@Page(name = "转发规则")
class RulesFragment : BaseFragment<FragmentRulesBinding?>(), RulePagingAdapter.OnItemClickListener {
@ -79,7 +78,7 @@ class RulesFragment : BaseFragment<FragmentRulesBinding?>(), RulePagingAdapter.O
binding!!.recyclerView.setRecycledViewPool(viewPool)
viewPool.setMaxRecycledViews(0, 10)
binding!!.tabBar.setTabTitles(ResUtils.getStringArray(R.array.type_param_option))
binding!!.tabBar.setTabTitles(getStringArray(R.array.type_param_option))
binding!!.tabBar.setOnTabClickListener { _, position ->
//XToastUtils.toast("点击了$title--$position")
currentType = when (position) {

@ -39,7 +39,6 @@ import com.idormy.sms.forwarder.fragment.senders.WeworkRobotFragment
import com.idormy.sms.forwarder.utils.KEY_SENDER_CLONE
import com.idormy.sms.forwarder.utils.KEY_SENDER_ID
import com.idormy.sms.forwarder.utils.KEY_SENDER_TYPE
import com.idormy.sms.forwarder.utils.SENDER_FRAGMENT_LIST
import com.idormy.sms.forwarder.utils.TYPE_BARK
import com.idormy.sms.forwarder.utils.TYPE_DINGTALK_GROUP_ROBOT
import com.idormy.sms.forwarder.utils.TYPE_DINGTALK_INNER_ROBOT
@ -62,15 +61,16 @@ import com.xuexiang.xaop.annotation.SingleClick
import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xpage.base.XPageFragment
import com.xuexiang.xpage.core.PageOption
import com.xuexiang.xpage.enums.CoreAnim
import com.xuexiang.xpage.model.PageInfo
import com.xuexiang.xui.adapter.recyclerview.RecyclerViewHolder
import com.xuexiang.xui.utils.DensityUtils
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.utils.WidgetUtils
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xui.widget.alpha.XUIAlphaTextView
import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
import com.xuexiang.xutil.resource.ResUtils.getStringArray
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
@ -87,7 +87,120 @@ class SendersFragment : BaseFragment<FragmentSendersBinding?>(),
private val viewModel by viewModels<SenderViewModel> { BaseViewModelFactory(context) }
private val dialog: BottomSheetDialog by lazy { BottomSheetDialog(requireContext()) }
private var currentStatus: Int = 1
//private val statusValueArray = ResUtils.getIntArray(R.array.status_param_value)
private var SENDER_FRAGMENT_LIST = listOf(
PageInfo(
getString(R.string.dingtalk_robot),
"com.idormy.sms.forwarder.fragment.senders.DingtalkGroupRobotFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_dingtalk
),
PageInfo(
getString(R.string.email),
"com.idormy.sms.forwarder.fragment.senders.EmailFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_email
),
PageInfo(
getString(R.string.bark),
"com.idormy.sms.forwarder.fragment.senders.BarkFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_bark
),
PageInfo(
getString(R.string.webhook),
"com.idormy.sms.forwarder.fragment.senders.WebhookFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_webhook
),
PageInfo(
getString(R.string.wework_robot),
"com.idormy.sms.forwarder.fragment.senders.WeworkRobotFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_wework_robot
),
PageInfo(
getString(R.string.wework_agent),
"com.idormy.sms.forwarder.fragment.senders.WeworkAgentFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_wework_agent
),
PageInfo(
getString(R.string.server_chan),
"com.idormy.sms.forwarder.fragment.senders.ServerchanFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_serverchan
),
PageInfo(
getString(R.string.telegram),
"com.idormy.sms.forwarder.fragment.senders.TelegramFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_telegram
),
PageInfo(
getString(R.string.sms_menu),
"com.idormy.sms.forwarder.fragment.senders.SmsFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_sms
),
PageInfo(
getString(R.string.feishu),
"com.idormy.sms.forwarder.fragment.senders.FeishuFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_feishu
),
PageInfo(
getString(R.string.pushplus),
"com.idormy.sms.forwarder.fragment.senders.PushplusFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_pushplus
),
PageInfo(
getString(R.string.gotify),
"com.idormy.sms.forwarder.fragment.senders.GotifyFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_gotify
),
PageInfo(
getString(R.string.dingtalk_inner_robot),
"com.idormy.sms.forwarder.fragment.senders.DingtalkInnerRobotFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_dingtalk_inner
),
PageInfo(
getString(R.string.feishu_app),
"com.idormy.sms.forwarder.fragment.senders.FeishuAppFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_feishu_app
),
PageInfo(
getString(R.string.url_scheme),
"com.idormy.sms.forwarder.fragment.senders.UrlSchemeFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_url_scheme
),
PageInfo(
getString(R.string.socket),
"com.idormy.sms.forwarder.fragment.senders.SocketFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_socket
),
)
override fun viewBindingInflate(
inflater: LayoutInflater,
@ -140,7 +253,7 @@ class SendersFragment : BaseFragment<FragmentSendersBinding?>(),
binding!!.recyclerView.setRecycledViewPool(viewPool)
viewPool.setMaxRecycledViews(0, 10)
binding!!.tabBar.setTabTitles(ResUtils.getStringArray(R.array.status_param_option))
binding!!.tabBar.setTabTitles(getStringArray(R.array.status_param_option))
binding!!.tabBar.setOnTabClickListener { _, position ->
//XToastUtils.toast("点击了$title--$position")
//currentStatus = statusValueArray[position]

@ -10,7 +10,6 @@ import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xrouter.annotation.AutoWired
import com.xuexiang.xrouter.launcher.XRouter
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xutil.resource.ResUtils
import com.xuexiang.xutil.resource.ResourceUtils
/**
@ -49,7 +48,7 @@ class ServiceProtocolFragment : BaseFragment<FragmentServiceProtocolBinding?>()
* 初始化控件
*/
override fun initViews() {
if (title == ResUtils.getString(R.string.title_user_protocol)) {
if (title == getString(R.string.title_user_protocol)) {
binding!!.tvProtocolText.text = accountProtocol
} else {
binding!!.tvProtocolText.text = privacyProtocol

@ -92,18 +92,7 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
override fun performAction(view: View) {
GuideTipsDialog.showTipsForce(requireContext())
}
})/*titleBar!!.addAction(object : TitleBar.ImageAction(R.drawable.ic_restore) {
@SingleClick
override fun performAction(view: View) {
MaterialDialog.Builder(requireContext())
.content(R.string.delete_type_log_tips)
.positiveText(R.string.lab_yes)
.negativeText(R.string.lab_no)
.onPositive { _: MaterialDialog?, _: DialogAction? ->
}
.show()
}
})*/
})
return titleBar
}
@ -168,10 +157,8 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
switchDirectlyToClient(binding!!.sbDirectlyToClient)
//纯自动任务模式
switchDirectlyToTask(binding!!.sbDirectlyToTask)
//多语言设置
switchLanguage(binding!!.rgMainLanguages)
}
override fun onResume() {
@ -1031,8 +1018,8 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
// 重启应用
if (restart) {
XToastUtils.toast(R.string.multi_languages_toast)
val intent = requireActivity().baseContext.packageManager.getLaunchIntentForPackage(requireActivity().baseContext.packageName)
intent!!.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
val intent = Intent(App.context, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(intent)
requireActivity().finish()
}

@ -33,6 +33,7 @@ import com.xuexiang.xaop.annotation.SingleClick
import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xpage.base.XPageFragment
import com.xuexiang.xpage.core.PageOption
import com.xuexiang.xpage.enums.CoreAnim
import com.xuexiang.xpage.model.PageInfo
import com.xuexiang.xrouter.annotation.AutoWired
import com.xuexiang.xrouter.launcher.XRouter
@ -83,6 +84,96 @@ class TasksEditFragment : BaseFragment<FragmentTasksEditBinding?>(), View.OnClic
private var itemListConditions = mutableListOf<TaskSetting>()
private var itemListActions = mutableListOf<TaskSetting>()
private var TASK_CONDITION_FRAGMENT_LIST = listOf(
PageInfo(
getString(R.string.task_cron),
"com.idormy.sms.forwarder.fragment.condition.CronFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_custom_time,
),
PageInfo(
getString(R.string.task_to_address),
"com.idormy.sms.forwarder.fragment.condition.ToAddressFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_to_address,
),
PageInfo(
getString(R.string.task_leave_address),
"com.idormy.sms.forwarder.fragment.condition.LeaveAddressFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_leave_address,
),
PageInfo(
getString(R.string.task_network),
"com.idormy.sms.forwarder.fragment.condition.NetworkFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_network
),
PageInfo(
getString(R.string.task_sim),
"com.idormy.sms.forwarder.fragment.condition.SimFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_sim
),
PageInfo(
getString(R.string.task_battery),
"com.idormy.sms.forwarder.fragment.condition.BatteryFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_battery
),
PageInfo(
getString(R.string.task_charge),
"com.idormy.sms.forwarder.fragment.condition.ChargeFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_charge
),
PageInfo(
getString(R.string.task_lock_screen),
"com.idormy.sms.forwarder.fragment.condition.LockScreenFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_lock_screen
),
)
private var TASK_ACTION_FRAGMENT_LIST = listOf(
PageInfo(
getString(R.string.task_sendsms),
"com.idormy.sms.forwarder.fragment.action.SendSmsFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_sms
),
PageInfo(
getString(R.string.task_notification),
"com.idormy.sms.forwarder.fragment.action.NotificationFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_sender,
),
PageInfo(
getString(R.string.task_frpc),
"com.idormy.sms.forwarder.fragment.action.FrpcFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_frpc
),
PageInfo(
getString(R.string.task_server),
"com.idormy.sms.forwarder.fragment.action.HttpServerFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_http_server
),
)
override fun initArgs() {
XRouter.getInstance().inject(this)
}

@ -22,15 +22,15 @@ import com.scwang.smartrefresh.layout.api.RefreshLayout
import com.xuexiang.xaop.annotation.SingleClick
import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xpage.core.PageOption
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.utils.ThemeUtils
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
import com.xuexiang.xutil.resource.ResUtils.getStringArray
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
@Suppress("PrivatePropertyName", "DEPRECATION")
@Suppress("PrivatePropertyName")
@Page(name = "自动任务")
class TasksFragment : BaseFragment<FragmentTasksBinding?>(), TaskPagingAdapter.OnItemClickListener {
@ -70,7 +70,7 @@ class TasksFragment : BaseFragment<FragmentTasksBinding?>(), TaskPagingAdapter.O
binding!!.recyclerView.setRecycledViewPool(viewPool)
viewPool.setMaxRecycledViews(0, 10)
binding!!.tabBar.setTabTitles(ResUtils.getStringArray(R.array.task_type_option))
binding!!.tabBar.setTabTitles(getStringArray(R.array.task_type_option))
binding!!.tabBar.setOnTabClickListener { _, position ->
//XToastUtils.toast("点击了$title--$position")
currentType = when (position) {

@ -25,10 +25,10 @@ import com.xuexiang.xrouter.annotation.AutoWired
import com.xuexiang.xrouter.launcher.XRouter
import com.xuexiang.xrouter.utils.TextUtils
import com.xuexiang.xui.utils.CountDownButtonHelper
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xui.widget.picker.widget.builder.OptionsPickerBuilder
import com.xuexiang.xui.widget.picker.widget.listener.OnOptionsSelectListener
import com.xuexiang.xutil.resource.ResUtils.getDrawable
import io.reactivex.SingleObserver
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
@ -37,7 +37,7 @@ import kotlinx.coroutines.*
import java.util.*
@Page(name = "Notification")
@Suppress("PrivatePropertyName", "DEPRECATION")
@Suppress("PrivatePropertyName")
class NotificationFragment : BaseFragment<FragmentTasksActionNotificationBinding?>(), View.OnClickListener, CompoundButton.OnCheckedChangeListener {
private val TAG: String = NotificationFragment::class.java.simpleName
@ -316,8 +316,6 @@ class NotificationFragment : BaseFragment<FragmentTasksActionNotificationBinding
senderSpinnerList.add(SenderAdapterItem(name, sender.imageId, sender.id, sender.status))
}
senderSpinnerAdapter = SenderSpinnerAdapter(senderSpinnerList)
//.setTextColor(ResUtils.getColor(R.color.green))
//.setTextSize(12F)
.setIsFilterKey(true).setFilterColor("#EF5362").setBackgroundSelector(R.drawable.selector_custom_spinner_bg)
binding!!.spSender.setAdapter(senderSpinnerAdapter)
@ -378,7 +376,7 @@ class NotificationFragment : BaseFragment<FragmentTasksActionNotificationBinding
val tvSenderName = layoutSenderItem.findViewById<TextView>(R.id.tv_sender_name)
ivSenderImage.setImageDrawable(sender.icon)
ivSenderStatus.setImageDrawable(ResUtils.getDrawable(if (STATUS_OFF == sender.status) R.drawable.ic_stop else R.drawable.ic_start))
ivSenderStatus.setImageDrawable(getDrawable(if (STATUS_OFF == sender.status) R.drawable.ic_stop else R.drawable.ic_start))
val senderItemId = sender.id as Long
tvSenderName.text = "ID-$senderItemId${sender.title}"

@ -37,7 +37,6 @@ import com.xuexiang.xrouter.annotation.AutoWired
import com.xuexiang.xrouter.launcher.XRouter
import com.xuexiang.xrouter.utils.TextUtils
import com.xuexiang.xui.utils.CountDownButtonHelper
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xutil.XUtil
@ -165,7 +164,7 @@ class SendSmsFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View
val mSubscriptionId: Int = App.SimInfoList[simSlotIndex]?.mSubscriptionId ?: -1
val msg = if (ActivityCompat.checkSelfPermission(XUtil.getContext(), Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
ResUtils.getString(R.string.no_sms_sending_permission)
getString(R.string.no_sms_sending_permission)
} else {
PhoneUtils.sendSms(mSubscriptionId, settingVo.phoneNumbers, settingVo.msgContent) ?: "success"
}
@ -178,7 +177,7 @@ class SendSmsFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View
}
override fun onDenied(permissions: List<String>, never: Boolean) {
LiveEventBus.get(KEY_TEST_ACTION, String::class.java).post(ResUtils.getString(R.string.no_sms_sending_permission))
LiveEventBus.get(KEY_TEST_ACTION, String::class.java).post(getString(R.string.no_sms_sending_permission))
}
})
return

@ -22,12 +22,11 @@ import com.xuexiang.xhttp2.callback.SimpleCallBack
import com.xuexiang.xhttp2.exception.ApiException
import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xrouter.utils.TextUtils
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xui.widget.grouplist.XUIGroupListView
import com.xuexiang.xutil.data.ConvertTools
@Suppress("PrivatePropertyName", "DEPRECATION")
@Suppress("PrivatePropertyName")
@Page(name = "远程查电量")
class BatteryQueryFragment : BaseFragment<FragmentClientBatteryQueryBinding?>() {
@ -81,7 +80,7 @@ class BatteryQueryFragment : BaseFragment<FragmentClientBatteryQueryBinding?>()
requestMsg = RSACrypt.encryptByPublicKey(requestMsg, publicKey)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -96,7 +95,7 @@ class BatteryQueryFragment : BaseFragment<FragmentClientBatteryQueryBinding?>()
requestMsg = ConvertTools.bytes2HexString(encryptCBC)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -129,26 +128,26 @@ class BatteryQueryFragment : BaseFragment<FragmentClientBatteryQueryBinding?>()
}
val resp: BaseResponse<BatteryInfo> = Gson().fromJson(json, object : TypeToken<BaseResponse<BatteryInfo>>() {}.type)
if (resp.code == 200) {
XToastUtils.success(ResUtils.getString(R.string.request_succeeded))
XToastUtils.success(getString(R.string.request_succeeded))
val batteryInfo = resp.data ?: return
val groupListView = binding!!.infoList
val section = XUIGroupListView.newSection(context)
section.addItemView(groupListView.createItemView(String.format(ResUtils.getString(R.string.battery_level), batteryInfo.level))) {}
if (batteryInfo.scale != "") section.addItemView(groupListView.createItemView(String.format(ResUtils.getString(R.string.battery_scale), batteryInfo.scale))) {}
if (batteryInfo.voltage != "") section.addItemView(groupListView.createItemView(String.format(ResUtils.getString(R.string.battery_voltage), batteryInfo.voltage))) {}
if (batteryInfo.temperature != "") section.addItemView(groupListView.createItemView(String.format(ResUtils.getString(R.string.battery_temperature), batteryInfo.temperature))) {}
section.addItemView(groupListView.createItemView(String.format(ResUtils.getString(R.string.battery_status), batteryInfo.status))) {}
section.addItemView(groupListView.createItemView(String.format(ResUtils.getString(R.string.battery_health), batteryInfo.health))) {}
section.addItemView(groupListView.createItemView(String.format(ResUtils.getString(R.string.battery_plugged), batteryInfo.plugged))) {}
section.addItemView(groupListView.createItemView(String.format(getString(R.string.battery_level), batteryInfo.level))) {}
if (batteryInfo.scale != "") section.addItemView(groupListView.createItemView(String.format(getString(R.string.battery_scale), batteryInfo.scale))) {}
if (batteryInfo.voltage != "") section.addItemView(groupListView.createItemView(String.format(getString(R.string.battery_voltage), batteryInfo.voltage))) {}
if (batteryInfo.temperature != "") section.addItemView(groupListView.createItemView(String.format(getString(R.string.battery_temperature), batteryInfo.temperature))) {}
section.addItemView(groupListView.createItemView(String.format(getString(R.string.battery_status), batteryInfo.status))) {}
section.addItemView(groupListView.createItemView(String.format(getString(R.string.battery_health), batteryInfo.health))) {}
section.addItemView(groupListView.createItemView(String.format(getString(R.string.battery_plugged), batteryInfo.plugged))) {}
section.addTo(groupListView)
} else {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + resp.msg)
XToastUtils.error(getString(R.string.request_failed) + resp.msg)
}
} catch (e: Exception) {
e.printStackTrace()
XToastUtils.error(ResUtils.getString(R.string.request_failed) + response)
XToastUtils.error(getString(R.string.request_failed) + response)
}
}
})

@ -41,16 +41,17 @@ import com.xuexiang.xpage.base.XPageActivity
import com.xuexiang.xpage.core.PageOption
import com.xuexiang.xrouter.utils.TextUtils
import com.xuexiang.xui.adapter.recyclerview.RecyclerViewHolder
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.utils.SnackbarUtils
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xui.widget.searchview.MaterialSearchView
import com.xuexiang.xutil.data.ConvertTools
import com.xuexiang.xutil.data.DateUtils
import com.xuexiang.xutil.resource.ResUtils.getColor
import com.xuexiang.xutil.resource.ResUtils.getStringArray
import com.xuexiang.xutil.system.ClipboardUtils
import me.samlss.broccoli.Broccoli
@Suppress("PrivatePropertyName", "DEPRECATION")
@Suppress("PrivatePropertyName")
@Page(name = "远程查通话")
class CallQueryFragment : BaseFragment<FragmentClientCallQueryBinding?>() {
@ -105,7 +106,7 @@ class CallQueryFragment : BaseFragment<FragmentClientCallQueryBinding?>() {
holder.text(R.id.tv_time, DateUtils.getFriendlyTimeSpanByNow(model.dateLong))
holder.image(R.id.iv_image, model.typeImageId)
holder.image(R.id.iv_sim_image, model.simImageId)
holder.text(R.id.tv_duration, ResUtils.getString(R.string.call_duration) + model.duration + ResUtils.getString(R.string.seconds))
holder.text(R.id.tv_duration, getString(R.string.call_duration) + model.duration + getString(R.string.seconds))
holder.click(R.id.iv_copy) {
XToastUtils.info(String.format(getString(R.string.copied_to_clipboard), from))
@ -140,7 +141,7 @@ class CallQueryFragment : BaseFragment<FragmentClientCallQueryBinding?>() {
delegateAdapter.addAdapter(mAdapter)
binding!!.recyclerView.adapter = delegateAdapter
binding!!.tabBar.setTabTitles(ResUtils.getStringArray(R.array.call_type_option))
binding!!.tabBar.setTabTitles(getStringArray(R.array.call_type_option))
binding!!.tabBar.setOnTabClickListener { _, position ->
//XToastUtils.toast("点击了$title--$position")
callType = 3 - position
@ -156,7 +157,7 @@ class CallQueryFragment : BaseFragment<FragmentClientCallQueryBinding?>() {
binding!!.searchView.setOnQueryTextListener(object : MaterialSearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String): Boolean {
SnackbarUtils.Indefinite(view, String.format(getString(R.string.search_keyword), query)).info()
.actionColor(ResUtils.getColor(R.color.xui_config_color_white))
.actionColor(getColor(R.color.xui_config_color_white))
.setAction(getString(R.string.clear)) {
keyword = ""
loadRemoteData(true)
@ -234,7 +235,7 @@ class CallQueryFragment : BaseFragment<FragmentClientCallQueryBinding?>() {
requestMsg = RSACrypt.encryptByPublicKey(requestMsg, publicKey)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -249,7 +250,7 @@ class CallQueryFragment : BaseFragment<FragmentClientCallQueryBinding?>() {
requestMsg = ConvertTools.bytes2HexString(encryptCBC)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -292,11 +293,11 @@ class CallQueryFragment : BaseFragment<FragmentClientCallQueryBinding?>() {
binding!!.refreshLayout.finishLoadMore()
}
} else {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + resp.msg)
XToastUtils.error(getString(R.string.request_failed) + resp.msg)
}
} catch (e: Exception) {
e.printStackTrace()
XToastUtils.error(ResUtils.getString(R.string.request_failed) + response)
XToastUtils.error(getString(R.string.request_failed) + response)
}
}
})

@ -31,7 +31,6 @@ import com.xuexiang.xhttp2.exception.ApiException
import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xrouter.utils.TextUtils
import com.xuexiang.xui.utils.CountDownButtonHelper
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
@ -39,10 +38,11 @@ import com.xuexiang.xutil.app.AppUtils
import com.xuexiang.xutil.data.ConvertTools
import com.xuexiang.xutil.file.FileIOUtils
import com.xuexiang.xutil.file.FileUtils
import com.xuexiang.xutil.resource.ResUtils.getStringArray
import java.io.File
import java.util.*
@Suppress("PrivatePropertyName", "DEPRECATION")
@Suppress("PrivatePropertyName")
@Page(name = "一键换新机")
class CloneFragment : BaseFragment<FragmentClientCloneBinding?>(), View.OnClickListener {
@ -93,7 +93,7 @@ class CloneFragment : BaseFragment<FragmentClientCloneBinding?>(), View.OnClickL
}
})
binding!!.tabBar.setTabTitles(ResUtils.getStringArray(R.array.clone_type_option))
binding!!.tabBar.setTabTitles(getStringArray(R.array.clone_type_option))
binding!!.tabBar.setOnTabClickListener { _, position ->
//XToastUtils.toast("点击了$title--$position")
if (position == 1) {
@ -268,7 +268,7 @@ class CloneFragment : BaseFragment<FragmentClientCloneBinding?>(), View.OnClickL
requestMsg = RSACrypt.encryptByPublicKey(requestMsg, publicKey)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -283,7 +283,7 @@ class CloneFragment : BaseFragment<FragmentClientCloneBinding?>(), View.OnClickL
requestMsg = ConvertTools.bytes2HexString(encryptCBC)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -317,13 +317,13 @@ class CloneFragment : BaseFragment<FragmentClientCloneBinding?>(), View.OnClickL
}
val resp: BaseResponse<String> = Gson().fromJson(json, object : TypeToken<BaseResponse<String>>() {}.type)
if (resp.code == 200) {
XToastUtils.success(ResUtils.getString(R.string.request_succeeded))
XToastUtils.success(getString(R.string.request_succeeded))
} else {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + resp.msg)
XToastUtils.error(getString(R.string.request_failed) + resp.msg)
}
} catch (e: Exception) {
e.printStackTrace()
XToastUtils.error(ResUtils.getString(R.string.request_failed) + response)
XToastUtils.error(getString(R.string.request_failed) + response)
}
pushCountDownHelper?.finish()
}
@ -369,7 +369,7 @@ class CloneFragment : BaseFragment<FragmentClientCloneBinding?>(), View.OnClickL
requestMsg = RSACrypt.encryptByPublicKey(requestMsg, publicKey)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -384,7 +384,7 @@ class CloneFragment : BaseFragment<FragmentClientCloneBinding?>(), View.OnClickL
requestMsg = ConvertTools.bytes2HexString(encryptCBC)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -427,7 +427,7 @@ class CloneFragment : BaseFragment<FragmentClientCloneBinding?>(), View.OnClickL
Log.d(TAG, "cloneInfo = $cloneInfo")
if (cloneInfo == null) {
XToastUtils.error(ResUtils.getString(R.string.request_failed))
XToastUtils.error(getString(R.string.request_failed))
return
}
@ -438,12 +438,12 @@ class CloneFragment : BaseFragment<FragmentClientCloneBinding?>(), View.OnClickL
XToastUtils.success(getString(R.string.import_succeeded))
}
} else {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + resp.msg)
XToastUtils.error(getString(R.string.request_failed) + resp.msg)
}
} catch (e: Exception) {
e.printStackTrace()
XToastUtils.error(ResUtils.getString(R.string.request_failed) + response)
XToastUtils.error(getString(R.string.request_failed) + response)
}
exportCountDownHelper?.finish()
}

@ -21,7 +21,6 @@ import com.xuexiang.xhttp2.exception.ApiException
import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xrouter.utils.TextUtils
import com.xuexiang.xui.utils.CountDownButtonHelper
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xutil.data.ConvertTools
@ -86,7 +85,7 @@ class ContactAddFragment : BaseFragment<FragmentClientContactAddBinding?>(), Vie
val phoneNumbers = binding!!.etPhoneNumbers.text.toString()
val phoneRegex = getString(R.string.phone_numbers_regex).toRegex()
if (!phoneRegex.matches(phoneNumbers)) {
XToastUtils.error(ResUtils.getString(R.string.phone_numbers_error))
XToastUtils.error(getString(R.string.phone_numbers_error))
return
}
@ -114,7 +113,7 @@ class ContactAddFragment : BaseFragment<FragmentClientContactAddBinding?>(), Vie
requestMsg = RSACrypt.encryptByPublicKey(requestMsg, publicKey)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -129,7 +128,7 @@ class ContactAddFragment : BaseFragment<FragmentClientContactAddBinding?>(), Vie
requestMsg = ConvertTools.bytes2HexString(encryptCBC)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -164,13 +163,13 @@ class ContactAddFragment : BaseFragment<FragmentClientContactAddBinding?>(), Vie
}
val resp: BaseResponse<String> = Gson().fromJson(json, object : TypeToken<BaseResponse<String>>() {}.type)
if (resp.code == 200) {
XToastUtils.success(ResUtils.getString(R.string.request_succeeded))
XToastUtils.success(getString(R.string.request_succeeded))
} else {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + resp.msg)
XToastUtils.error(getString(R.string.request_failed) + resp.msg)
}
} catch (e: Exception) {
e.printStackTrace()
XToastUtils.error(ResUtils.getString(R.string.request_failed) + response)
XToastUtils.error(getString(R.string.request_failed) + response)
}
mCountDownHelper?.finish()
}

@ -41,15 +41,15 @@ import com.xuexiang.xpage.base.XPageActivity
import com.xuexiang.xpage.core.PageOption
import com.xuexiang.xrouter.utils.TextUtils
import com.xuexiang.xui.adapter.recyclerview.RecyclerViewHolder
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.utils.SnackbarUtils
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xui.widget.searchview.MaterialSearchView
import com.xuexiang.xutil.data.ConvertTools
import com.xuexiang.xutil.resource.ResUtils.getColor
import com.xuexiang.xutil.system.ClipboardUtils
import me.samlss.broccoli.Broccoli
@Suppress("PrivatePropertyName", "DEPRECATION")
@Suppress("PrivatePropertyName")
@Page(name = "远程查话簿")
class ContactQueryFragment : BaseFragment<FragmentClientContactQueryBinding?>() {
@ -139,7 +139,7 @@ class ContactQueryFragment : BaseFragment<FragmentClientContactQueryBinding?>()
binding!!.searchView.setOnQueryTextListener(object : MaterialSearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String): Boolean {
SnackbarUtils.Indefinite(view, String.format(getString(R.string.search_keyword), query)).info()
.actionColor(ResUtils.getColor(R.color.xui_config_color_white))
.actionColor(getColor(R.color.xui_config_color_white))
.setAction(getString(R.string.clear)) {
keyword = ""
loadRemoteData()
@ -212,7 +212,7 @@ class ContactQueryFragment : BaseFragment<FragmentClientContactQueryBinding?>()
requestMsg = RSACrypt.encryptByPublicKey(requestMsg, publicKey)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -227,7 +227,7 @@ class ContactQueryFragment : BaseFragment<FragmentClientContactQueryBinding?>()
requestMsg = ConvertTools.bytes2HexString(encryptCBC)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -260,16 +260,15 @@ class ContactQueryFragment : BaseFragment<FragmentClientContactQueryBinding?>()
}
val resp: BaseResponse<List<ContactInfo>?> = Gson().fromJson(json, object : TypeToken<BaseResponse<List<ContactInfo>?>>() {}.type)
if (resp.code == 200) {
//XToastUtils.success(ResUtils.getString(R.string.request_succeeded))
mAdapter!!.refresh(resp.data)
binding!!.refreshLayout.finishRefresh()
binding!!.recyclerView.scrollToPosition(0)
} else {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + resp.msg)
XToastUtils.error(getString(R.string.request_failed) + resp.msg)
}
} catch (e: Exception) {
e.printStackTrace()
XToastUtils.error(ResUtils.getString(R.string.request_failed) + response)
XToastUtils.error(getString(R.string.request_failed) + response)
}
}
})

@ -25,7 +25,6 @@ import com.xuexiang.xhttp2.exception.ApiException
import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xrouter.utils.TextUtils
import com.xuexiang.xui.utils.CountDownButtonHelper
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xui.widget.grouplist.XUIGroupListView
import com.xuexiang.xutil.data.ConvertTools
@ -110,7 +109,7 @@ class LocationFragment : BaseFragment<FragmentClientLocationBinding?>(), View.On
requestMsg = RSACrypt.encryptByPublicKey(requestMsg, publicKey)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -125,7 +124,7 @@ class LocationFragment : BaseFragment<FragmentClientLocationBinding?>(), View.On
requestMsg = ConvertTools.bytes2HexString(encryptCBC)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -160,7 +159,7 @@ class LocationFragment : BaseFragment<FragmentClientLocationBinding?>(), View.On
}
val resp: BaseResponse<LocationInfo> = Gson().fromJson(json, object : TypeToken<BaseResponse<LocationInfo>>() {}.type)
if (resp.code == 200) {
XToastUtils.success(ResUtils.getString(R.string.request_succeeded))
XToastUtils.success(getString(R.string.request_succeeded))
mCountDownHelper?.finish()
val locationInfo = resp.data ?: return
@ -168,18 +167,18 @@ class LocationFragment : BaseFragment<FragmentClientLocationBinding?>(), View.On
val groupListView = binding!!.infoList
groupListView.removeAllViews()
val section = XUIGroupListView.newSection(context)
section.addItemView(groupListView.createItemView(String.format(ResUtils.getString(R.string.location_longitude), locationInfo.longitude))) {}
section.addItemView(groupListView.createItemView(String.format(ResUtils.getString(R.string.location_latitude), locationInfo.latitude))) {}
if (locationInfo.address != "") section.addItemView(groupListView.createItemView(String.format(ResUtils.getString(R.string.location_address), locationInfo.address))) {}
if (locationInfo.time != "") section.addItemView(groupListView.createItemView(String.format(ResUtils.getString(R.string.location_time), locationInfo.time))) {}
if (locationInfo.provider != "") section.addItemView(groupListView.createItemView(String.format(ResUtils.getString(R.string.location_provider), locationInfo.provider))) {}
section.addItemView(groupListView.createItemView(String.format(getString(R.string.location_longitude), locationInfo.longitude))) {}
section.addItemView(groupListView.createItemView(String.format(getString(R.string.location_latitude), locationInfo.latitude))) {}
if (locationInfo.address != "") section.addItemView(groupListView.createItemView(String.format(getString(R.string.location_address), locationInfo.address))) {}
if (locationInfo.time != "") section.addItemView(groupListView.createItemView(String.format(getString(R.string.location_time), locationInfo.time))) {}
if (locationInfo.provider != "") section.addItemView(groupListView.createItemView(String.format(getString(R.string.location_provider), locationInfo.provider))) {}
section.addTo(groupListView)
} else {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + resp.msg)
XToastUtils.error(getString(R.string.request_failed) + resp.msg)
}
} catch (e: Exception) {
e.printStackTrace()
XToastUtils.error(ResUtils.getString(R.string.request_failed) + response)
XToastUtils.error(getString(R.string.request_failed) + response)
}
mCountDownHelper?.finish()
}

@ -40,16 +40,17 @@ import com.xuexiang.xpage.base.XPageActivity
import com.xuexiang.xpage.core.PageOption
import com.xuexiang.xrouter.utils.TextUtils
import com.xuexiang.xui.adapter.recyclerview.RecyclerViewHolder
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.utils.SnackbarUtils
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xui.widget.searchview.MaterialSearchView
import com.xuexiang.xui.widget.searchview.MaterialSearchView.SearchViewListener
import com.xuexiang.xutil.data.ConvertTools
import com.xuexiang.xutil.data.DateUtils
import com.xuexiang.xutil.resource.ResUtils.getColor
import com.xuexiang.xutil.resource.ResUtils.getStringArray
import me.samlss.broccoli.Broccoli
@Suppress("PrivatePropertyName", "DEPRECATION")
@Suppress("PrivatePropertyName")
@Page(name = "远程查短信")
class SmsQueryFragment : BaseFragment<FragmentClientSmsQueryBinding?>() {
@ -128,7 +129,7 @@ class SmsQueryFragment : BaseFragment<FragmentClientSmsQueryBinding?>() {
delegateAdapter.addAdapter(mAdapter)
binding!!.recyclerView.adapter = delegateAdapter
binding!!.tabBar.setTabTitles(ResUtils.getStringArray(R.array.sms_type_option))
binding!!.tabBar.setTabTitles(getStringArray(R.array.sms_type_option))
binding!!.tabBar.setOnTabClickListener { _, position ->
//XToastUtils.toast("点击了$title--$position")
smsType = position + 1
@ -144,7 +145,7 @@ class SmsQueryFragment : BaseFragment<FragmentClientSmsQueryBinding?>() {
binding!!.searchView.setOnQueryTextListener(object : MaterialSearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String): Boolean {
SnackbarUtils.Indefinite(view, String.format(getString(R.string.search_keyword), query)).info()
.actionColor(ResUtils.getColor(R.color.xui_config_color_white))
.actionColor(getColor(R.color.xui_config_color_white))
.setAction(getString(R.string.clear)) {
keyword = ""
loadRemoteData(true)
@ -222,7 +223,7 @@ class SmsQueryFragment : BaseFragment<FragmentClientSmsQueryBinding?>() {
requestMsg = RSACrypt.encryptByPublicKey(requestMsg, publicKey)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -237,7 +238,7 @@ class SmsQueryFragment : BaseFragment<FragmentClientSmsQueryBinding?>() {
requestMsg = ConvertTools.bytes2HexString(encryptCBC)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -270,7 +271,6 @@ class SmsQueryFragment : BaseFragment<FragmentClientSmsQueryBinding?>() {
}
val resp: BaseResponse<List<SmsInfo>?> = Gson().fromJson(json, object : TypeToken<BaseResponse<List<SmsInfo>?>>() {}.type)
if (resp.code == 200) {
//XToastUtils.success(ResUtils.getString(R.string.request_succeeded))
pageNum++
if (refresh) {
mAdapter!!.refresh(resp.data)
@ -281,11 +281,11 @@ class SmsQueryFragment : BaseFragment<FragmentClientSmsQueryBinding?>() {
binding!!.refreshLayout.finishLoadMore()
}
} else {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + resp.msg)
XToastUtils.error(getString(R.string.request_failed) + resp.msg)
}
} catch (e: Exception) {
e.printStackTrace()
XToastUtils.error(ResUtils.getString(R.string.request_failed) + response)
XToastUtils.error(getString(R.string.request_failed) + response)
}
}
})

@ -22,7 +22,6 @@ import com.xuexiang.xhttp2.exception.ApiException
import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xrouter.utils.TextUtils
import com.xuexiang.xui.utils.CountDownButtonHelper
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xutil.data.ConvertTools
@ -98,14 +97,14 @@ class SmsSendFragment : BaseFragment<FragmentClientSmsSendBinding?>(), View.OnCl
val phoneNumbers = binding!!.etPhoneNumbers.text.toString()
val phoneRegex = getString(R.string.phone_numbers_regex).toRegex()
if (!phoneRegex.matches(phoneNumbers)) {
XToastUtils.error(ResUtils.getString(R.string.phone_numbers_error))
XToastUtils.error(getString(R.string.phone_numbers_error))
return
}
val msgContent = binding!!.etMsgContent.text.toString()
val msgRegex = getString(R.string.msg_content_regex).toRegex()
if (!msgRegex.matches(msgContent)) {
XToastUtils.error(ResUtils.getString(R.string.msg_content_error))
XToastUtils.error(getString(R.string.msg_content_error))
return
}
@ -132,7 +131,7 @@ class SmsSendFragment : BaseFragment<FragmentClientSmsSendBinding?>(), View.OnCl
requestMsg = RSACrypt.encryptByPublicKey(requestMsg, publicKey)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -147,7 +146,7 @@ class SmsSendFragment : BaseFragment<FragmentClientSmsSendBinding?>(), View.OnCl
requestMsg = ConvertTools.bytes2HexString(encryptCBC)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -182,13 +181,13 @@ class SmsSendFragment : BaseFragment<FragmentClientSmsSendBinding?>(), View.OnCl
}
val resp: BaseResponse<String> = Gson().fromJson(json, object : TypeToken<BaseResponse<String>>() {}.type)
if (resp.code == 200) {
XToastUtils.success(ResUtils.getString(R.string.request_succeeded))
XToastUtils.success(getString(R.string.request_succeeded))
} else {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + resp.msg)
XToastUtils.error(getString(R.string.request_failed) + resp.msg)
}
} catch (e: Exception) {
e.printStackTrace()
XToastUtils.error(ResUtils.getString(R.string.request_failed) + response)
XToastUtils.error(getString(R.string.request_failed) + response)
}
mCountDownHelper?.finish()
}

@ -24,13 +24,13 @@ import com.xuexiang.xhttp2.exception.ApiException
import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xrouter.utils.TextUtils
import com.xuexiang.xui.utils.CountDownButtonHelper
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
import com.xuexiang.xutil.data.ConvertTools
import com.xuexiang.xutil.resource.ResUtils.getColors
@Suppress("PrivatePropertyName", "DEPRECATION")
@Suppress("PrivatePropertyName")
@Page(name = "远程WOL")
class WolSendFragment : BaseFragment<FragmentClientWolSendBinding?>(), View.OnClickListener {
@ -101,7 +101,7 @@ class WolSendFragment : BaseFragment<FragmentClientWolSendBinding?>(), View.OnCl
.positiveText(R.string.select)
.negativeText(R.string.cancel)
.neutralText(R.string.clear_history)
.neutralColor(ResUtils.getColors(R.color.red))
.neutralColor(getColors(R.color.red))
.onNeutral { _: MaterialDialog?, _: DialogAction? ->
wolHistory.clear()
HttpServerUtils.wolHistory = ""
@ -125,21 +125,21 @@ class WolSendFragment : BaseFragment<FragmentClientWolSendBinding?>(), View.OnCl
val mac = binding!!.etMac.text.toString()
val macRegex = getString(R.string.mac_regex).toRegex()
if (!macRegex.matches(mac)) {
XToastUtils.error(ResUtils.getString(R.string.mac_error))
XToastUtils.error(getString(R.string.mac_error))
return
}
val ip = binding!!.etIp.text.toString()
val ipRegex = getString(R.string.ip_regex).toRegex()
if (!TextUtils.isEmpty(ip) && !ipRegex.matches(ip)) {
XToastUtils.error(ResUtils.getString(R.string.ip_error))
XToastUtils.error(getString(R.string.ip_error))
return
}
val port = binding!!.etPort.text.toString()
val portRegex = getString(R.string.wol_port_regex).toRegex()
if (!TextUtils.isEmpty(port) && !portRegex.matches(port)) {
XToastUtils.error(ResUtils.getString(R.string.wol_port_error))
XToastUtils.error(getString(R.string.wol_port_error))
return
}
@ -166,7 +166,7 @@ class WolSendFragment : BaseFragment<FragmentClientWolSendBinding?>(), View.OnCl
requestMsg = RSACrypt.encryptByPublicKey(requestMsg, publicKey)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -181,7 +181,7 @@ class WolSendFragment : BaseFragment<FragmentClientWolSendBinding?>(), View.OnCl
requestMsg = ConvertTools.bytes2HexString(encryptCBC)
Log.i(TAG, "requestMsg: $requestMsg")
} catch (e: Exception) {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
XToastUtils.error(getString(R.string.request_failed) + e.message)
e.printStackTrace()
return
}
@ -216,16 +216,16 @@ class WolSendFragment : BaseFragment<FragmentClientWolSendBinding?>(), View.OnCl
}
val resp: BaseResponse<String> = Gson().fromJson(json, object : TypeToken<BaseResponse<String>>() {}.type)
if (resp.code == 200) {
XToastUtils.success(ResUtils.getString(R.string.request_succeeded))
XToastUtils.success(getString(R.string.request_succeeded))
//添加到历史记录
wolHistory[mac] = ip
HttpServerUtils.wolHistory = Gson().toJson(wolHistory)
} else {
XToastUtils.error(ResUtils.getString(R.string.request_failed) + resp.msg)
XToastUtils.error(getString(R.string.request_failed) + resp.msg)
}
} catch (e: Exception) {
e.printStackTrace()
XToastUtils.error(ResUtils.getString(R.string.request_failed) + response)
XToastUtils.error(getString(R.string.request_failed) + response)
}
mCountDownHelper?.finish()
}

@ -17,8 +17,6 @@ import com.idormy.sms.forwarder.database.viewmodel.SenderViewModel
import com.idormy.sms.forwarder.databinding.FragmentSendersBarkBinding
import com.idormy.sms.forwarder.entity.MsgInfo
import com.idormy.sms.forwarder.entity.setting.BarkSetting
import com.idormy.sms.forwarder.utils.BARK_ENCRYPTION_ALGORITHM_MAP
import com.idormy.sms.forwarder.utils.BARK_LEVEL_MAP
import com.idormy.sms.forwarder.utils.CommonUtils
import com.idormy.sms.forwarder.utils.EVENT_TOAST_ERROR
import com.idormy.sms.forwarder.utils.KEY_SENDER_CLONE
@ -55,6 +53,20 @@ class BarkFragment : BaseFragment<FragmentSendersBarkBinding?>(), View.OnClickLi
private var mCountDownHelper: CountDownButtonHelper? = null
private var barkLevel: String = "active" //通知级别
private var transformation: String = "none" //加密算法
private val BARK_LEVEL_MAP = mapOf(
"active" to getString(R.string.bark_level_active),
"timeSensitive" to getString(R.string.bark_level_timeSensitive),
"passive" to getString(R.string.bark_level_passive)
)
private val BARK_ENCRYPTION_ALGORITHM_MAP = mapOf(
"none" to getString(R.string.bark_encryption_algorithm_none),
"AES128/CBC/PKCS7Padding" to "AES128/CBC/PKCS7Padding",
"AES128/ECB/PKCS7Padding" to "AES128/ECB/PKCS7Padding",
"AES192/CBC/PKCS7Padding" to "AES192/CBC/PKCS7Padding",
"AES192/ECB/PKCS7Padding" to "AES192/ECB/PKCS7Padding",
"AES256/CBC/PKCS7Padding" to "AES256/CBC/PKCS7Padding",
"AES256/ECB/PKCS7Padding" to "AES256/ECB/PKCS7Padding",
)
@JvmField
@AutoWired(name = KEY_SENDER_ID)

@ -32,11 +32,11 @@ 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.utils.ResUtils
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
import com.xuexiang.xui.widget.spinner.materialspinner.MaterialSpinner
import com.xuexiang.xutil.resource.ResUtils.getStringArray
import io.reactivex.SingleObserver
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
@ -44,7 +44,7 @@ import io.reactivex.schedulers.Schedulers
import java.util.Date
@Page(name = "Email")
@Suppress("PrivatePropertyName", "DEPRECATION")
@Suppress("PrivatePropertyName")
class EmailFragment : BaseFragment<FragmentSendersEmailBinding?>(), View.OnClickListener {
private val TAG: String = EmailFragment::class.java.simpleName
@ -97,7 +97,7 @@ class EmailFragment : BaseFragment<FragmentSendersEmailBinding?>(), View.OnClick
}
})
val mailTypeArray = ResUtils.getStringArray(R.array.MailType)
val mailTypeArray = getStringArray(R.array.MailType)
Log.d(TAG, mailTypeArray.toString())
binding!!.spMailType.setOnItemSelectedListener { _: MaterialSpinner?, position: Int, _: Long, item: Any ->
mailType = item.toString()

@ -9,21 +9,30 @@ import com.google.gson.Gson
import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.entity.CallInfo
import com.idormy.sms.forwarder.entity.MsgInfo
import com.idormy.sms.forwarder.utils.CALL_TYPE_MAP
import com.idormy.sms.forwarder.utils.PhoneUtils
import com.idormy.sms.forwarder.utils.SettingUtils
import com.idormy.sms.forwarder.utils.Worker
import com.idormy.sms.forwarder.workers.SendWorker
import com.xuexiang.xrouter.utils.TextUtils
import com.xuexiang.xui.utils.ResUtils.getString
import java.util.*
import com.xuexiang.xutil.resource.ResUtils.getString
import java.util.Date
@Suppress("DEPRECATION")
open class CallReceiver : PhoneStateReceiver() {
companion object {
private val TAG = CallReceiver::class.java.simpleName
//通话类型1.来电挂机 2.去电挂机 3.未接来电 4.来电提醒 5.来电接通 6.去电拨出
private val CALL_TYPE_MAP = mapOf(
//"0" to getString(R.string.unknown_call),
"1" to getString(R.string.incoming_call_ended),
"2" to getString(R.string.outgoing_call_ended),
"3" to getString(R.string.missed_call),
"4" to getString(R.string.incoming_call_received),
"5" to getString(R.string.incoming_call_answered),
"6" to getString(R.string.outgoing_call_started),
)
//const val ACTION_IN = "android.intent.action.PHONE_STATE"
const val ACTION_OUT = "android.intent.action.NEW_OUTGOING_CALL"
const val EXTRA_PHONE_NUMBER = "android.intent.extra.PHONE_NUMBER"

@ -3,7 +3,7 @@ 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.xuexiang.xutil.resource.ResUtils.getString
import com.yanzhenjie.andserver.annotation.Interceptor
import com.yanzhenjie.andserver.error.HttpException
import com.yanzhenjie.andserver.framework.HandlerInterceptor
@ -13,7 +13,7 @@ import com.yanzhenjie.andserver.http.HttpMethod
import com.yanzhenjie.andserver.http.HttpRequest
import com.yanzhenjie.andserver.http.HttpResponse
@Suppress("PrivatePropertyName", "DEPRECATION")
@Suppress("PrivatePropertyName")
@Interceptor
class LoggerInterceptor : HandlerInterceptor {

@ -5,10 +5,10 @@ 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.xuexiang.xutil.resource.ResUtils.getString
import com.yanzhenjie.andserver.annotation.*
@Suppress("PrivatePropertyName", "DEPRECATION")
@Suppress("PrivatePropertyName")
@RestController
@RequestMapping(path = ["/clone"])
class CloneController {

@ -11,11 +11,11 @@ import com.idormy.sms.forwarder.server.model.BaseRequest
import com.idormy.sms.forwarder.server.model.SmsQueryData
import com.idormy.sms.forwarder.server.model.SmsSendData
import com.idormy.sms.forwarder.utils.PhoneUtils
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xutil.XUtil
import com.xuexiang.xutil.resource.ResUtils.getString
import com.yanzhenjie.andserver.annotation.*
@Suppress("PrivatePropertyName", "DEPRECATION")
@Suppress("PrivatePropertyName")
@RestController
@RequestMapping(path = ["/sms"])
class SmsController {
@ -41,7 +41,7 @@ class SmsController {
val mSubscriptionId: Int = App.SimInfoList[simSlotIndex]?.mSubscriptionId ?: -1
if (ActivityCompat.checkSelfPermission(XUtil.getContext(), Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
return ResUtils.getString(R.string.no_sms_sending_permission)
return getString(R.string.no_sms_sending_permission)
}
return PhoneUtils.sendSms(mSubscriptionId, smsSendData.phoneNumbers, smsSendData.msgContent) ?: "success"

@ -4,9 +4,9 @@ import android.content.Intent
import android.os.BatteryManager
import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.entity.BatteryInfo
import com.xuexiang.xui.utils.ResUtils.getString
import com.xuexiang.xutil.resource.ResUtils.getString
@Suppress("DEPRECATION", "MemberVisibilityCanBePrivate")
@Suppress("MemberVisibilityCanBePrivate")
object BatteryUtils {
//private const val TAG = "BatteryUtils"

@ -27,7 +27,6 @@ import com.idormy.sms.forwarder.service.NotificationService
import com.xuexiang.xpage.base.XPageFragment
import com.xuexiang.xpage.core.PageOption
import com.xuexiang.xui.utils.ColorUtils
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.widget.dialog.DialogLoader
import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
@ -35,6 +34,7 @@ import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog.SingleButton
import com.xuexiang.xui.widget.imageview.preview.PreviewBuilder
import com.xuexiang.xutil.XUtil
import com.xuexiang.xutil.common.StringUtils
import com.xuexiang.xutil.resource.ResUtils.getString
import java.net.Inet4Address
import java.net.Inet6Address
import java.net.NetworkInterface
@ -70,19 +70,19 @@ class CommonUtils private constructor() {
}.negativeText(R.string.lab_disagree).onNegative { dialog, _ ->
dialog.dismiss()
DialogLoader.getInstance().showConfirmDialog(
context, ResUtils.getString(R.string.title_reminder), String.format(
ResUtils.getString(R.string.content_privacy_explain_again), ResUtils.getString(R.string.app_name)
), ResUtils.getString(R.string.lab_look_again), { dialog, _ ->
context, getString(R.string.title_reminder), String.format(
getString(R.string.content_privacy_explain_again), getString(R.string.app_name)
), getString(R.string.lab_look_again), { dialog, _ ->
dialog.dismiss()
showPrivacyDialog(context, submitListener)
}, ResUtils.getString(R.string.lab_still_disagree)
}, getString(R.string.lab_still_disagree)
) { dialog, _ ->
dialog.dismiss()
DialogLoader.getInstance().showConfirmDialog(
context, ResUtils.getString(R.string.content_think_about_it_again), ResUtils.getString(R.string.lab_look_again), { dialog, _ ->
context, getString(R.string.content_think_about_it_again), getString(R.string.lab_look_again), { dialog, _ ->
dialog.dismiss()
showPrivacyDialog(context, submitListener)
}, ResUtils.getString(R.string.lab_exit_app)
}, getString(R.string.lab_exit_app)
) { dialog, _ ->
dialog.dismiss()
XUtil.exitApp()
@ -100,7 +100,7 @@ class CommonUtils private constructor() {
* @return 隐私政策说明
*/
private fun getPrivacyContent(context: Context): SpannableStringBuilder {
return SpannableStringBuilder().append(" ").append(ResUtils.getString(R.string.privacy_content_1)).append(" ").append(ResUtils.getString(R.string.app_name)).append("!\n").append(" ").append(ResUtils.getString(R.string.privacy_content_2)).append(" ").append(ResUtils.getString(R.string.privacy_content_3)).append(getPrivacyLink(context, PRIVACY_URL)).append(ResUtils.getString(R.string.privacy_content_4)).append(" ").append(ResUtils.getString(R.string.privacy_content_5)).append(getPrivacyLink(context, PRIVACY_URL)).append(ResUtils.getString(R.string.privacy_content_6)).append(" ").append(ResUtils.getString(R.string.privacy_content_7))
return SpannableStringBuilder().append(" ").append(getString(R.string.privacy_content_1)).append(" ").append(getString(R.string.app_name)).append("!\n").append(" ").append(getString(R.string.privacy_content_2)).append(" ").append(getString(R.string.privacy_content_3)).append(getPrivacyLink(context, PRIVACY_URL)).append(getString(R.string.privacy_content_4)).append(" ").append(getString(R.string.privacy_content_5)).append(getPrivacyLink(context, PRIVACY_URL)).append(getString(R.string.privacy_content_6)).append(" ").append(getString(R.string.privacy_content_7))
}
/**
@ -110,7 +110,7 @@ class CommonUtils private constructor() {
@Suppress("SameParameterValue")
private fun getPrivacyLink(context: Context, privacyUrl: String): SpannableString {
val privacyName = String.format(
ResUtils.getString(R.string.lab_privacy_name), ResUtils.getString(R.string.app_name)
getString(R.string.lab_privacy_name), getString(R.string.app_name)
)
val spannableString = SpannableString(privacyName)
spannableString.setSpan(object : ClickableSpan() {
@ -143,7 +143,7 @@ class CommonUtils private constructor() {
@JvmStatic
fun gotoProtocol(fragment: XPageFragment?, isPrivacy: Boolean, isImmersive: Boolean) {
PageOption.to(ServiceProtocolFragment::class.java).putString(
ServiceProtocolFragment.KEY_PROTOCOL_TITLE, if (isPrivacy) ResUtils.getString(R.string.title_privacy_protocol) else ResUtils.getString(
ServiceProtocolFragment.KEY_PROTOCOL_TITLE, if (isPrivacy) getString(R.string.title_privacy_protocol) else getString(
R.string.title_user_protocol
)
).putBoolean(ServiceProtocolFragment.KEY_IS_IMMERSIVE, isImmersive).open(fragment!!)

@ -1,18 +1,13 @@
@file:Suppress("unused", "DEPRECATION")
package com.idormy.sms.forwarder.utils
import com.idormy.sms.forwarder.R
import com.xuexiang.xpage.enums.CoreAnim
import com.xuexiang.xpage.model.PageInfo
import com.xuexiang.xui.utils.ResUtils.getString
object Worker {
const val sendMsgInfo = "send_msg_info"
const val sendLogId = "send_log_id"
const val sendSbnId = "send_sbn_id"
//const val sendLogId = "send_log_id"
//const val sendSbnId = "send_sbn_id"
const val updateLogs = "update_logs"
const val ruleId = "rule_id"
//const val ruleId = "rule_id"
const val rule = "rule"
const val senderIndex = "sender_index"
const val msgId = "msg_id"
@ -30,7 +25,6 @@ object TaskWorker {
//初始化相关
const val AUTO_CHECK_UPDATE = "auto_check_update"
const val IS_FIRST_OPEN_KEY = "is_first_open_key"
const val IS_AGREE_PRIVACY_KEY = "is_agree_privacy_key"
//数据库
@ -95,9 +89,6 @@ const val CACTUS_LAST_TIMER = "cactus_last_timer"
const val CACTUS_DATE = "cactus_date"
const val CACTUS_END_DATE = "cactus_end_date"
//OkHttp 请求超时时间
const val REQUEST_TIMEOUT_SECONDS = 5
//规则相关
const val STATUS_ON = 1
const val STATUS_OFF = 0
@ -125,75 +116,6 @@ const val SENDER_LOGIC_ALL = "ALL"
const val SENDER_LOGIC_UNTIL_FAIL = "UntilFail"
const val SENDER_LOGIC_UNTIL_SUCCESS = "UntilSuccess"
const val SENDER_LOGIC_RETRY = "Retry"
val TYPE_MAP = object : HashMap<String, String>() {
init {
put("sms", getString(R.string.rule_sms))
put("call", getString(R.string.rule_call))
put("app", getString(R.string.rule_app))
}
}
val FILED_MAP = object : HashMap<String, String>() {
init {
put("transpond_all", getString(R.string.rule_transpond_all))
put("phone_num", getString(R.string.rule_phone_num))
put("msg_content", getString(R.string.rule_msg_content))
put("multi_match", getString(R.string.rule_multi_match))
put("package_name", getString(R.string.rule_package_name))
put("inform_content", getString(R.string.rule_inform_content))
put("call_type", getString(R.string.rule_call_type))
put("uid", getString(R.string.rule_uid))
}
}
val CHECK_MAP = object : HashMap<String, String>() {
init {
put("is", getString(R.string.rule_is))
put("notis", getString(R.string.rule_notis))
put("contain", getString(R.string.rule_contain))
put("startwith", getString(R.string.rule_startwith))
put("endwith", getString(R.string.rule_endwith))
put("notcontain", getString(R.string.rule_notcontain))
put("regex", getString(R.string.rule_regex))
}
}
val SIM_SLOT_MAP = object : HashMap<String, String>() {
init {
put("ALL", getString(R.string.rule_all))
put("SIM1", "SIM1")
put("SIM2", "SIM2")
}
}
val FORWARD_STATUS_MAP = object : HashMap<Int, String>() {
init {
put(0, getString(R.string.failed))
put(1, getString(R.string.processing))
put(2, getString(R.string.success))
}
}
val BARK_LEVEL_MAP = mapOf(
"active" to getString(R.string.bark_level_active),
"timeSensitive" to getString(R.string.bark_level_timeSensitive),
"passive" to getString(R.string.bark_level_passive)
)
val BARK_ENCRYPTION_ALGORITHM_MAP = mapOf(
"none" to getString(R.string.bark_encryption_algorithm_none),
"AES128/CBC/PKCS7Padding" to "AES128/CBC/PKCS7Padding",
"AES128/ECB/PKCS7Padding" to "AES128/ECB/PKCS7Padding",
"AES192/CBC/PKCS7Padding" to "AES192/CBC/PKCS7Padding",
"AES192/ECB/PKCS7Padding" to "AES192/ECB/PKCS7Padding",
"AES256/CBC/PKCS7Padding" to "AES256/CBC/PKCS7Padding",
"AES256/ECB/PKCS7Padding" to "AES256/ECB/PKCS7Padding",
)
//通话类型1.来电挂机 2.去电挂机 3.未接来电 4.来电提醒 5.来电接通 6.去电拨出
val CALL_TYPE_MAP = mapOf(
//"0" to getString(R.string.unknown_call),
"1" to getString(R.string.incoming_call_ended),
"2" to getString(R.string.outgoing_call_ended),
"3" to getString(R.string.missed_call),
"4" to getString(R.string.incoming_call_received),
"5" to getString(R.string.incoming_call_answered),
"6" to getString(R.string.outgoing_call_started),
)
//发送通道
const val TYPE_DINGTALK_GROUP_ROBOT = 0
@ -212,120 +134,6 @@ const val TYPE_DINGTALK_INNER_ROBOT = 12
const val TYPE_FEISHU_APP = 13
const val TYPE_URL_SCHEME = 14
const val TYPE_SOCKET = 15
var SENDER_FRAGMENT_LIST = listOf(
PageInfo(
getString(R.string.dingtalk_robot),
"com.idormy.sms.forwarder.fragment.senders.DingtalkGroupRobotFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_dingtalk
),
PageInfo(
getString(R.string.email),
"com.idormy.sms.forwarder.fragment.senders.EmailFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_email
),
PageInfo(
getString(R.string.bark),
"com.idormy.sms.forwarder.fragment.senders.BarkFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_bark
),
PageInfo(
getString(R.string.webhook),
"com.idormy.sms.forwarder.fragment.senders.WebhookFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_webhook
),
PageInfo(
getString(R.string.wework_robot),
"com.idormy.sms.forwarder.fragment.senders.WeworkRobotFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_wework_robot
),
PageInfo(
getString(R.string.wework_agent),
"com.idormy.sms.forwarder.fragment.senders.WeworkAgentFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_wework_agent
),
PageInfo(
getString(R.string.server_chan),
"com.idormy.sms.forwarder.fragment.senders.ServerchanFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_serverchan
),
PageInfo(
getString(R.string.telegram),
"com.idormy.sms.forwarder.fragment.senders.TelegramFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_telegram
),
PageInfo(
getString(R.string.sms_menu),
"com.idormy.sms.forwarder.fragment.senders.SmsFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_sms
),
PageInfo(
getString(R.string.feishu),
"com.idormy.sms.forwarder.fragment.senders.FeishuFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_feishu
),
PageInfo(
getString(R.string.pushplus),
"com.idormy.sms.forwarder.fragment.senders.PushplusFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_pushplus
),
PageInfo(
getString(R.string.gotify),
"com.idormy.sms.forwarder.fragment.senders.GotifyFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_gotify
),
PageInfo(
getString(R.string.dingtalk_inner_robot),
"com.idormy.sms.forwarder.fragment.senders.DingtalkInnerRobotFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_dingtalk_inner
),
PageInfo(
getString(R.string.feishu_app),
"com.idormy.sms.forwarder.fragment.senders.FeishuAppFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_feishu_app
),
PageInfo(
getString(R.string.url_scheme),
"com.idormy.sms.forwarder.fragment.senders.UrlSchemeFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_url_scheme
),
PageInfo(
getString(R.string.socket),
"com.idormy.sms.forwarder.fragment.senders.SocketFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_socket
),
)
//前台服务
const val FRONT_NOTIFY_ID = 0x1010
@ -343,15 +151,6 @@ const val EVENT_FRPC_RUNNING_SUCCESS = "EVENT_FRPC_RUNNING_SUCCESS"
const val INTENT_FRPC_EDIT_FILE = "INTENT_FRPC_EDIT_FILE"
const val INTENT_FRPC_APPLY_FILE = "INTENT_FRPC_APPLY_FILE"
//来电监听
const val ACTION_CALL_IN = "android.intent.action.PHONE_STATE"
const val ACTION_CALL_OUT = "android.intent.action.NEW_OUTGOING_CALL"
const val EXTRA_PHONE_NUMBER = "android.intent.extra.PHONE_NUMBER"
//Markdown 查看页面
const val KEY_TITLE = "key_title"
const val KEY_URL = "key_url"
//吐司监听
const val EVENT_TOAST_SUCCESS = "key_toast_success"
const val EVENT_TOAST_ERROR = "key_toast_error"
@ -380,17 +179,10 @@ const val EVENT_KEY_PHONE_NUMBERS = "EVENT_KEY_PHONE_NUMBERS"
const val KEY_UPDATE_URL = "https://xupdate.ppps.cn/update/checkVersion"
//HttpServer相关
const val ENABLE_HTTP_SERVER = "enable_http_server"
const val HTTP_SERVER_PORT = 5000
const val HTTP_SERVER_TIME_OUT = 10
const val HTTP_SERVER_NOTIFY_ID = 0x1011
const val HTTP_SERVER_CHANNEL_ID = "http_server_notification_channel"
const val HTTP_SERVER_CHANNEL_NAME = "Http-Server Service"
const val START_ACTION = "start"
const val STOP_ACTION = "stop"
const val HTTP_SUCCESS_CODE: Int = 200
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_SAFETY_MEASURES = "server_safety_measures"
const val SP_SERVER_SIGN_KEY = "server_sign_key"
@ -416,71 +208,6 @@ const val SP_SERVER_CONFIG = "server_config"
const val SP_CLIENT_SAFETY_MEASURES = "client_safety_measures"
const val SP_CLIENT_SIGN_KEY = "client_sign_key"
var CLIENT_FRAGMENT_LIST = listOf(
PageInfo(
getString(R.string.api_clone),
"com.idormy.sms.forwarder.fragment.client.CloneFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_api_clone
),
PageInfo(
getString(R.string.api_sms_query),
"com.idormy.sms.forwarder.fragment.client.SmsQueryFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_api_sms_query
),
PageInfo(
getString(R.string.api_sms_send),
"com.idormy.sms.forwarder.fragment.client.SmsSendFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_api_sms_send
),
PageInfo(
getString(R.string.api_call_query),
"com.idormy.sms.forwarder.fragment.client.CallQueryFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_api_call_query
),
PageInfo(
getString(R.string.api_contact_query),
"com.idormy.sms.forwarder.fragment.client.ContactQueryFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_api_contact_query
),
PageInfo(
getString(R.string.api_contact_add),
"com.idormy.sms.forwarder.fragment.client.ContactAddFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_api_contact_add
),
PageInfo(
getString(R.string.api_wol),
"com.idormy.sms.forwarder.fragment.client.WolSendFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_api_wol
),
PageInfo(
getString(R.string.api_location),
"com.idormy.sms.forwarder.fragment.client.LocationFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_api_location
),
PageInfo(
getString(R.string.api_battery_query),
"com.idormy.sms.forwarder.fragment.client.BatteryQueryFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.icon_api_battery_query
),
)
//自动任务
const val MAX_SETTING_NUM = 5 //最大条件/动作设置条数
@ -505,100 +232,12 @@ const val TASK_CONDITION_SIM = 1004
const val TASK_CONDITION_BATTERY = 1005
const val TASK_CONDITION_CHARGE = 1006
const val TASK_CONDITION_LOCK_SCREEN = 1007
var TASK_CONDITION_FRAGMENT_LIST = listOf(
PageInfo(
getString(R.string.task_cron),
"com.idormy.sms.forwarder.fragment.condition.CronFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_custom_time,
),
PageInfo(
getString(R.string.task_to_address),
"com.idormy.sms.forwarder.fragment.condition.ToAddressFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_to_address,
),
PageInfo(
getString(R.string.task_leave_address),
"com.idormy.sms.forwarder.fragment.condition.LeaveAddressFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_leave_address,
),
PageInfo(
getString(R.string.task_network),
"com.idormy.sms.forwarder.fragment.condition.NetworkFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_network
),
PageInfo(
getString(R.string.task_sim),
"com.idormy.sms.forwarder.fragment.condition.SimFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_sim
),
PageInfo(
getString(R.string.task_battery),
"com.idormy.sms.forwarder.fragment.condition.BatteryFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_battery
),
PageInfo(
getString(R.string.task_charge),
"com.idormy.sms.forwarder.fragment.condition.ChargeFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_charge
),
PageInfo(
getString(R.string.task_lock_screen),
"com.idormy.sms.forwarder.fragment.condition.LockScreenFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_lock_screen
),
)
//注意TASK_ACTION_XXX 枚举值 等于 TASK_ACTION_FRAGMENT_LIST 索引加上 KEY_BACK_CODE_ACTION不可改变
const val TASK_ACTION_SENDSMS = 2000
const val TASK_ACTION_NOTIFICATION = 2001
const val TASK_ACTION_FRPC = 2002
const val TASK_ACTION_HTTPSERVER = 2003
var TASK_ACTION_FRAGMENT_LIST = listOf(
PageInfo(
getString(R.string.task_sendsms),
"com.idormy.sms.forwarder.fragment.action.SendSmsFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_sms
),
PageInfo(
getString(R.string.task_notification),
"com.idormy.sms.forwarder.fragment.action.NotificationFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_sender,
),
PageInfo(
getString(R.string.task_frpc),
"com.idormy.sms.forwarder.fragment.action.FrpcFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_frpc
),
PageInfo(
getString(R.string.task_server),
"com.idormy.sms.forwarder.fragment.action.HttpServerFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_http_server
),
)
const val SP_BATTERY_INFO = "battery_info"
const val SP_BATTERY_STATUS = "battery_status"

@ -10,8 +10,8 @@ import com.idormy.sms.forwarder.core.Core
import com.idormy.sms.forwarder.entity.CloneInfo
import com.idormy.sms.forwarder.entity.LocationInfo
import com.idormy.sms.forwarder.server.model.BaseRequest
import com.xuexiang.xui.utils.ResUtils.getString
import com.xuexiang.xutil.app.AppUtils
import com.xuexiang.xutil.resource.ResUtils.getString
import com.yanzhenjie.andserver.error.HttpException
import java.net.URLEncoder
import java.nio.charset.StandardCharsets
@ -21,7 +21,6 @@ import javax.crypto.spec.SecretKeySpec
/**
* HttpServer工具类
*/
@Suppress("DEPRECATION")
class HttpServerUtils private constructor() {
companion object {

@ -28,7 +28,7 @@ import com.idormy.sms.forwarder.entity.SmsInfo
import com.xuexiang.xutil.XUtil
import com.xuexiang.xutil.app.IntentUtils
import com.xuexiang.xutil.data.DateUtils
import com.xuexiang.xutil.resource.ResUtils
import com.xuexiang.xutil.resource.ResUtils.getString
import java.text.SimpleDateFormat
import java.util.*
@ -381,31 +381,31 @@ class PhoneUtils private constructor() {
//获取通话记录转发内容
fun getCallMsg(callInfo: CallInfo): String {
val sb = StringBuilder()
sb.append(ResUtils.getString(R.string.contact)).append(callInfo.name).append("\n")
if (!TextUtils.isEmpty(callInfo.viaNumber)) sb.append(ResUtils.getString(R.string.via_number)).append(callInfo.viaNumber).append("\n")
if (callInfo.dateLong > 0L) sb.append(ResUtils.getString(R.string.call_date)).append(
sb.append(getString(R.string.contact)).append(callInfo.name).append("\n")
if (!TextUtils.isEmpty(callInfo.viaNumber)) sb.append(getString(R.string.via_number)).append(callInfo.viaNumber).append("\n")
if (callInfo.dateLong > 0L) sb.append(getString(R.string.call_date)).append(
DateUtils.millis2String(
callInfo.dateLong, SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
)
).append("\n")
if (callInfo.duration > 0) {
if (callInfo.type == 3) {
sb.append(ResUtils.getString(R.string.ring_duration))
sb.append(getString(R.string.ring_duration))
} else {
sb.append(ResUtils.getString(R.string.call_duration))
sb.append(getString(R.string.call_duration))
}
sb.append(callInfo.duration).append("s\n")
}
sb.append(ResUtils.getString(R.string.mandatory_type))
sb.append(getString(R.string.mandatory_type))
//通话类型1.来电挂机 2.去电挂机 3.未接来电 4.来电提醒 5.来电接通 6.去电拨出
when (callInfo.type) {
1 -> sb.append(ResUtils.getString(R.string.incoming_call_ended))
2 -> sb.append(ResUtils.getString(R.string.outgoing_call_ended))
3 -> sb.append(ResUtils.getString(R.string.missed_call))
4 -> sb.append(ResUtils.getString(R.string.incoming_call_received))
5 -> sb.append(ResUtils.getString(R.string.incoming_call_answered))
6 -> sb.append(ResUtils.getString(R.string.outgoing_call_started))
else -> sb.append(ResUtils.getString(R.string.unknown_call))
1 -> sb.append(getString(R.string.incoming_call_ended))
2 -> sb.append(getString(R.string.outgoing_call_ended))
3 -> sb.append(getString(R.string.missed_call))
4 -> sb.append(getString(R.string.incoming_call_received))
5 -> sb.append(getString(R.string.incoming_call_answered))
6 -> sb.append(getString(R.string.outgoing_call_started))
else -> sb.append(getString(R.string.unknown_call))
}
return sb.toString()
}
@ -477,7 +477,7 @@ class PhoneUtils private constructor() {
val phoneNumber = cursor.getString(indexAddress)
// 根据手机号码查询用户名
val contacts = getContactByNumber(phoneNumber)
smsInfo.name = if (contacts.isNotEmpty()) contacts[0].name else ResUtils.getString(R.string.unknown_number)
smsInfo.name = if (contacts.isNotEmpty()) contacts[0].name else getString(R.string.unknown_number)
// 联系人号码
smsInfo.number = phoneNumber
// 短信内容

@ -3,11 +3,11 @@ 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 com.xuexiang.xutil.resource.ResUtils.getString
import java.util.regex.Pattern
import java.util.regex.PatternSyntaxException
@Suppress("unused", "DEPRECATION")
@Suppress("unused")
class RuleLine(line: String, lineNum: Int, beforeRuleLine: RuleLine?) {
companion object {
val CONJUNCTION_AND: String = getString(R.string.CONJUNCTION_AND)

@ -1,11 +1,9 @@
@file:Suppress("DEPRECATION")
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 com.xuexiang.xutil.resource.ResUtils.getString
import java.util.*
@Suppress("unused")

@ -18,8 +18,8 @@ import com.idormy.sms.forwarder.workers.SendLogicWorker
import com.idormy.sms.forwarder.workers.SendWorker
import com.idormy.sms.forwarder.workers.UpdateLogsWorker
import com.jeremyliao.liveeventbus.LiveEventBus
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xutil.XUtil
import com.xuexiang.xutil.resource.ResUtils.getString
import java.text.ParsePosition
import java.text.SimpleDateFormat
import java.util.Calendar
@ -70,7 +70,7 @@ object SendUtils {
val sender = rule.senderList[senderIndex]
if (sender.status != 1) {
Log.d(TAG, "sender = $sender is disabled")
updateLogs(logId, 0, ResUtils.getString(R.string.sender_disabled))
updateLogs(logId, 0, getString(R.string.sender_disabled))
senderLogic(0, msgInfo, rule, senderIndex, msgId)
return
}
@ -98,7 +98,7 @@ object SendUtils {
val now = System.currentTimeMillis()
if (periodStart != null && periodEnd != null && now in periodStart..periodEnd) {
Log.d(TAG, "免打扰(禁用转发)时间段")
updateLogs(logId, 0, ResUtils.getString(R.string.silent_time_period))
updateLogs(logId, 0, getString(R.string.silent_time_period))
senderLogic(0, msgInfo, rule, senderIndex, msgId)
return
}
@ -185,7 +185,7 @@ object SendUtils {
}
else -> {
updateLogs(logId, 0, ResUtils.getString(R.string.unknown_sender))
updateLogs(logId, 0, getString(R.string.unknown_sender))
senderLogic(0, msgInfo, rule, senderIndex, msgId)
}
}
@ -223,9 +223,9 @@ object SendUtils {
//测试的没有记录ID这里取巧了
if (logId == null || logId == 0L) {
if (status == 2) {
LiveEventBus.get(EVENT_TOAST_SUCCESS, String::class.java).post(ResUtils.getString(R.string.request_succeeded))
LiveEventBus.get(EVENT_TOAST_SUCCESS, String::class.java).post(getString(R.string.request_succeeded))
} else {
LiveEventBus.get(EVENT_TOAST_ERROR, String::class.java).post(ResUtils.getString(R.string.request_failed) + response)
LiveEventBus.get(EVENT_TOAST_ERROR, String::class.java).post(getString(R.string.request_failed) + response)
}
return
}

@ -2,9 +2,8 @@ package com.idormy.sms.forwarder.utils
import android.location.Criteria
import com.idormy.sms.forwarder.R
import com.xuexiang.xui.utils.ResUtils.getString
import com.xuexiang.xutil.resource.ResUtils.getString
@Suppress("DEPRECATION")
class SettingUtils private constructor() {
companion object {

@ -15,8 +15,8 @@ import com.xuexiang.xhttp2.XHttp
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.getString
import com.xuexiang.xutil.net.NetworkUtils
import com.xuexiang.xutil.resource.ResUtils.getString
import okhttp3.Credentials
import okhttp3.Response
import okhttp3.Route
@ -26,7 +26,6 @@ import java.net.PasswordAuthentication
import java.net.Proxy
//钉钉企业内机器人
@Suppress("DEPRECATION")
class DingtalkInnerRobotUtils private constructor() {
companion object {

@ -9,9 +9,8 @@ import com.idormy.sms.forwarder.utils.SendUtils
import com.idormy.sms.forwarder.utils.SettingUtils
import com.idormy.sms.forwarder.utils.mail.Mail
import com.idormy.sms.forwarder.utils.mail.MailSender
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xutil.resource.ResUtils.getString
@Suppress("DEPRECATION")
class EmailUtils {
companion object {
@ -154,7 +153,7 @@ class EmailUtils {
}
override fun onSuccess() {
SendUtils.updateLogs(logId, 2, ResUtils.getString(R.string.request_succeeded))
SendUtils.updateLogs(logId, 2, getString(R.string.request_succeeded))
SendUtils.senderLogic(2, msgInfo, rule, senderIndex, msgId)
}
})

@ -15,10 +15,9 @@ import com.xuexiang.xhttp2.XHttp
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.getString
import com.xuexiang.xutil.resource.ResUtils.getString
//飞书企业应用
@Suppress("DEPRECATION")
class FeishuAppUtils private constructor() {
companion object {

@ -14,7 +14,7 @@ import com.xuexiang.xhttp2.XHttp
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.xutil.resource.ResUtils.getString
@Suppress("DEPRECATION")
class PushplusUtils private constructor() {
@ -52,7 +52,7 @@ class PushplusUtils private constructor() {
if (!TextUtils.isEmpty(setting.template)) msgMap["template"] = setting.template.toString()
if (!TextUtils.isEmpty(setting.topic)) msgMap["topic"] = setting.topic.toString()
if (setting.website == ResUtils.getString(R.string.pushplus_plus)) {
if (setting.website == getString(R.string.pushplus_plus)) {
if (!TextUtils.isEmpty(setting.channel)) msgMap["channel"] = setting.channel.toString()
if (!TextUtils.isEmpty(setting.webhook)) msgMap["webhook"] = setting.webhook.toString()
if (!TextUtils.isEmpty(setting.callbackUrl)) msgMap["callbackUrl"] = setting.callbackUrl.toString()

@ -12,9 +12,9 @@ import com.idormy.sms.forwarder.entity.setting.SmsSetting
import com.idormy.sms.forwarder.utils.PhoneUtils
import com.idormy.sms.forwarder.utils.SendUtils
import com.idormy.sms.forwarder.utils.SettingUtils
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xutil.XUtil
import com.xuexiang.xutil.net.NetworkUtils
import com.xuexiang.xutil.resource.ResUtils.getString
@Suppress("DEPRECATION")
class SmsUtils {
@ -32,13 +32,13 @@ class SmsUtils {
) {
//仅当无网络时启用 && 判断是否真实有网络
if (setting.onlyNoNetwork == true && NetworkUtils.isHaveInternet() && NetworkUtils.isAvailableByPing()) {
SendUtils.updateLogs(logId, 0, ResUtils.getString(R.string.OnlyNoNetwork))
SendUtils.updateLogs(logId, 0, getString(R.string.OnlyNoNetwork))
SendUtils.senderLogic(0, msgInfo, rule, senderIndex, msgId)
return
}
if (ActivityCompat.checkSelfPermission(XUtil.getContext(), Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
SendUtils.updateLogs(logId, 0, ResUtils.getString(R.string.no_sms_sending_permission))
SendUtils.updateLogs(logId, 0, getString(R.string.no_sms_sending_permission))
SendUtils.senderLogic(0, msgInfo, rule, senderIndex, msgId)
return
}
@ -59,13 +59,13 @@ class SmsUtils {
Log.d(TAG, App.SimInfoList.toString())
//替换 {{来源号码}} 标签
val mobiles = setting.mobiles.replace(ResUtils.getString(R.string.tag_from), msgInfo.from)
val mobiles = setting.mobiles.replace(getString(R.string.tag_from), msgInfo.from)
//TODO取不到卡槽信息时采用默认卡槽发送
val mSubscriptionId: Int = App.SimInfoList[simSlotIndex]?.mSubscriptionId ?: -1
val res: String? = PhoneUtils.sendSms(mSubscriptionId, mobiles, content)
if (res == null) {
SendUtils.updateLogs(logId, 2, ResUtils.getString(R.string.request_succeeded))
SendUtils.updateLogs(logId, 2, getString(R.string.request_succeeded))
SendUtils.senderLogic(2, msgInfo, rule, senderIndex, msgId)
} else {
SendUtils.updateLogs(logId, 0, res)

@ -16,8 +16,8 @@ import com.xuexiang.xhttp2.XHttp
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.getString
import com.xuexiang.xutil.net.NetworkUtils
import com.xuexiang.xutil.resource.ResUtils.getString
import okhttp3.Credentials
import okhttp3.Response
import okhttp3.Route
@ -26,7 +26,6 @@ import java.net.InetSocketAddress
import java.net.PasswordAuthentication
import java.net.Proxy
@Suppress("DEPRECATION")
class WeworkAgentUtils private constructor() {
companion object {

@ -3,9 +3,9 @@ package com.idormy.sms.forwarder.utils.update
import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.utils.XToastUtils
import com.idormy.sms.forwarder.utils.update.UpdateTipDialog.Companion.show
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xupdate.entity.UpdateError
import com.xuexiang.xupdate.listener.OnUpdateFailureListener
import com.xuexiang.xutil.resource.ResUtils.getString
/**
* 自定义版本更新提示
@ -28,13 +28,13 @@ class CustomUpdateFailureListener @JvmOverloads constructor(
override fun onFailure(error: UpdateError) {
if (mNeedErrorTip) {
if (error.detailMsg.contains("{\"code\":-1,\"msg\":null,\"data\":null}")) {
XToastUtils.success(ResUtils.getString(R.string.no_new_version))
XToastUtils.success(getString(R.string.no_new_version))
} else {
XToastUtils.error(error)
}
}
if (error.code == UpdateError.ERROR.DOWNLOAD_FAILED) {
show(String.format(ResUtils.getString(R.string.download_failed_switch_download_url), UpdateTipDialog.DOWNLOAD_TYPE_NAME))
show(String.format(getString(R.string.download_failed_switch_download_url), UpdateTipDialog.DOWNLOAD_TYPE_NAME))
}
}
}

@ -7,7 +7,6 @@ import android.text.TextUtils
import androidx.appcompat.app.AppCompatActivity
import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.utils.CommonUtils.Companion.goWeb
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.widget.dialog.DialogLoader
import com.xuexiang.xupdate.XUpdate
@ -17,19 +16,18 @@ import com.xuexiang.xupdate.XUpdate
* @author xuexiang
* @since 2019-06-15 00:06
*/
@Suppress("DEPRECATION")
class UpdateTipDialog : AppCompatActivity(), DialogInterface.OnDismissListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
var content = intent.getStringExtra(KEY_CONTENT)
if (TextUtils.isEmpty(content)) {
content = String.format(ResUtils.getString(R.string.download_slow_switch_download_url), DOWNLOAD_TYPE_NAME)
content = String.format(getString(R.string.download_slow_switch_download_url), DOWNLOAD_TYPE_NAME)
}
DialogLoader.getInstance()
.showConfirmDialog(this, content, ResUtils.getString(R.string.yes), { dialog: DialogInterface, _: Int ->
.showConfirmDialog(this, content, getString(R.string.yes), { dialog: DialogInterface, _: Int ->
dialog.dismiss()
goWeb(this@UpdateTipDialog, DOWNLOAD_URL)
}, ResUtils.getString(R.string.no))
}, getString(R.string.no))
.setOnDismissListener(this)
}

@ -7,11 +7,11 @@ import com.xuexiang.xhttp2.XHttpSDK
import com.xuexiang.xhttp2.callback.DownloadProgressCallBack
import com.xuexiang.xhttp2.callback.SimpleCallBack
import com.xuexiang.xhttp2.exception.ApiException
import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xupdate.proxy.IUpdateHttpService
import com.xuexiang.xupdate.proxy.IUpdateHttpService.DownloadCallback
import com.xuexiang.xutil.file.FileUtils
import com.xuexiang.xutil.net.JsonUtil
import com.xuexiang.xutil.resource.ResUtils.getString
/**
* XHttp2实现的请求更新
@ -19,7 +19,6 @@ import com.xuexiang.xutil.net.JsonUtil
* @author xuexiang
* @since 2018/8/12 上午11:46
*/
@Suppress("DEPRECATION")
class XHttpUpdateHttpServiceImpl : IUpdateHttpService {
override fun asyncGet(
url: String,
@ -88,7 +87,7 @@ class XHttpUpdateHttpServiceImpl : IUpdateHttpService {
}
override fun cancelDownload(url: String) {
XToastUtils.info(ResUtils.getString(R.string.update_cancelled))
XToastUtils.info(getString(R.string.update_cancelled))
XHttpSDK.cancelRequest(url)
}
}

@ -32,12 +32,12 @@ import com.idormy.sms.forwarder.utils.TASK_ACTION_SENDSMS
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.xutil.file.FileUtils
import com.xuexiang.xutil.resource.ResUtils.getString
import frpclib.Frpclib
//执行每个task具体动作任务
@Suppress("PrivatePropertyName", "DEPRECATION")
@Suppress("PrivatePropertyName")
class ActionWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {
private val TAG: String = ActionWorker::class.java.simpleName
@ -87,7 +87,7 @@ class ActionWorker(context: Context, params: WorkerParameters) : CoroutineWorker
val mSubscriptionId: Int = App.SimInfoList[simSlotIndex]?.mSubscriptionId ?: -1
if (ActivityCompat.checkSelfPermission(App.context, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
val msg = ResUtils.getString(R.string.no_sms_sending_permission)
val msg = getString(R.string.no_sms_sending_permission)
writeLog(msg, "ERROR")
} else {
val msg = PhoneUtils.sendSms(mSubscriptionId, smsSetting.phoneNumbers, smsSetting.msgContent)

@ -19,7 +19,7 @@ import com.idormy.sms.forwarder.utils.PhoneUtils
import com.idormy.sms.forwarder.utils.TaskWorker
import com.idormy.sms.forwarder.utils.task.ConditionUtils
import com.idormy.sms.forwarder.utils.task.TaskUtils
import com.xuexiang.xutil.resource.ResUtils
import com.xuexiang.xutil.resource.ResUtils.getString
import java.util.Date
@Suppress("PrivatePropertyName", "DEPRECATION")
@ -64,19 +64,19 @@ class SimWorker(context: Context, params: WorkerParameters) : CoroutineWorker(co
}
val msg = StringBuilder()
msg.append(String.format(ResUtils.getString(R.string.sim_state), simStateStr)).append("\n")
msg.append(String.format(getString(R.string.sim_state), simStateStr)).append("\n")
if (TaskUtils.simState == TelephonyManager.SIM_STATE_READY) {
// 获取 SIM 卡信息
App.SimInfoList = PhoneUtils.getSimMultiInfo()
//Log.d(TAG, App.SimInfoList.toString())
App.SimInfoList.forEach {
msg.append("[SIM-").append(it.key + 1).append("]\n")
msg.append(ResUtils.getString(R.string.carrier_name)).append(": ").append(it.value.mCarrierName).append("\n")
msg.append(getString(R.string.carrier_name)).append(": ").append(it.value.mCarrierName).append("\n")
//msg.append(getString(R.string.icc_id)).append(": ").append(it.value.mIccId).append("\n")
msg.append(ResUtils.getString(R.string.sim_slot_index)).append(": ").append(it.value.mSimSlotIndex).append("\n")
msg.append(ResUtils.getString(R.string.number)).append(": ").append(it.value.mNumber).append("\n")
msg.append(ResUtils.getString(R.string.country_iso)).append(": ").append(it.value.mCountryIso).append("\n")
msg.append(ResUtils.getString(R.string.subscription_id)).append(": ").append(it.value.mSubscriptionId).append("\n")
msg.append(getString(R.string.sim_slot_index)).append(": ").append(it.value.mSimSlotIndex).append("\n")
msg.append(getString(R.string.number)).append(": ").append(it.value.mNumber).append("\n")
msg.append(getString(R.string.country_iso)).append(": ").append(it.value.mCountryIso).append("\n")
msg.append(getString(R.string.subscription_id)).append(": ").append(it.value.mSubscriptionId).append("\n")
}
}

@ -436,8 +436,8 @@
<string name="ssl">SSL</string>
<!--CloneActivity-->
<string name="local_ip">Local IP: </string>
<string name="operating_instruction">Instructions: \n[Note] The APP version of the sender and receiver must be the same!\n1. Please keep the SOURCE and DESTINATION phones in the same Wi-Fi network, and do not turn on isolation. \n2. Tap "Send" on SOURCE mobile phone, and get "server IP" \n3. After filling in "Server IP" on DESTINATION phone, tap "Receive". \n [NOTE:] sender(s), forwarding rule(s) and log(s) will be overwritten after cloning!</string> <!-- 原文是“新旧手机”,英文翻译中处理为“源”手机和“目标”手机,因为担心“新旧”的表述引起混淆(有没一种可能就是用户就是用从新手机的设备复制到旧手机上去呢?)。 -->
<string name="operating_instruction_offline">[NOTE:] sender(s), forwarding rule(s) and log(s) will be overwritten after cloning!</string> <!-- 原文是“新旧手机”,英文翻译中处理为“源”手机和“目标”手机,因为担心“新旧”的表述引起混淆(有没一种可能就是用户就是用从新手机的设备复制到旧手机上去呢?)。 -->
<string name="operating_instruction">Important Note:\nThis feature is intended solely for personal use in switching between old and new phones. Any consequences arising from illegal use are the user\'s responsibility!\n\nInstructions:\n1. Connect both old and new phones to the same WiFi network (disable AP isolation). If internal network penetration is needed, configure Frpc first.\n2. [Choose One] On the old phone, tap the "Push" button to send this device\'s configuration to the server.\n3. [Choose One] On the new phone, tap the "Pull" button to fetch the server\'s configuration to this device.\n\nNotes:\n1. The client and server app versions must match for successful cloning.\n2. Upon successful import, the sending channels and forwarding rules will be entirely replaced, clearing the historical records.\n3. Active requests, keep-alive measures, and personal settings are not included in the cloning scope.\n4. After successful import, it\'s crucial to re-enter the [General Settings] and toggle on the functions you need! (Or manually grant permissions in system settings).</string>
<string name="operating_instruction_offline">Important Note:\nThis feature is strictly intended for personal use in switching between old and new phones. Any consequences arising from illegal use are the user\'s responsibility!\n\nNotes:\n1. The exporting and importing apps must have identical versions for one-click cloning to work!\n2. Upon successful import on the new phone, the sending channels and forwarding rules will be entirely replaced, clearing the history records!\n3. Active requests, keep-alive measures, and personal settings are not included in the cloning process.\n4. After a successful import, it\'s crucial to re-enter the [General Settings] and toggle on the functions you need! (Or manually grant permissions in system settings).</string>
<string name="push">Push</string>
<string name="pull">Pull</string>
<string name="stop">Stop</string>
@ -1139,7 +1139,7 @@
<string name="delete_task_tips">Are you sure to delete this task?</string>
<string name="delete_task_toast">The task has deleted.</string>
<string name="add_condition">Add Condition</string>
<string name="add_condition_tips">Example: Below 20% battery</string>
<string name="add_condition_tips" tools:ignore="StringFormatCount">Example: Below 20% battery</string>
<string name="add_condition_continue">Continue to add condition</string>
<string name="add_action">Add Action</string>
<string name="add_action_tips">Example: Disable all forwarding</string>

@ -437,8 +437,8 @@
<string name="ssl">SSL</string>
<!--CloneActivity-->
<string name="local_ip">本机IP</string>
<string name="operating_instruction">严正声明:\n该功能仅限个人新旧手机切换使用用于非法用途后果自负\n\n操作说明\n1.新旧手机连接同一个WiFi网络(禁用AP隔离)如需穿透内网请先配置Frpc\n2.【二选一】旧手机点【推送】按钮,将本机的配置推送到服务端\n3.【二选一】新手机点【拉取】按钮,将拉取服务端的配置到本机\n\n注意事项\n1.客户端与服务端的APP版本必须一致才能克隆!\n2.导入成功后,发送通道、转发规则将完全被覆盖,清空历史记录!\n3.主动请求、保活措施、个性设置不在克隆范围</string>
<string name="operating_instruction_offline">严正声明:\n该功能仅限个人新旧手机切换使用用于非法用途后果自负\n\n注意事项\n1.导出方与导入方的APP版本必须一致才能一键克隆!\n2.新手机导入成功后,发送通道、转发规则将完全被覆盖,清空历史记录!\n3.主动请求、保活措施、个性设置不在克隆范围</string>
<string name="operating_instruction">严正声明:\n该功能仅限个人新旧手机切换使用用于非法用途后果自负\n\n操作说明\n1.新旧手机连接同一个WiFi网络(禁用AP隔离)如需穿透内网请先配置Frpc\n2.【二选一】旧手机点【推送】按钮,将本机的配置推送到服务端\n3.【二选一】新手机点【拉取】按钮,将拉取服务端的配置到本机\n\n注意事项\n1.客户端与服务端的APP版本必须一致才能克隆!\n2.导入成功后,发送通道、转发规则将完全被覆盖,清空历史记录!\n3.主动请求、保活措施、个性设置不在克隆范围\n4.导入成功后,务必再次进入【通用设置】开关一次你需要的功能!(或去系统设置手动授权权限)</string>
<string name="operating_instruction_offline">严正声明:\n该功能仅限个人新旧手机切换使用用于非法用途后果自负\n\n注意事项\n1.导出方与导入方的APP版本必须一致才能一键克隆!\n2.新手机导入成功后,发送通道、转发规则将完全被覆盖,清空历史记录!\n3.主动请求、保活措施、个性设置不在克隆范围\n4.导入成功后,务必再次进入【通用设置】开关一次你需要的功能!(或去系统设置手动授权权限)</string>
<string name="push">推送</string>
<string name="pull">拉取</string>
<string name="stop">停止</string>

@ -437,8 +437,8 @@
<string name="ssl">SSL</string>
<!--CloneActivity-->
<string name="local_ip">本機IP</string>
<string name="operating_instruction">嚴正聲明:\n該功能僅限個人新舊手機切換使用用於非法用途後果自負\n\n操作說明\n1.新舊手機連接同一個WiFi網絡(禁用AP隔離)如需穿透內網請先配置Frpc\n2.【二選一】舊手機點【推送】按鈕,將本機的配置推送到服務端\n3.【二選一】新手機點【拉取】按鈕,將拉取服務端的配置到本機\n\n注意事項\n1.客戶端與服務端的APP版本必須一致才能克隆!\n2.導入成功後,發送通道、轉發規則將完全被覆蓋,清空歷史記錄!\n3.主動請求、保活措施、個性設置不在克隆範圍</string>
<string name="operating_instruction_offline">嚴正聲明:\n該功能僅限個人新舊手機切換使用用於非法用途後果自負\n\n注意事項\n1.導出方與導入方的APP版本必須一致才能一鍵克隆!\n2.新手機導入成功後,發送通道、轉發規則將完全被覆蓋,清空歷史記錄!\n3.主動請求、保活措施、個性設置不在克隆範圍</string>
<string name="operating_instruction">嚴正聲明:\n該功能僅限個人新舊手機切換使用用於非法用途後果自負\n\n操作說明\n1.新舊手機連接同一個WiFi網絡(禁用AP隔離)如需穿透內網請先配置Frpc\n2.【二選一】舊手機點【推送】按鈕,將本機的配置推送到服務端\n3.【二選一】新手機點【拉取】按鈕,將拉取服務端的配置到本機\n\n注意事項\n1.客戶端與服務端的APP版本必須一致才能克隆!\n2.導入成功後,發送通道、轉發規則將完全被覆蓋,清空歷史記錄!\n3.主動請求、保活措施、個性設置不在克隆範圍\n4.導入成功後,務必再次進入【通用設置】開關一次你需要的功能!(或去系統設置手動授權權限)</string>
<string name="operating_instruction_offline">嚴正聲明:\n該功能僅限個人新舊手機切換使用用於非法用途後果自負\n\n注意事項\n1.導出方與導入方的APP版本必須一致才能一鍵克隆!\n2.新手機導入成功後,發送通道、轉發規則將完全被覆蓋,清空歷史記錄!\n3.主動請求、保活措施、個性設置不在克隆範圍\n4.導入成功後,務必再次進入【通用設置】開關一次你需要的功能!(或去系統設置手動授權權限)</string>
<string name="push">推送</string>
<string name="pull">拉取</string>
<string name="stop">停止</string>

@ -437,8 +437,8 @@
<string name="ssl">SSL</string>
<!--CloneActivity-->
<string name="local_ip">本机IP</string>
<string name="operating_instruction">严正声明:\n该功能仅限个人新旧手机切换使用用于非法用途后果自负\n\n操作说明\n1.新旧手机连接同一个WiFi网络(禁用AP隔离)如需穿透内网请先配置Frpc\n2.【二选一】旧手机点【推送】按钮,将本机的配置推送到服务端\n3.【二选一】新手机点【拉取】按钮,将拉取服务端的配置到本机\n\n注意事项\n1.客户端与服务端的APP版本必须一致才能克隆!\n2.导入成功后,发送通道、转发规则将完全被覆盖,清空历史记录!\n3.主动请求、保活措施、个性设置不在克隆范围</string>
<string name="operating_instruction_offline">严正声明:\n该功能仅限个人新旧手机切换使用用于非法用途后果自负\n\n注意事项\n1.导出方与导入方的APP版本必须一致才能一键克隆!\n2.新手机导入成功后,发送通道、转发规则将完全被覆盖,清空历史记录!\n3.主动请求、保活措施、个性设置不在克隆范围</string>
<string name="operating_instruction">严正声明:\n该功能仅限个人新旧手机切换使用用于非法用途后果自负\n\n操作说明\n1.新旧手机连接同一个WiFi网络(禁用AP隔离)如需穿透内网请先配置Frpc\n2.【二选一】旧手机点【推送】按钮,将本机的配置推送到服务端\n3.【二选一】新手机点【拉取】按钮,将拉取服务端的配置到本机\n\n注意事项\n1.客户端与服务端的APP版本必须一致才能克隆!\n2.导入成功后,发送通道、转发规则将完全被覆盖,清空历史记录!\n3.主动请求、保活措施、个性设置不在克隆范围\n4.导入成功后,务必再次进入【通用设置】开关一次你需要的功能!(或去系统设置手动授权权限)</string>
<string name="operating_instruction_offline">严正声明:\n该功能仅限个人新旧手机切换使用用于非法用途后果自负\n\n注意事项\n1.导出方与导入方的APP版本必须一致才能一键克隆!\n2.新手机导入成功后,发送通道、转发规则将完全被覆盖,清空历史记录!\n3.主动请求、保活措施、个性设置不在克隆范围\n4.导入成功后,务必再次进入【通用设置】开关一次你需要的功能!(或去系统设置手动授权权限)</string>
<string name="push">推送</string>
<string name="pull">拉取</string>
<string name="stop">停止</string>
@ -1140,7 +1140,7 @@
<string name="delete_task_tips">删除任务操作确认</string>
<string name="delete_task_toast">删除任务操作确认</string>
<string name="add_condition">添加条件</string>
<string name="add_condition_tips">例如如果电量低于20%时</string>
<string name="add_condition_tips" tools:ignore="StringFormatCount">例如如果电量低于20%时</string>
<string name="add_condition_continue">继续添加条件</string>
<string name="add_action">添加动作</string>
<string name="add_action_tips">例如:禁用所有转发通道</string>

Loading…
Cancel
Save