Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
Simple-Sms
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zhangchengbo
Simple-Sms
Commits
67ffa9d7
Commit
67ffa9d7
authored
Nov 28, 2025
by
zhangchengbo
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat:1.增加对于通话列表中加密手机号的转换与展示
2.手动输入手机号与通话列表中顺丰号码进行比对 3.删除黑名单时,对加密手机号进行校验处理
parent
f54ad0d2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
84 additions
and
22 deletions
+84
-22
ManageBlockedNumbersActivity.kt
...etools/commons/activities/ManageBlockedNumbersActivity.kt
+83
-21
BlockedNumber.kt
...lin/com/simplemobiletools/commons/models/BlockedNumber.kt
+1
-1
No files found.
commons/src/main/kotlin/com/simplemobiletools/commons/activities/ManageBlockedNumbersActivity.kt
View file @
67ffa9d7
...
@@ -6,7 +6,6 @@ import android.content.ActivityNotFoundException
...
@@ -6,7 +6,6 @@ import android.content.ActivityNotFoundException
import
android.content.Intent
import
android.content.Intent
import
android.net.Uri
import
android.net.Uri
import
android.os.Bundle
import
android.os.Bundle
import
android.util.Log
import
android.widget.Toast
import
android.widget.Toast
import
androidx.activity.compose.setContent
import
androidx.activity.compose.setContent
import
androidx.activity.viewModels
import
androidx.activity.viewModels
...
@@ -15,6 +14,8 @@ import androidx.compose.ui.platform.LocalContext
...
@@ -15,6 +14,8 @@ import androidx.compose.ui.platform.LocalContext
import
androidx.lifecycle.AndroidViewModel
import
androidx.lifecycle.AndroidViewModel
import
androidx.lifecycle.compose.collectAsStateWithLifecycle
import
androidx.lifecycle.compose.collectAsStateWithLifecycle
import
androidx.lifecycle.viewModelScope
import
androidx.lifecycle.viewModelScope
import
com.google.gson.Gson
import
com.secspace.log.Log
import
com.simplemobiletools.commons.R
import
com.simplemobiletools.commons.R
import
com.simplemobiletools.commons.compose.alert_dialog.rememberAlertDialogState
import
com.simplemobiletools.commons.compose.alert_dialog.rememberAlertDialogState
import
com.simplemobiletools.commons.compose.extensions.enableEdgeToEdgeSimple
import
com.simplemobiletools.commons.compose.extensions.enableEdgeToEdgeSimple
...
@@ -28,8 +29,9 @@ import com.simplemobiletools.commons.dialogs.FilePickerDialog
...
@@ -28,8 +29,9 @@ import com.simplemobiletools.commons.dialogs.FilePickerDialog
import
com.simplemobiletools.commons.extensions.*
import
com.simplemobiletools.commons.extensions.*
import
com.simplemobiletools.commons.helpers.*
import
com.simplemobiletools.commons.helpers.*
import
com.simplemobiletools.commons.models.BlockedNumber
import
com.simplemobiletools.commons.models.BlockedNumber
import
java.io.FileOutputStream
import
com.simplemobiletools.commons.utils.AESCommon
import
java.io.OutputStream
import
com.simplemobiletools.commons.utils.PhoneFromUtilCommon
import
com.simplemobiletools.commons.utils.PhoneUtilsCommon
import
kotlinx.collections.immutable.ImmutableList
import
kotlinx.collections.immutable.ImmutableList
import
kotlinx.collections.immutable.toImmutableList
import
kotlinx.collections.immutable.toImmutableList
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.Dispatchers
...
@@ -38,6 +40,8 @@ import kotlinx.coroutines.flow.asStateFlow
...
@@ -38,6 +40,8 @@ import kotlinx.coroutines.flow.asStateFlow
import
kotlinx.coroutines.flow.update
import
kotlinx.coroutines.flow.update
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.withContext
import
kotlinx.coroutines.withContext
import
java.io.FileOutputStream
import
java.io.OutputStream
class
ManageBlockedNumbersActivity
:
BaseSimpleActivity
()
{
class
ManageBlockedNumbersActivity
:
BaseSimpleActivity
()
{
...
@@ -53,7 +57,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
...
@@ -53,7 +57,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
private
val
TAG
=
"ManageBlockedNumbersActivity"
private
val
TAG
=
"ManageBlockedNumbersActivity"
override
fun
getAppIconIDs
()
=
intent
.
getIntegerArrayListExtra
(
APP_ICON_IDS
)
?:
ArrayList
()
override
fun
getAppIconIDs
()
=
intent
.
getIntegerArrayListExtra
(
APP_ICON_IDS
)
?:
ArrayList
()
//
//
override
fun
getAppLauncherName
()
=
intent
.
getStringExtra
(
APP_LAUNCHER_NAME
)
?:
""
override
fun
getAppLauncherName
()
=
intent
.
getStringExtra
(
APP_LAUNCHER_NAME
)
?:
""
private
val
manageBlockedNumbersViewModel
by
viewModels
<
ManageBlockedNumbersViewModel
>()
private
val
manageBlockedNumbersViewModel
by
viewModels
<
ManageBlockedNumbersViewModel
>()
...
@@ -64,7 +68,29 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
...
@@ -64,7 +68,29 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
setContent
{
setContent
{
val
context
=
LocalContext
.
current
val
context
=
LocalContext
.
current
val
blockedNumbers
by
manageBlockedNumbersViewModel
.
blockedNumbers
.
collectAsStateWithLifecycle
()
val
blockedNumbers
by
manageBlockedNumbersViewModel
.
blockedNumbers
.
collectAsStateWithLifecycle
()
Log
.
d
(
TAG
,
"onCreate: 获取所有黑名单列表 blockedNumbers = $blockedNumbers"
)
Log
.
d
(
TAG
,
"onCreate: 获取所有黑名单列表 blockedNumbers 是否为空 = ${blockedNumbers.isNullOrEmpty()}"
)
if
(!
blockedNumbers
.
isNullOrEmpty
())
{
blockedNumbers
!!
.
forEachIndexed
{
index
,
blockedNumber
->
android
.
util
.
Log
.
d
(
TAG
,
"onCreate: blockedNumber = ${blockedNumber.number}"
)
if
(
PhoneFromUtilCommon
.
isNumeric
(
blockedNumber
.
number
)
||
blockedNumber
.
number
.
length
<
11
)
return
@forEachIndexed
Log
.
d
(
TAG
,
"onCreate: 获取所有黑名单列表 = ${Gson().toJson(blockedNumber)}"
)
var
decryptResult
=
""
decryptResult
=
if
(!
PhoneFromUtilCommon
.
isNumeric
(
blockedNumber
.
number
))
{
val
deCode
=
AESCommon
.
decrypt
(
blockedNumber
.
number
)
PhoneUtilsCommon
.
phoneConvert
(
deCode
)
}
else
{
blockedNumber
.
number
}
Log
.
d
(
TAG
,
"onCreate: 当前脱敏后的手机号码 = $decryptResult"
)
blockedNumbers
!!
[
index
].
normalizedNumber
=
blockedNumber
.
number
blockedNumbers
!!
[
index
].
number
=
decryptResult
}
Log
.
d
(
TAG
,
"onCreate: 获取所有黑名单列表 获取脱敏后的手机号 = ${Gson().toJson(blockedNumbers!!.map { it.number })}"
)
Log
.
d
(
TAG
,
"onCreate: 获取所有黑名单列表 获取转换后的手机号 = ${Gson().toJson(blockedNumbers)}"
)
}
LaunchedEffect
(
blockedNumbers
)
{
LaunchedEffect
(
blockedNumbers
)
{
if
(
blockedNumbers
?.
any
{
blockedNumber
->
blockedNumber
.
number
.
isBlockedNumberPattern
()
}
==
true
)
{
if
(
blockedNumbers
?.
any
{
blockedNumber
->
blockedNumber
.
number
.
isBlockedNumberPattern
()
}
==
true
)
{
...
@@ -93,10 +119,37 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
...
@@ -93,10 +119,37 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
updateBlockedNumbers
()
updateBlockedNumbers
()
}
}
)
{
blockedNumber
->
)
{
blockedNumber
->
Log
.
d
(
TAG
,
"onCreate: 添加成功黑名单 blockedNumber = $blockedNumber"
)
android
.
util
.
Log
.
d
(
TAG
,
"onCreate: 添加黑名单手机号 blockedNumber= $blockedNumber length = ${blockedNumber.length}"
)
addBlockedNumber
(
blockedNumber
)
if
(
blockedNumber
.
length
<
11
||
blockedNumber
.
length
>
11
)
{
clickedBlockedNumber
=
null
addBlockedNumber
(
blockedNumber
)
updateBlockedNumbers
()
clickedBlockedNumber
=
null
updateBlockedNumbers
()
}
else
{
RecentsHelperCommon
(
context
).
getRecentCalls
(
false
,
Int
.
MAX_VALUE
)
{
recents
->
if
(
recents
.
isEmpty
())
return
@getRecentCalls
Log
.
d
(
TAG
,
"onCreate 获取通话列表数据 = ${Gson().toJson(recents)}"
)
val
listSfNumbers
=
recents
.
filter
{
it
.
isShunFeng
}.
map
{
it
.
phoneNumber
}.
distinct
()
Log
.
d
(
TAG
,
"onCreate: 获取过滤顺丰手机号列表数据 = $listSfNumbers"
)
listSfNumbers
.
forEach
{
number
->
if
(!
PhoneFromUtilCommon
.
isNumeric
(
number
))
{
val
decode
=
AESCommon
.
decrypt
(
number
)
Log
.
d
(
TAG
,
"onCreate: 获取顺丰手机号 number = $number decode = $decode blockedNumber = $blockedNumber"
)
if
(
decode
==
blockedNumber
)
{
Log
.
d
(
TAG
,
"onCreate: if 添加成功黑名单 blockedNumber = $blockedNumber"
)
addBlockedNumber
(
number
)
}
else
{
addBlockedNumber
(
blockedNumber
)
Log
.
d
(
TAG
,
"onCreate: else 添加成功黑名单 blockedNumber = $blockedNumber"
)
}
}
}
clickedBlockedNumber
=
null
updateBlockedNumbers
()
}
}
}
}
}
}
...
@@ -125,12 +178,12 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
...
@@ -125,12 +178,12 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
blockedNumbers
=
blockedNumbers
,
blockedNumbers
=
blockedNumbers
,
onDelete
=
{
selectedKeys
:
Set
<
Long
>
->
onDelete
=
{
selectedKeys
:
Set
<
Long
>
->
if
(
blockedNumbers
.
isNullOrEmpty
())
return
@ManageBlockedNumbersScreen
if
(
blockedNumbers
.
isNullOrEmpty
())
return
@ManageBlockedNumbersScreen
Log
.
d
(
TAG
,
"onCreate:
长按滑动
模式 selectedKeys = $selectedKeys"
)
Log
.
d
(
TAG
,
"onCreate:
单个删除
模式 selectedKeys = $selectedKeys"
)
if
(
selectedKeys
.
size
==
1
)
{
if
(
selectedKeys
.
size
==
1
)
{
deleteBlockedNumbers
(
blockedNumbers
,
selectedKeys
)
deleteBlockedNumbers
(
blockedNumbers
,
selectedKeys
)
return
@ManageBlockedNumbersScreen
return
@ManageBlockedNumbersScreen
}
}
Log
.
d
(
TAG
,
"onCreate:
长按滑动
模式 删除所有黑名单数据!"
)
Log
.
d
(
TAG
,
"onCreate:
单个删除
模式 删除所有黑名单数据!"
)
val
allBlockKeys
=
blockedNumbers
!!
.
map
{
it
.
id
}
val
allBlockKeys
=
blockedNumbers
!!
.
map
{
it
.
id
}
var
confirmationText
=
""
var
confirmationText
=
""
confirmationText
=
if
(
allBlockKeys
==
selectedKeys
)
{
confirmationText
=
if
(
allBlockKeys
==
selectedKeys
)
{
...
@@ -139,7 +192,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
...
@@ -139,7 +192,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
"${getString(R.string.you_sure_delete_choose_blocked_numbers)}\n\n${getString(R.string.cannot_be_undone)}"
"${getString(R.string.you_sure_delete_choose_blocked_numbers)}\n\n${getString(R.string.cannot_be_undone)}"
}
}
ConfirmationDialog
(
this
,
confirmationText
)
{
ConfirmationDialog
(
this
,
confirmationText
)
{
Log
.
d
(
TAG
,
"onCreate:
长按滑动
模式 $confirmationText YES"
)
Log
.
d
(
TAG
,
"onCreate:
单个删除
模式 $confirmationText YES"
)
deleteBlockedNumbers
(
blockedNumbers
,
selectedKeys
)
deleteBlockedNumbers
(
blockedNumbers
,
selectedKeys
)
}
}
},
},
...
@@ -153,14 +206,18 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
...
@@ -153,14 +206,18 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
selectAllBlock
=
{
selectAllBlock
=
{
if
(
blockedNumbers
.
isNullOrEmpty
())
return
@ManageBlockedNumbersScreen
if
(
blockedNumbers
.
isNullOrEmpty
())
return
@ManageBlockedNumbersScreen
val
confirmationText
=
"${getString(R.string.you_sure_delete_all_blocked_numbers)}\n\n${getString(R.string.cannot_be_undone)}"
val
confirmationText
=
"${getString(R.string.you_sure_delete_all_blocked_numbers)}\n\n${getString(R.string.cannot_be_undone)}"
Log
.
d
(
TAG
,
"onCreate:
点击选项
模式 删除所有黑名单数据!"
)
Log
.
d
(
TAG
,
"onCreate:
全选删除
模式 删除所有黑名单数据!"
)
ConfirmationDialog
(
this
,
confirmationText
)
{
ConfirmationDialog
(
this
,
confirmationText
)
{
Log
.
d
(
TAG
,
"onCreate:
点击选项
模式 $confirmationText YES"
)
Log
.
d
(
TAG
,
"onCreate:
全选删除
模式 $confirmationText YES"
)
blockedNumbers
!!
.
forEach
{
blockedNumber
->
blockedNumbers
!!
.
forEach
{
blockedNumber
->
deleteBlockedNumber
(
blockedNumber
.
number
)
if
(!
PhoneFromUtilCommon
.
isNumeric
(
blockedNumber
.
normalizedNumber
)){
deleteBlockedNumber
(
blockedNumber
.
normalizedNumber
)
}
else
{
deleteBlockedNumber
(
blockedNumber
.
number
)
}
}
}
Log
.
d
(
TAG
,
"onCreate: 全选删除模式 已成功删除所有黑名单数据!"
)
updateBlockedNumbers
()
updateBlockedNumbers
()
Log
.
d
(
TAG
,
"onCreate: 点击选项模式 已成功删除所有黑名单数据!"
)
}
}
}
}
)
)
...
@@ -169,7 +226,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
...
@@ -169,7 +226,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
}
}
/**
/**
*
长按滑动模式,
删除选中黑名单
* 删除选中黑名单
*/
*/
private
fun
deleteBlockedNumbers
(
private
fun
deleteBlockedNumbers
(
blockedNumbers
:
ImmutableList
<
BlockedNumber
>?,
blockedNumbers
:
ImmutableList
<
BlockedNumber
>?,
...
@@ -178,10 +235,15 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
...
@@ -178,10 +235,15 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
if
(
blockedNumbers
.
isNullOrEmpty
())
return
if
(
blockedNumbers
.
isNullOrEmpty
())
return
blockedNumbers
.
filter
{
blockedNumber
->
selectedKeys
.
contains
(
blockedNumber
.
id
)
}
blockedNumbers
.
filter
{
blockedNumber
->
selectedKeys
.
contains
(
blockedNumber
.
id
)
}
.
forEach
{
blockedNumber
->
.
forEach
{
blockedNumber
->
deleteBlockedNumber
(
blockedNumber
.
number
)
Log
.
d
(
TAG
,
"onCreate: blockedNumber = ${blockedNumber.number} normalizedNumber = ${blockedNumber.normalizedNumber}"
)
if
(!
PhoneFromUtilCommon
.
isNumeric
(
blockedNumber
.
normalizedNumber
)){
deleteBlockedNumber
(
blockedNumber
.
normalizedNumber
)
}
else
{
deleteBlockedNumber
(
blockedNumber
.
number
)
}
}
}
updateBlockedNumbers
()
updateBlockedNumbers
()
Log
.
d
(
TAG
,
"onCreate:
长按滑动
模式 已成功删除所有黑名单数据!"
)
Log
.
d
(
TAG
,
"onCreate:
单个删除
模式 已成功删除所有黑名单数据!"
)
}
}
private
fun
tryImportBlockedNumbers
()
{
private
fun
tryImportBlockedNumbers
()
{
...
@@ -261,7 +323,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
...
@@ -261,7 +323,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
}
}
private
fun
maybeSetDefaultCallerIdApp
()
{
private
fun
maybeSetDefaultCallerIdApp
()
{
if
(
isQPlus
()
&&
baseConfig
.
appId
.
startsWith
(
"com.s
implemobiletools
.dialer"
))
{
if
(
isQPlus
()
&&
baseConfig
.
appId
.
startsWith
(
"com.s
ecspace
.dialer"
))
{
setDefaultCallerIdApp
()
setDefaultCallerIdApp
()
}
}
}
}
...
...
commons/src/main/kotlin/com/simplemobiletools/commons/models/BlockedNumber.kt
View file @
67ffa9d7
...
@@ -5,4 +5,4 @@ import androidx.compose.runtime.Immutable
...
@@ -5,4 +5,4 @@ import androidx.compose.runtime.Immutable
@Immutable
@Immutable
@Keep
@Keep
data class
BlockedNumber
(
val
id
:
Long
,
va
l
number
:
String
,
val
normalizedNumber
:
String
,
val
numberToCompare
:
String
,
val
contactName
:
String
?
=
null
)
data class
BlockedNumber
(
val
id
:
Long
,
va
r
number
:
String
,
var
normalizedNumber
:
String
,
val
numberToCompare
:
String
,
val
contactName
:
String
?
=
null
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment