新增:自动任务·快捷指令 —— SIM卡槽状态改变(废弃:`66666666`)

pull/408/head
pppscn 10 months ago
parent 2233c0032f
commit 437716cd4e

@ -297,7 +297,6 @@
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.SIM_STATE_CHANGED" />
</intent-filter>
</receiver>

@ -143,8 +143,7 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
editAddExtraSim1(binding!!.etExtraSim1)
//SIM2备注
editAddExtraSim2(binding!!.etExtraSim2)
//SIM卡槽状态监控
switchSimStateReceiver(binding!!.sbSimStateReceiver)
//通知内容
editNotifyContent(binding!!.etNotifyContent)
@ -800,25 +799,6 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), 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)

@ -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
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 卡状态
when (telephonyManager.simState) {
TelephonyManager.SIM_STATE_ABSENT -> {
Log.d(TAG, "SIM 卡被移除")
// 处理 SIM 卡被移除的情况
}
TelephonyManager.SIM_STATE_READY -> {
Log.d(TAG, "SIM 卡已准备就绪延迟2秒再获取信息")
Thread.sleep(2000)
// 获取 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 卡受限")
}
if (intent.action != "android.intent.action.SIM_STATE_CHANGED") return
TelephonyManager.SIM_STATE_NETWORK_LOCKED -> {
Log.d(TAG, "SIM 卡网络锁定")
}
// 处理 SIM 卡状态变化的逻辑
val simStateOld = TaskUtils.simState
val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
TelephonyManager.SIM_STATE_NOT_READY -> {
Log.d(TAG, "SIM 卡未准备好")
}
// 获取当前 SIM 卡状态
val simStateNew = telephonyManager.simState
TelephonyManager.SIM_STATE_PERM_DISABLED -> {
Log.d(TAG, "SIM 卡被禁用")
}
// SIM 卡状态未发生变化,避免重复执行
if (simStateOld == simStateNew) return
TelephonyManager.SIM_STATE_PIN_REQUIRED -> {
Log.d(TAG, "SIM 卡需要 PIN 解锁")
}
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_PUK_REQUIRED -> {
Log.d(TAG, "SIM 卡需要 PUK 解锁")
}
TelephonyManager.SIM_STATE_READY -> {
Log.d(TAG, "SIM 卡已准备就绪")
TaskUtils.simState = simStateNew
duration = 5000L
getString(R.string.sim_state_ready)
}
TelephonyManager.SIM_STATE_UNKNOWN -> {
Log.d(TAG, "SIM 卡状态未知")
}
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<SendWorker>().setInputData(
//注意SIM卡已准备就绪时延迟5秒给够搜索信号时间才执行任务
val request = OneTimeWorkRequestBuilder<SimWorker>()
.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)
}
}

@ -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
}

@ -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"
const val SP_IPV6 = "ipv6"
const val SP_SIM_STATE = "sim_state"

@ -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)

@ -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)
}
}

@ -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<TaskSetting>::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<ActionWorker>().setInputData(actionData).build()
WorkManager.getInstance().enqueue(actionRequest)
}
return Result.success()
}
}

@ -1251,40 +1251,6 @@
</LinearLayout>
<LinearLayout
style="@style/settingBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/sim_state_monitor"
android:textStyle="bold"
tools:ignore="RelativeOverlap" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/sim_state_monitor_tips"
android:textSize="9sp"
tools:ignore="SmallSp" />
</LinearLayout>
<com.xuexiang.xui.widget.button.switchbutton.SwitchButton
android:id="@+id/sb_sim_state_receiver"
style="@style/SwitchButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
style="@style/settingBarStyle"
android:layout_width="match_parent"

@ -555,7 +555,6 @@
<string name="httpserver">Local HttpServer</string>
<string name="httpserver_tips">Available under WiFi network, after startup, other machines in the LAN can directly call the local interface</string>
<string name="sim_state_monitor">SIM State Monitor</string>
<string name="sim_state_monitor_tips">[Note] You need to manually create APP forwarding rules, package name: 66666666</string>
<string name="network_state_monitor">Network State Monitor</string>
<string name="network_state_change_remind">Network State Change Remind</string>
<string name="keep_alive">Keep Alive</string>

@ -556,7 +556,6 @@
<string name="httpserver">被动接收本地 HttpServer</string>
<string name="httpserver_tips">WiFi网络下可用启动后局域网内其他机器可直接调用本机接口</string>
<string name="sim_state_monitor">SIM卡槽状态监控</string>
<string name="sim_state_monitor_tips">需要手动创建APP转发规则包名66666666</string>
<string name="network_state_monitor">网络状态监控</string>
<string name="network_state_change_remind">网络状态改变提醒</string>
<string name="keep_alive">保活措施</string>

Loading…
Cancel
Save