From 242fb332bd1a801716f46846b5e0c42e54aa2754 Mon Sep 17 00:00:00 2001 From: pppscn <35696959@qq.com> Date: Mon, 29 Aug 2022 23:26:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E6=9D=A5=E7=94=B5?= =?UTF-8?q?=E6=8F=90=E9=86=92=EF=BC=88=E5=93=8D=E9=93=83=E7=AB=8B=E5=8D=B3?= =?UTF-8?q?=E8=BD=AC=E5=8F=91=EF=BC=8C=E6=97=A0=E5=8D=A1=E6=A7=BD=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=EF=BC=89=20#213?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../idormy/sms/forwarder/entity/CallInfo.kt | 2 +- .../forwarder/fragment/SettingsFragment.kt | 21 +++++--- .../forwarder/receiver/PhoneStateReceiver.kt | 49 +++++++++-------- .../idormy/sms/forwarder/utils/Constants.kt | 1 + .../idormy/sms/forwarder/utils/PhoneUtils.kt | 14 +++-- .../sms/forwarder/utils/SettingUtils.kt | 8 +++ app/src/main/res/layout/fragment_settings.xml | 53 +++++++++++-------- app/src/main/res/values-en/strings.xml | 3 ++ app/src/main/res/values/strings.xml | 3 ++ 9 files changed, 98 insertions(+), 56 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 f41c2fca..3d5ea9d0 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 @@ -13,7 +13,7 @@ data class CallInfo( var dateLong: Long = 0L, //获取通话时长,值为多少秒 var duration: Int = 0, - //通话类型:1=呼入, 2=呼出, 3=未接 + //通话类型:1=呼入, 2=呼出, 3=未接, 4=未接提醒 var type: Int = 1, //被呼号码 @SerializedName("via_number") 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 1b098260..3936b9e2 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 @@ -78,7 +78,7 @@ class SettingsFragment : BaseFragment(), View.OnClickL //转发短信广播 switchEnableSms(binding!!.sbEnableSms) //转发通话记录 - switchEnablePhone(binding!!.sbEnablePhone, binding!!.scbCallType1, binding!!.scbCallType2, binding!!.scbCallType3) + switchEnablePhone(binding!!.sbEnablePhone, binding!!.scbCallType1, binding!!.scbCallType2, binding!!.scbCallType3, binding!!.scbCallType4) //转发应用通知 switchEnableAppNotify(binding!!.sbEnableAppNotify, binding!!.scbCancelAppNotify, binding!!.scbNotUserPresent) //启动时异步获取已安装App信息 @@ -266,13 +266,14 @@ class SettingsFragment : BaseFragment(), View.OnClickL //转发通话 @SuppressLint("UseSwitchCompatOrMaterialCode") - fun switchEnablePhone(sbEnablePhone: SwitchButton, scbCallType1: SmoothCheckBox, scbCallType2: SmoothCheckBox, scbCallType3: SmoothCheckBox) { + fun switchEnablePhone(sbEnablePhone: SwitchButton, scbCallType1: SmoothCheckBox, scbCallType2: SmoothCheckBox, scbCallType3: SmoothCheckBox, scbCallType4: SmoothCheckBox) { sbEnablePhone.isChecked = SettingUtils.enablePhone scbCallType1.isChecked = SettingUtils.enableCallType1 scbCallType2.isChecked = SettingUtils.enableCallType2 scbCallType3.isChecked = SettingUtils.enableCallType3 + scbCallType4.isChecked = SettingUtils.enableCallType4 sbEnablePhone.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean -> - if (isChecked && !SettingUtils.enableCallType1 && !SettingUtils.enableCallType2 && !SettingUtils.enableCallType3) { + if (isChecked && !SettingUtils.enableCallType1 && !SettingUtils.enableCallType2 && !SettingUtils.enableCallType3 && !SettingUtils.enableCallType4) { XToastUtils.info(R.string.enable_phone_fw_tips) SettingUtils.enablePhone = false sbEnablePhone.isChecked = false @@ -315,7 +316,7 @@ class SettingsFragment : BaseFragment(), View.OnClickL } scbCallType1.setOnCheckedChangeListener { _: SmoothCheckBox, isChecked: Boolean -> SettingUtils.enableCallType1 = isChecked - if (!isChecked && !SettingUtils.enableCallType1 && !SettingUtils.enableCallType2 && !SettingUtils.enableCallType3) { + if (!isChecked && !SettingUtils.enableCallType1 && !SettingUtils.enableCallType2 && !SettingUtils.enableCallType3 && !SettingUtils.enableCallType4) { XToastUtils.info(R.string.enable_phone_fw_tips) SettingUtils.enablePhone = false sbEnablePhone.isChecked = false @@ -323,7 +324,7 @@ class SettingsFragment : BaseFragment(), View.OnClickL } scbCallType2.setOnCheckedChangeListener { _: SmoothCheckBox, isChecked: Boolean -> SettingUtils.enableCallType2 = isChecked - if (!isChecked && !SettingUtils.enableCallType1 && !SettingUtils.enableCallType2 && !SettingUtils.enableCallType3) { + if (!isChecked && !SettingUtils.enableCallType1 && !SettingUtils.enableCallType2 && !SettingUtils.enableCallType3 && !SettingUtils.enableCallType4) { XToastUtils.info(R.string.enable_phone_fw_tips) SettingUtils.enablePhone = false sbEnablePhone.isChecked = false @@ -331,7 +332,15 @@ class SettingsFragment : BaseFragment(), View.OnClickL } scbCallType3.setOnCheckedChangeListener { _: SmoothCheckBox, isChecked: Boolean -> SettingUtils.enableCallType3 = isChecked - if (!isChecked && !SettingUtils.enableCallType1 && !SettingUtils.enableCallType2 && !SettingUtils.enableCallType3) { + if (!isChecked && !SettingUtils.enableCallType1 && !SettingUtils.enableCallType2 && !SettingUtils.enableCallType3 && !SettingUtils.enableCallType4) { + XToastUtils.info(R.string.enable_phone_fw_tips) + SettingUtils.enablePhone = false + sbEnablePhone.isChecked = false + } + } + scbCallType4.setOnCheckedChangeListener { _: SmoothCheckBox, isChecked: Boolean -> + SettingUtils.enableCallType4 = isChecked + if (!isChecked && !SettingUtils.enableCallType1 && !SettingUtils.enableCallType2 && !SettingUtils.enableCallType3 && !SettingUtils.enableCallType4) { XToastUtils.info(R.string.enable_phone_fw_tips) SettingUtils.enablePhone = false sbEnablePhone.isChecked = false diff --git a/app/src/main/java/com/idormy/sms/forwarder/receiver/PhoneStateReceiver.kt b/app/src/main/java/com/idormy/sms/forwarder/receiver/PhoneStateReceiver.kt index 7547b072..8d0a61b1 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/receiver/PhoneStateReceiver.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/receiver/PhoneStateReceiver.kt @@ -21,6 +21,7 @@ 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.xuexiang.xutil.resource.ResUtils import com.xuexiang.xutil.resource.ResUtils.getString import java.util.* @@ -42,27 +43,6 @@ class PhoneStateReceiver : BroadcastReceiver() { if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) return //获取来电号码 - /*val phoneNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER) - val state = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - Core.telephonyManager.callStateForSubscription - } else { - Core.telephonyManager.callState - } - Log.d(TAG, "来电信息:state=$state phoneNumber = $phoneNumber") - if (TextUtils.isEmpty(phoneNumber)) return - - when (state) { - TelephonyManager.CALL_STATE_RINGING -> {} - TelephonyManager.CALL_STATE_IDLE -> { - *//*(Core.app as App).applicationScope.launch { - delay(500L) //延时0.5秒获取通话记录 - sendReceiveCallMsg(context, phoneNumber) - }*//* - sendReceiveCallMsg(context, phoneNumber) - } - TelephonyManager.CALL_STATE_OFFHOOK -> {} - }*/ - val number = intent.extras!!.getString(TelephonyManager.EXTRA_INCOMING_NUMBER) val stateStr = intent.extras!!.getString(TelephonyManager.EXTRA_STATE) var state = 0 @@ -71,6 +51,8 @@ class PhoneStateReceiver : BroadcastReceiver() { TelephonyManager.EXTRA_STATE_OFFHOOK -> state = TelephonyManager.CALL_STATE_OFFHOOK TelephonyManager.EXTRA_STATE_RINGING -> state = TelephonyManager.CALL_STATE_RINGING } + Log.d(TAG, "state=$state, number=$number") + onCallStateChanged(context, state, number) } catch (e: Exception) { @@ -82,17 +64,39 @@ class PhoneStateReceiver : BroadcastReceiver() { //Outgoing call- goes from IDLE to OFFHOOK when it dials out, to IDLE when hung up private fun onCallStateChanged(context: Context, state: Int, number: String?) { val lastState = MMKVUtils.getInt("CALL_LAST_STATE", TelephonyManager.CALL_STATE_IDLE) - if (lastState == state) { + if (lastState == state || (state == TelephonyManager.CALL_STATE_RINGING && number == null)) { //No change, debounce extras return } + MMKVUtils.put("CALL_LAST_STATE", state) when (state) { TelephonyManager.CALL_STATE_RINGING -> { Log.d(TAG, "来电响铃") MMKVUtils.put("CALL_IS_INCOMING", true) //MMKVUtils.put("CALL_START_TIME", Date()) MMKVUtils.put("CALL_SAVED_NUMBER", number) + + //来电提醒 + if (!TextUtils.isEmpty(number) && SettingUtils.enableCallType4) { + val contacts = PhoneUtils.getContactByNumber(number) + val contactName = if (contacts.isNotEmpty()) contacts[0].name else getString(R.string.unknown_number) + + val sb = StringBuilder() + sb.append(getString(R.string.linkman)).append(contactName).append("\n") + sb.append(ResUtils.getString(R.string.mandatory_type)) + sb.append(getString(R.string.incoming_call)) + + val msgInfo = MsgInfo("call", number.toString(), sb.toString(), Date(), "", -1) + val request = OneTimeWorkRequestBuilder() + .setInputData( + workDataOf( + Worker.sendMsgInfo to Gson().toJson(msgInfo) + ) + ) + .build() + WorkManager.getInstance(context).enqueue(request) + } } TelephonyManager.CALL_STATE_OFFHOOK -> //Transition of ringing->offhook are pickups of incoming calls. Nothing done on them @@ -125,7 +129,6 @@ class PhoneStateReceiver : BroadcastReceiver() { } } } - MMKVUtils.put("CALL_LAST_STATE", state) } private fun sendReceiveCallMsg(context: Context, callType: Int, phoneNumber: String?) { 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 3380c651..31613aca 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 @@ -29,6 +29,7 @@ const val SP_ENABLE_PHONE = "enable_phone" const val SP_ENABLE_CALL_TYPE_1 = "enable_call_type_1" const val SP_ENABLE_CALL_TYPE_2 = "enable_call_type_2" const val SP_ENABLE_CALL_TYPE_3 = "enable_call_type_3" +const val SP_ENABLE_CALL_TYPE_4 = "enable_call_type_4" const val SP_ENABLE_APP_NOTIFY = "enable_app_notify" const val SP_ENABLE_CANCEL_APP_NOTIFY = "enable_cancel_app_notify" 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 3d76827d..82e3b5c2 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 @@ -307,13 +307,21 @@ class PhoneUtils private constructor() { sb.append(ResUtils.getString(R.string.linkman)).append(callInfo.name).append("\n") if (!TextUtils.isEmpty(callInfo.viaNumber)) sb.append(ResUtils.getString(R.string.via_number)).append(callInfo.viaNumber).append("\n") if (callInfo.dateLong > 0L) sb.append(ResUtils.getString(R.string.call_date)).append(DateUtils.millis2String(callInfo.dateLong, SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()))).append("\n") - if (callInfo.duration > 0) sb.append(ResUtils.getString(R.string.call_duration)).append(callInfo.duration).append("s\n") + if (callInfo.duration > 0) { + if (callInfo.type == 3) { + sb.append(ResUtils.getString(R.string.ring_duration)) + } else { + sb.append(ResUtils.getString(R.string.call_duration)) + } + sb.append(callInfo.duration).append("s\n") + } sb.append(ResUtils.getString(R.string.mandatory_type)) - //通话类型:1.呼入 2.呼出 3.未接 + //通话类型:1.呼入 2.呼出 3.未接 4.来电提醒 when (callInfo.type) { 1 -> sb.append(ResUtils.getString(R.string.received_call)) 2 -> sb.append(ResUtils.getString(R.string.local_outgoing_call)) - else -> sb.append(ResUtils.getString(R.string.missed_call)) + 3 -> sb.append(ResUtils.getString(R.string.missed_call)) + else -> sb.append(ResUtils.getString(R.string.incoming_call)) } return sb.toString() } 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 cd42544a..fb015d7b 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 @@ -61,6 +61,14 @@ class SettingUtils private constructor() { MMKVUtils.put(SP_ENABLE_CALL_TYPE_3, enableCallType3) } + //是否转发通话——来电提醒 + @JvmStatic + var enableCallType4: Boolean + get() = MMKVUtils.getBoolean(SP_ENABLE_CALL_TYPE_4, false) + set(enableCallType4) { + MMKVUtils.put(SP_ENABLE_CALL_TYPE_4, enableCallType4) + } + //是否转发应用通知 @JvmStatic var enableAppNotify: Boolean diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 0123e99b..eaf3b80e 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -107,7 +107,7 @@ @@ -121,37 +121,51 @@ + android:textSize="10sp" /> + android:textSize="10sp" /> + android:textSize="10sp" /> + + + + @@ -215,9 +229,8 @@ + android:textSize="10sp" /> + android:textSize="10sp" /> @@ -293,10 +305,9 @@ + android:textSize="10sp" /> + android:textSize="10sp" /> @@ -531,9 +541,8 @@ + android:textSize="10sp" /> @@ -804,9 +813,8 @@ + android:textSize="10sp" /> + android:textSize="10sp" /> diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 164919d5..22a57aa6 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -503,8 +503,11 @@ Main switch: Enable the forwarding function as required Call date: Call duration: + Ring duration: + Type: Call type: Missed + Incoming Received Call out Optional: diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e1b37028..6e48cf9e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -504,8 +504,11 @@ 总开关,请根据实际需要,启用对应的转发功能 通话时间: 通话时长: + 响铃时长: + 类型: 通话类型: 未接来电 + 来电提醒 已接来电 本机去电 可选操作: