From 437716cd4e181c62eb3b616316543e4819bd7779 Mon Sep 17 00:00:00 2001
From: pppscn <35696959@qq.com>
Date: Thu, 14 Dec 2023 15:55:56 +0800
Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E8=87=AA=E5=8A=A8?=
=?UTF-8?q?=E4=BB=BB=E5=8A=A1=C2=B7=E5=BF=AB=E6=8D=B7=E6=8C=87=E4=BB=A4=20?=
=?UTF-8?q?=E2=80=94=E2=80=94=20SIM=E5=8D=A1=E6=A7=BD=E7=8A=B6=E6=80=81?=
=?UTF-8?q?=E6=94=B9=E5=8F=98=EF=BC=88=E5=BA=9F=E5=BC=83=EF=BC=9A`66666666?=
=?UTF-8?q?`=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/src/main/AndroidManifest.xml | 1 -
.../forwarder/fragment/SettingsFragment.kt | 22 +--
.../forwarder/receiver/SimStateReceiver.kt | 136 ++++++------------
.../sms/forwarder/utils/BatteryUtils.kt | 3 +-
.../idormy/sms/forwarder/utils/Constants.kt | 5 +-
.../sms/forwarder/utils/SettingUtils.kt | 3 -
.../sms/forwarder/utils/task/TaskUtils.kt | 4 +
.../idormy/sms/forwarder/workers/SimWorker.kt | 93 ++++++++++++
app/src/main/res/layout/fragment_settings.xml | 34 -----
app/src/main/res/values-en/strings.xml | 1 -
app/src/main/res/values/strings.xml | 1 -
11 files changed, 145 insertions(+), 158 deletions(-)
create mode 100644 app/src/main/java/com/idormy/sms/forwarder/workers/SimWorker.kt
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f4ccc22c..34e9ebac 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -297,7 +297,6 @@
android:enabled="true"
android:exported="true">
-
diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/SettingsFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/SettingsFragment.kt
index 250c4465..fd104096 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/fragment/SettingsFragment.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/SettingsFragment.kt
@@ -143,8 +143,7 @@ class SettingsFragment : BaseFragment(), View.OnClickL
editAddExtraSim1(binding!!.etExtraSim1)
//SIM2备注
editAddExtraSim2(binding!!.etExtraSim2)
- //SIM卡槽状态监控
- switchSimStateReceiver(binding!!.sbSimStateReceiver)
+
//通知内容
editNotifyContent(binding!!.etNotifyContent)
@@ -800,25 +799,6 @@ class SettingsFragment : BaseFragment(), View.OnClickL
})
}
- //SIM卡槽状态监控
- @SuppressLint("UseSwitchCompatOrMaterialCode")
- fun switchSimStateReceiver(sbSimStateReceiver: SwitchButton) {
- sbSimStateReceiver.isChecked = SettingUtils.enableSimStateReceiver
- sbSimStateReceiver.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
- App.SimInfoList = PhoneUtils.getSimMultiInfo()
- if (isChecked && App.SimInfoList.isEmpty()) {
- XToastUtils.error(R.string.tip_can_not_get_sim_infos)
- XXPermissions.startPermissionActivity(
- requireContext(), "android.permission.READ_PHONE_STATE"
- )
- SettingUtils.enableSimStateReceiver = false
- sbSimStateReceiver.isChecked = false
- return@setOnCheckedChangeListener
- }
- SettingUtils.enableSimStateReceiver = isChecked
- }
- }
-
//设置通知内容
private fun editNotifyContent(etNotifyContent: EditText) {
etNotifyContent.setText(SettingUtils.notifyContent)
diff --git a/app/src/main/java/com/idormy/sms/forwarder/receiver/SimStateReceiver.kt b/app/src/main/java/com/idormy/sms/forwarder/receiver/SimStateReceiver.kt
index 8de3d445..b9e97e7d 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/receiver/SimStateReceiver.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/receiver/SimStateReceiver.kt
@@ -8,120 +8,70 @@ import android.util.Log
import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager
import androidx.work.workDataOf
-import com.google.gson.Gson
-import com.idormy.sms.forwarder.App
import com.idormy.sms.forwarder.R
-import com.idormy.sms.forwarder.entity.MsgInfo
-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.idormy.sms.forwarder.utils.TASK_CONDITION_SIM
+import com.idormy.sms.forwarder.utils.TaskWorker
+import com.idormy.sms.forwarder.utils.task.TaskUtils
+import com.idormy.sms.forwarder.workers.SimWorker
import com.xuexiang.xutil.resource.ResUtils.getString
-import java.util.Date
+import java.util.concurrent.TimeUnit
-@Suppress("PrivatePropertyName", "UNUSED_PARAMETER")
+@Suppress("PrivatePropertyName")
class SimStateReceiver : BroadcastReceiver() {
private var TAG = SimStateReceiver::class.java.simpleName
override fun onReceive(context: Context, intent: Intent) {
+
//纯客户端模式
if (SettingUtils.enablePureClientMode) return
- //SIM卡槽状态监控开关
- if (!SettingUtils.enableSimStateReceiver) return
+ if (intent.action != "android.intent.action.SIM_STATE_CHANGED") return
- val action = intent.action
- if (action == Intent.ACTION_BOOT_COMPLETED) {
- // 在这里处理开机启动时的逻辑
- // 例如:注册监听 SIM 变化
- registerSimStateListener(context)
- } else if (action == "android.intent.action.SIM_STATE_CHANGED") {
- // 处理 SIM 卡状态变化的逻辑
- val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
+ // 处理 SIM 卡状态变化的逻辑
+ val simStateOld = TaskUtils.simState
+ val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
- // 获取当前 SIM 卡状态
- when (telephonyManager.simState) {
- TelephonyManager.SIM_STATE_ABSENT -> {
- Log.d(TAG, "SIM 卡被移除")
- // 处理 SIM 卡被移除的情况
- }
+ // 获取当前 SIM 卡状态
+ val simStateNew = telephonyManager.simState
- TelephonyManager.SIM_STATE_READY -> {
- Log.d(TAG, "SIM 卡已准备就绪,延迟2秒再获取信息")
- Thread.sleep(2000)
+ // SIM 卡状态未发生变化,避免重复执行
+ if (simStateOld == simStateNew) return
- // 获取 SIM 卡信息
- App.SimInfoList = PhoneUtils.getSimMultiInfo()
- Log.d(TAG, App.SimInfoList.toString())
-
- val msg = StringBuilder()
- App.SimInfoList.forEach {
- msg.append("[SIM-").append(it.key + 1).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(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")
- }
-
- sendMessage(context, msg.toString().trimEnd())
- }
-
- TelephonyManager.SIM_STATE_CARD_IO_ERROR -> {
- Log.d(TAG, "SIM 卡读取失败")
- }
-
- TelephonyManager.SIM_STATE_CARD_RESTRICTED -> {
- Log.d(TAG, "SIM 卡受限")
- }
-
- TelephonyManager.SIM_STATE_NETWORK_LOCKED -> {
- Log.d(TAG, "SIM 卡网络锁定")
- }
-
- TelephonyManager.SIM_STATE_NOT_READY -> {
- Log.d(TAG, "SIM 卡未准备好")
- }
-
- TelephonyManager.SIM_STATE_PERM_DISABLED -> {
- Log.d(TAG, "SIM 卡被禁用")
- }
-
- TelephonyManager.SIM_STATE_PIN_REQUIRED -> {
- Log.d(TAG, "SIM 卡需要 PIN 解锁")
- }
-
- TelephonyManager.SIM_STATE_PUK_REQUIRED -> {
- Log.d(TAG, "SIM 卡需要 PUK 解锁")
- }
-
- TelephonyManager.SIM_STATE_UNKNOWN -> {
- Log.d(TAG, "SIM 卡状态未知")
- }
+ var duration = 10L
+ val msg = when (simStateNew) {
+ TelephonyManager.SIM_STATE_ABSENT -> {
+ Log.d(TAG, "SIM 卡被移除")
+ TaskUtils.simState = simStateNew
+ getString(R.string.sim_state_absent)
}
+
+ TelephonyManager.SIM_STATE_READY -> {
+ Log.d(TAG, "SIM 卡已准备就绪")
+ TaskUtils.simState = simStateNew
+ duration = 5000L
+ getString(R.string.sim_state_ready)
+ }
+
+ else -> {
+ Log.d(TAG, "SIM 卡状态未知")
+ TaskUtils.simState = 0
+ getString(R.string.sim_state_unknown)
+ }
+
}
- }
- private fun registerSimStateListener(context: Context) {
- // 在此处注册 SIM 变化监听器
- // 可以使用 TelephonyManager 或 SubscriptionManager 进行注册监听
- }
-
- //发送信息
- private fun sendMessage(context: Context, msg: String) {
- Log.i(TAG, msg)
- try {
- val msgInfo = MsgInfo("app", "66666666", msg, Date(), getString(R.string.sim_state_monitor), -1)
- val request = OneTimeWorkRequestBuilder().setInputData(
+ //注意:SIM卡已准备就绪时,延迟5秒(给够搜索信号时间)才执行任务
+ val request = OneTimeWorkRequestBuilder()
+ .setInitialDelay(duration, TimeUnit.MILLISECONDS)
+ .setInputData(
workDataOf(
- Worker.sendMsgInfo to Gson().toJson(msgInfo),
+ TaskWorker.conditionType to TASK_CONDITION_SIM,
+ TaskWorker.msg to msg.toString().trimEnd(),
)
).build()
- WorkManager.getInstance(context).enqueue(request)
- } catch (e: Exception) {
- Log.e(TAG, "getLog e:" + e.message)
- }
+ WorkManager.getInstance(context).enqueue(request)
}
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/BatteryUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/BatteryUtils.kt
index 626d0c6e..548bf0af 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/utils/BatteryUtils.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/utils/BatteryUtils.kt
@@ -2,7 +2,6 @@ package com.idormy.sms.forwarder.utils
import android.content.Intent
import android.os.BatteryManager
-import android.util.Log
import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.entity.BatteryInfo
import com.xuexiang.xui.utils.ResUtils.getString
@@ -30,7 +29,7 @@ object BatteryUtils {
batteryInfo.status = getStatus(status)
batteryInfo.health = getHealth(health)
batteryInfo.plugged = getPlugged(plugged)
- Log.i(TAG, batteryInfo.toString())
+ //Log.i(TAG, batteryInfo.toString())
return batteryInfo
}
diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt
index 829d98e5..0d39b749 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt
@@ -23,6 +23,7 @@ object TaskWorker {
const val task = "task"
const val taskActions = "task_actions"
const val conditionType = "condition_type"
+ const val msg = "msg"
const val msgInfo = "msg_info"
}
@@ -76,7 +77,6 @@ const val SP_SUBID_SIM1 = "subid_sim1"
const val SP_SUBID_SIM2 = "subid_sim2"
const val SP_EXTRA_SIM1 = "extra_sim1"
const val SP_EXTRA_SIM2 = "extra_sim2"
-const val SP_SIM_STATE_RECEIVER = "enable_sim_state_receiver"
const val SP_ENABLE_SMS_TEMPLATE = "enable_sms_template"
const val SP_SMS_TEMPLATE = "sms_template"
@@ -585,4 +585,5 @@ const val SP_NETWORK_STATE = "network_state"
const val SP_DATA_SIM_SLOT = "data_sim_slot"
const val SP_WIFI_SSID = "wifi_ssid"
const val SP_IPV4 = "ipv4"
-const val SP_IPV6 = "ipv6"
\ No newline at end of file
+const val SP_IPV6 = "ipv6"
+const val SP_SIM_STATE = "sim_state"
\ No newline at end of file
diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtils.kt
index da6ade74..c51b3cab 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtils.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtils.kt
@@ -113,9 +113,6 @@ class SettingUtils private constructor() {
//SIM2备注
var extraSim2: String by SharedPreference(SP_EXTRA_SIM2, "")
- //SIM卡槽状态监控
- var enableSimStateReceiver: Boolean by SharedPreference(SP_SIM_STATE_RECEIVER, false)
-
//是否启用自定义模板
var enableSmsTemplate: Boolean by SharedPreference(SP_ENABLE_SMS_TEMPLATE, false)
diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/task/TaskUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/task/TaskUtils.kt
index c684ad48..13cb941b 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/utils/task/TaskUtils.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/utils/task/TaskUtils.kt
@@ -10,6 +10,7 @@ import com.idormy.sms.forwarder.utils.SP_DATA_SIM_SLOT
import com.idormy.sms.forwarder.utils.SP_IPV4
import com.idormy.sms.forwarder.utils.SP_IPV6
import com.idormy.sms.forwarder.utils.SP_NETWORK_STATE
+import com.idormy.sms.forwarder.utils.SP_SIM_STATE
import com.idormy.sms.forwarder.utils.SP_WIFI_SSID
import com.idormy.sms.forwarder.utils.SharedPreference
@@ -49,5 +50,8 @@ class TaskUtils private constructor() {
//IPv6地址
var ipv6: String by SharedPreference(SP_IPV6, "")
+
+ //SIM卡状态:0-未知状态,1-卡被移除,5-卡已准备就绪
+ var simState: Int by SharedPreference(SP_SIM_STATE, 0)
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/idormy/sms/forwarder/workers/SimWorker.kt b/app/src/main/java/com/idormy/sms/forwarder/workers/SimWorker.kt
new file mode 100644
index 00000000..14b65c6f
--- /dev/null
+++ b/app/src/main/java/com/idormy/sms/forwarder/workers/SimWorker.kt
@@ -0,0 +1,93 @@
+package com.idormy.sms.forwarder.workers
+
+import android.content.Context
+import android.telephony.TelephonyManager
+import android.util.Log
+import androidx.work.CoroutineWorker
+import androidx.work.Data
+import androidx.work.OneTimeWorkRequestBuilder
+import androidx.work.WorkManager
+import androidx.work.WorkerParameters
+import com.google.gson.Gson
+import com.idormy.sms.forwarder.App
+import com.idormy.sms.forwarder.R
+import com.idormy.sms.forwarder.database.AppDatabase
+import com.idormy.sms.forwarder.entity.MsgInfo
+import com.idormy.sms.forwarder.entity.task.SimSetting
+import com.idormy.sms.forwarder.entity.task.TaskSetting
+import com.idormy.sms.forwarder.utils.PhoneUtils
+import com.idormy.sms.forwarder.utils.TaskWorker
+import com.idormy.sms.forwarder.utils.task.TaskUtils
+import com.xuexiang.xutil.resource.ResUtils
+import java.util.Date
+
+@Suppress("PrivatePropertyName", "DEPRECATION")
+class SimWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {
+
+ private val TAG: String = SimWorker::class.java.simpleName
+
+ override suspend fun doWork(): Result {
+ val conditionType = inputData.getInt(TaskWorker.conditionType, -1)
+ val simStateStr = inputData.getString(TaskWorker.msg)
+ val taskList = AppDatabase.getInstance(App.context).taskDao().getByType(conditionType)
+ for (task in taskList) {
+ Log.d(TAG, "task = $task")
+
+ // 根据任务信息执行相应操作
+ val conditionList = Gson().fromJson(task.conditions, Array::class.java).toMutableList()
+ if (conditionList.isEmpty()) {
+ Log.d(TAG, "任务${task.id}:conditionList is empty")
+ continue
+ }
+ val firstCondition = conditionList.firstOrNull()
+ if (firstCondition == null) {
+ Log.d(TAG, "任务${task.id}:firstCondition is null")
+ continue
+ }
+
+ val simSetting = Gson().fromJson(firstCondition.setting, SimSetting::class.java)
+ if (simSetting == null) {
+ Log.d(TAG, "任务${task.id}:simSetting is null")
+ continue
+ }
+
+ if (TaskUtils.simState != simSetting.simState) {
+ Log.d(TAG, "任务${task.id}:networkState is not match, simSetting = $simSetting")
+ continue
+ }
+
+ //TODO:判断其他条件是否满足,注意:SIM卡已准备就绪,延迟5秒才进入这里(给够搜索信号时间)
+ /*if (!TaskUtils.isConditionMatch(task, msg)) {
+ Log.d(TAG, "任务${task.id}:condition is not match")
+ continue
+ }*/
+
+ val msg = StringBuilder()
+ msg.append(String.format(ResUtils.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.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")
+ }
+ }
+
+ //TODO: 组装消息体 && 执行具体任务
+ val msgInfo = MsgInfo("task", task.name, msg.toString().trimEnd(), Date(), task.description)
+ val actionData = Data.Builder().putLong(TaskWorker.taskId, task.id).putString(TaskWorker.taskActions, task.actions).putString(TaskWorker.msgInfo, Gson().toJson(msgInfo)).build()
+ val actionRequest = OneTimeWorkRequestBuilder().setInputData(actionData).build()
+ WorkManager.getInstance().enqueue(actionRequest)
+ }
+
+ return Result.success()
+
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml
index f70717d8..83469959 100644
--- a/app/src/main/res/layout/fragment_settings.xml
+++ b/app/src/main/res/layout/fragment_settings.xml
@@ -1251,40 +1251,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
Local HttpServer
Available under WiFi network, after startup, other machines in the LAN can directly call the local interface
SIM State Monitor
- [Note] You need to manually create APP forwarding rules, package name: 66666666
Network State Monitor
Network State Change Remind
Keep Alive
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 42b71af3..41b7ab88 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -556,7 +556,6 @@
被动接收本地 HttpServer
WiFi网络下可用,启动后局域网内其他机器可直接调用本机接口
SIM卡槽状态监控
- 需要手动创建APP转发规则,包名:66666666
网络状态监控
网络状态改变提醒
保活措施