mirror of
https://github.com/pppscn/SmsForwarder
synced 2025-08-03 01:17:41 +08:00
优化:多语言切换时枚举常量自动切换语言
This commit is contained in:
parent
22474b2295
commit
e4432cb037
@ -18,10 +18,16 @@ import com.gyf.cactus.Cactus
|
|||||||
import com.gyf.cactus.callback.CactusCallback
|
import com.gyf.cactus.callback.CactusCallback
|
||||||
import com.gyf.cactus.ext.cactus
|
import com.gyf.cactus.ext.cactus
|
||||||
import com.hjq.language.MultiLanguages
|
import com.hjq.language.MultiLanguages
|
||||||
|
import com.hjq.language.OnLanguageListener
|
||||||
import com.idormy.sms.forwarder.activity.MainActivity
|
import com.idormy.sms.forwarder.activity.MainActivity
|
||||||
import com.idormy.sms.forwarder.core.Core
|
import com.idormy.sms.forwarder.core.Core
|
||||||
import com.idormy.sms.forwarder.database.AppDatabase
|
import com.idormy.sms.forwarder.database.AppDatabase
|
||||||
import com.idormy.sms.forwarder.database.repository.*
|
import com.idormy.sms.forwarder.database.repository.FrpcRepository
|
||||||
|
import com.idormy.sms.forwarder.database.repository.LogsRepository
|
||||||
|
import com.idormy.sms.forwarder.database.repository.MsgRepository
|
||||||
|
import com.idormy.sms.forwarder.database.repository.RuleRepository
|
||||||
|
import com.idormy.sms.forwarder.database.repository.SenderRepository
|
||||||
|
import com.idormy.sms.forwarder.database.repository.TaskRepository
|
||||||
import com.idormy.sms.forwarder.entity.SimInfo
|
import com.idormy.sms.forwarder.entity.SimInfo
|
||||||
import com.idormy.sms.forwarder.receiver.BatteryReceiver
|
import com.idormy.sms.forwarder.receiver.BatteryReceiver
|
||||||
import com.idormy.sms.forwarder.receiver.CactusReceiver
|
import com.idormy.sms.forwarder.receiver.CactusReceiver
|
||||||
@ -30,7 +36,17 @@ import com.idormy.sms.forwarder.receiver.NetworkChangeReceiver
|
|||||||
import com.idormy.sms.forwarder.service.ForegroundService
|
import com.idormy.sms.forwarder.service.ForegroundService
|
||||||
import com.idormy.sms.forwarder.service.HttpServerService
|
import com.idormy.sms.forwarder.service.HttpServerService
|
||||||
import com.idormy.sms.forwarder.service.LocationService
|
import com.idormy.sms.forwarder.service.LocationService
|
||||||
import com.idormy.sms.forwarder.utils.*
|
import com.idormy.sms.forwarder.utils.AppInfo
|
||||||
|
import com.idormy.sms.forwarder.utils.CactusSave
|
||||||
|
import com.idormy.sms.forwarder.utils.FRONT_CHANNEL_ID
|
||||||
|
import com.idormy.sms.forwarder.utils.FRONT_CHANNEL_NAME
|
||||||
|
import com.idormy.sms.forwarder.utils.FRONT_NOTIFY_ID
|
||||||
|
import com.idormy.sms.forwarder.utils.FRPC_LIB_VERSION
|
||||||
|
import com.idormy.sms.forwarder.utils.HistoryUtils
|
||||||
|
import com.idormy.sms.forwarder.utils.HttpServerUtils
|
||||||
|
import com.idormy.sms.forwarder.utils.Log
|
||||||
|
import com.idormy.sms.forwarder.utils.SettingUtils
|
||||||
|
import com.idormy.sms.forwarder.utils.SharedPreference
|
||||||
import com.idormy.sms.forwarder.utils.sdkinit.UMengInit
|
import com.idormy.sms.forwarder.utils.sdkinit.UMengInit
|
||||||
import com.idormy.sms.forwarder.utils.sdkinit.XBasicLibInit
|
import com.idormy.sms.forwarder.utils.sdkinit.XBasicLibInit
|
||||||
import com.idormy.sms.forwarder.utils.sdkinit.XUpdateInit
|
import com.idormy.sms.forwarder.utils.sdkinit.XUpdateInit
|
||||||
@ -42,13 +58,16 @@ import io.reactivex.Observable
|
|||||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||||
import io.reactivex.disposables.Disposable
|
import io.reactivex.disposables.Disposable
|
||||||
import io.reactivex.schedulers.Schedulers
|
import io.reactivex.schedulers.Schedulers
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.SupervisorJob
|
||||||
import java.io.BufferedWriter
|
import java.io.BufferedWriter
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileWriter
|
import java.io.FileWriter
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.Date
|
||||||
|
import java.util.Locale
|
||||||
|
import java.util.TimeZone
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
@Suppress("DEPRECATION")
|
@Suppress("DEPRECATION")
|
||||||
@ -69,6 +88,15 @@ class App : Application(), CactusCallback, Configuration.Provider by Core {
|
|||||||
@SuppressLint("StaticFieldLeak")
|
@SuppressLint("StaticFieldLeak")
|
||||||
lateinit var context: Context
|
lateinit var context: Context
|
||||||
|
|
||||||
|
//通话类型:1.来电挂机 2.去电挂机 3.未接来电 4.来电提醒 5.来电接通 6.去电拨出
|
||||||
|
var CALL_TYPE_MAP: MutableMap<String, String> = mutableMapOf()
|
||||||
|
var FILED_MAP: MutableMap<String, String> = mutableMapOf()
|
||||||
|
var CHECK_MAP: MutableMap<String, String> = mutableMapOf()
|
||||||
|
var SIM_SLOT_MAP: MutableMap<String, String> = mutableMapOf()
|
||||||
|
var FORWARD_STATUS_MAP: MutableMap<Int, String> = mutableMapOf()
|
||||||
|
var BARK_LEVEL_MAP: MutableMap<String, String> = mutableMapOf()
|
||||||
|
var BARK_ENCRYPTION_ALGORITHM_MAP: MutableMap<String, String> = mutableMapOf()
|
||||||
|
|
||||||
//已插入SIM卡信息
|
//已插入SIM卡信息
|
||||||
var SimInfoList: MutableMap<Int, SimInfo> = mutableMapOf()
|
var SimInfoList: MutableMap<Int, SimInfo> = mutableMapOf()
|
||||||
|
|
||||||
@ -96,6 +124,9 @@ class App : Application(), CactusCallback, Configuration.Provider by Core {
|
|||||||
|
|
||||||
//Frpclib是否已经初始化
|
//Frpclib是否已经初始化
|
||||||
var FrpclibInited = false
|
var FrpclibInited = false
|
||||||
|
|
||||||
|
//是否需要在拼接字符串时添加空格
|
||||||
|
var isNeedSpaceBetweenWords = false
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun attachBaseContext(base: Context) {
|
override fun attachBaseContext(base: Context) {
|
||||||
@ -275,21 +306,24 @@ class App : Application(), CactusCallback, Configuration.Provider by Core {
|
|||||||
// 初始化语种切换框架
|
// 初始化语种切换框架
|
||||||
MultiLanguages.init(this)
|
MultiLanguages.init(this)
|
||||||
// 设置语种变化监听器
|
// 设置语种变化监听器
|
||||||
/*MultiLanguages.setOnLanguageListener(object : OnLanguageListener {
|
MultiLanguages.setOnLanguageListener(object : OnLanguageListener {
|
||||||
override fun onAppLocaleChange(oldLocale: Locale, newLocale: Locale) {
|
override fun onAppLocaleChange(oldLocale: Locale, newLocale: Locale) {
|
||||||
// 注意:只有setAppLanguage时触发,clearAppLanguage时不触发
|
// 注意:只有setAppLanguage时触发,clearAppLanguage时不触发
|
||||||
Log.i(TAG, "监听到应用切换了语种,旧语种:$oldLocale,新语种:$newLocale")
|
Log.i(TAG, "监听到应用切换了语种,旧语种:$oldLocale,新语种:$newLocale")
|
||||||
|
switchLanguage(newLocale)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onSystemLocaleChange(oldLocale: Locale, newLocale: Locale) {
|
override fun onSystemLocaleChange(oldLocale: Locale, newLocale: Locale) {
|
||||||
//val isFlowSystem = MultiLanguages.isSystemLanguage(context) //取值不对,一直是false
|
Log.i(TAG, "监听到系统切换了语种,旧语种:$oldLocale,新语种:$newLocale")
|
||||||
val isFlowSystem = SettingUtils.isFlowSystemLanguage
|
switchLanguage(newLocale)
|
||||||
|
/*val isFlowSystem = SettingUtils.isFlowSystemLanguage //MultiLanguages.isSystemLanguage(context)取值不对,一直是false
|
||||||
Log.i(TAG, "监听到系统切换了语种,旧语种:$oldLocale,新语种:$newLocale,是否跟随系统:$isFlowSystem")
|
Log.i(TAG, "监听到系统切换了语种,旧语种:$oldLocale,新语种:$newLocale,是否跟随系统:$isFlowSystem")
|
||||||
if (isFlowSystem) {
|
if (isFlowSystem) {
|
||||||
CommonUtils.switchLanguage(oldLocale, newLocale)
|
CommonUtils.switchLanguage(oldLocale, newLocale)
|
||||||
|
}*/
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
})*/
|
switchLanguage(MultiLanguages.getAppLanguage(this))
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("CheckResult")
|
@SuppressLint("CheckResult")
|
||||||
@ -327,4 +361,89 @@ class App : Application(), CactusCallback, Configuration.Provider by Core {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//多语言切换时枚举常量自动切换语言
|
||||||
|
private fun switchLanguage(newLocale: Locale) {
|
||||||
|
isNeedSpaceBetweenWords = !newLocale.language.contains("zh")
|
||||||
|
|
||||||
|
CALL_TYPE_MAP.clear()
|
||||||
|
CALL_TYPE_MAP.putAll(
|
||||||
|
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),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
FILED_MAP.clear()
|
||||||
|
FILED_MAP.putAll(
|
||||||
|
mapOf(
|
||||||
|
"transpond_all" to getString(R.string.rule_transpond_all),
|
||||||
|
"phone_num" to getString(R.string.rule_phone_num),
|
||||||
|
"msg_content" to getString(R.string.rule_msg_content),
|
||||||
|
"multi_match" to getString(R.string.rule_multi_match),
|
||||||
|
"package_name" to getString(R.string.rule_package_name),
|
||||||
|
"inform_content" to getString(R.string.rule_inform_content),
|
||||||
|
"call_type" to getString(R.string.rule_call_type),
|
||||||
|
"uid" to getString(R.string.rule_uid),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
CHECK_MAP.clear()
|
||||||
|
CHECK_MAP.putAll(
|
||||||
|
mapOf(
|
||||||
|
"is" to getString(R.string.rule_is),
|
||||||
|
"notis" to getString(R.string.rule_notis),
|
||||||
|
"contain" to getString(R.string.rule_contain),
|
||||||
|
"startwith" to getString(R.string.rule_startwith),
|
||||||
|
"endwith" to getString(R.string.rule_endwith),
|
||||||
|
"notcontain" to getString(R.string.rule_notcontain),
|
||||||
|
"regex" to getString(R.string.rule_regex),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
SIM_SLOT_MAP.clear()
|
||||||
|
SIM_SLOT_MAP.putAll(
|
||||||
|
mapOf(
|
||||||
|
"ALL" to getString(R.string.rule_any),
|
||||||
|
"SIM1" to "SIM1",
|
||||||
|
"SIM2" to "SIM2",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
FORWARD_STATUS_MAP.clear()
|
||||||
|
FORWARD_STATUS_MAP.putAll(
|
||||||
|
mapOf(
|
||||||
|
0 to getString(R.string.failed),
|
||||||
|
1 to getString(R.string.processing),
|
||||||
|
2 to getString(R.string.success),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
BARK_LEVEL_MAP.clear()
|
||||||
|
BARK_LEVEL_MAP.putAll(
|
||||||
|
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)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
BARK_ENCRYPTION_ALGORITHM_MAP.clear()
|
||||||
|
BARK_ENCRYPTION_ALGORITHM_MAP.putAll(
|
||||||
|
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",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -29,7 +29,7 @@ class RulePagingAdapter(private val itemClickListener: OnItemClickListener) : Pa
|
|||||||
if (item != null) {
|
if (item != null) {
|
||||||
holder.binding.ivRuleImage.setImageResource(item.imageId)
|
holder.binding.ivRuleImage.setImageResource(item.imageId)
|
||||||
holder.binding.ivRuleStatus.setImageResource(item.statusImageId)
|
holder.binding.ivRuleStatus.setImageResource(item.statusImageId)
|
||||||
holder.binding.tvRuleMatch.text = item.ruleMatch
|
holder.binding.tvRuleMatch.text = item.getName(false)
|
||||||
|
|
||||||
holder.binding.layoutSenders.removeAllViews()
|
holder.binding.layoutSenders.removeAllViews()
|
||||||
for (sender in item.senderList) {
|
for (sender in item.senderList) {
|
||||||
|
@ -78,7 +78,7 @@ class RuleRecyclerAdapter(
|
|||||||
}
|
}
|
||||||
image.setImageResource(icon)
|
image.setImageResource(icon)
|
||||||
status.setImageResource(rule.statusImageId)
|
status.setImageResource(rule.statusImageId)
|
||||||
title.text = rule.name
|
title.text = rule.getName()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onClick(v: View?) {
|
override fun onClick(v: View?) {
|
||||||
|
@ -2,6 +2,11 @@ package com.idormy.sms.forwarder.database.entity
|
|||||||
|
|
||||||
import android.os.Parcelable
|
import android.os.Parcelable
|
||||||
import androidx.room.*
|
import androidx.room.*
|
||||||
|
import com.idormy.sms.forwarder.App
|
||||||
|
import com.idormy.sms.forwarder.App.Companion.CALL_TYPE_MAP
|
||||||
|
import com.idormy.sms.forwarder.App.Companion.CHECK_MAP
|
||||||
|
import com.idormy.sms.forwarder.App.Companion.FILED_MAP
|
||||||
|
import com.idormy.sms.forwarder.App.Companion.SIM_SLOT_MAP
|
||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.database.ext.ConvertersSenderList
|
import com.idormy.sms.forwarder.database.ext.ConvertersSenderList
|
||||||
import com.idormy.sms.forwarder.entity.MsgInfo
|
import com.idormy.sms.forwarder.entity.MsgInfo
|
||||||
@ -54,113 +59,77 @@ data class Rule(
|
|||||||
companion object {
|
companion object {
|
||||||
val TAG: String = Rule::class.java.simpleName
|
val TAG: String = Rule::class.java.simpleName
|
||||||
|
|
||||||
//通话类型:1.来电挂机 2.去电挂机 3.未接来电 4.来电提醒 5.来电接通 6.去电拨出
|
fun getRuleMatch(filed: String?, check: String?, value: String?, simSlot: String?, senderList: List<Sender>? = null): String {
|
||||||
val CALL_TYPE_MAP = mapOf(
|
val blank = if (App.isNeedSpaceBetweenWords) " " else ""
|
||||||
//"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_any))
|
|
||||||
put("SIM1", "SIM1")
|
|
||||||
put("SIM2", "SIM2")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getRuleMatch(filed: String?, check: String?, value: String?, simSlot: String?): Any {
|
|
||||||
val sb = StringBuilder()
|
val sb = StringBuilder()
|
||||||
sb.append(SIM_SLOT_MAP[simSlot]).append(getString(R.string.rule_card))
|
sb.append(SIM_SLOT_MAP[simSlot]).append(blank).append(getString(R.string.rule_card)).append(blank)
|
||||||
when (filed) {
|
when (filed) {
|
||||||
null, FILED_TRANSPOND_ALL -> {
|
null, FILED_TRANSPOND_ALL -> sb.append(getString(R.string.rule_all_fw_to))
|
||||||
sb.append(getString(R.string.rule_all_fw_to))
|
FILED_CALL_TYPE -> sb.append(getString(R.string.rule_when))
|
||||||
}
|
.append(blank)
|
||||||
|
.append(FILED_MAP[filed])
|
||||||
|
.append(blank)
|
||||||
|
.append(CHECK_MAP[check])
|
||||||
|
.append(blank)
|
||||||
|
.append(CALL_TYPE_MAP[value])
|
||||||
|
.append(blank)
|
||||||
|
.append(getString(R.string.rule_fw_to))
|
||||||
|
|
||||||
FILED_CALL_TYPE -> {
|
else -> sb.append(getString(R.string.rule_when))
|
||||||
sb.append(getString(R.string.rule_when)).append(FILED_MAP[filed]).append(CHECK_MAP[check]).append(CALL_TYPE_MAP[value]).append(getString(R.string.rule_fw_to))
|
.append(blank)
|
||||||
}
|
.append(FILED_MAP[filed])
|
||||||
|
.append(blank)
|
||||||
else -> {
|
.append(CHECK_MAP[check])
|
||||||
sb.append(getString(R.string.rule_when)).append(FILED_MAP[filed]).append(CHECK_MAP[check]).append(value).append(getString(R.string.rule_fw_to))
|
.append(blank)
|
||||||
|
.append(value)
|
||||||
|
.append(blank)
|
||||||
|
.append(getString(R.string.rule_fw_to))
|
||||||
}
|
}
|
||||||
|
if (!senderList.isNullOrEmpty()) {
|
||||||
|
sb.append(blank).append(senderList.joinToString(",") { it.name })
|
||||||
}
|
}
|
||||||
return sb.toString()
|
return sb.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val name: String
|
|
||||||
get() {
|
|
||||||
val sb = StringBuilder()
|
|
||||||
if (type == "call" || type == "sms") sb.append(SIM_SLOT_MAP[simSlot].toString()).append(getString(R.string.rule_card))
|
|
||||||
when (filed) {
|
|
||||||
FILED_TRANSPOND_ALL -> sb.append(getString(R.string.rule_all_fw_to))
|
|
||||||
FILED_CALL_TYPE -> sb.append(getString(R.string.rule_when) + FILED_MAP[filed] + CHECK_MAP[check] + CALL_TYPE_MAP[value] + getString(R.string.rule_fw_to))
|
|
||||||
else -> sb.append(getString(R.string.rule_when) + FILED_MAP[filed] + CHECK_MAP[check] + value + getString(R.string.rule_fw_to))
|
|
||||||
}
|
|
||||||
sb.append(senderList.joinToString(",") { it.name })
|
|
||||||
return sb.toString()
|
|
||||||
}
|
|
||||||
|
|
||||||
val description: String
|
val description: String
|
||||||
get() {
|
get() {
|
||||||
val card = SIM_SLOT_MAP[simSlot].toString() + getString(R.string.rule_card)
|
val blank = if (App.isNeedSpaceBetweenWords) " " else ""
|
||||||
|
val card = SIM_SLOT_MAP[simSlot].toString() + blank + getString(R.string.rule_card) + blank
|
||||||
val sb = StringBuilder()
|
val sb = StringBuilder()
|
||||||
when (type) {
|
when (type) {
|
||||||
"app" -> sb.append(getString(R.string.task_app_when))
|
"app" -> sb.append(getString(R.string.task_app_when))
|
||||||
"call" -> sb.append(String.format(getString(R.string.task_call_when), card))
|
"call" -> sb.append(String.format(getString(R.string.task_call_when), card))
|
||||||
"sms" -> sb.append(String.format(getString(R.string.task_sms_when), card))
|
"sms" -> sb.append(String.format(getString(R.string.task_sms_when), card))
|
||||||
}
|
}
|
||||||
|
sb.append(blank)
|
||||||
when (filed) {
|
when (filed) {
|
||||||
FILED_TRANSPOND_ALL -> sb.append("")
|
FILED_TRANSPOND_ALL -> sb.append("")
|
||||||
FILED_CALL_TYPE -> sb.append(getString(R.string.rule_when) + FILED_MAP[filed] + CHECK_MAP[check] + CALL_TYPE_MAP[value])
|
FILED_CALL_TYPE -> sb.append(getString(R.string.rule_when))
|
||||||
else -> sb.append(getString(R.string.rule_when) + FILED_MAP[filed] + CHECK_MAP[check] + value)
|
.append(blank)
|
||||||
|
.append(FILED_MAP[filed])
|
||||||
|
.append(blank)
|
||||||
|
.append(CHECK_MAP[check])
|
||||||
|
.append(blank)
|
||||||
|
.append(CALL_TYPE_MAP[value])
|
||||||
|
|
||||||
|
else -> sb.append(getString(R.string.rule_when))
|
||||||
|
.append(blank)
|
||||||
|
.append(FILED_MAP[filed])
|
||||||
|
.append(blank)
|
||||||
|
.append(CHECK_MAP[check])
|
||||||
|
.append(blank)
|
||||||
|
.append(value)
|
||||||
}
|
}
|
||||||
return sb.toString()
|
return sb.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
val ruleMatch: String
|
fun getName(appendSenderList: Boolean = true): String {
|
||||||
get() {
|
return if (appendSenderList) {
|
||||||
val simStr = if ("app" == type) "" else SIM_SLOT_MAP[simSlot].toString() + getString(R.string.rule_card)
|
getRuleMatch(filed, check, value, simSlot, senderList)
|
||||||
return when (filed) {
|
} else {
|
||||||
FILED_TRANSPOND_ALL -> {
|
getRuleMatch(filed, check, value, simSlot, null)
|
||||||
simStr + getString(R.string.rule_all_fw_to)
|
|
||||||
}
|
|
||||||
|
|
||||||
FILED_CALL_TYPE -> {
|
|
||||||
simStr + getString(R.string.rule_when) + FILED_MAP[filed] + CHECK_MAP[check] + CALL_TYPE_MAP[value] + getString(R.string.rule_fw_to)
|
|
||||||
}
|
|
||||||
|
|
||||||
else -> {
|
|
||||||
simStr + getString(R.string.rule_when) + FILED_MAP[filed] + CHECK_MAP[check] + value + getString(R.string.rule_fw_to)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ import android.annotation.SuppressLint
|
|||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import com.idormy.sms.forwarder.App
|
import com.idormy.sms.forwarder.App
|
||||||
|
import com.idormy.sms.forwarder.App.Companion.CALL_TYPE_MAP
|
||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.utils.AppUtils
|
import com.idormy.sms.forwarder.utils.AppUtils
|
||||||
import com.idormy.sms.forwarder.utils.BatteryUtils
|
import com.idormy.sms.forwarder.utils.BatteryUtils
|
||||||
@ -32,17 +33,6 @@ data class MsgInfo(
|
|||||||
var uid: Int = 0, //APP通知的UID
|
var uid: Int = 0, //APP通知的UID
|
||||||
) : Serializable {
|
) : Serializable {
|
||||||
|
|
||||||
//通话类型: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),
|
|
||||||
)
|
|
||||||
|
|
||||||
val titleForSend = getTitleForSend()
|
val titleForSend = getTitleForSend()
|
||||||
|
|
||||||
val smsVoForSend = getContentForSend()
|
val smsVoForSend = getContentForSend()
|
||||||
@ -105,7 +95,7 @@ data class MsgInfo(
|
|||||||
.replaceTag(getString(R.string.tag_current_time), SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date()), needJson)
|
.replaceTag(getString(R.string.tag_current_time), SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date()), needJson)
|
||||||
.replaceTag(getString(R.string.tag_device_name), extraDeviceMark.trim(), needJson)
|
.replaceTag(getString(R.string.tag_device_name), extraDeviceMark.trim(), needJson)
|
||||||
.replaceTag(getString(R.string.tag_app_version), AppUtils.getAppVersionName(), needJson)
|
.replaceTag(getString(R.string.tag_app_version), AppUtils.getAppVersionName(), needJson)
|
||||||
.replaceTag(getString(R.string.tag_call_type), callTypeMap[callType.toString()] ?: getString(R.string.unknown_call), needJson)
|
.replaceTag(getString(R.string.tag_call_type), CALL_TYPE_MAP[callType.toString()] ?: getString(R.string.unknown_call), needJson)
|
||||||
.replaceTag(getString(R.string.tag_ipv4), TaskUtils.ipv4, needJson)
|
.replaceTag(getString(R.string.tag_ipv4), TaskUtils.ipv4, needJson)
|
||||||
.replaceTag(getString(R.string.tag_ipv6), TaskUtils.ipv6, needJson)
|
.replaceTag(getString(R.string.tag_ipv6), TaskUtils.ipv6, needJson)
|
||||||
.replaceTag(getString(R.string.tag_battery_pct), "%.2f".format(TaskUtils.batteryPct), needJson)
|
.replaceTag(getString(R.string.tag_battery_pct), "%.2f".format(TaskUtils.batteryPct), needJson)
|
||||||
|
@ -9,6 +9,7 @@ import androidx.fragment.app.viewModels
|
|||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.recyclerview.widget.RecyclerView.RecycledViewPool
|
import androidx.recyclerview.widget.RecyclerView.RecycledViewPool
|
||||||
import com.alibaba.android.vlayout.VirtualLayoutManager
|
import com.alibaba.android.vlayout.VirtualLayoutManager
|
||||||
|
import com.idormy.sms.forwarder.App.Companion.FORWARD_STATUS_MAP
|
||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.activity.MainActivity
|
import com.idormy.sms.forwarder.activity.MainActivity
|
||||||
import com.idormy.sms.forwarder.adapter.MsgPagingAdapter
|
import com.idormy.sms.forwarder.adapter.MsgPagingAdapter
|
||||||
@ -39,7 +40,7 @@ import io.reactivex.schedulers.Schedulers
|
|||||||
import kotlinx.coroutines.flow.collectLatest
|
import kotlinx.coroutines.flow.collectLatest
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.Locale
|
||||||
|
|
||||||
@Suppress("PrivatePropertyName")
|
@Suppress("PrivatePropertyName")
|
||||||
@Page(name = "转发日志")
|
@Page(name = "转发日志")
|
||||||
@ -50,13 +51,6 @@ class LogsFragment : BaseFragment<FragmentLogsBinding?>(), MsgPagingAdapter.OnIt
|
|||||||
private var adapter = MsgPagingAdapter(this)
|
private var adapter = MsgPagingAdapter(this)
|
||||||
private val viewModel by viewModels<MsgViewModel> { BaseViewModelFactory(context) }
|
private val viewModel by viewModels<MsgViewModel> { BaseViewModelFactory(context) }
|
||||||
private var currentType: String = "sms"
|
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(
|
override fun viewBindingInflate(
|
||||||
inflater: LayoutInflater,
|
inflater: LayoutInflater,
|
||||||
|
@ -17,6 +17,7 @@ import androidx.recyclerview.widget.RecyclerView
|
|||||||
import androidx.work.OneTimeWorkRequestBuilder
|
import androidx.work.OneTimeWorkRequestBuilder
|
||||||
import androidx.work.WorkManager
|
import androidx.work.WorkManager
|
||||||
import com.idormy.sms.forwarder.App
|
import com.idormy.sms.forwarder.App
|
||||||
|
import com.idormy.sms.forwarder.App.Companion.CALL_TYPE_MAP
|
||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.adapter.SenderRecyclerAdapter
|
import com.idormy.sms.forwarder.adapter.SenderRecyclerAdapter
|
||||||
import com.idormy.sms.forwarder.adapter.base.ItemMoveCallback
|
import com.idormy.sms.forwarder.adapter.base.ItemMoveCallback
|
||||||
@ -96,17 +97,6 @@ class RulesEditFragment : BaseFragment<FragmentRulesEditBinding?>(), View.OnClic
|
|||||||
private var titleBar: TitleBar? = null
|
private var titleBar: TitleBar? = null
|
||||||
private val viewModel by viewModels<RuleViewModel> { BaseViewModelFactory(context) }
|
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 callType = 1
|
||||||
private var callTypeIndex = 0
|
private var callTypeIndex = 0
|
||||||
|
|
||||||
|
@ -1065,7 +1065,7 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
|||||||
when (checkedId) {
|
when (checkedId) {
|
||||||
R.id.rb_main_language_auto -> {
|
R.id.rb_main_language_auto -> {
|
||||||
// 只为了触发onAppLocaleChange
|
// 只为了触发onAppLocaleChange
|
||||||
// MultiLanguages.setAppLanguage(context, newLang)
|
MultiLanguages.setAppLanguage(context, newLang)
|
||||||
// SettingUtils.isFlowSystemLanguage = true
|
// SettingUtils.isFlowSystemLanguage = true
|
||||||
// 跟随系统
|
// 跟随系统
|
||||||
MultiLanguages.clearAppLanguage(context)
|
MultiLanguages.clearAppLanguage(context)
|
||||||
|
@ -256,7 +256,8 @@ class RuleFragment : BaseFragment<FragmentTasksActionRuleBinding?>(), View.OnCli
|
|||||||
ruleSpinnerList.clear()
|
ruleSpinnerList.clear()
|
||||||
ruleListAll = ruleList as MutableList<Rule>
|
ruleListAll = ruleList as MutableList<Rule>
|
||||||
for (rule in ruleList) {
|
for (rule in ruleList) {
|
||||||
val name = if (rule.name.length > 20) rule.name.substring(0, 19) else rule.name
|
var name = rule.getName()
|
||||||
|
if (name.length > 20) name = name.substring(0, 19)
|
||||||
val icon = when (rule.type) {
|
val icon = when (rule.type) {
|
||||||
"sms" -> R.drawable.auto_task_icon_sms
|
"sms" -> R.drawable.auto_task_icon_sms
|
||||||
"call" -> R.drawable.auto_task_icon_incall
|
"call" -> R.drawable.auto_task_icon_incall
|
||||||
|
@ -13,6 +13,7 @@ import androidx.work.OneTimeWorkRequestBuilder
|
|||||||
import androidx.work.WorkManager
|
import androidx.work.WorkManager
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import com.idormy.sms.forwarder.App
|
import com.idormy.sms.forwarder.App
|
||||||
|
import com.idormy.sms.forwarder.App.Companion.CALL_TYPE_MAP
|
||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.adapter.spinner.AppListAdapterItem
|
import com.idormy.sms.forwarder.adapter.spinner.AppListAdapterItem
|
||||||
import com.idormy.sms.forwarder.adapter.spinner.AppListSpinnerAdapter
|
import com.idormy.sms.forwarder.adapter.spinner.AppListSpinnerAdapter
|
||||||
@ -73,17 +74,6 @@ class MsgFragment : BaseFragment<FragmentTasksConditionMsgBinding?>(), View.OnCl
|
|||||||
private val TAG: String = MsgFragment::class.java.simpleName
|
private val TAG: String = MsgFragment::class.java.simpleName
|
||||||
private var titleBar: TitleBar? = null
|
private var titleBar: TitleBar? = null
|
||||||
|
|
||||||
//通话类型: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 callType = 1
|
||||||
private var callTypeIndex = 0
|
private var callTypeIndex = 0
|
||||||
private var resultCode: Int = TASK_CONDITION_SMS
|
private var resultCode: Int = TASK_CONDITION_SMS
|
||||||
|
@ -7,6 +7,8 @@ import android.view.ViewGroup
|
|||||||
import android.widget.EditText
|
import android.widget.EditText
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
|
import com.idormy.sms.forwarder.App.Companion.BARK_ENCRYPTION_ALGORITHM_MAP
|
||||||
|
import com.idormy.sms.forwarder.App.Companion.BARK_LEVEL_MAP
|
||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.core.BaseFragment
|
import com.idormy.sms.forwarder.core.BaseFragment
|
||||||
import com.idormy.sms.forwarder.core.Core
|
import com.idormy.sms.forwarder.core.Core
|
||||||
@ -53,20 +55,6 @@ class BarkFragment : BaseFragment<FragmentSendersBarkBinding?>(), View.OnClickLi
|
|||||||
private var mCountDownHelper: CountDownButtonHelper? = null
|
private var mCountDownHelper: CountDownButtonHelper? = null
|
||||||
private var barkLevel: String = "active" //通知级别
|
private var barkLevel: String = "active" //通知级别
|
||||||
private var transformation: String = "none" //加密算法
|
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
|
@JvmField
|
||||||
@AutoWired(name = KEY_SENDER_ID)
|
@AutoWired(name = KEY_SENDER_ID)
|
||||||
|
@ -5,6 +5,7 @@ import androidx.work.OneTimeWorkRequestBuilder
|
|||||||
import androidx.work.WorkManager
|
import androidx.work.WorkManager
|
||||||
import androidx.work.workDataOf
|
import androidx.work.workDataOf
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
|
import com.idormy.sms.forwarder.App.Companion.CALL_TYPE_MAP
|
||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.entity.CallInfo
|
import com.idormy.sms.forwarder.entity.CallInfo
|
||||||
import com.idormy.sms.forwarder.entity.MsgInfo
|
import com.idormy.sms.forwarder.entity.MsgInfo
|
||||||
@ -22,17 +23,6 @@ open class CallReceiver : PhoneStateReceiver() {
|
|||||||
companion object {
|
companion object {
|
||||||
private val TAG = CallReceiver::class.java.simpleName
|
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_IN = "android.intent.action.PHONE_STATE"
|
||||||
const val ACTION_OUT = "android.intent.action.NEW_OUTGOING_CALL"
|
const val ACTION_OUT = "android.intent.action.NEW_OUTGOING_CALL"
|
||||||
const val EXTRA_PHONE_NUMBER = "android.intent.extra.PHONE_NUMBER"
|
const val EXTRA_PHONE_NUMBER = "android.intent.extra.PHONE_NUMBER"
|
||||||
|
@ -146,7 +146,7 @@ class ActionWorker(context: Context, params: WorkerParameters) : CoroutineWorker
|
|||||||
SendUtils.sendMsgSender(msgInfo, ruleSetting, 0, -1L, -1L)
|
SendUtils.sendMsgSender(msgInfo, ruleSetting, 0, -1L, -1L)
|
||||||
|
|
||||||
successNum++
|
successNum++
|
||||||
writeLog(String.format(getString(R.string.successful_execution), ruleSetting.name), "SUCCESS")
|
writeLog(String.format(getString(R.string.successful_execution), ruleSetting.getName()), "SUCCESS")
|
||||||
}
|
}
|
||||||
|
|
||||||
TASK_ACTION_CLEANER -> {
|
TASK_ACTION_CLEANER -> {
|
||||||
|
@ -640,8 +640,8 @@
|
|||||||
<string name="rule_sms">SMS</string>
|
<string name="rule_sms">SMS</string>
|
||||||
<string name="rule_call">CALL</string>
|
<string name="rule_call">CALL</string>
|
||||||
<string name="rule_app">APP</string>
|
<string name="rule_app">APP</string>
|
||||||
<string name="rule_all">ALL</string>
|
<string name="rule_all">All</string>
|
||||||
<string name="rule_any">ANY</string>
|
<string name="rule_any">Any</string>
|
||||||
<string name="rule_transpond_all">Transpond All</string>
|
<string name="rule_transpond_all">Transpond All</string>
|
||||||
<string name="rule_phone_num">Phone Num</string>
|
<string name="rule_phone_num">Phone Num</string>
|
||||||
<string name="rule_msg_content">Msg Content</string>
|
<string name="rule_msg_content">Msg Content</string>
|
||||||
@ -1201,11 +1201,11 @@
|
|||||||
<string name="task_sms_tips">Triggered upon receiving SMS broadcast</string>
|
<string name="task_sms_tips">Triggered upon receiving SMS broadcast</string>
|
||||||
<string name="task_sms_when">received SMS broadcast from %s</string>
|
<string name="task_sms_when">received SMS broadcast from %s</string>
|
||||||
<string name="task_call">Call</string>
|
<string name="task_call">Call</string>
|
||||||
<string name="task_call_tips">Triggered upon receiving call broadcast</string>
|
<string name="task_call_tips">Triggered upon receiving CALL broadcast</string>
|
||||||
<string name="task_call_when">received call broadcast from %s</string>
|
<string name="task_call_when">received CALL broadcast from %s</string>
|
||||||
<string name="task_app">Notification</string>
|
<string name="task_app">Notification</string>
|
||||||
<string name="task_app_tips">Triggered upon receiving app notification</string>
|
<string name="task_app_tips">Triggered upon receiving APP notification</string>
|
||||||
<string name="task_app_when">received app notification</string>
|
<string name="task_app_when">received APP notification</string>
|
||||||
<string name="task_bluetooth">Bluetooth Device</string>
|
<string name="task_bluetooth">Bluetooth Device</string>
|
||||||
<string name="task_bluetooth_tips">Triggered upon changes in Bluetooth status</string>
|
<string name="task_bluetooth_tips">Triggered upon changes in Bluetooth status</string>
|
||||||
<string name="task_sendsms">Send Sms</string>
|
<string name="task_sendsms">Send Sms</string>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user