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 网络状态监控 网络状态改变提醒 保活措施