mirror of
https://github.com/pppscn/SmsForwarder
synced 2025-08-03 01:17:41 +08:00
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…
x
Reference in New Issue
Block a user