Commit a61e3949 by zhangchengbo

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

feat:优化[设置-管理黑名单]列表展示脱敏号码,黑名单手机号均为正常号码(脱敏号码无效,加密后的手机号无法与正常手机号匹配) 2.通过是否是顺丰号码对黑名单进行脱敏展示,黑名单中手机号的[加入/移除]均为正常手机号码
parent fd989360
...@@ -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) { if (firstPhoneNumber != null) {
deleteBlockedNumber(encryptNumber) deleteBlockedNumber(firstPhoneNumber)
} else {
if (firstPhoneNumber != null) {
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()
} }
} }
......
...@@ -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,11 +188,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() { ...@@ -210,11 +188,7 @@ 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.number )
deleteBlockedNumber(blockedNumber.normalizedNumber )
}else{
deleteBlockedNumber(blockedNumber.number )
}
} }
Log.d(TAG, "onCreate: 全选删除模式 已成功删除所有黑名单数据!") Log.d(TAG, "onCreate: 全选删除模式 已成功删除所有黑名单数据!")
updateBlockedNumbers() updateBlockedNumbers()
...@@ -236,11 +210,7 @@ class ManageBlockedNumbersActivity : BaseSimpleActivity() { ...@@ -236,11 +210,7 @@ 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.number )
deleteBlockedNumber(blockedNumber.normalizedNumber )
}else{
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() }
// }
} }
} }
} }
......
...@@ -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)
......
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