136 lines
5.4 KiB
Kotlin
136 lines
5.4 KiB
Kotlin
package com.simplemobiletools.smsmessenger.receivers
|
|
|
|
import android.content.BroadcastReceiver
|
|
import android.content.Context
|
|
import android.content.Intent
|
|
import android.os.Handler
|
|
import android.os.Looper
|
|
import android.provider.Telephony
|
|
import com.simplemobiletools.commons.extensions.baseConfig
|
|
import com.simplemobiletools.commons.extensions.getMyContactsCursor
|
|
import com.simplemobiletools.commons.extensions.isNumberBlocked
|
|
import com.simplemobiletools.commons.helpers.SimpleContactsHelper
|
|
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
|
import com.simplemobiletools.commons.models.PhoneNumber
|
|
import com.simplemobiletools.commons.models.SimpleContact
|
|
import com.simplemobiletools.smsmessenger.extensions.*
|
|
import com.simplemobiletools.smsmessenger.helpers.refreshMessages
|
|
import com.simplemobiletools.smsmessenger.models.Message
|
|
|
|
class SmsReceiver : BroadcastReceiver() {
|
|
override fun onReceive(context: Context, intent: Intent) {
|
|
val messages = Telephony.Sms.Intents.getMessagesFromIntent(intent)
|
|
var address = ""
|
|
var body = ""
|
|
var subject = ""
|
|
var date = 0L
|
|
var threadId = 0L
|
|
var status = Telephony.Sms.STATUS_NONE
|
|
val type = Telephony.Sms.MESSAGE_TYPE_INBOX
|
|
val read = 0
|
|
val subscriptionId = intent.getIntExtra("subscription", -1)
|
|
|
|
val privateCursor = context.getMyContactsCursor(false, true)
|
|
ensureBackgroundThread {
|
|
messages.forEach {
|
|
address = it.originatingAddress ?: ""
|
|
subject = it.pseudoSubject
|
|
status = it.status
|
|
body += it.messageBody
|
|
date = System.currentTimeMillis()
|
|
threadId = context.getThreadId(address)
|
|
}
|
|
|
|
if (context.baseConfig.blockUnknownNumbers) {
|
|
val simpleContactsHelper = SimpleContactsHelper(context)
|
|
simpleContactsHelper.exists(address, privateCursor) { exists ->
|
|
if (exists) {
|
|
handleMessage(context, address, subject, body, date, read, threadId, type, subscriptionId, status)
|
|
}
|
|
}
|
|
} else {
|
|
handleMessage(context, address, subject, body, date, read, threadId, type, subscriptionId, status)
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun handleMessage(
|
|
context: Context,
|
|
address: String,
|
|
subject: String,
|
|
body: String,
|
|
date: Long,
|
|
read: Int,
|
|
threadId: Long,
|
|
type: Int,
|
|
subscriptionId: Int,
|
|
status: Int
|
|
) {
|
|
if (isMessageFilteredOut(context, body)) {
|
|
return
|
|
}
|
|
|
|
val photoUri = SimpleContactsHelper(context).getPhotoUriFromPhoneNumber(address)
|
|
val bitmap = context.getNotificationBitmap(photoUri)
|
|
Handler(Looper.getMainLooper()).post {
|
|
if (!context.isNumberBlocked(address)) {
|
|
val privateCursor = context.getMyContactsCursor(favoritesOnly = false, withPhoneNumbersOnly = true)
|
|
ensureBackgroundThread {
|
|
val newMessageId = context.insertNewSMS(address, subject, body, date, read, threadId, type, subscriptionId)
|
|
|
|
val conversation = context.getConversations(threadId).firstOrNull() ?: return@ensureBackgroundThread
|
|
try {
|
|
context.insertOrUpdateConversation(conversation)
|
|
} catch (ignored: Exception) {
|
|
}
|
|
|
|
try {
|
|
context.updateUnreadCountBadge(context.conversationsDB.getUnreadConversations())
|
|
} catch (ignored: Exception) {
|
|
}
|
|
|
|
val senderName = context.getNameFromAddress(address, privateCursor)
|
|
val phoneNumber = PhoneNumber(address, 0, "", address)
|
|
val participant = SimpleContact(0, 0, senderName, photoUri, arrayListOf(phoneNumber), ArrayList(), ArrayList())
|
|
val participants = arrayListOf(participant)
|
|
val messageDate = (date / 1000).toInt()
|
|
|
|
val message =
|
|
Message(
|
|
newMessageId,
|
|
body,
|
|
type,
|
|
status,
|
|
participants,
|
|
messageDate,
|
|
false,
|
|
threadId,
|
|
false,
|
|
null,
|
|
address,
|
|
senderName,
|
|
photoUri,
|
|
subscriptionId
|
|
)
|
|
context.messagesDB.insertOrUpdate(message)
|
|
if (context.config.useThreadsArchive) {
|
|
context.updateConversationArchivedStatus(threadId, false)
|
|
}
|
|
refreshMessages()
|
|
context.showReceivedMessageNotification(newMessageId, address, body, threadId, bitmap)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun isMessageFilteredOut(context: Context, body: String): Boolean {
|
|
for (blockedKeyword in context.config.blockedKeywords) {
|
|
if (body.contains(blockedKeyword, ignoreCase = true)) {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
}
|