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) 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 } }