Commit a61e3949 by zhangchengbo

feat:优化[设置-管理黑名单]列表展示脱敏号码,黑名单手机号均为正常号码(脱敏号码无效,加密后的手机号无法与正常手机号匹配)…

feat:优化[设置-管理黑名单]列表展示脱敏号码,黑名单手机号均为正常号码(脱敏号码无效,加密后的手机号无法与正常手机号匹配) 2.通过是否是顺丰号码对黑名单进行脱敏展示,黑名单中手机号的[加入/移除]均为正常手机号码
parent fd989360
......@@ -56,7 +56,6 @@ import com.secspace.sms.extensions.*
import com.secspace.sms.helpers.*
import com.secspace.sms.messaging.*
import com.secspace.sms.models.*
import com.secspace.sms.util.AES
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.PermissionRequiredDialog
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
......@@ -249,19 +248,9 @@ class ThreadActivity : SimpleActivity() {
Log.d(TAG, "refreshMenuItems: firstPhoneNumber = $firstPhoneNumber")
val blockedNumbers = getBlockedNumbers().map { it.number }
Log.d(TAG, "refreshMenuItems: blockedNumbers = $blockedNumbers ")
var encryptNumber = ""
var isContainsNumber = false
val isSFNumber = conversation?.isSFNumber ?: false
Log.d(TAG, "refreshMenuItems: isSFNumber =$isSFNumber ")
if (isSFNumber) {
encryptNumber = AES.encrypt(firstPhoneNumber)
Log.d(TAG, "refreshMenuItems: encryptNumber = $encryptNumber ")
isContainsNumber = blockedNumbers.contains(encryptNumber)
} else {
isContainsNumber = blockedNumbers.contains(firstPhoneNumber)
}
val isContainsNumber = blockedNumbers.contains(firstPhoneNumber)
Log.d(TAG, "refreshMenuItems: isContainsNumber = $isContainsNumber ")
Log.d(TAG, "refreshMenuItems: 获取手机号码 = ${Gson().toJson(conversation)}")
......@@ -297,19 +286,9 @@ class ThreadActivity : SimpleActivity() {
Log.d(TAG, "setupOptionsMenu: firstPhoneNumber = $firstPhoneNumber")
val blockedNumbers = getBlockedNumbers().map { it.number }
Log.d(TAG, "setupOptionsMenu: blockedNumbers = $blockedNumbers ")
var encryptNumber = ""
var isContainsNumber = false
val isSFNumber = conversation?.isSFNumber ?: false
Log.d(TAG, "setupOptionsMenu: isSFNumber =$isSFNumber ")
if (isSFNumber) {
encryptNumber = AES.encrypt(firstPhoneNumber)
Log.d(TAG, "setupOptionsMenu: encryptNumber = $encryptNumber ")
isContainsNumber = blockedNumbers.contains(encryptNumber)
} else {
isContainsNumber = blockedNumbers.contains(firstPhoneNumber)
}
val isContainsNumber = blockedNumbers.contains(firstPhoneNumber)
Log.d(TAG, "setupOptionsMenu: isContainsNumber = $isContainsNumber ")
Log.d(TAG, "setupOptionsMenu: 获取手机号码 = ${Gson().toJson(conversation)}")
......@@ -317,15 +296,11 @@ class ThreadActivity : SimpleActivity() {
R.id.delete -> askConfirmDelete()
R.id.block_number -> {
if (blockedNumbers.isNotEmpty() && isContainsNumber) {
if (isSFNumber) {
deleteBlockedNumber(encryptNumber)
} else {
if (firstPhoneNumber != null) {
deleteBlockedNumber(firstPhoneNumber)
}
if (firstPhoneNumber != null) {
deleteBlockedNumber(firstPhoneNumber)
}
} else {
tryBlocking(isSFNumber, encryptNumber)
tryBlocking(isSFNumber)
}
refreshMenuItems()//不刷新 黑名单的状态不正确
}/* R.id.restore -> askConfirmRestoreAll()
......@@ -982,31 +957,36 @@ class ThreadActivity : SimpleActivity() {
return userPreferredSimIdx ?: senderPreferredSimIdx ?: systemPreferredSimIdx ?: 0
}
private fun tryBlocking(isSFNumber: Boolean, encryptNumber: String) {
private fun tryBlocking(isSFNumber: Boolean) {
var numbersString = ""
val userName = conversation?.userName ?: ""
val numbers = participants.getAddresses()
if (userName.isNotEmpty()) {
numbersString = userName
numbersString = if (userName.isNotEmpty() && !userName.isPhoneNumber()) {//必须是有备注
userName
} else {
val numbers = participants.getAddresses()
numbersString = TextUtils.join(", ", numbers)
if (isSFNumber) {
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 numbers = participants.getAddresses()
Log.d(TAG, "tryBlocking: question = $question")
ConfirmationDialog(this, question) {
ensureBackgroundThread {
// numbers.forEach {
// Log.d(TAG, "tryBlocking: phoneNumber = $phoneNumber")
if (isSFNumber) {
addBlockedNumber(encryptNumber)
} else {
addBlockedNumber(conversation?.phoneNumber ?: "")
numbers.forEach {
Log.d(TAG, "tryBlocking: forEach phoneNumber = $it")
if (isSFNumber) {
addBlockedNumber(it, true)
} else {
addBlockedNumber(it, false)
}
}
// }
refreshMessages()
}
}
......
......@@ -69,28 +69,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
val context = LocalContext.current
val blockedNumbers by manageBlockedNumbersViewModel.blockedNumbers.collectAsStateWithLifecycle()
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)}")
}
Log.d(TAG, "onCreate: 获取所有黑名单列表 = ${Gson().toJson(blockedNumbers)}")
LaunchedEffect(blockedNumbers) {
if (blockedNumbers?.any { blockedNumber -> blockedNumber.number.isBlockedNumberPattern() } == true) {
......@@ -119,7 +98,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
updateBlockedNumbers()
}
) { 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) {
addBlockedNumber(blockedNumber)
clickedBlockedNumber = null
......@@ -133,13 +112,12 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
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) {
if (!PhoneFromUtilCommon.isNumeric(number) && !number.isPhoneNumber()) {
val decodeNumber = AESCommon.decrypt(number)
Log.d(TAG, "onCreate: 获取顺丰手机号 number = $number decode = $decodeNumber blockedNumber = $blockedNumber")
if (decodeNumber == blockedNumber) {
Log.d(TAG, "onCreate: if 添加成功黑名单 blockedNumber = $blockedNumber")
addBlockedNumber(number)
addBlockedNumber(blockedNumber,true)
}else{
addBlockedNumber(blockedNumber)
Log.d(TAG, "onCreate: else 添加成功黑名单 blockedNumber = $blockedNumber")
......@@ -178,7 +156,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
blockedNumbers = blockedNumbers,
onDelete = { selectedKeys: Set<Long> ->
if (blockedNumbers.isNullOrEmpty()) return@ManageBlockedNumbersScreen
Log.d(TAG, "onCreate: 单个删除模式 selectedKeys = $selectedKeys")
Log.d(TAG, "onCreate: 单个删除模式 blockedNumbers = $blockedNumbers selectedKeys = $selectedKeys")
if (selectedKeys.size == 1) {
deleteBlockedNumbers(blockedNumbers, selectedKeys)
return@ManageBlockedNumbersScreen
......@@ -192,7 +170,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
"${getString(R.string.you_sure_delete_choose_blocked_numbers)}\n\n${getString(R.string.cannot_be_undone)}"
}
ConfirmationDialog(this, confirmationText) {
Log.d(TAG, "onCreate: 单个删除模式 $confirmationText YES")
Log.d(TAG, "onCreate: 单个删除模式 blockedNumbers = $blockedNumbers $confirmationText YES")
deleteBlockedNumbers(blockedNumbers, selectedKeys)
}
},
......@@ -210,11 +188,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
ConfirmationDialog(this, confirmationText) {
Log.d(TAG, "onCreate: 全选删除模式 $confirmationText YES")
blockedNumbers!!.forEach { blockedNumber ->
if(!PhoneFromUtilCommon.isNumeric(blockedNumber.normalizedNumber)){
deleteBlockedNumber(blockedNumber.normalizedNumber )
}else{
deleteBlockedNumber(blockedNumber.number )
}
deleteBlockedNumber(blockedNumber.number )
}
Log.d(TAG, "onCreate: 全选删除模式 已成功删除所有黑名单数据!")
updateBlockedNumbers()
......@@ -236,11 +210,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
blockedNumbers.filter { blockedNumber -> selectedKeys.contains(blockedNumber.id) }
.forEach { blockedNumber ->
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()
Log.d(TAG, "onCreate: 单个删除模式 已成功删除所有黑名单数据!")
......@@ -416,9 +386,12 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() {
fun updateBlockedNumbers() {
viewModelScope.launch {
withContext(Dispatchers.IO) {
application.getBlockedNumbersWithContact { list ->
_blockedNumbers.update { list.toImmutableList() }
}
val list = application.getBlockedNumbers()
_blockedNumbers.update { list.toImmutableList() }
// application.getBlockedNumbersWithContact { list ->
// _blockedNumbers.update { list.toImmutableList() }
// }
}
}
}
......
......@@ -27,6 +27,7 @@ import android.provider.OpenableColumns
import android.provider.Settings
import android.telecom.TelecomManager
import android.telephony.PhoneNumberUtils
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.WindowManager
......@@ -48,6 +49,7 @@ import com.simplemobiletools.commons.R
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.AlarmSound
import com.simplemobiletools.commons.models.BlockedNumber
import com.simplemobiletools.commons.utils.AESCommon
import java.io.File
import java.text.SimpleDateFormat
import java.util.Date
......@@ -1069,6 +1071,8 @@ fun Context.getBlockedNumbersWithContact(callback: (ArrayList<BlockedNumber>) ->
}
}
private val TAG = "ContextCommon"
@TargetApi(Build.VERSION_CODES.N)
fun Context.getBlockedNumbers(): ArrayList<BlockedNumber> {
val blockedNumbers = ArrayList<BlockedNumber>()
......@@ -1088,19 +1092,31 @@ fun Context.getBlockedNumbers(): ArrayList<BlockedNumber> {
val number = cursor.getStringValue(BlockedNumbers.COLUMN_ORIGINAL_NUMBER) ?: ""
val normalizedNumber = cursor.getStringValue(BlockedNumbers.COLUMN_E164_NUMBER) ?: number
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)
Log.d(TAG, "getBlockedNumbersWithContact: blockedNumbers 长度 = ${blockedNumbers.size}")
}
return blockedNumbers
}
/**
* 确保传入的number 必须是 正常的手机号码格式
* isSfEncryptNumber 判断是否是顺丰号码
*/
@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 {
put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, number)
if (number.isPhoneNumber()) {
if (number.isPhoneNumber() && !isSfEncryptNumber) {
put(BlockedNumbers.COLUMN_E164_NUMBER, PhoneNumberUtils.normalizeNumber(number))
} else {
put(BlockedNumbers.COLUMN_E164_NUMBER, AESCommon.encrypt(number))
}
try {
contentResolver.insert(BlockedNumbers.CONTENT_URI, this)
......@@ -1114,6 +1130,7 @@ fun Context.addBlockedNumber(number: String): Boolean {
@TargetApi(Build.VERSION_CODES.N)
fun Context.deleteBlockedNumber(number: String): Boolean {
Log.d(TAG, "deleteBlockedNumber: 接收的手机号 number = $number ")
val selection = "${BlockedNumbers.COLUMN_ORIGINAL_NUMBER} = ?"
val selectionArgs = arrayOf(number)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment