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
a61e3949
Commit
a61e3949
authored
Dec 02, 2025
by
zhangchengbo
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat:优化[设置-管理黑名单]列表展示脱敏号码,黑名单手机号均为正常号码(脱敏号码无效,加密后的手机号无法与正常手机号匹配)…
feat:优化[设置-管理黑名单]列表展示脱敏号码,黑名单手机号均为正常号码(脱敏号码无效,加密后的手机号无法与正常手机号匹配) 2.通过是否是顺丰号码对黑名单进行脱敏展示,黑名单中手机号的[加入/移除]均为正常手机号码
parent
fd989360
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
93 additions
and
100 deletions
+93
-100
ThreadActivity.kt
...main/kotlin/com/secspace/sms/activities/ThreadActivity.kt
+20
-40
ManageBlockedNumbersActivity.kt
...etools/commons/activities/ManageBlockedNumbersActivity.kt
+14
-41
ManageBlockedNumbersScreen.kt
...ols/commons/compose/screens/ManageBlockedNumbersScreen.kt
+39
-16
Context.kt
...otlin/com/simplemobiletools/commons/extensions/Context.kt
+20
-3
No files found.
app/src/main/kotlin/com/secspace/sms/activities/ThreadActivity.kt
View file @
a61e3949
...
@@ -56,7 +56,6 @@ import com.secspace.sms.extensions.*
...
@@ -56,7 +56,6 @@ import com.secspace.sms.extensions.*
import
com.secspace.sms.helpers.*
import
com.secspace.sms.helpers.*
import
com.secspace.sms.messaging.*
import
com.secspace.sms.messaging.*
import
com.secspace.sms.models.*
import
com.secspace.sms.models.*
import
com.secspace.sms.util.AES
import
com.simplemobiletools.commons.dialogs.ConfirmationDialog
import
com.simplemobiletools.commons.dialogs.ConfirmationDialog
import
com.simplemobiletools.commons.dialogs.PermissionRequiredDialog
import
com.simplemobiletools.commons.dialogs.PermissionRequiredDialog
import
com.simplemobiletools.commons.dialogs.RadioGroupDialog
import
com.simplemobiletools.commons.dialogs.RadioGroupDialog
...
@@ -249,19 +248,9 @@ class ThreadActivity : SimpleActivity() {
...
@@ -249,19 +248,9 @@ class ThreadActivity : SimpleActivity() {
Log
.
d
(
TAG
,
"refreshMenuItems: firstPhoneNumber = $firstPhoneNumber"
)
Log
.
d
(
TAG
,
"refreshMenuItems: firstPhoneNumber = $firstPhoneNumber"
)
val
blockedNumbers
=
getBlockedNumbers
().
map
{
it
.
number
}
val
blockedNumbers
=
getBlockedNumbers
().
map
{
it
.
number
}
Log
.
d
(
TAG
,
"refreshMenuItems: blockedNumbers = $blockedNumbers "
)
Log
.
d
(
TAG
,
"refreshMenuItems: blockedNumbers = $blockedNumbers "
)
var
encryptNumber
=
""
var
isContainsNumber
=
false
val
isSFNumber
=
conversation
?.
isSFNumber
?:
false
val
isSFNumber
=
conversation
?.
isSFNumber
?:
false
Log
.
d
(
TAG
,
"refreshMenuItems: isSFNumber =$isSFNumber "
)
Log
.
d
(
TAG
,
"refreshMenuItems: isSFNumber =$isSFNumber "
)
if
(
isSFNumber
)
{
val
isContainsNumber
=
blockedNumbers
.
contains
(
firstPhoneNumber
)
encryptNumber
=
AES
.
encrypt
(
firstPhoneNumber
)
Log
.
d
(
TAG
,
"refreshMenuItems: encryptNumber = $encryptNumber "
)
isContainsNumber
=
blockedNumbers
.
contains
(
encryptNumber
)
}
else
{
isContainsNumber
=
blockedNumbers
.
contains
(
firstPhoneNumber
)
}
Log
.
d
(
TAG
,
"refreshMenuItems: isContainsNumber = $isContainsNumber "
)
Log
.
d
(
TAG
,
"refreshMenuItems: isContainsNumber = $isContainsNumber "
)
Log
.
d
(
TAG
,
"refreshMenuItems: 获取手机号码 = ${Gson().toJson(conversation)}"
)
Log
.
d
(
TAG
,
"refreshMenuItems: 获取手机号码 = ${Gson().toJson(conversation)}"
)
...
@@ -297,19 +286,9 @@ class ThreadActivity : SimpleActivity() {
...
@@ -297,19 +286,9 @@ class ThreadActivity : SimpleActivity() {
Log
.
d
(
TAG
,
"setupOptionsMenu: firstPhoneNumber = $firstPhoneNumber"
)
Log
.
d
(
TAG
,
"setupOptionsMenu: firstPhoneNumber = $firstPhoneNumber"
)
val
blockedNumbers
=
getBlockedNumbers
().
map
{
it
.
number
}
val
blockedNumbers
=
getBlockedNumbers
().
map
{
it
.
number
}
Log
.
d
(
TAG
,
"setupOptionsMenu: blockedNumbers = $blockedNumbers "
)
Log
.
d
(
TAG
,
"setupOptionsMenu: blockedNumbers = $blockedNumbers "
)
var
encryptNumber
=
""
var
isContainsNumber
=
false
val
isSFNumber
=
conversation
?.
isSFNumber
?:
false
val
isSFNumber
=
conversation
?.
isSFNumber
?:
false
Log
.
d
(
TAG
,
"setupOptionsMenu: isSFNumber =$isSFNumber "
)
Log
.
d
(
TAG
,
"setupOptionsMenu: isSFNumber =$isSFNumber "
)
if
(
isSFNumber
)
{
val
isContainsNumber
=
blockedNumbers
.
contains
(
firstPhoneNumber
)
encryptNumber
=
AES
.
encrypt
(
firstPhoneNumber
)
Log
.
d
(
TAG
,
"setupOptionsMenu: encryptNumber = $encryptNumber "
)
isContainsNumber
=
blockedNumbers
.
contains
(
encryptNumber
)
}
else
{
isContainsNumber
=
blockedNumbers
.
contains
(
firstPhoneNumber
)
}
Log
.
d
(
TAG
,
"setupOptionsMenu: isContainsNumber = $isContainsNumber "
)
Log
.
d
(
TAG
,
"setupOptionsMenu: isContainsNumber = $isContainsNumber "
)
Log
.
d
(
TAG
,
"setupOptionsMenu: 获取手机号码 = ${Gson().toJson(conversation)}"
)
Log
.
d
(
TAG
,
"setupOptionsMenu: 获取手机号码 = ${Gson().toJson(conversation)}"
)
...
@@ -317,15 +296,11 @@ class ThreadActivity : SimpleActivity() {
...
@@ -317,15 +296,11 @@ class ThreadActivity : SimpleActivity() {
R
.
id
.
delete
->
askConfirmDelete
()
R
.
id
.
delete
->
askConfirmDelete
()
R
.
id
.
block_number
->
{
R
.
id
.
block_number
->
{
if
(
blockedNumbers
.
isNotEmpty
()
&&
isContainsNumber
)
{
if
(
blockedNumbers
.
isNotEmpty
()
&&
isContainsNumber
)
{
if
(
isSFNumber
)
{
deleteBlockedNumber
(
encryptNumber
)
}
else
{
if
(
firstPhoneNumber
!=
null
)
{
if
(
firstPhoneNumber
!=
null
)
{
deleteBlockedNumber
(
firstPhoneNumber
)
deleteBlockedNumber
(
firstPhoneNumber
)
}
}
}
}
else
{
}
else
{
tryBlocking
(
isSFNumber
,
encryptNumber
)
tryBlocking
(
isSFNumber
)
}
}
refreshMenuItems
()
//不刷新 黑名单的状态不正确
refreshMenuItems
()
//不刷新 黑名单的状态不正确
}
/* R.id.restore -> askConfirmRestoreAll()
}
/* R.id.restore -> askConfirmRestoreAll()
...
@@ -982,31 +957,36 @@ class ThreadActivity : SimpleActivity() {
...
@@ -982,31 +957,36 @@ class ThreadActivity : SimpleActivity() {
return
userPreferredSimIdx
?:
senderPreferredSimIdx
?:
systemPreferredSimIdx
?:
0
return
userPreferredSimIdx
?:
senderPreferredSimIdx
?:
systemPreferredSimIdx
?:
0
}
}
private
fun
tryBlocking
(
isSFNumber
:
Boolean
,
encryptNumber
:
String
)
{
private
fun
tryBlocking
(
isSFNumber
:
Boolean
)
{
var
numbersString
=
""
var
numbersString
=
""
val
userName
=
conversation
?.
userName
?:
""
val
userName
=
conversation
?.
userName
?:
""
val
numbers
=
participants
.
getAddresses
()
if
(
userName
.
isNotEmpty
())
{
numbersString
=
if
(
userName
.
isNotEmpty
()
&&
!
userName
.
isPhoneNumber
())
{
//必须是有备注
numbersString
=
userName
userName
}
else
{
}
else
{
val
numbers
=
participants
.
getAddresses
()
if
(
isSFNumber
)
{
numbersString
=
TextUtils
.
join
(
", "
,
numbers
)
TextUtils
.
join
(
", "
,
listOf
(
conversation
?.
phoneNumber
))
}
else
{
TextUtils
.
join
(
", "
,
numbers
)
}
}
}
Log
.
d
(
TAG
,
"tryBlocking: numbers = $numbers"
)
val
question
=
String
.
format
(
resources
.
getString
(
com
.
simplemobiletools
.
commons
.
R
.
string
.
block_confirmation
),
numbersString
)
val
question
=
String
.
format
(
resources
.
getString
(
com
.
simplemobiletools
.
commons
.
R
.
string
.
block_confirmation
),
numbersString
)
// val numbers = participants.getAddresses()
Log
.
d
(
TAG
,
"tryBlocking: question = $question"
)
Log
.
d
(
TAG
,
"tryBlocking: question = $question"
)
ConfirmationDialog
(
this
,
question
)
{
ConfirmationDialog
(
this
,
question
)
{
ensureBackgroundThread
{
ensureBackgroundThread
{
//
numbers.forEach {
numbers
.
forEach
{
// Log.d(TAG, "tryBlocking: phoneNumber = $phoneNumber
")
Log
.
d
(
TAG
,
"tryBlocking: forEach phoneNumber = $it
"
)
if
(
isSFNumber
)
{
if
(
isSFNumber
)
{
addBlockedNumber
(
encryptNumber
)
addBlockedNumber
(
it
,
true
)
}
else
{
}
else
{
addBlockedNumber
(
conversation
?.
phoneNumber
?:
""
)
addBlockedNumber
(
it
,
false
)
}
}
}
// }
refreshMessages
()
refreshMessages
()
}
}
}
}
...
...
commons/src/main/kotlin/com/simplemobiletools/commons/activities/ManageBlockedNumbersActivity.kt
View file @
a61e3949
...
@@ -69,28 +69,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
...
@@ -69,28 +69,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
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.isNullOrEmpty()}"
)
Log
.
d
(
TAG
,
"onCreate: 获取所有黑名单列表 blockedNumbers 是否为空 = ${blockedNumbers.isNullOrEmpty()}"
)
Log
.
d
(
TAG
,
"onCreate: 获取所有黑名单列表 = ${Gson().toJson(blockedNumbers)}"
)
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
)
{
...
@@ -119,7 +98,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
...
@@ -119,7 +98,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
updateBlockedNumbers
()
updateBlockedNumbers
()
}
}
)
{
blockedNumber
->
)
{
blockedNumber
->
android
.
util
.
Log
.
d
(
TAG
,
"onCreate: 添加黑名单手机号 blockedNumber= $blockedNumber length = ${blockedNumber.length}"
)
Log
.
d
(
TAG
,
"onCreate: 添加黑名单手机号 blockedNumber= $blockedNumber length = ${blockedNumber.length}"
)
if
(
blockedNumber
.
length
<
11
||
blockedNumber
.
length
>
11
)
{
if
(
blockedNumber
.
length
<
11
||
blockedNumber
.
length
>
11
)
{
addBlockedNumber
(
blockedNumber
)
addBlockedNumber
(
blockedNumber
)
clickedBlockedNumber
=
null
clickedBlockedNumber
=
null
...
@@ -133,13 +112,12 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
...
@@ -133,13 +112,12 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
Log
.
d
(
TAG
,
"onCreate: 获取过滤顺丰手机号列表数据 = $listSfNumbers"
)
Log
.
d
(
TAG
,
"onCreate: 获取过滤顺丰手机号列表数据 = $listSfNumbers"
)
listSfNumbers
.
forEach
{
number
->
listSfNumbers
.
forEach
{
number
->
if
(!
PhoneFromUtilCommon
.
isNumeric
(
number
))
{
if
(!
PhoneFromUtilCommon
.
isNumeric
(
number
)
&&
!
number
.
isPhoneNumber
())
{
val
decode
=
AESCommon
.
decrypt
(
number
)
val
decodeNumber
=
AESCommon
.
decrypt
(
number
)
Log
.
d
(
TAG
,
"onCreate: 获取顺丰手机号 number = $number decode = $decodeNumber blockedNumber = $blockedNumber"
)
Log
.
d
(
TAG
,
"onCreate: 获取顺丰手机号 number = $number decode = $decode blockedNumber = $blockedNumber"
)
if
(
decodeNumber
==
blockedNumber
)
{
if
(
decode
==
blockedNumber
)
{
Log
.
d
(
TAG
,
"onCreate: if 添加成功黑名单 blockedNumber = $blockedNumber"
)
Log
.
d
(
TAG
,
"onCreate: if 添加成功黑名单 blockedNumber = $blockedNumber"
)
addBlockedNumber
(
number
)
addBlockedNumber
(
blockedNumber
,
true
)
}
else
{
}
else
{
addBlockedNumber
(
blockedNumber
)
addBlockedNumber
(
blockedNumber
)
Log
.
d
(
TAG
,
"onCreate: else 添加成功黑名单 blockedNumber = $blockedNumber"
)
Log
.
d
(
TAG
,
"onCreate: else 添加成功黑名单 blockedNumber = $blockedNumber"
)
...
@@ -178,7 +156,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
...
@@ -178,7 +156,7 @@ 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: 单个删除模式
blockedNumbers = $blockedNumbers
selectedKeys = $selectedKeys"
)
if
(
selectedKeys
.
size
==
1
)
{
if
(
selectedKeys
.
size
==
1
)
{
deleteBlockedNumbers
(
blockedNumbers
,
selectedKeys
)
deleteBlockedNumbers
(
blockedNumbers
,
selectedKeys
)
return
@ManageBlockedNumbersScreen
return
@ManageBlockedNumbersScreen
...
@@ -192,7 +170,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
...
@@ -192,7 +170,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: 单个删除模式
blockedNumbers = $blockedNumbers
$confirmationText YES"
)
deleteBlockedNumbers
(
blockedNumbers
,
selectedKeys
)
deleteBlockedNumbers
(
blockedNumbers
,
selectedKeys
)
}
}
},
},
...
@@ -210,12 +188,8 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
...
@@ -210,12 +188,8 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
ConfirmationDialog
(
this
,
confirmationText
)
{
ConfirmationDialog
(
this
,
confirmationText
)
{
Log
.
d
(
TAG
,
"onCreate: 全选删除模式 $confirmationText YES"
)
Log
.
d
(
TAG
,
"onCreate: 全选删除模式 $confirmationText YES"
)
blockedNumbers
!!
.
forEach
{
blockedNumber
->
blockedNumbers
!!
.
forEach
{
blockedNumber
->
if
(!
PhoneFromUtilCommon
.
isNumeric
(
blockedNumber
.
normalizedNumber
)){
deleteBlockedNumber
(
blockedNumber
.
normalizedNumber
)
}
else
{
deleteBlockedNumber
(
blockedNumber
.
number
)
deleteBlockedNumber
(
blockedNumber
.
number
)
}
}
}
Log
.
d
(
TAG
,
"onCreate: 全选删除模式 已成功删除所有黑名单数据!"
)
Log
.
d
(
TAG
,
"onCreate: 全选删除模式 已成功删除所有黑名单数据!"
)
updateBlockedNumbers
()
updateBlockedNumbers
()
}
}
...
@@ -236,12 +210,8 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
...
@@ -236,12 +210,8 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
blockedNumbers
.
filter
{
blockedNumber
->
selectedKeys
.
contains
(
blockedNumber
.
id
)
}
blockedNumbers
.
filter
{
blockedNumber
->
selectedKeys
.
contains
(
blockedNumber
.
id
)
}
.
forEach
{
blockedNumber
->
.
forEach
{
blockedNumber
->
Log
.
d
(
TAG
,
"onCreate: blockedNumber = ${blockedNumber.number} normalizedNumber = ${blockedNumber.normalizedNumber}"
)
Log
.
d
(
TAG
,
"onCreate: blockedNumber = ${blockedNumber.number} normalizedNumber = ${blockedNumber.normalizedNumber}"
)
if
(!
PhoneFromUtilCommon
.
isNumeric
(
blockedNumber
.
normalizedNumber
)){
deleteBlockedNumber
(
blockedNumber
.
normalizedNumber
)
}
else
{
deleteBlockedNumber
(
blockedNumber
.
number
)
deleteBlockedNumber
(
blockedNumber
.
number
)
}
}
}
updateBlockedNumbers
()
updateBlockedNumbers
()
Log
.
d
(
TAG
,
"onCreate: 单个删除模式 已成功删除所有黑名单数据!"
)
Log
.
d
(
TAG
,
"onCreate: 单个删除模式 已成功删除所有黑名单数据!"
)
}
}
...
@@ -416,9 +386,12 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
...
@@ -416,9 +386,12 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
fun
updateBlockedNumbers
()
{
fun
updateBlockedNumbers
()
{
viewModelScope
.
launch
{
viewModelScope
.
launch
{
withContext
(
Dispatchers
.
IO
)
{
withContext
(
Dispatchers
.
IO
)
{
application
.
getBlockedNumbersWithContact
{
list
->
val
list
=
application
.
getBlockedNumbers
()
_blockedNumbers
.
update
{
list
.
toImmutableList
()
}
_blockedNumbers
.
update
{
list
.
toImmutableList
()
}
}
// application.getBlockedNumbersWithContact { list ->
// _blockedNumbers.update { list.toImmutableList() }
// }
}
}
}
}
}
}
...
...
commons/src/main/kotlin/com/simplemobiletools/commons/compose/screens/ManageBlockedNumbersScreen.kt
View file @
a61e3949
package
com.simplemobiletools.commons.compose.screens
package
com.simplemobiletools.commons.compose.screens
import
android.util.Log
import
androidx.activity.compose.BackHandler
import
androidx.activity.compose.BackHandler
import
androidx.compose.animation.Crossfade
import
androidx.compose.animation.core.FastOutLinearInEasing
import
androidx.compose.animation.core.tween
import
androidx.compose.foundation.clickable
import
androidx.compose.foundation.clickable
import
androidx.compose.foundation.combinedClickable
import
androidx.compose.foundation.combinedClickable
import
androidx.compose.foundation.gestures.scrollBy
import
androidx.compose.foundation.gestures.scrollBy
...
@@ -38,9 +36,9 @@ import androidx.compose.ui.text.font.FontWeight
...
@@ -38,9 +36,9 @@ import androidx.compose.ui.text.font.FontWeight
import
androidx.compose.ui.text.style.TextAlign
import
androidx.compose.ui.text.style.TextAlign
import
androidx.compose.ui.text.style.TextDecoration
import
androidx.compose.ui.text.style.TextDecoration
import
androidx.compose.ui.text.style.TextOverflow
import
androidx.compose.ui.text.style.TextOverflow
import
androidx.compose.ui.tooling.preview.PreviewParameter
import
androidx.compose.ui.unit.dp
import
androidx.compose.ui.unit.dp
import
androidx.compose.ui.unit.sp
import
androidx.compose.ui.unit.sp
import
com.google.gson.Gson
import
com.simplemobiletools.commons.R
import
com.simplemobiletools.commons.R
import
com.simplemobiletools.commons.compose.components.SimpleDropDownMenuItem
import
com.simplemobiletools.commons.compose.components.SimpleDropDownMenuItem
import
com.simplemobiletools.commons.compose.extensions.*
import
com.simplemobiletools.commons.compose.extensions.*
...
@@ -48,14 +46,16 @@ import com.simplemobiletools.commons.compose.lists.*
...
@@ -48,14 +46,16 @@ import com.simplemobiletools.commons.compose.lists.*
import
com.simplemobiletools.commons.compose.menus.ActionItem
import
com.simplemobiletools.commons.compose.menus.ActionItem
import
com.simplemobiletools.commons.compose.menus.ActionMenu
import
com.simplemobiletools.commons.compose.menus.ActionMenu
import
com.simplemobiletools.commons.compose.menus.OverflowMode
import
com.simplemobiletools.commons.compose.menus.OverflowMode
import
com.simplemobiletools.commons.compose.settings.SettingsCheckBoxComponent
import
com.simplemobiletools.commons.compose.settings.SettingsHorizontalDivider
import
com.simplemobiletools.commons.compose.system_ui_controller.rememberSystemUiController
import
com.simplemobiletools.commons.compose.system_ui_controller.rememberSystemUiController
import
com.simplemobiletools.commons.compose.theme.*
import
com.simplemobiletools.commons.compose.theme.*
import
com.simplemobiletools.commons.compose.theme.model.Theme
import
com.simplemobiletools.commons.compose.theme.model.Theme
import
com.simplemobiletools.commons.extensions.darkenColor
import
com.simplemobiletools.commons.extensions.darkenColor
import
com.simplemobiletools.commons.extensions.getContrastColor
import
com.simplemobiletools.commons.extensions.getContrastColor
import
com.simplemobiletools.commons.extensions.isPhoneNumber
import
com.simplemobiletools.commons.models.BlockedNumber
import
com.simplemobiletools.commons.models.BlockedNumber
import
com.simplemobiletools.commons.utils.AESCommon
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.delay
import
kotlinx.coroutines.delay
...
@@ -84,7 +84,7 @@ internal fun ManageBlockedNumbersScreen(
...
@@ -84,7 +84,7 @@ internal fun ManageBlockedNumbersScreen(
onDelete
:
(
Set
<
Long
>)
->
Unit
,
onDelete
:
(
Set
<
Long
>)
->
Unit
,
onEdit
:
(
BlockedNumber
)
->
Unit
,
onEdit
:
(
BlockedNumber
)
->
Unit
,
onCopy
:
(
BlockedNumber
)
->
Unit
,
onCopy
:
(
BlockedNumber
)
->
Unit
,
selectAllBlock
:
()->
Unit
selectAllBlock
:
()
->
Unit
)
{
)
{
val
dimens
=
SimpleTheme
.
dimens
val
dimens
=
SimpleTheme
.
dimens
val
startingPadding
=
remember
{
Modifier
.
padding
(
horizontal
=
dimens
.
padding
.
small
)
}
val
startingPadding
=
remember
{
Modifier
.
padding
(
horizontal
=
dimens
.
padding
.
small
)
}
...
@@ -108,7 +108,20 @@ internal fun ManageBlockedNumbersScreen(
...
@@ -108,7 +108,20 @@ internal fun ManageBlockedNumbersScreen(
contrastColor
:
Color
->
contrastColor
:
Color
->
Column
{
Column
{
Crossfade
(
targetState
=
isInActionMode
,
label
=
"toolbar-anim"
,
animationSpec
=
tween
(
easing
=
FastOutLinearInEasing
))
{
actionMode
->
NonActionModeToolbar
(
scrolledColor
=
scrolledColor
,
navigationInteractionSource
=
navigationInteractionSource
,
goBack
=
goBack
,
scrollBehavior
=
scrollBehavior
,
statusBarColor
=
statusBarColor
,
colorTransitionFraction
=
colorTransitionFraction
,
contrastColor
=
contrastColor
,
onAdd
=
onAdd
,
onImportBlockedNumbers
=
onImportBlockedNumbers
,
onExportBlockedNumbers
=
onExportBlockedNumbers
,
selectAllBlock
=
selectAllBlock
)
/* Crossfade(targetState = isInActionMode, label = "toolbar-anim", animationSpec = tween(easing = FastOutLinearInEasing)) { actionMode ->
com.secspace.log.Log.d("","actionMode = $actionMode blockedNumbers = ${blockedNumbers != null}" )
com.secspace.log.Log.d("","actionMode = $actionMode blockedNumbers = ${blockedNumbers != null}" )
if (actionMode && blockedNumbers != null) {
if (actionMode && blockedNumbers != null) {
ActionModeToolbar(
ActionModeToolbar(
...
@@ -144,7 +157,7 @@ internal fun ManageBlockedNumbersScreen(
...
@@ -144,7 +157,7 @@ internal fun ManageBlockedNumbersScreen(
}
}
}
}
/*
SettingsCheckBoxComponent(
SettingsCheckBoxComponent(
label = if (isDialer) stringResource(id = R.string.block_not_stored_calls) else stringResource(id = R.string.block_not_stored_messages),
label = if (isDialer) stringResource(id = R.string.block_not_stored_calls) else stringResource(id = R.string.block_not_stored_messages),
initialValue = isBlockUnknownSelected,
initialValue = isBlockUnknownSelected,
onChange = onBlockUnknownSelectedChange,
onChange = onBlockUnknownSelectedChange,
...
@@ -322,18 +335,18 @@ private fun BlockedNumber(
...
@@ -322,18 +335,18 @@ private fun BlockedNumber(
onCopy
:
(
BlockedNumber
)
->
Unit
,
onCopy
:
(
BlockedNumber
)
->
Unit
,
isSelected
:
Boolean
isSelected
:
Boolean
)
{
)
{
val
hasContactName
=
/*blockedNumber.contactName != null*/
false
val
hasContactName
=
blockedNumber
.
contactName
!=
null
val
contactNameContent
=
remember
{
val
contactNameContent
=
remember
{
movableContentOf
{
movableContentOf
{
Text
(
Text
(
text
=
/*blockedNumber.contactName.toString()*/
""
,
text
=
blockedNumber
.
contactName
.
toString
()
,
modifier
=
modifier
.
padding
(
horizontal
=
SimpleTheme
.
dimens
.
padding
.
medium
,
vertical
=
SimpleTheme
.
dimens
.
padding
.
extraSmall
)
modifier
=
modifier
.
padding
(
horizontal
=
SimpleTheme
.
dimens
.
padding
.
medium
,
vertical
=
SimpleTheme
.
dimens
.
padding
.
extraSmall
)
)
)
}
}
}
}
val
blockedNumberContent
=
remember
{
val
blockedNumberContent
=
remember
{
movableContentOf
{
movableContentOf
{
BlockedNumberHeadlineContent
(
blockedNumber
=
blockedNumber
,
hasContactName
=
hasContactName
)
BlockedNumberHeadlineContent
(
blockedNumber
=
blockedNumber
,
hasContactName
=
hasContactName
)
}
}
}
}
ListItem
(
ListItem
(
...
@@ -382,8 +395,18 @@ private fun blockedNumberListItemColors(
...
@@ -382,8 +395,18 @@ private fun blockedNumberListItemColors(
@Composable
@Composable
private
fun
BlockedNumberHeadlineContent
(
modifier
:
Modifier
=
Modifier
,
blockedNumber
:
BlockedNumber
,
hasContactName
:
Boolean
)
{
private
fun
BlockedNumberHeadlineContent
(
modifier
:
Modifier
=
Modifier
,
blockedNumber
:
BlockedNumber
,
hasContactName
:
Boolean
)
{
Log
.
d
(
"ManageBlockedNumbersScreen"
,
"BlockedNumberHeadlineContent: blockedNumber = ${Gson().toJson(blockedNumber)}"
)
var
showNumber
=
""
if
(!
blockedNumber
.
normalizedNumber
.
isPhoneNumber
()
||
!
PhoneFromUtilCommon
.
isNumeric
(
blockedNumber
.
normalizedNumber
))
{
val
decryptResult
=
AESCommon
.
decrypt
(
blockedNumber
.
normalizedNumber
)
if
(
decryptResult
.
isPhoneNumber
())
{
showNumber
=
PhoneUtilsCommon
.
phoneConvert
(
decryptResult
)
}
}
else
{
showNumber
=
blockedNumber
.
number
}
Text
(
Text
(
text
=
blockedNumber
.
n
umber
,
text
=
showN
umber
,
modifier
=
modifier
.
padding
(
horizontal
=
SimpleTheme
.
dimens
.
padding
.
medium
),
modifier
=
modifier
.
padding
(
horizontal
=
SimpleTheme
.
dimens
.
padding
.
medium
),
color
=
if
(
hasContactName
)
LocalContentColor
.
current
.
copy
(
alpha
=
0.7f
)
else
LocalContentColor
.
current
color
=
if
(
hasContactName
)
LocalContentColor
.
current
.
copy
(
alpha
=
0.7f
)
else
LocalContentColor
.
current
)
)
...
@@ -546,7 +569,7 @@ private fun NonActionModeToolbar(
...
@@ -546,7 +569,7 @@ private fun NonActionModeToolbar(
onAdd
:
()
->
Unit
,
onAdd
:
()
->
Unit
,
onImportBlockedNumbers
:
()
->
Unit
,
onImportBlockedNumbers
:
()
->
Unit
,
onExportBlockedNumbers
:
()
->
Unit
,
onExportBlockedNumbers
:
()
->
Unit
,
selectAllBlock
:
()
->
Unit
selectAllBlock
:
()
->
Unit
)
{
)
{
SimpleScaffoldTopBar
(
SimpleScaffoldTopBar
(
title
=
{
scrolledTextColor
->
title
=
{
scrolledTextColor
->
...
@@ -656,7 +679,7 @@ private fun LazyListScope.noPermissionToBlock(
...
@@ -656,7 +679,7 @@ private fun LazyListScope.noPermissionToBlock(
}
}
}
}
@MyDevices
/*
@MyDevices
@Composable
@Composable
private fun ManageBlockedNumbersScreenPreview(@PreviewParameter(BooleanPreviewParameterProvider::class) isDialer: Boolean) {
private fun ManageBlockedNumbersScreenPreview(@PreviewParameter(BooleanPreviewParameterProvider::class) isDialer: Boolean) {
AppThemeSurface {
AppThemeSurface {
...
@@ -688,4 +711,4 @@ private fun ManageBlockedNumbersScreenPreview(@PreviewParameter(BooleanPreviewPa
...
@@ -688,4 +711,4 @@ private fun ManageBlockedNumbersScreenPreview(@PreviewParameter(BooleanPreviewPa
selectAllBlock = {},
selectAllBlock = {},
)
)
}
}
}
}
*/
commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context.kt
View file @
a61e3949
...
@@ -27,6 +27,7 @@ import android.provider.OpenableColumns
...
@@ -27,6 +27,7 @@ import android.provider.OpenableColumns
import
android.provider.Settings
import
android.provider.Settings
import
android.telecom.TelecomManager
import
android.telecom.TelecomManager
import
android.telephony.PhoneNumberUtils
import
android.telephony.PhoneNumberUtils
import
android.util.Log
import
android.view.LayoutInflater
import
android.view.LayoutInflater
import
android.view.View
import
android.view.View
import
android.view.WindowManager
import
android.view.WindowManager
...
@@ -48,6 +49,7 @@ import com.simplemobiletools.commons.R
...
@@ -48,6 +49,7 @@ import com.simplemobiletools.commons.R
import
com.simplemobiletools.commons.helpers.*
import
com.simplemobiletools.commons.helpers.*
import
com.simplemobiletools.commons.models.AlarmSound
import
com.simplemobiletools.commons.models.AlarmSound
import
com.simplemobiletools.commons.models.BlockedNumber
import
com.simplemobiletools.commons.models.BlockedNumber
import
com.simplemobiletools.commons.utils.AESCommon
import
java.io.File
import
java.io.File
import
java.text.SimpleDateFormat
import
java.text.SimpleDateFormat
import
java.util.Date
import
java.util.Date
...
@@ -1069,6 +1071,8 @@ fun Context.getBlockedNumbersWithContact(callback: (ArrayList<BlockedNumber>) ->
...
@@ -1069,6 +1071,8 @@ fun Context.getBlockedNumbersWithContact(callback: (ArrayList<BlockedNumber>) ->
}
}
}
}
private
val
TAG
=
"ContextCommon"
@TargetApi
(
Build
.
VERSION_CODES
.
N
)
@TargetApi
(
Build
.
VERSION_CODES
.
N
)
fun
Context
.
getBlockedNumbers
():
ArrayList
<
BlockedNumber
>
{
fun
Context
.
getBlockedNumbers
():
ArrayList
<
BlockedNumber
>
{
val
blockedNumbers
=
ArrayList
<
BlockedNumber
>()
val
blockedNumbers
=
ArrayList
<
BlockedNumber
>()
...
@@ -1088,19 +1092,31 @@ fun Context.getBlockedNumbers(): ArrayList<BlockedNumber> {
...
@@ -1088,19 +1092,31 @@ fun Context.getBlockedNumbers(): ArrayList<BlockedNumber> {
val
number
=
cursor
.
getStringValue
(
BlockedNumbers
.
COLUMN_ORIGINAL_NUMBER
)
?:
""
val
number
=
cursor
.
getStringValue
(
BlockedNumbers
.
COLUMN_ORIGINAL_NUMBER
)
?:
""
val
normalizedNumber
=
cursor
.
getStringValue
(
BlockedNumbers
.
COLUMN_E164_NUMBER
)
?:
number
val
normalizedNumber
=
cursor
.
getStringValue
(
BlockedNumbers
.
COLUMN_E164_NUMBER
)
?:
number
val
comparableNumber
=
normalizedNumber
.
trimToComparableNumber
()
val
comparableNumber
=
normalizedNumber
.
trimToComparableNumber
()
val
blockedNumber
=
BlockedNumber
(
id
,
number
,
normalizedNumber
,
comparableNumber
)
Log
.
d
(
TAG
,
"getBlockedNumbersWithContact: 黑名单信息 number = $number normalizedNumber = $normalizedNumber comparableNumber = $comparableNumber"
)
val
blockedNumber
=
BlockedNumber
(
id
,
number
,
normalizedNumber
,
comparableNumber
,
null
)
Log
.
d
(
TAG
,
"getBlockedNumbersWithContact: blockedNumber = ${Gson().toJson(blockedNumber)}"
)
blockedNumbers
.
add
(
blockedNumber
)
blockedNumbers
.
add
(
blockedNumber
)
Log
.
d
(
TAG
,
"getBlockedNumbersWithContact: blockedNumbers 长度 = ${blockedNumbers.size}"
)
}
}
return
blockedNumbers
return
blockedNumbers
}
}
/**
* 确保传入的number 必须是 正常的手机号码格式
* isSfEncryptNumber 判断是否是顺丰号码
*/
@TargetApi
(
Build
.
VERSION_CODES
.
N
)
@TargetApi
(
Build
.
VERSION_CODES
.
N
)
fun
Context
.
addBlockedNumber
(
number
:
String
):
Boolean
{
fun
Context
.
addBlockedNumber
(
number
:
String
,
isSfEncryptNumber
:
Boolean
=
false
):
Boolean
{
Log
.
d
(
TAG
,
"addBlockedNumber: 接收的手机号 number = $number 是否对该号码进行加密操作 = $isSfEncryptNumber"
)
ContentValues
().
apply
{
ContentValues
().
apply
{
put
(
BlockedNumbers
.
COLUMN_ORIGINAL_NUMBER
,
number
)
put
(
BlockedNumbers
.
COLUMN_ORIGINAL_NUMBER
,
number
)
if
(
number
.
isPhoneNumber
())
{
if
(
number
.
isPhoneNumber
()
&&
!
isSfEncryptNumber
)
{
put
(
BlockedNumbers
.
COLUMN_E164_NUMBER
,
PhoneNumberUtils
.
normalizeNumber
(
number
))
put
(
BlockedNumbers
.
COLUMN_E164_NUMBER
,
PhoneNumberUtils
.
normalizeNumber
(
number
))
}
else
{
put
(
BlockedNumbers
.
COLUMN_E164_NUMBER
,
AESCommon
.
encrypt
(
number
))
}
}
try
{
try
{
contentResolver
.
insert
(
BlockedNumbers
.
CONTENT_URI
,
this
)
contentResolver
.
insert
(
BlockedNumbers
.
CONTENT_URI
,
this
)
...
@@ -1114,6 +1130,7 @@ fun Context.addBlockedNumber(number: String): Boolean {
...
@@ -1114,6 +1130,7 @@ fun Context.addBlockedNumber(number: String): Boolean {
@TargetApi
(
Build
.
VERSION_CODES
.
N
)
@TargetApi
(
Build
.
VERSION_CODES
.
N
)
fun
Context
.
deleteBlockedNumber
(
number
:
String
):
Boolean
{
fun
Context
.
deleteBlockedNumber
(
number
:
String
):
Boolean
{
Log
.
d
(
TAG
,
"deleteBlockedNumber: 接收的手机号 number = $number "
)
val
selection
=
"${BlockedNumbers.COLUMN_ORIGINAL_NUMBER} = ?"
val
selection
=
"${BlockedNumbers.COLUMN_ORIGINAL_NUMBER} = ?"
val
selectionArgs
=
arrayOf
(
number
)
val
selectionArgs
=
arrayOf
(
number
)
...
...
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