From e941fcf62bbc7d00b7ad8d0a5e6a2f4eccbc55e8 Mon Sep 17 00:00:00 2001 From: pppscn <35696959@qq.com> Date: Sat, 11 Jun 2022 08:25:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E5=8D=A1=E6=A7=BDID=E6=9E=9A=E4=B8=BE=E5=80=BC=EF=BC=88=200=3D?= =?UTF-8?q?Sim1,=201=3DSim2,=20-1=3D=E8=8E=B7=E5=8F=96=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=EF=BC=89=E3=80=90=E6=9C=AA=E5=81=9A=E6=9C=BA=E5=9E=8B=E9=80=82?= =?UTF-8?q?=E9=85=8D=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../idormy/sms/forwarder/entity/CallInfo.kt | 6 +- .../idormy/sms/forwarder/entity/SmsInfo.kt | 6 +- .../fragment/client/SmsSendFragment.kt | 2 +- .../server/controller/SmsController.kt | 2 +- .../forwarder/service/ForegroundService.kt | 62 +++++++++++-------- .../idormy/sms/forwarder/utils/PhoneUtils.kt | 56 ++++++++++++----- 6 files changed, 85 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/com/idormy/sms/forwarder/entity/CallInfo.kt b/app/src/main/java/com/idormy/sms/forwarder/entity/CallInfo.kt index f7410629..f41c2fca 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/entity/CallInfo.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/entity/CallInfo.kt @@ -18,7 +18,7 @@ data class CallInfo( //被呼号码 @SerializedName("via_number") var viaNumber: String = "", - //卡槽ID: 1=Sim1, 2=Sim2, -1=获取失败 + //卡槽ID: 0=Sim1, 1=Sim2, -1=获取失败 @SerializedName("sim_id") var simId: Int = -1, ) : Serializable { @@ -35,8 +35,8 @@ data class CallInfo( val simImageId: Int get() { return when (simId) { - 1 -> R.drawable.ic_sim1 - 2 -> R.drawable.ic_sim2 + 0 -> R.drawable.ic_sim1 + 1 -> R.drawable.ic_sim2 else -> R.drawable.ic_sim } } diff --git a/app/src/main/java/com/idormy/sms/forwarder/entity/SmsInfo.kt b/app/src/main/java/com/idormy/sms/forwarder/entity/SmsInfo.kt index 22336cbb..4b60811a 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/entity/SmsInfo.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/entity/SmsInfo.kt @@ -15,7 +15,7 @@ data class SmsInfo( var date: Long = 0L, // 短信类型: 1=接收, 2=发送 var type: Int = 1, - // 卡槽ID: 1=Sim1, 2=Sim2, -1=获取失败 + // 卡槽ID: 0=Sim1, 1=Sim2, -1=获取失败 @SerializedName("sim_id") var simId: Int = -1, ) : Serializable { @@ -25,8 +25,8 @@ data class SmsInfo( val simImageId: Int get() { return when (simId) { - 1 -> R.drawable.ic_sim1 - 2 -> R.drawable.ic_sim2 + 0 -> R.drawable.ic_sim1 + 1 -> R.drawable.ic_sim2 else -> R.drawable.ic_sim } } diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/client/SmsSendFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/client/SmsSendFragment.kt index 38eaf679..53451c09 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/client/SmsSendFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/client/SmsSendFragment.kt @@ -61,7 +61,7 @@ class SmsSendFragment : BaseFragment(), View.OnCl override fun initListeners() { binding!!.btnSubmit.setOnClickListener(this) LiveEventBus.get(EVENT_KEY_SIM_SLOT, Int::class.java).observeSticky(this) { value: Int -> - binding!!.rgSimSlot.check(if (value == 2) R.id.rb_sim_slot_2 else R.id.rb_sim_slot_1) + binding!!.rgSimSlot.check(if (value == 1) R.id.rb_sim_slot_2 else R.id.rb_sim_slot_1) } LiveEventBus.get(EVENT_KEY_PHONE_NUMBERS, String::class.java).observeSticky(this) { value: String -> binding!!.etPhoneNumbers.setText(value) diff --git a/app/src/main/java/com/idormy/sms/forwarder/server/controller/SmsController.kt b/app/src/main/java/com/idormy/sms/forwarder/server/controller/SmsController.kt index b7267c03..7d2a2487 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/server/controller/SmsController.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/server/controller/SmsController.kt @@ -56,6 +56,6 @@ class SmsController { val limit = smsQueryData.pageSize val offset = (smsQueryData.pageNum - 1) * limit - return PhoneUtils.getSmsList(smsQueryData.type, limit, offset, smsQueryData.keyword) + return PhoneUtils.getSmsInfoList(smsQueryData.type, limit, offset, smsQueryData.keyword) } } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/service/ForegroundService.kt b/app/src/main/java/com/idormy/sms/forwarder/service/ForegroundService.kt index 0affdce6..313f25c9 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/service/ForegroundService.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/service/ForegroundService.kt @@ -73,35 +73,41 @@ class ForegroundService : Service() { override fun onCreate() { super.onCreate() - //纯客户端模式 - if (SettingUtils.enablePureClientMode) return + try { + //纯客户端模式 + if (SettingUtils.enablePureClientMode) return - notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager - startForeground(FRONT_NOTIFY_ID, createForegroundNotification()) - isRunning = true + notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager + startForeground(FRONT_NOTIFY_ID, createForegroundNotification()) - //开关通知监听服务 - if (SettingUtils.enableAppNotify && CommonUtils.isNotificationListenerServiceEnabled(this)) { - CommonUtils.toggleNotificationListenerService(this) - } - - //监听Frpc启动指令 - LiveEventBus.get(INTENT_FRPC_APPLY_FILE, String::class.java).observeStickyForever(frpcObserver) - //自启动的Frpc - GlobalScope.async(Dispatchers.IO) { - val frpcList = AppDatabase.getInstance(App.context).frpcDao().getAutorun() - - if (frpcList.isEmpty()) { - Log.d(TAG, "没有自启动的Frpc") - return@async + //开关通知监听服务 + if (SettingUtils.enableAppNotify && CommonUtils.isNotificationListenerServiceEnabled(this)) { + CommonUtils.toggleNotificationListenerService(this) } - for (frpc in frpcList) { - val error = Frpclib.runContent(frpc.uid, frpc.config) - if (!TextUtils.isEmpty(error)) { - Log.e(TAG, error) + //监听Frpc启动指令 + LiveEventBus.get(INTENT_FRPC_APPLY_FILE, String::class.java).observeStickyForever(frpcObserver) + //自启动的Frpc + GlobalScope.async(Dispatchers.IO) { + val frpcList = AppDatabase.getInstance(App.context).frpcDao().getAutorun() + + if (frpcList.isEmpty()) { + Log.d(TAG, "没有自启动的Frpc") + return@async + } + + for (frpc in frpcList) { + val error = Frpclib.runContent(frpc.uid, frpc.config) + if (!TextUtils.isEmpty(error)) { + Log.e(TAG, error) + } } } + + isRunning = true + } catch (e: Exception) { + e.printStackTrace() + isRunning = false } } @@ -118,9 +124,13 @@ class ForegroundService : Service() { return } - stopForeground(true) - compositeDisposable.dispose() - isRunning = false + try { + stopForeground(true) + compositeDisposable.dispose() + isRunning = false + } catch (e: Exception) { + e.printStackTrace() + } super.onDestroy() } diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/PhoneUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/PhoneUtils.kt index da078835..9c0034be 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/PhoneUtils.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/PhoneUtils.kt @@ -19,6 +19,7 @@ import android.text.TextUtils import android.util.Log import androidx.annotation.RequiresPermission import androidx.core.app.ActivityCompat +import com.idormy.sms.forwarder.App import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.entity.CallInfo @@ -32,7 +33,6 @@ import com.xuexiang.xutil.resource.ResUtils import java.text.SimpleDateFormat import java.util.* - @Suppress("PropertyName") class PhoneUtils private constructor() { @@ -86,6 +86,7 @@ class PhoneUtils private constructor() { } catch (e: java.lang.Exception) { e.printStackTrace() } + Log.e(TAG, infoList.toString()) return infoList } @@ -215,13 +216,15 @@ class PhoneUtils private constructor() { val indexDuration = cursor.getColumnIndex(CallLog.Calls.DURATION) val indexType = cursor.getColumnIndex(CallLog.Calls.TYPE) val indexViaNumber = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && cursor.getColumnIndex("via_number") != -1) cursor.getColumnIndex("via_number") else -1 + var isSimId = false var indexSimId = -1 - if (cursor.getColumnIndex("simid") != -1) { - indexSimId = cursor.getColumnIndex("simid") - } else if (cursor.getColumnIndex(CallLog.Calls.PHONE_ACCOUNT_ID) != -1 + if (cursor.getColumnIndex(CallLog.Calls.PHONE_ACCOUNT_ID) != -1 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ) { indexSimId = cursor.getColumnIndex(CallLog.Calls.PHONE_ACCOUNT_ID) + } else if (cursor.getColumnIndex("simid") != -1) { + indexSimId = cursor.getColumnIndex("simid") + //isSimId = true } do { val callInfo = CallInfo( @@ -231,7 +234,7 @@ class PhoneUtils private constructor() { cursor.getInt(indexDuration), //获取通话时长,值为多少秒 cursor.getInt(indexType), //获取通话类型:1.呼入 2.呼出 3.未接 if (indexViaNumber != -1) cursor.getString(indexViaNumber) else "", //来源号码 - if (indexSimId != -1) cursor.getInt(indexSimId) else -1 //卡槽id + if (indexSimId != -1) getSimId(cursor.getInt(indexSimId), isSimId) else -1 //卡槽id ) Log.d(TAG, callInfo.toString()) callInfoList.add(callInfo) @@ -261,14 +264,6 @@ class PhoneUtils private constructor() { var selection = "1=1" val selectionArgs = ArrayList() if (!TextUtils.isEmpty(phoneNumber)) { - /*selection += " and " + ContactsContract.CommonDataKinds.Phone.NUMBER + " in (?,?,?) " - val phone1 = phoneNumber?.subSequence(0, 3).toString() + " " + phoneNumber?.substring(3, 7) + - " " + phoneNumber?.substring(7) - val phone2 = phoneNumber?.subSequence(0, 3).toString() + "-" + phoneNumber?.substring(3, 7) + - "-" + phoneNumber?.substring(7) - selectionArgs.add("%$phoneNumber%") - selectionArgs.add("%$phone1%") - selectionArgs.add("%$phone2%")*/ selection += " and replace(replace(" + ContactsContract.CommonDataKinds.Phone.NUMBER + ",' ',''),'-','') like ?" selectionArgs.add("%$phoneNumber%") } @@ -360,7 +355,7 @@ class PhoneUtils private constructor() { } // 获取用户短信列表 - fun getSmsList(type: Int, limit: Int, offset: Int, keyword: String): MutableList { + fun getSmsInfoList(type: Int, limit: Int, offset: Int, keyword: String): MutableList { val smsInfoList: MutableList = mutableListOf() try { var selection = "1=1" @@ -402,6 +397,7 @@ class PhoneUtils private constructor() { val indexBody = cursor.getColumnIndex("body") val indexDate = cursor.getColumnIndex("date") val indexType = cursor.getColumnIndex("type") + var isSimId = false var indexSimId = -1 if (cursor.getColumnIndex("sim_id") != -1) { indexSimId = cursor.getColumnIndex("sim_id") @@ -421,7 +417,7 @@ class PhoneUtils private constructor() { // 短信类型: 1=接收, 2=发送 smsInfo.type = cursor.getInt(indexType) // 卡槽id - smsInfo.simId = if (indexSimId != -1) cursor.getInt(indexSimId) else -1 + smsInfo.simId = if (indexSimId != -1) getSimId(cursor.getInt(indexSimId), isSimId) else -1 smsInfoList.add(smsInfo) } while (cursor.moveToNext()) if (!cursor.isClosed) cursor.close() @@ -452,6 +448,36 @@ class PhoneUtils private constructor() { XUtil.getContext().startActivity(IntentUtils.getCallIntent(phoneNumber, true)) } + /** + * 将 subscription_id 转成 卡槽ID: 0=Sim1, 1=Sim2, -1=获取失败 + * + * TODO: 这里有坑,每个品牌定制系统的字段不太一样,不一定能获取到卡槽ID + * 测试通过:MIUI 测试失败:原生 Android 11(Google Pixel 2 XL) + * + * @param mId SubscriptionId + * @param isSimId 是否已经是SimId无需转换(待做机型兼容) + */ + private fun getSimId(mId: Int, isSimId: Boolean): Int { + Log.i(TAG, "mId = $mId, isSimId = $isSimId") + if (isSimId) return mId + + //获取卡槽信息 + if (App.SimInfoList.isEmpty()) { + App.SimInfoList = getSimMultiInfo() + } + Log.i(TAG, "SimInfoList = " + App.SimInfoList.toString()) + + val simSlot = -1 + if (App.SimInfoList.isEmpty()) return simSlot + for (simInfo in App.SimInfoList.values) { + if (simInfo.mSubscriptionId == mId && simInfo.mSimSlotIndex != -1) { + Log.i(TAG, "simInfo = $simInfo") + return simInfo.mSimSlotIndex + } + } + return simSlot + } + } init {